View | Details | Raw Unified | Return to bug 327405 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/emf/cdo/workspace/internal/efs/CDOWorkspaceStore.java (-54 / +84 lines)
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
    }

Return to bug 327405