Lines 21-26
Link Here
|
21 |
import org.eclipse.emf.cdo.view.CDOView; |
21 |
import org.eclipse.emf.cdo.view.CDOView; |
22 |
import org.eclipse.emf.cdo.workspace.CDOWorkspace; |
22 |
import org.eclipse.emf.cdo.workspace.CDOWorkspace; |
23 |
import org.eclipse.emf.cdo.workspace.efs.CDOFS; |
23 |
import org.eclipse.emf.cdo.workspace.efs.CDOFS; |
|
|
24 |
import org.eclipse.emf.cdo.workspace.internal.efs.bundle.OM; |
24 |
|
25 |
|
25 |
import org.eclipse.net4j.util.WrappedException; |
26 |
import org.eclipse.net4j.util.WrappedException; |
26 |
import org.eclipse.net4j.util.io.IOUtil; |
27 |
import org.eclipse.net4j.util.io.IOUtil; |
Lines 32-37
Link Here
|
32 |
import org.eclipse.emf.ecore.EStructuralFeature; |
33 |
import org.eclipse.emf.ecore.EStructuralFeature; |
33 |
import org.eclipse.emf.ecore.InternalEObject; |
34 |
import org.eclipse.emf.ecore.InternalEObject; |
34 |
import org.eclipse.emf.ecore.util.EcoreUtil; |
35 |
import org.eclipse.emf.ecore.util.EcoreUtil; |
|
|
36 |
import org.eclipse.emf.ecore.util.InternalEList; |
35 |
import org.eclipse.emf.ecore.xmi.XMIResource; |
37 |
import org.eclipse.emf.ecore.xmi.XMIResource; |
36 |
import org.eclipse.emf.spi.cdo.InternalCDOObject; |
38 |
import org.eclipse.emf.spi.cdo.InternalCDOObject; |
37 |
|
39 |
|
Lines 69-74
Link Here
|
69 |
|
71 |
|
70 |
private CDOView view; |
72 |
private CDOView view; |
71 |
|
73 |
|
|
|
74 |
private Map<org.eclipse.emf.common.util.URI, CDOID> newObjects = new HashMap<org.eclipse.emf.common.util.URI, CDOID>(); |
75 |
|
72 |
private SaveContext saveContext; |
76 |
private SaveContext saveContext; |
73 |
|
77 |
|
74 |
public CDOWorkspaceStore(String name, File location) |
78 |
public CDOWorkspaceStore(String name, File location) |
Lines 159-164
Link Here
|
159 |
|
163 |
|
160 |
public void dispose() |
164 |
public void dispose() |
161 |
{ |
165 |
{ |
|
|
166 |
newObjects = null; |
167 |
|
162 |
if (view != null) |
168 |
if (view != null) |
163 |
{ |
169 |
{ |
164 |
IOUtil.close(view); |
170 |
IOUtil.close(view); |
Lines 239-244
Link Here
|
239 |
} |
245 |
} |
240 |
} |
246 |
} |
241 |
|
247 |
|
|
|
248 |
private CDOID getNewObject(org.eclipse.emf.common.util.URI uri) |
249 |
{ |
250 |
return newObjects.get(uri); |
251 |
} |
252 |
|
253 |
private void registerNewObject(org.eclipse.emf.common.util.URI uri, CDOID id) |
254 |
{ |
255 |
if (uri.fragment().startsWith("/")) |
256 |
{ |
257 |
throw new IllegalArgumentException("New objects with positional URI fragment are not supported"); |
258 |
} |
259 |
|
260 |
newObjects.put(uri, id); |
261 |
} |
262 |
|
242 |
/** |
263 |
/** |
243 |
* @author Eike Stepper |
264 |
* @author Eike Stepper |
244 |
*/ |
265 |
*/ |
Lines 246-254
Link Here
|
246 |
{ |
267 |
{ |
247 |
private CDOTransaction transaction = workspace.openTransaction(); |
268 |
private CDOTransaction transaction = workspace.openTransaction(); |
248 |
|
269 |
|
249 |
private Map<String, InternalCDOObject> newObjects = new HashMap<String, InternalCDOObject>(); |
270 |
private Map<org.eclipse.emf.common.util.URI, List<ForwardReference>> forwardReferences = new HashMap<org.eclipse.emf.common.util.URI, List<ForwardReference>>(); |
250 |
|
|
|
251 |
private Map<String, List<ForwardReference>> forwardReferences = new HashMap<String, List<ForwardReference>>(); |
252 |
|
271 |
|
253 |
private XMIResource xmiResource; |
272 |
private XMIResource xmiResource; |
254 |
|
273 |
|
Lines 265-270
Link Here
|
265 |
CDOResource cdoResource = transaction.getResource(cdoPath); |
284 |
CDOResource cdoResource = transaction.getResource(cdoPath); |
266 |
saveContents(xmiResource.getContents(), cdoResource.getContents()); |
285 |
saveContents(xmiResource.getContents(), cdoResource.getContents()); |
267 |
} |
286 |
} |
|
|
287 |
catch (RuntimeException ex) |
288 |
{ |
289 |
OM.LOG.error(ex); |
290 |
throw ex; |
291 |
} |
268 |
finally |
292 |
finally |
269 |
{ |
293 |
{ |
270 |
this.xmiResource = null; |
294 |
this.xmiResource = null; |
Lines 282-306
Link Here
|
282 |
if (cdoObject == null) |
306 |
if (cdoObject == null) |
283 |
{ |
307 |
{ |
284 |
cdoObject = createNewCDOObject(xmiObject); |
308 |
cdoObject = createNewCDOObject(xmiObject); |
285 |
cdoContents.add(i, cdoObject); |
309 |
cdoContents.add(i, cdoObject); // Inverse handshaking cares for the opposite (implicit or explicit) |
286 |
} |
310 |
} |
287 |
else |
311 |
else |
288 |
{ |
312 |
{ |
289 |
int index = cdoContents.indexOf(cdoObject); |
313 |
int index = cdoContents.indexOf(cdoObject); |
290 |
if (index != -1) |
314 |
if (index != -1) |
291 |
{ |
315 |
{ |
292 |
cdoContents.move(i, index); |
316 |
cdoContents.move(i, index); // No effect on opposite (implicit or explicit) |
293 |
} |
317 |
} |
294 |
else |
318 |
else |
295 |
{ |
319 |
{ |
296 |
cdoContents.add(i, cdoObject); |
320 |
cdoContents.add(i, cdoObject); // Inverse handshaking cares for the opposite (implicit or explicit) |
297 |
} |
321 |
} |
298 |
} |
322 |
} |
299 |
|
323 |
|
300 |
saveObject((InternalEObject)xmiObject, (InternalCDOObject)cdoObject); |
324 |
saveObject((InternalEObject)xmiObject, (InternalCDOObject)cdoObject); |
301 |
} |
325 |
} |
302 |
|
326 |
|
303 |
shortenList(cdoContents, size); |
327 |
shortenList((InternalEList<EObject>)cdoContents, size); |
304 |
} |
328 |
} |
305 |
|
329 |
|
306 |
private void saveObject(InternalEObject xmiObject, InternalCDOObject cdoObject) |
330 |
private void saveObject(InternalEObject xmiObject, InternalCDOObject cdoObject) |
Lines 336-351
Link Here
|
336 |
cdoValue = createNewCDOObject((EObject)xmiValue); |
360 |
cdoValue = createNewCDOObject((EObject)xmiValue); |
337 |
} |
361 |
} |
338 |
|
362 |
|
339 |
cdoObject.eSet(reference, cdoValue); |
363 |
cdoObject.eSet(reference, cdoValue); // Inverse handshaking cares for the opposite (implicit or |
|
|
364 |
// explicit) |
365 |
|
340 |
saveObject((InternalEObject)xmiValue, cdoValue); |
366 |
saveObject((InternalEObject)xmiValue, cdoValue); |
341 |
} |
367 |
} |
342 |
else |
368 |
else |
343 |
{ |
369 |
{ |
344 |
cdoObject.eSet(reference, null); |
370 |
cdoObject.eSet(reference, null); // No opposite to consider |
345 |
} |
371 |
} |
346 |
} |
372 |
} |
347 |
} |
373 |
} |
348 |
else |
374 |
else if (!reference.isContainer()) // Handled by inverse handshaking |
349 |
{ |
375 |
{ |
350 |
if (reference.isMany()) |
376 |
if (reference.isMany()) |
351 |
{ |
377 |
{ |
Lines 365-375
Link Here
|
365 |
org.eclipse.emf.common.util.URI eProxyURI = xmiElement.eProxyURI(); |
391 |
org.eclipse.emf.common.util.URI eProxyURI = xmiElement.eProxyURI(); |
366 |
if (eProxyURI != null) |
392 |
if (eProxyURI != null) |
367 |
{ |
393 |
{ |
368 |
String href = eProxyURI.fragment(); |
394 |
cdoElement = getCDOObjectByURI(eProxyURI); |
369 |
cdoElement = getCDOObjectByHREF(href); |
|
|
370 |
if (cdoElement == null) |
395 |
if (cdoElement == null) |
371 |
{ |
396 |
{ |
372 |
registerForwardReference(cdoObject, reference, i, href); |
397 |
registerForwardReference(cdoObject, reference, i, eProxyURI); |
373 |
|
398 |
|
374 |
InternalCDOObject dummy = createNewCDOObject(xmiElement); |
399 |
InternalCDOObject dummy = createNewCDOObject(xmiElement); |
375 |
cdoElements.add(i, dummy); |
400 |
cdoElements.add(i, dummy); |
Lines 392-398
Link Here
|
392 |
} |
417 |
} |
393 |
} |
418 |
} |
394 |
|
419 |
|
395 |
shortenList(cdoElements, size); |
420 |
shortenList((InternalEList<EObject>)cdoElements, size); |
396 |
} |
421 |
} |
397 |
else |
422 |
else |
398 |
{ |
423 |
{ |
Lines 403-413
Link Here
|
403 |
org.eclipse.emf.common.util.URI eProxyURI = ((InternalEObject)xmiValue).eProxyURI(); |
428 |
org.eclipse.emf.common.util.URI eProxyURI = ((InternalEObject)xmiValue).eProxyURI(); |
404 |
if (eProxyURI != null) |
429 |
if (eProxyURI != null) |
405 |
{ |
430 |
{ |
406 |
String href = eProxyURI.fragment(); |
431 |
cdoValue = getCDOObjectByURI(eProxyURI); |
407 |
cdoValue = getCDOObjectByHREF(href); |
|
|
408 |
if (cdoValue == null) |
432 |
if (cdoValue == null) |
409 |
{ |
433 |
{ |
410 |
registerForwardReference(cdoObject, reference, -1, href); |
434 |
registerForwardReference(cdoObject, reference, -1, eProxyURI); |
411 |
} |
435 |
} |
412 |
} |
436 |
} |
413 |
else |
437 |
else |
Lines 416-422
Link Here
|
416 |
} |
440 |
} |
417 |
} |
441 |
} |
418 |
|
442 |
|
419 |
cdoObject.eSet(reference, cdoValue); |
443 |
int referenceID = cdoValue.eClass().getFeatureID(reference); |
|
|
444 |
cdoObject.eInverseAdd((InternalEObject)cdoValue, referenceID, null, null); |
420 |
} |
445 |
} |
421 |
} |
446 |
} |
422 |
} |
447 |
} |
Lines 472-521
Link Here
|
472 |
return null; |
497 |
return null; |
473 |
} |
498 |
} |
474 |
|
499 |
|
|
|
500 |
private InternalCDOObject getCDOObjectByURI(org.eclipse.emf.common.util.URI uri) |
501 |
{ |
502 |
CDOID id = null; |
503 |
|
504 |
try |
505 |
{ |
506 |
String href = uri.fragment(); |
507 |
id = CDOIDUtil.read(href); |
508 |
} |
509 |
catch (Exception ex) |
510 |
{ |
511 |
//$FALL-THROUGH$ |
512 |
} |
513 |
|
514 |
if (id == null) |
515 |
{ |
516 |
id = getNewObject(uri); |
517 |
} |
518 |
|
519 |
if (id != null) |
520 |
{ |
521 |
return (InternalCDOObject)transaction.getObject(id); |
522 |
} |
523 |
|
524 |
return null; |
525 |
} |
526 |
|
475 |
private InternalCDOObject createNewCDOObject(EObject xmiObject) |
527 |
private InternalCDOObject createNewCDOObject(EObject xmiObject) |
476 |
{ |
528 |
{ |
477 |
// Create new object |
529 |
// Create new object |
478 |
EObject newInstance = EcoreUtil.create(xmiObject.eClass()); |
530 |
EObject newInstance = EcoreUtil.create(xmiObject.eClass()); |
479 |
InternalCDOObject cdoObject = (InternalCDOObject)CDOUtil.getCDOObject(newInstance); |
531 |
InternalCDOObject cdoObject = (InternalCDOObject)CDOUtil.getCDOObject(newInstance); |
480 |
|
532 |
|
481 |
// Remember new object |
533 |
org.eclipse.emf.common.util.URI uri = EcoreUtil.getURI(xmiObject); |
482 |
String fragment = xmiResource.getURIFragment(xmiObject); |
534 |
registerNewObject(uri, cdoObject.cdoID()); |
483 |
newObjects.put(fragment, cdoObject); |
|
|
484 |
|
535 |
|
485 |
return cdoObject; |
536 |
return cdoObject; |
486 |
} |
537 |
} |
487 |
|
538 |
|
488 |
private void shortenList(EList<EObject> list, int size) |
539 |
private void shortenList(InternalEList<EObject> list, int size) |
489 |
{ |
540 |
{ |
490 |
int remove = list.size() - size; |
541 |
int remove = list.size() - size; |
491 |
while (remove-- != 0) |
542 |
while (remove-- != 0) |
492 |
{ |
543 |
{ |
493 |
list.remove(list.size() - 1); |
544 |
list.basicRemove(list.size() - 1, null); // Do not impact a potential eOpposite! |
494 |
} |
545 |
} |
495 |
} |
546 |
} |
496 |
|
547 |
|
497 |
private InternalCDOObject getCDOObjectByHREF(String href) |
|
|
498 |
{ |
499 |
InternalCDOObject cdoObject = null; |
500 |
|
501 |
try |
502 |
{ |
503 |
CDOID id = CDOIDUtil.read(href); |
504 |
cdoObject = (InternalCDOObject)transaction.getObject(id); |
505 |
} |
506 |
catch (Exception ex) |
507 |
{ |
508 |
//$FALL-THROUGH$ |
509 |
} |
510 |
|
511 |
if (cdoObject == null) |
512 |
{ |
513 |
cdoObject = newObjects.get(href); |
514 |
} |
515 |
|
516 |
return cdoObject; |
517 |
} |
518 |
|
519 |
private void done() |
548 |
private void done() |
520 |
{ |
549 |
{ |
521 |
if (resolveForwardReferences()) |
550 |
if (resolveForwardReferences()) |
Lines 524-536
Link Here
|
524 |
} |
553 |
} |
525 |
} |
554 |
} |
526 |
|
555 |
|
527 |
private void registerForwardReference(InternalCDOObject cdoObject, EReference reference, int index, String href) |
556 |
private void registerForwardReference(InternalCDOObject cdoObject, EReference reference, int index, |
|
|
557 |
org.eclipse.emf.common.util.URI uri) |
528 |
{ |
558 |
{ |
529 |
List<ForwardReference> list = forwardReferences.get(href); |
559 |
List<ForwardReference> list = forwardReferences.get(uri); |
530 |
if (list == null) |
560 |
if (list == null) |
531 |
{ |
561 |
{ |
532 |
list = new ArrayList<ForwardReference>(); |
562 |
list = new ArrayList<ForwardReference>(); |
533 |
forwardReferences.put(href, list); |
563 |
forwardReferences.put(uri, list); |
534 |
} |
564 |
} |
535 |
|
565 |
|
536 |
list.add(new ForwardReference(cdoObject, reference, index)); |
566 |
list.add(new ForwardReference(cdoObject, reference, index)); |
Lines 538-550
Link Here
|
538 |
|
568 |
|
539 |
private boolean resolveForwardReferences() |
569 |
private boolean resolveForwardReferences() |
540 |
{ |
570 |
{ |
541 |
Set<Entry<String, List<ForwardReference>>> entrySet = forwardReferences.entrySet(); |
571 |
Set<Entry<org.eclipse.emf.common.util.URI, List<ForwardReference>>> entrySet = forwardReferences.entrySet(); |
542 |
for (Iterator<Entry<String, List<ForwardReference>>> it = entrySet.iterator(); it.hasNext();) |
572 |
for (Iterator<Entry<org.eclipse.emf.common.util.URI, List<ForwardReference>>> it = entrySet.iterator(); it |
|
|
573 |
.hasNext();) |
543 |
{ |
574 |
{ |
544 |
Entry<String, List<ForwardReference>> entry = it.next(); |
575 |
Entry<org.eclipse.emf.common.util.URI, List<ForwardReference>> entry = it.next(); |
545 |
String href = entry.getKey(); |
576 |
org.eclipse.emf.common.util.URI uri = entry.getKey(); |
546 |
|
577 |
|
547 |
InternalCDOObject target = getCDOObjectByHREF(href); |
578 |
InternalCDOObject target = getCDOObjectByURI(uri); |
548 |
if (target != null) |
579 |
if (target != null) |
549 |
{ |
580 |
{ |
550 |
List<ForwardReference> list = entry.getValue(); |
581 |
List<ForwardReference> list = entry.getValue(); |
Lines 575-581
Link Here
|
575 |
IOUtil.closeSilent(transaction); |
606 |
IOUtil.closeSilent(transaction); |
576 |
transaction = null; |
607 |
transaction = null; |
577 |
forwardReferences = null; |
608 |
forwardReferences = null; |
578 |
newObjects = null; |
|
|
579 |
saveContext = null; |
609 |
saveContext = null; |
580 |
} |
610 |
} |
581 |
} |
611 |
} |