@Override protected void process(CDOView view, String resourceName) throws Throwable { view.getResource(resourceName); CDOResource resource = view.getResource(resourceName); Root root = (Root) resource.getContents().get(0); String id = root.getID(); }
public void testCustomDefaultLiteral() throws CommitException { // valid default literal att.setDefaultValueLiteral("1;2"); EObject obj = EcoreUtil.create(cls); obj.eUnset(att); { CDOSession session = openSession(); session.getPackageRegistry().putEPackage(pkg); CDOTransaction tx = session.openTransaction(); CDOResource res = tx.createResource(getResourcePath("/test")); res.getContents().add(obj); tx.commit(); tx.close(); session.close(); } clearCache(getRepository().getRevisionManager()); { CDOSession session = openSession(); session.getPackageRegistry().putEPackage(pkg); CDOView v = session.openView(); CDOResource res = v.getResource(getResourcePath("/test")); EObject persistent = res.getContents().get(0); CustomType pCustom = (CustomType) persistent.eGet(att); assertEquals(1, pCustom.getA()); assertEquals(2, pCustom.getB()); v.close(); session.close(); } }
public void testDeleteExistingObject() throws Exception { { msg("Open session & local transaction"); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOPushTransaction pushTransaction = openPushTransaction(transaction); file = pushTransaction.getFile(); CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath)); msg("Remove an existing element"); Supplier supplier = (Supplier) resource.getContents().get(0); resource.getContents().remove(supplier); msg("Commit"); pushTransaction.commit(); session.close(); } { msg("Reload previous local session"); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOPushTransaction pushTransaction = openPushTransaction(transaction, file); assertEquals(true, transaction.isDirty()); assertEquals(1, transaction.getRevisionDeltas().size()); push(transaction, pushTransaction); session.close(); } CDOSession session = openSession(); CDOView view = session.openView(); CDOResource resource = view.getResource(getResourcePath(resourcePath)); assertEquals(1, resource.getContents().size()); }
public void testAddNewObjectInObject() throws Exception { { msg("Open session & local transaction"); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOPushTransaction pushTransaction = openPushTransaction(transaction); file = pushTransaction.getFile(); CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath)); msg("Create a new element"); Category category = getModel1Factory().createCategory(); Company company = (Company) resource.getContents().get(1); company.getCategories().add(category); msg("Commit"); pushTransaction.commit(); session.close(); } { msg("Reload previous local session"); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOPushTransaction pushTransaction = openPushTransaction(transaction, file); assertEquals(true, transaction.isDirty()); assertEquals(1, transaction.getRevisionDeltas().size()); CDORevisionDelta delta = transaction.getRevisionDeltas().values().iterator().next(); assertNotNull(delta); push(transaction, pushTransaction); session.close(); } CDOSession session = openSession(); CDOView view = session.openView(); CDOResource resource = view.getResource(getResourcePath(resourcePath)); assertEquals(2, resource.getContents().size()); }
public void testUnsetValue() throws Exception { { msg("Open session & local transaction"); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOPushTransaction pushTransaction = openPushTransaction(transaction); file = pushTransaction.getFile(); CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath)); Supplier supplier = (Supplier) resource.getContents().get(0); supplier.setName(null); msg("Commit"); pushTransaction.commit(); session.close(); } { msg("Reload previous local session"); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOPushTransaction pushTransaction = openPushTransaction(transaction, file); assertEquals(true, transaction.isDirty()); CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath)); Supplier supplier = (Supplier) resource.getContents().get(0); assertNull(supplier.getName()); push(transaction, pushTransaction); session.close(); } CDOSession session = openSession(); CDOView view = session.openView(); CDOResource resource = view.getResource(getResourcePath(resourcePath)); Supplier supplier = (Supplier) resource.getContents().get(0); assertNull(supplier.getName()); }
public void testAddNewObjectInResource() throws Exception { { msg("Open session & local transaction"); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOPushTransaction pushTransaction = openPushTransaction(transaction); file = pushTransaction.getFile(); CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath)); msg("Create a new element"); Supplier supplier = getModel1Factory().createSupplier(); supplier.setName("supplier" + System.currentTimeMillis()); resource.getContents().add(supplier); msg("Commit"); pushTransaction.commit(); session.close(); } { msg("Reload previous local session"); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOPushTransaction pushTransaction = openPushTransaction(transaction, file); assertEquals(true, transaction.isDirty()); assertEquals(1, transaction.getRevisionDeltas().size()); CDORevisionDelta delta = transaction.getRevisionDeltas().values().iterator().next(); assertNotNull(delta); push(transaction, pushTransaction); session.close(); } CDOSession session = openSession(); CDOView view = session.openView(); CDOResource resource = view.getResource(getResourcePath(resourcePath)); assertEquals(3, resource.getContents().size()); }
public void testCustomRegular() throws CommitException { EObject obj = EcoreUtil.create(cls); obj.eSet(att, new CustomType(23, 42)); { CDOSession session = openSession(); session.getPackageRegistry().putEPackage(pkg); CDOTransaction tx = session.openTransaction(); CDOResource res = tx.createResource(getResourcePath("/test")); res.getContents().add(obj); tx.commit(); tx.close(); session.close(); } clearCache(getRepository().getRevisionManager()); { CDOSession session = openSession(); session.getPackageRegistry().putEPackage(pkg); CDOView v = session.openView(); CDOResource res = v.getResource(getResourcePath("/test")); EObject persistent = res.getContents().get(0); CustomType pCustom = (CustomType) persistent.eGet(att); assertEquals(23, pCustom.getA()); assertEquals(42, pCustom.getB()); v.close(); session.close(); } }
public void testReadTransientValue() throws Exception { CDOSession session = openSession(); { disableConsole(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/test1")); Product1 product = getModel1Factory().createProduct1(); product.setDescription("DESCRIPTION"); product.setName("McDuff"); resource.getContents().add(product); assertEquals("DESCRIPTION", product.getDescription()); transaction.commit(); enableConsole(); } CDOView view = session.openView(); CDOResource resource = view.getResource(getResourcePath("/test1")); EList<EObject> contents = resource.getContents(); Product1 s = (Product1) contents.get(0); assertNotNull(s); assertEquals("McDuff", s.getName()); assertNull(s.getDescription()); s.setDescription("HELLO"); assertEquals("HELLO", s.getDescription()); }
public void testAddNewHierarchy() throws Exception { final String currentSupplierName = "supplier" + System.currentTimeMillis(); final Date orderDate = new Date(); final Float orderDetailPrice = 10.5F; { msg("Open session & local transaction"); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOPushTransaction pushTransaction = openPushTransaction(transaction); file = pushTransaction.getFile(); CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath)); msg("Create a new element"); Supplier supplier = getModel1Factory().createSupplier(); supplier.setName(currentSupplierName); resource.getContents().add(supplier); msg("Create a new child"); PurchaseOrder order = getModel1Factory().createPurchaseOrder(); order.setDate(orderDate); supplier.getPurchaseOrders().add(order); resource.getContents().add(order); OrderDetail detail = getModel1Factory().createOrderDetail(); detail.setPrice(orderDetailPrice); order.getOrderDetails().add(detail); msg("Commit"); pushTransaction.commit(); session.close(); } { msg("Reload previous local session"); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOPushTransaction pushTransaction = openPushTransaction(transaction, file); assertEquals(true, transaction.isDirty()); assertEquals(1, transaction.getRevisionDeltas().size()); CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath)); assertEquals(4, resource.getContents().size()); push(transaction, pushTransaction); session.close(); } CDOSession session = openSession(); CDOView view = session.openView(); CDOResource resource = view.getResource(getResourcePath(resourcePath)); assertEquals(4, resource.getContents().size()); Supplier supplier = (Supplier) resource.getContents().get(2); assertEquals(currentSupplierName, supplier.getName()); assertEquals(1, supplier.getPurchaseOrders().size()); PurchaseOrder order = supplier.getPurchaseOrders().get(0); assertNotNull(order); assertEquals(orderDate, order.getDate()); assertEquals(1, order.getOrderDetails().size()); OrderDetail detail = order.getOrderDetails().get(0); assertNotNull(detail); assertEquals(orderDetailPrice, detail.getPrice()); }
public void testRemoveContained() throws Exception { List<Category> categories = new ArrayList<Category>(); categories.add(getModel1Factory().createCategory()); Company company = getModel1Factory().createCompany(); company.getCategories().add(getModel1Factory().createCategory()); company.getCategories().add(getModel1Factory().createCategory()); company.getCategories().add(getModel1Factory().createCategory()); company.getCategories().addAll(categories); company.getCategories().add(getModel1Factory().createCategory()); company.getCategories().add(getModel1Factory().createCategory()); company.getCategories().add(getModel1Factory().createCategory()); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/test1")); resource.getContents().add(company); transaction.commit(); CDOSession session2 = openSession(); CDOView view = session2.openView(); view.options().addChangeSubscriptionPolicy(CDOAdapterPolicy.ALL); CDOResource resource2 = view.getResource(getResourcePath("/test1")); Company company2 = (Company) resource2.getContents().get(0); Object[] strongRefs = company2.getCategories().toArray(); // Keep those in memory msg(strongRefs); final TestAdapter adapter = new TestAdapter(); company2.eAdapters().add(adapter); company.getCategories().removeAll(categories); transaction.commit(); final Object[] oldValue = {null}; new PollingTimeOuter() { @Override protected boolean successful() { for (Notification notification : adapter.getNotifications()) { if (notification.getEventType() == Notification.REMOVE && notification.getFeature() == getModel1Package().getCompany_Categories()) { oldValue[0] = notification.getOldValue(); return true; } } return false; } }.assertNoTimeOut(); assertInstanceOf(Category.class, CDOUtil.getEObject((EObject) oldValue[0])); }
public void testEnableDisableNotifications() throws CommitException { CDOSession session1 = openSession(); CDOSession session2 = openSession(); CDOView controlView = session2.openView(); withExplicitRelease(session1, controlView, false); controlView.options().setLockNotificationEnabled(true); withExplicitRelease(session1, controlView, true); controlView.options().setLockNotificationEnabled(false); withExplicitRelease(session1, controlView, false); session1.close(); session2.close(); }
public void testReadBlob() throws Exception { commitBlob(); getRepository().getRevisionManager().getCache().clear(); CDOSession session = openSession(); CDOView view = session.openView(); CDOResource resource = view.getResource(getResourcePath("res")); Image image = (Image) resource.getContents().get(0); assertEquals(320, image.getWidth()); assertEquals(200, image.getHeight()); CDOBlob blob = image.getData(); assertEquals(null, blob); }
public void testUnsetValueWithoutPushTX() throws Exception { { msg("Open session & local transaction"); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath)); Supplier supplier = (Supplier) resource.getContents().get(0); supplier.setName(null); msg("Commit"); transaction.commit(); session.close(); } CDOSession session = openSession(); CDOView view = session.openView(); CDOResource resource = view.getResource(getResourcePath(resourcePath)); Supplier supplier = (Supplier) resource.getContents().get(0); assertNull(supplier.getName()); }
@Override protected void postRun(CDOView view, CDOObject parent) { if (newObject != null) { EObject object = view.getObject(newObject); if (object != null) { CDOCheckoutContentProvider contentProvider = getContentProvider(); if (contentProvider != null) { contentProvider.selectObjects(object); } } } }
/** See bug 315409. */ @Requires(IRepositoryConfig.CAPABILITY_BRANCHING) public void _testInvalidationWithDeltas_SubBranch() throws Exception { CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); Company company = getModel1Factory().createCompany(); company.setName("main-v1"); CDOResource resource = transaction.createResource(getResourcePath("/test1")); resource.getContents().add(company); transaction.commit(); company.setName("main-v2"); transaction.commit(); CDOBranch subBranch = transaction.getBranch().createBranch("SUB_BRANCH"); transaction.setBranch(subBranch); CDOView view = session.openView(subBranch); view.options().addChangeSubscriptionPolicy(CDOAdapterPolicy.ALL); Company company2 = view.getObject(company); company2.eAdapters().add(new AdapterImpl()); company.setName("sub-v1"); commitAndSync(transaction, view); CDORevision revision2 = CDOUtil.getCDOObject(company2).cdoRevision(); assertEquals(1, revision2.getVersion()); assertEquals(transaction.getBranch(), revision2.getBranch()); assertEquals(transaction.getLastCommitTime(), revision2.getTimeStamp()); company.setName("sub-v2"); commitAndSync(transaction, view); revision2 = CDOUtil.getCDOObject(company2).cdoRevision(); assertEquals(2, revision2.getVersion()); assertEquals(transaction.getBranch(), revision2.getBranch()); assertEquals(transaction.getLastCommitTime(), revision2.getTimeStamp()); }
public void testMoveObject() throws Exception { { msg("Open session & local transaction"); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOPushTransaction pushTransaction = openPushTransaction(transaction); file = pushTransaction.getFile(); CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath)); msg("Create a new elements"); Supplier supplier2 = getModel1Factory().createSupplier(); supplier2.setName("supplier" + System.currentTimeMillis()); resource.getContents().add(supplier2); msg("Move first supplier"); Supplier supplier1 = (Supplier) resource.getContents().get(0); resource.getContents().move(1, supplier1); assertEquals(supplierName, ((Supplier) resource.getContents().get(1)).getName()); msg("Commit"); pushTransaction.commit(); session.close(); } { msg("Reload previous local session"); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOPushTransaction pushTransaction = openPushTransaction(transaction, file); assertEquals(true, transaction.isDirty()); CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath)); assertEquals(supplierName, ((Supplier) resource.getContents().get(1)).getName()); push(transaction, pushTransaction); session.close(); } CDOSession session = openSession(); CDOView view = session.openView(); CDOResource resource = view.getResource(getResourcePath(resourcePath)); assertEquals(supplierName, ((Supplier) resource.getContents().get(1)).getName()); }
public static InternalCDOObject adapt(Object object, CDOView view) { if (view.isClosed()) { throw new IllegalStateException(Messages.getString("FSMUtil.0")); // $NON-NLS-1$ } if (object instanceof InternalCDOObject) { return (InternalCDOObject) object; } if (object == null) { throw new IllegalArgumentException(Messages.getString("FSMUtil.1")); // $NON-NLS-1$ } if (object instanceof InternalEObject) { if (!view.isLegacyModeEnabled()) { throw new LegacyModeNotEnabledException(); } return adaptLegacy((InternalEObject) object); } return null; }
public void testUpdateExistingObject() throws Exception { String newName = "supplier" + System.currentTimeMillis(); { msg("Open session & local transaction"); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOPushTransaction pushTransaction = openPushTransaction(transaction); file = pushTransaction.getFile(); CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath)); msg("Make a diff in existing element"); Supplier supplier = (Supplier) resource.getContents().get(0); supplier.setName(newName); msg("Commit"); pushTransaction.commit(); session.close(); } { msg("Reload previous local session"); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOPushTransaction pushTransaction = openPushTransaction(transaction, file); assertEquals(true, transaction.isDirty()); assertEquals(1, transaction.getRevisionDeltas().size()); push(transaction, pushTransaction); session.close(); } CDOSession session = openSession(); CDOView view = session.openView(); CDOResource resource = view.getResource(getResourcePath(resourcePath)); assertEquals(2, resource.getContents().size()); Supplier supplier = (Supplier) resource.getContents().get(0); assertNotNull(supplier); assertEquals(newName, supplier.getName()); }
private void testCDORevisionFetchWithChangesOnAllBranches( CDOSession session, CDOBranch currentBranch, SignalCounter signalCounter, CDOID companyCDOID, int expectedNbCategories, boolean prefetch) { CDOView view = session.openView(currentBranch); assertEquals(0, signalCounter.getCountFor(LoadRevisionsRequest.class)); String resourcePath = getResourcePath(RESOURCE_NAME); List<String> pathSegments = CDOURIUtil.analyzePath(resourcePath); CDOResource resource = view.getResource(resourcePath); assertEquals(pathSegments.size(), signalCounter.getCountFor(LoadRevisionsRequest.class)); if (prefetch) { resource.cdoPrefetch(CDORevision.DEPTH_INFINITE); } assertEquals(RESOURCE_NAME, resource.getName()); EObject eObject = resource.getContents().get(0); Assert.assertTrue(eObject instanceof Company); Company company = (Company) eObject; assertEquals(pathSegments.size() + 1, signalCounter.getCountFor(LoadRevisionsRequest.class)); Assert.assertEquals(expectedNbCategories, company.getCategories().size()); view.getRevision(companyCDOID); assertEquals(pathSegments.size() + 1, signalCounter.getCountFor(LoadRevisionsRequest.class)); view.getResourceSet().eAdapters().add(new EContentAdapter()); assertEquals(pathSegments.size() + 1, signalCounter.getCountFor(LoadRevisionsRequest.class)); view.close(); signalCounter.clearCounts(); }
/** See bug 315409. */ public void testInvalidationWithDeltas_SameBranch() throws Exception { CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOView view = session.openView(); Company company = getModel1Factory().createCompany(); company.setName("main-v1"); CDOResource resource = transaction.createResource(getResourcePath("/test1")); resource.getContents().add(company); commitAndSync(transaction, view); company.setName("main-v2"); commitAndSync(transaction, view); view.options().addChangeSubscriptionPolicy(CDOAdapterPolicy.ALL); Company company2 = view.getObject(company); company2.eAdapters().add(new AdapterImpl()); company.setName("main-v3"); commitAndSync(transaction, view); CDORevision revision2 = CDOUtil.getCDOObject(company2).cdoRevision(); assertEquals(3, revision2.getVersion()); assertEquals(transaction.getBranch(), revision2.getBranch()); assertEquals(transaction.getLastCommitTime(), revision2.getTimeStamp()); company.setName("main-v4"); commitAndSync(transaction, view); revision2 = CDOUtil.getCDOObject(company2).cdoRevision(); assertEquals(4, revision2.getVersion()); assertEquals(transaction.getBranch(), revision2.getBranch()); assertEquals(transaction.getLastCommitTime(), revision2.getTimeStamp()); }
public void testLockStateHeldByDurableView() throws CommitException { { CDOSession session1 = openSession(); CDOTransaction tx1 = session1.openTransaction(); tx1.enableDurableLocking(); CDOResource res1 = tx1.createResource(getResourcePath("r1")); Company company1 = getModel1Factory().createCompany(); res1.getContents().add(company1); tx1.commit(); CDOUtil.getCDOObject(company1).cdoWriteLock().lock(); tx1.close(); session1.close(); } CDOSession session2 = openSession(); CDOView controlView = session2.openView(); CDOResource resource = controlView.getResource(getResourcePath("r1")); Company company1 = (Company) resource.getContents().get(0); CDOObject cdoObj = CDOUtil.getCDOObject(company1); assertEquals(true, cdoObj.cdoWriteLock().isLockedByOthers()); assertEquals(true, cdoObj.cdoLockState().getWriteLockOwner().isDurableView()); session2.close(); }
private void withAutoRelease( CDOSession session1, CDOView controlView, boolean mustReceiveNotifications) throws CommitException { TestListener2 controlViewListener = new TestListener2(CDOViewLocksChangedEvent.class); controlView.addListener(controlViewListener); CDOTransaction tx1 = session1.openTransaction(); tx1.options().setAutoReleaseLocksEnabled(true); CDOResource res1 = tx1.getOrCreateResource(getResourcePath("r1")); res1.getContents().clear(); Company company = getModel1Factory().createCompany(); res1.getContents().add(company); tx1.commit(); implicitRelease(company, LockType.WRITE, tx1, controlViewListener, mustReceiveNotifications); implicitRelease(company, LockType.READ, tx1, controlViewListener, mustReceiveNotifications); implicitRelease(company, LockType.OPTION, tx1, controlViewListener, mustReceiveNotifications); }
@Override public IInternalPapyrusRepository getRepository(CDOView view) { IInternalPapyrusRepository result = null; int sessionID = view.getSessionID(); for (IInternalPapyrusRepository next : repositories.values()) { // if it's not connected, it can't be responsible for this view if (next.isConnected()) { if (next.getCDOSession().getSessionID() == sessionID) { result = next; break; } } } return result; }
public void testRemoveManyXRef() throws Exception { final List<OrderDetail> details = new ArrayList<OrderDetail>(); details.add(getModel1Factory().createOrderDetail()); details.add(getModel1Factory().createOrderDetail()); details.add(getModel1Factory().createOrderDetail()); details.add(getModel1Factory().createOrderDetail()); details.add(getModel1Factory().createOrderDetail()); details.add(getModel1Factory().createOrderDetail()); details.add(getModel1Factory().createOrderDetail()); details.add(getModel1Factory().createOrderDetail()); details.add(getModel1Factory().createOrderDetail()); details.add(getModel1Factory().createOrderDetail()); Product1 product = getModel1Factory().createProduct1(); product.setName("test1"); product.getOrderDetails().addAll(details); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/test1")); resource.getContents().add(product); resource.getContents().addAll(details); transaction.commit(); CDOSession session2 = openSession(); CDOView view = session2.openView(); view.options().addChangeSubscriptionPolicy(CDOAdapterPolicy.ALL); CDOResource resource2 = view.getResource(getResourcePath("/test1")); Product1 product2 = (Product1) resource2.getContents().get(0); Object[] strongRefs = product2.getOrderDetails().toArray(); // Keep those in memory msg(strongRefs); final TestAdapter adapter = new TestAdapter(); product2.eAdapters().add(adapter); details.remove(0); details.remove(0); details.remove(0); details.remove(4); details.remove(4); details.remove(4); product.getOrderDetails().removeAll(details); transaction.commit(); // TODO Consider to uncomment the following if bug 317144 is addressed in EMF // final Object[] oldValue = { null }; new PollingTimeOuter() { @Override protected boolean successful() { return adapter.getNotifications().length == details.size(); // TODO Consider to uncomment the following if bug 317144 is addressed in EMF // for (Notification notification : adapter.getNotifications()) // { // if (notification.getEventType() == Notification.REMOVE_MANY // && notification.getFeature() == getModel1Package().getProduct1_OrderDetails()) // { // oldValue[0] = notification.getOldValue(); // return true; // } // } // // return false; } }.assertNoTimeOut(); // TODO Consider to uncomment the following if bug 317144 is addressed in EMF // assertInstanceOf(Collection.class, oldValue[0]); // assertEquals(details.size(), ((Collection<?>)oldValue[0]).size()); }
public void testRemoveXRef() throws Exception { List<OrderDetail> details = new ArrayList<OrderDetail>(); details.add(getModel1Factory().createOrderDetail()); details.add(getModel1Factory().createOrderDetail()); details.add(getModel1Factory().createOrderDetail()); details.add(getModel1Factory().createOrderDetail()); details.add(getModel1Factory().createOrderDetail()); details.add(getModel1Factory().createOrderDetail()); details.add(getModel1Factory().createOrderDetail()); Product1 product = getModel1Factory().createProduct1(); product.setName("test1"); product.getOrderDetails().addAll(details); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/test1")); resource.getContents().add(product); resource.getContents().addAll(details); transaction.commit(); CDOSession session2 = openSession(); CDOView view = session2.openView(); view.options().addChangeSubscriptionPolicy(CDOAdapterPolicy.ALL); CDOResource resource2 = view.getResource(getResourcePath("/test1")); Product1 product2 = (Product1) resource2.getContents().get(0); Object[] strongRefs = product2.getOrderDetails().toArray(); // Keep those in memory msg(strongRefs); final TestAdapter adapter = new TestAdapter(); product2.eAdapters().add(adapter); details.remove(0); details.remove(0); details.remove(0); details.remove(1); details.remove(1); details.remove(1); product.getOrderDetails().removeAll(details); transaction.commit(); final Object[] oldValue = {null}; new PollingTimeOuter() { @Override protected boolean successful() { for (Notification notification : adapter.getNotifications()) { if (notification.getEventType() == Notification.REMOVE && notification.getFeature() == getModel1Package().getProduct1_OrderDetails()) { oldValue[0] = notification.getOldValue(); return true; } } return false; } }.assertNoTimeOut(); assertInstanceOf(OrderDetail.class, CDOUtil.getEObject((EObject) oldValue[0])); }
private CDOView openViewWithLockNotifications(CDOSession session, CDOBranch branch) { CDOView view = branch != null ? session.openView(branch) : session.openView(); view.options().setLockNotificationEnabled(true); return view; }
private void withExplicitRelease( CDOSession session1, CDOView controlView, boolean mustReceiveNotifications) throws CommitException { TestListener2 controlViewListener = new TestListener2(CDOViewLocksChangedEvent.class); controlView.addListener(controlViewListener); CDOTransaction tx1 = session1.openTransaction(); CDOResource res1 = tx1.getOrCreateResource(getResourcePath("r1")); TestListener2 transactionListener = new TestListener2(CDOViewLocksChangedEvent.class); tx1.addListener(transactionListener); res1.getContents().clear(); Company company = getModel1Factory().createCompany(); res1.getContents().add(company); tx1.commit(); CDOObject cdoCompany = CDOUtil.getCDOObject(company); CDOObject cdoCompanyInControlView = null; if (mustReceiveNotifications) { cdoCompanyInControlView = controlView.getObject(cdoCompany.cdoID()); } /* Test write lock */ cdoCompany.cdoWriteLock().lock(); if (mustReceiveNotifications) { controlViewListener.waitFor(1); assertEquals(1, controlViewListener.getEvents().size()); CDOViewLocksChangedEvent event = (CDOViewLocksChangedEvent) controlViewListener.getEvents().get(0); assertLockOwner(tx1, event.getLockOwner()); CDOLockState[] lockStates = event.getLockStates(); assertEquals(1, lockStates.length); assertLockedObject(cdoCompany, lockStates[0].getLockedObject()); assertLockOwner(tx1, lockStates[0].getWriteLockOwner()); assertSame(cdoCompanyInControlView.cdoLockState(), lockStates[0]); } cdoCompany.cdoWriteLock().unlock(); if (mustReceiveNotifications) { controlViewListener.waitFor(2); assertEquals(2, controlViewListener.getEvents().size()); CDOViewLocksChangedEvent event = (CDOViewLocksChangedEvent) controlViewListener.getEvents().get(1); assertLockOwner(tx1, event.getLockOwner()); CDOLockState[] lockStates = event.getLockStates(); assertEquals(1, lockStates.length); assertLockedObject(cdoCompany, lockStates[0].getLockedObject()); assertNull(lockStates[0].getWriteLockOwner()); assertSame(cdoCompanyInControlView.cdoLockState(), lockStates[0]); } /* Test read lock */ cdoCompany.cdoReadLock().lock(); if (mustReceiveNotifications) { controlViewListener.waitFor(3); assertEquals(3, controlViewListener.getEvents().size()); CDOViewLocksChangedEvent event = (CDOViewLocksChangedEvent) controlViewListener.getEvents().get(2); assertLockOwner(tx1, event.getLockOwner()); CDOLockState[] lockStates = event.getLockStates(); assertEquals(1, lockStates.length); assertLockedObject(cdoCompany, lockStates[0].getLockedObject()); assertEquals(1, lockStates[0].getReadLockOwners().size()); CDOLockOwner tx1Lo = CDOLockUtil.createLockOwner(tx1); assertEquals(true, lockStates[0].getReadLockOwners().contains(tx1Lo)); assertSame(cdoCompanyInControlView.cdoLockState(), lockStates[0]); } cdoCompany.cdoReadLock().unlock(); if (mustReceiveNotifications) { controlViewListener.waitFor(4); assertEquals(4, controlViewListener.getEvents().size()); CDOViewLocksChangedEvent event = (CDOViewLocksChangedEvent) controlViewListener.getEvents().get(3); assertLockOwner(tx1, event.getLockOwner()); CDOLockState[] lockStates = event.getLockStates(); assertEquals(1, lockStates.length); assertEquals(0, lockStates[0].getReadLockOwners().size()); assertSame(cdoCompanyInControlView.cdoLockState(), lockStates[0]); } /* Test write option */ cdoCompany.cdoWriteOption().lock(); if (mustReceiveNotifications) { controlViewListener.waitFor(5); assertEquals(5, controlViewListener.getEvents().size()); CDOViewLocksChangedEvent event = (CDOViewLocksChangedEvent) controlViewListener.getEvents().get(4); assertLockOwner(tx1, event.getLockOwner()); CDOLockState[] lockStates = event.getLockStates(); assertEquals(1, lockStates.length); assertLockedObject(cdoCompany, lockStates[0].getLockedObject()); assertLockOwner(tx1, lockStates[0].getWriteOptionOwner()); assertSame(cdoCompanyInControlView.cdoLockState(), lockStates[0]); } cdoCompany.cdoWriteOption().unlock(); if (mustReceiveNotifications) { controlViewListener.waitFor(6); assertEquals(6, controlViewListener.getEvents().size()); CDOViewLocksChangedEvent event = (CDOViewLocksChangedEvent) controlViewListener.getEvents().get(5); assertLockOwner(tx1, event.getLockOwner()); CDOLockState[] lockStates = event.getLockStates(); assertEquals(1, lockStates.length); assertLockedObject(cdoCompany, lockStates[0].getLockedObject()); assertNull(lockStates[0].getWriteOptionOwner()); assertSame(cdoCompanyInControlView.cdoLockState(), lockStates[0]); } assertEquals(0, transactionListener.getEvents().size()); if (!mustReceiveNotifications) { assertEquals(0, controlViewListener.getEvents().size()); } }
@Requires(IRepositoryConfig.CAPABILITY_OFFLINE) @Skips("DB.ranges") // Too slow in DB.ranges (11 minutes), see bug 357441 public void testOfflineCloneSynchronization() throws Exception { disableConsole(); // create an offline clone. InternalRepository clone = getRepository(); waitForOnline(clone); // create master session & transaction. InternalRepository master = getRepository("master"); CDOSession masterSession = openSession(master.getName()); CDOTransaction masterTransaction = masterSession.openTransaction(); // create client session & transaction. CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); // doing this that client notifications are built upon RevisionDeltas instead of RevisionKeys. session.options().setPassiveUpdateMode(PassiveUpdateMode.CHANGES); // create additional client sessions. CDOView[] cloneViews = new CDOView[NUM_CLIENT_VIEWS + 1]; for (int i = 0; i < NUM_CLIENT_VIEWS; i++) { CDOView view = session.openView(); cloneViews[i] = view; } cloneViews[NUM_CLIENT_VIEWS] = transaction; // create resource and base model. CDOResource resource = masterTransaction.createResource(getResourcePath("/my/resource")); Company company = getModel1Factory().createCompany(); Category catA = getModel1Factory().createCategory(); catA.setName("CatA"); company.getCategories().add(catA); Category catB = getModel1Factory().createCategory(); catB.setName("CatB"); company.getCategories().add(catB); resource.getContents().add(company); for (int i = 0; i < NUM_PRODUCTS; i++) { Product1 product = getModel1Factory().createProduct1(); product.setName("Product" + i); catA.getProducts().add(product); } masterTransaction.commit(); transaction.waitForUpdate(masterTransaction.getLastCommitTime(), 1000); // touch the objects on the views to actually receive updates. for (CDOView view : cloneViews) { Category vCatA = (Category) view.getObject(CDOUtil.getCDOObject(catA).cdoID()); Category vCatB = (Category) view.getObject(CDOUtil.getCDOObject(catB).cdoID()); vCatB.getName(); for (Product1 vProduct : vCatA.getProducts()) { vProduct.getName(); } } // do a lot of changes on master session. long start = System.currentTimeMillis(); for (int i = 0; i < NUM_PRODUCTS; i++) { Product1 p = catA.getProducts().remove(0); catB.getProducts().add(p); catB.getProducts().move(0, p); masterTransaction.commit(); } Thread.sleep(100); catA.setName(catA.getName() + " empty"); masterTransaction.commit(); System.out.println( MessageFormat.format( "## Committing changes on {0} products took: {1}", NUM_PRODUCTS, System.currentTimeMillis() - start)); // session.waitForUpdate(masterTransaction.getLastCommitTime(), 5000); for (CDOView view : cloneViews) { view.waitForUpdate(masterTransaction.getLastCommitTime(), 5000); } // adding this sleep as the waitForUpdate does not seem to work as expected in case of an error. sleep(5000); System.out.println("## Started checking...."); // check if all changes are made. Category cloneCatA = (Category) transaction.getObject(CDOUtil.getCDOObject(catA).cdoID()); Category cloneCatB = (Category) transaction.getObject(CDOUtil.getCDOObject(catB).cdoID()); System.out.println( "CatA IdVersion: " + CDOUtil.getCDOObject(cloneCatA).cdoRevision().toString()); System.out.println( "CatB IdVersion: " + CDOUtil.getCDOObject(cloneCatB).cdoRevision().toString()); assertEquals(NUM_PRODUCTS, cloneCatB.getProducts().size()); assertEquals(0, cloneCatA.getProducts().size()); assertEquals(catA.getName(), cloneCatA.getName()); }