Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » Graphiti » CDO Transaction Problem(CDO Transaction Problem)
CDO Transaction Problem [message #1273051] Wed, 19 March 2014 12:02 Go to next message
John Anderson is currently offline John AndersonFriend
Messages: 2
Registered: March 2014
Junior Member
Hi.
I am trying to deposit an EClass object which I have retrieved from a graphiti diagram to the CDO repository but I receive a write transaction error. The error doesn't appear if I create a new empty EClass object and store it to the CDO repository. I have included my code and the error message to this post.

Thank you in advance for any help you can provide in this problem.
John Anderson

Source code:
package uk.man.ac.graphiti.toolbarbuttons;

import java.util.List;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.net4j.CDONet4jSession;
import org.eclipse.emf.cdo.net4j.CDONet4jSessionConfiguration;
import org.eclipse.emf.cdo.net4j.CDONet4jUtil;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CommitException;
import org.eclipse.emf.cdo.util.ConcurrentAccessException;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.graphiti.mm.pictograms.ContainerShape;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.eclipse.graphiti.platform.IDiagramContainer;
import org.eclipse.graphiti.services.Graphiti;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.net4j.Net4jUtil;
import org.eclipse.net4j.connector.IConnector;
import org.eclipse.net4j.tcp.TCPUtil;
import org.eclipse.net4j.util.container.IPluginContainer;
import org.eclipse.net4j.util.lifecycle.ILifecycle;
import org.eclipse.net4j.util.lifecycle.LifecycleEventAdapter;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.HandlerUtil;

public class Deposit extends AbstractHandler {

private static CDONet4jSession cdoSession;

public static CDONet4jSession openSession(String repoName) {
CDONet4jSession session = null;
try {
final IConnector connector = (IConnector) IPluginContainer.INSTANCE
.getElement( //
"org.eclipse.net4j.connectors", // Product group
"tcp", // Type
"localhost"); // Description

CDONet4jSessionConfiguration config = CDONet4jUtil
.createNet4jSessionConfiguration();
config.setConnector(connector);
config.setRepositoryName(repoName);

session = config.openNet4jSession();


} catch (Exception e) {
return null;
}

return session;
}

@Override
public Object execute(ExecutionEvent event) {
String msg = null;
EClass eclass = null;
IWorkbench wb = PlatformUI.getWorkbench();
IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
IWorkbenchPage page = win.getActivePage();
IEditorPart editor = page.getActiveEditor();
if (editor instanceof IDiagramContainer) {
IDiagramContainer graphitiEditor = (IDiagramContainer) editor;
System.out.println("total.pe.elements="+graphitiEditor.getSelectedPictogramElements().length);
PictogramElement pe = graphitiEditor.getSelectedPictogramElements()[0];
Object bo = Graphiti.getLinkService()
.getBusinessObjectForLinkedPictogramElement(pe);
System.out.println("in1");
if (bo == null) {
msg = "You must select an EClass object";
sendMessage(event, msg);
System.out.println("in2");
} else {
if (bo instanceof EClass) {
eclass = (EClass) bo;

try {
System.out.println("in3");
Net4jUtil.prepareContainer(IPluginContainer.INSTANCE);
TCPUtil.prepareContainer(IPluginContainer.INSTANCE);
cdoSession = openSession("graphiti");

if (cdoSession != null) {
CDOTransaction transaction = cdoSession
.openTransaction();
CDOResource resource = transaction
.getOrCreateResource("/depositUsingButtonResource");

List<EObject> eclasslist = resource.getContents();
Boolean exists = false;
EClass temp = null;
for (int i = 0; i < eclasslist.size(); i++) {
temp = (EClass) eclasslist.get(i);
if (temp.getName().matches(eclass.getName())) {
exists = true;
break;
}
}
if (exists == true) {
msg = "Object already exists in repository";
} else {
resource.getContents().add(eclass);
transaction.commit();
msg = "Successful Deposit";
}

sendMessage(event, msg);
} else {
msg = "Deposit failed";
sendMessage(event, msg);
}
cdoSession.close();
} catch (ConcurrentAccessException e) {
msg = "Deposit failed";
sendMessage(event, msg);
} catch (CommitException e) {
msg = "Deposit failed";
sendMessage(event, msg);
}

}
}
}
return null;
}

private void sendMessage(ExecutionEvent event, String msg) {
MessageDialog.openInformation(
HandlerUtil.getActiveWorkbenchWindow(event).getShell(),
"Result", msg);
}
}


Error Message:

!ENTRY org.eclipse.ui 4 0 2014-03-19 12:00:04.847
!MESSAGE Unhandled event loop exception
!STACK 0
org.eclipse.e4.core.di.InjectionException: java.lang.IllegalStateException: Cannot modify resource set without a write transaction
at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:63)
at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:243)
at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:224)
at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132)
at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:167)
at org.eclipse.core.commands.Command.executeWithChecks(Command.java:499)
at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:508)
at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:213)
at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.executeItem(HandledContributionItem.java:850)
at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.handleWidgetSelection(HandledContributionItem.java:743)
at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.access$7(HandledContributionItem.java:727)
at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem$4.handleEvent(HandledContributionItem.java:662)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1057)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4170)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3759)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1113)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:997)
at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:138)
at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:610)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:567)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:124)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:354)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:181)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:636)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:591)
at org.eclipse.equinox.launcher.Main.run(Main.java:1450)
at org.eclipse.equinox.launcher.Main.main(Main.java:1426)
Caused by: java.lang.IllegalStateException: Cannot modify resource set without a write transaction
at org.eclipse.emf.transaction.impl.TransactionChangeRecorder.assertWriting(TransactionChangeRecorder.java:348)
at org.eclipse.emf.transaction.impl.TransactionChangeRecorder.appendNotification(TransactionChangeRecorder.java:302)
at org.eclipse.emf.transaction.impl.TransactionChangeRecorder.processResourceNotification(TransactionChangeRecorder.java:272)
at org.eclipse.emf.transaction.impl.TransactionChangeRecorder.notifyChanged(TransactionChangeRecorder.java:238)
at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:374)
at org.eclipse.emf.common.notify.impl.NotificationImpl.dispatch(NotificationImpl.java:1027)
at org.eclipse.emf.common.notify.impl.DelegatingNotifyingListImpl.addUnique(DelegatingNotifyingListImpl.java:305)
at org.eclipse.emf.common.util.AbstractEList.add(AbstractEList.java:303)
at uk.man.ac.graphiti.toolbarbuttons.Deposit.execute(Deposit.java:113)
at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:290)
at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:90)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:56)
... 37 more

Re: CDO Transaction Problem [message #1273779 is a reply to message #1273051] Thu, 20 March 2014 14:29 Go to previous messageGo to next message
Martin Hanysz is currently offline Martin HanyszFriend
Messages: 30
Registered: November 2013
Member
Dear John,

the error looks like you are modifying a Resource of your editor. Since Graphiti uses a TransactionalEditingDomain for its ResourceSet, you always have to create a write transaction to modify them. Only inside your Graphiti Features this is unnecessary because the Graphiti Framework itself will handle the creation of write transactions for you.

I looked over your code and it seems you are adding the business object (variable "eclass") to a CDOResource. If that business object is originally contained in your diagram editor's resource, the line
resource.getContents().add(eclass);

may also remove it from this resource, which requires a write transaction on the editor's TransactionalEditingDomain.

Hope this helps,
Martin

PS: when posting code, try to use the code markup tags ([_code][_/code] without the _) so the formatting of your code is correct.

[Updated on: Thu, 20 March 2014 14:30]

Report message to a moderator

Re: CDO Transaction Problem [message #1274449 is a reply to message #1273779] Fri, 21 March 2014 13:30 Go to previous messageGo to next message
John Anderson is currently offline John AndersonFriend
Messages: 2
Registered: March 2014
Junior Member
Thank you Martin for your help. I solved my transaction problem.
Re: CDO Transaction Problem [message #1274492 is a reply to message #1274449] Fri, 21 March 2014 14:54 Go to previous message
Martin Hanysz is currently offline Martin HanyszFriend
Messages: 30
Registered: November 2013
Member
John, do you mind telling us what the actual solution to your problem was? Maybe other users face a similar problem and look for help in this thread.

Best regards,
Martin

[Updated on: Fri, 21 March 2014 14:55]

Report message to a moderator

Previous Topic:Create source Anchor while starting Connection
Next Topic:Professional Support
Goto Forum:
  


Current Time: Sat Apr 27 00:56:41 GMT 2024

Powered by FUDForum. Page generated in 0.03197 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top