Skip to main content
summaryrefslogtreecommitdiffstats
blob: f7448f9dfb2aab103456acdae9cee2006187ebae (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
/*
 * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Ibrahim Sallam - initial API and implementation
 */
package org.eclipse.emf.cdo.server.internal.objectivity.db;

import org.eclipse.emf.cdo.common.model.CDOModelUtil;
import org.eclipse.emf.cdo.common.model.CDOPackageRegistry;
import org.eclipse.emf.cdo.common.model.CDOPackageUnit;
import org.eclipse.emf.cdo.common.model.EMFUtil;
import org.eclipse.emf.cdo.server.internal.objectivity.bundle.OM;
import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyPackageInfo;
import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyPackageUnit;
import org.eclipse.emf.cdo.server.internal.objectivity.utils.ObjyDb;
import org.eclipse.emf.cdo.server.internal.objectivity.utils.SmartLock;
import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageInfo;
import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageUnit;

import org.eclipse.net4j.util.om.monitor.OMMonitor;
import org.eclipse.net4j.util.om.trace.ContextTracer;

import org.eclipse.emf.ecore.EPackage;

import com.objy.db.app.Session;
import com.objy.db.app.ooId;
import com.objy.db.app.ooObj;
import com.objy.db.util.ooMap;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class ObjyPackageHandler
{

  private static final ContextTracer TRACER_DEBUG = new ContextTracer(OM.DEBUG, ObjyPackageHandler.class);

  private static final ContextTracer TRACER_INFO = new ContextTracer(OM.INFO, ObjyPackageHandler.class);

  protected ooId packageMapId;

  private boolean zipped = true;

  public ObjyPackageHandler(String repositoryName)
  {
    // this.store = store;
    packageMapId = ObjyDb.getOrCreatePackageMap(repositoryName);
  }

  /***
   * Factory method to create the PackageMap, which is an ooMap
   */
  public static ooId create(ooId scopeContOid)
  {
    ooMap map = new ooMap();
    ooObj clusterObject = ooObj.create_ooObj(scopeContOid);
    clusterObject.cluster(map);
    return map.getOid();
  }

  public void writePackages(CDOPackageRegistry packageRegistry, InternalCDOPackageUnit packageUnit, OMMonitor monitor)
  {
    try
    {
      ooMap packageMap = getMap();

      SmartLock.lock(packageMap.getContainer());
      InternalCDOPackageInfo[] packageInfos = packageUnit.getPackageInfos();
      monitor.begin(1 + packageInfos.length);

      if (TRACER_INFO.isEnabled())
      {
        TRACER_INFO.format("Writing package unit: {0}", packageUnit); //$NON-NLS-1$
      }

      byte[] ePackageAsBytes = getEPackageBytes(packageRegistry, packageUnit);

      ObjyPackageUnit objyPackageUnit = new ObjyPackageUnit(ePackageAsBytes.length);
      packageMap.cluster(objyPackageUnit);

      objyPackageUnit.setId(packageUnit.getID());
      objyPackageUnit.setOrdinal(packageUnit.getOriginalType().ordinal());
      objyPackageUnit.setTimeStamp(packageUnit.getTimeStamp());
      objyPackageUnit.setPackageAsBytes(ePackageAsBytes);

      if (TRACER_DEBUG.isEnabled())
      {
        TRACER_DEBUG.trace("... writing ObjyPackageUnit.getId(): " + objyPackageUnit.getId());
      }

      ObjyPackageInfo objyPackageInfo;
      for (InternalCDOPackageInfo packageInfo : packageInfos)
      {
        objyPackageInfo = createPackageInfo(packageInfo, monitor); // Don't fork monitor
        objyPackageUnit.addPackageInfo(objyPackageInfo);
        // make sure we have the mapping between the Package name an the nsURI
        // set mapping between package name and the nsURI
        // getStore().addPackageMapping(packageInfo.getPackageURI(), ooPackageInfo.getPackageName());
        // getStore().addPackageMapping(ooPackageInfo.getPackageName(), packageInfo.getPackageURI());
        String objyPackageName = ObjySchema.getObjyPackageName(packageInfo.getPackageURI());
        ObjySchema.setPackageNameMapping(packageInfo.getPackageURI(), objyPackageName);
        ObjySchema.setPackageNameMapping(objyPackageName, packageInfo.getPackageURI());

        // we might as well create the schema in Objy, although I`m not sure if we needed for the ecore pacakge.
        EPackage ePackage = packageInfo.getEPackage();
        ObjySchema.registerEPackage(ePackage);
      }

      // add the package unit to the map.
      packageMap.add(objyPackageUnit, objyPackageUnit.getId());
    }
    finally
    {
      monitor.done();
    }
  }

  private ObjyPackageInfo createPackageInfo(InternalCDOPackageInfo packageInfo, OMMonitor monitor)
  {
    if (TRACER_INFO.isEnabled())
    {
      TRACER_INFO.format("Writing package info: {0}", packageInfo); //$NON-NLS-1$
    }

    ObjyPackageInfo ooPackageInfo = new ObjyPackageInfo();
    ooPackageInfo.setPackageURI(packageInfo.getPackageURI());
    ooPackageInfo.setParentURI(packageInfo.getParentURI());
    ooPackageInfo.setUnitID(packageInfo.getPackageUnit().getID());
    ooPackageInfo.setPackageName(packageInfo.getEPackage().getName());

    return ooPackageInfo;
  }

  private byte[] getEPackageBytes(CDOPackageRegistry packageRegistry, InternalCDOPackageUnit packageUnit)
  {
    EPackage ePackage = packageUnit.getTopLevelPackageInfo().getEPackage();
    return EMFUtil.getEPackageBytes(ePackage, zipped, packageRegistry);
  }

  public Collection<InternalCDOPackageUnit> readPackageUnits()
  {
    final Map<ObjyPackageUnit, InternalCDOPackageUnit> packageUnitsMap = new HashMap<ObjyPackageUnit, InternalCDOPackageUnit>();

    ooMap packageMap = getMap();

    Iterator<?> itr = packageMap.elements();
    while (itr.hasNext())
    {
      ObjyPackageUnit objyPackageUnit = (ObjyPackageUnit)itr.next();
      InternalCDOPackageUnit packageUnit = createPackageUnit();
      packageUnit.setOriginalType(CDOPackageUnit.Type.values()[objyPackageUnit.getOrdinal()]);
      packageUnit.setTimeStamp(objyPackageUnit.getTimeStamp());
      packageUnitsMap.put(objyPackageUnit, packageUnit);
      if (TRACER_INFO.isEnabled())
      {
        TRACER_INFO.format("Read package unit: {0}", packageUnit); //$NON-NLS-1$
      }
    }

    // create the package infos from the units.
    for (Entry<ObjyPackageUnit, InternalCDOPackageUnit> entry : packageUnitsMap.entrySet())
    {
      // scan the relationship.
      List<ObjyPackageInfo> objyPackageInfoList = entry.getKey().getPackageInfos();
      List<InternalCDOPackageInfo> packageInfoList = new ArrayList<InternalCDOPackageInfo>();
      // create the package infos.
      for (ObjyPackageInfo objyPackageInfo : objyPackageInfoList)
      {
        InternalCDOPackageInfo packageInfo = createPackageInfo(objyPackageInfo);
        packageInfoList.add(packageInfo);
        // set mapping between package URI and the package name used in Objy Schema.
        // getStore().addPackageMapping(packageInfo.getPackageURI(), ooPackageInfo.getPackageName());
        // getStore().addPackageMapping(ooPackageInfo.getPackageName(), packageInfo.getPackageURI());
        String objyPackageName = ObjySchema.getObjyPackageName(packageInfo.getPackageURI());
        ObjySchema.setPackageNameMapping(packageInfo.getPackageURI(), objyPackageName);
        ObjySchema.setPackageNameMapping(objyPackageName, packageInfo.getPackageURI());
      }
      // add the package infos to the unit.
      InternalCDOPackageInfo[] array = packageInfoList.toArray(new InternalCDOPackageInfo[packageInfoList.size()]);
      entry.getValue().setPackageInfos(array);
    }

    return packageUnitsMap.values();
  }

  protected InternalCDOPackageUnit createPackageUnit()
  {
    return (InternalCDOPackageUnit)CDOModelUtil.createPackageUnit();
  }

  protected InternalCDOPackageInfo createPackageInfo()
  {
    return (InternalCDOPackageInfo)CDOModelUtil.createPackageInfo();
  }

  private InternalCDOPackageInfo createPackageInfo(ObjyPackageInfo ooPackageInfo)
  {
    if (TRACER_INFO.isEnabled())
    {
      TRACER_INFO.format("create package info: {0}", ooPackageInfo); //$NON-NLS-1$
    }

    InternalCDOPackageInfo packageInfo = createPackageInfo();

    packageInfo.setPackageURI(ooPackageInfo.getPackageURI());
    packageInfo.setParentURI(ooPackageInfo.getParentURI());
    // TODO - do we need this!!!! setUnitID(packageInfo.getPackageUnit().getID());

    return packageInfo;
  }

  public byte[] readPackageBytes(InternalCDOPackageUnit packageUnit)
  {
    byte[] bytes = null;

    ooMap map = getMap();
    String packageUnitId = packageUnit.getID();
    if (TRACER_INFO.isEnabled())
    {
      TRACER_INFO.format("Looking for package unit with ID: {0}", packageUnitId); //$NON-NLS-1$
    }
    if (map.isMember(packageUnitId))
    {
      if (TRACER_INFO.isEnabled())
      {
        TRACER_INFO.format("Reading package unit with ID: {0}", packageUnitId); //$NON-NLS-1$
      }
      ObjyPackageUnit objyPackageUnit = (ObjyPackageUnit)map.lookup(packageUnitId);
      // this is our package...
      bytes = objyPackageUnit.getPackageAsBytes();
    }
    return bytes;
  }

  /***
   * This function assume we are in an Objy transaction.
   */
  private ooMap getMap()
  {
    ooMap map = null;
    map = (ooMap)Session.getCurrent().getFD().objectFrom(packageMapId);
    return map;
  }

}

Back to the top