2014-03-19 138 views
0

我试图将从图表图中检索到的EClass对象存入CDO存储库,但收到写入交易错误。如果我创建一个新的空EClass对象并将其存储到CDO存储库,则不会出现该错误。我已将我的代码和错误消息添加到此帖子中。CDO交易问题

非常感谢您提供任何帮助,您可以在此问题中提供帮助。 约翰·安德森

的源代码:

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); 
} 
} 

错误消息:

!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 

回答

0

根据您提供这个堆栈跟踪是不与CDO交易中的问题,而是用来自EMF交易项目“org.eclipse.emf.transaction”的交易(或缺乏交易)。