Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » TMF (Xtext) » Synchronization issues in the Outline view
Synchronization issues in the Outline view [message #734977] Mon, 10 October 2011 14:52 Go to next message
Vlad Gheorghe is currently offline Vlad GheorgheFriend
Messages: 127
Registered: May 2011
Senior Member
Hello,


I've customized the Outline view of my xtext editor by providing <MyDsl>OutlineTreeProvider extends DefaultOutlineTreeProvider.

I'm using a private instance of <MyDsl>ItemProviderAdapterFactory in order to generate labels for the outline tree elements.
( I want different labels in outline than the ones provided by the xtext <MyDsl>LabelProvider).

The problem is that I get synchronization-related exceptions on view update (see stack traces below).

I've assumed that access to IOutlineTreeProvider must not be synchronized, as instances are always accessed from a single thread (during IUnitOfWork, cf. javadoc).

Is it possible that several IUnitOfWork be executed concurrently ?
If so, shouldn't this be specified in the api ? (e.g. make methods synchronized.. )

Has anyone had similar problems ?

Best regards,
Vlad Gheorghe


Stack Traces:

!ENTRY org.eclipse.xtext.ui 4 0 2011-10-10 16:19:13.829
!MESSAGE Error refreshing outline
!STACK 0
java.util.ConcurrentModificationException
at org.eclipse.emf.common.util.AbstractEList$EIterator.checkModCount(AbstractEList.java:762)
at org.eclipse.emf.common.util.AbstractEList$EIterator.doNext(AbstractEList.java:710)
at org.eclipse.emf.common.util.AbstractEList$EIterator.next(AbstractEList.java:696)
at org.eclipse.emf.common.notify.impl.AdapterFactoryImpl.adapt(AdapterFactoryImpl.java:86)
at com.thalesgroup.dts.l905.ptest.provider.PtestItemProviderAdapterFactory.adapt(PtestItemProviderAdapterFactory.java:392)
at org.eclipse.emf.common.notify.impl.AdapterFactoryImpl.adapt(AdapterFactoryImpl.java:63)
at com.thalesgroup.dts.l905.ptest.provider.PtestItemProviderAdapterFactory.adapt(PtestItemProviderAdapterFactory.java:403)
at org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider.getText(AdapterFactoryLabelProvider.java:376)
at com.thalesgroup.dts.l905.ptest.lang.ui.outline.PTestOutlineTreeProvider._text(PTestOutlineTreeProvider.java:108)
at sun.reflect.GeneratedMethodAccessor22.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291)
at org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider.createEObjectNode(DefaultOutlineTreeProvider.java:112)
at org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider._createNode(DefaultOutlineTreeProvider.java:108)
at sun.reflect.GeneratedMethodAccessor21.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291)
at org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider.createNode(DefaultOutlineTreeProvider.java:104)
at com.thalesgroup.dts.l905.ptest.lang.ui.outline.PTestOutlineTreeProvider._createChildren(PTestOutlineTreeProvider.java:53)
at sun.reflect.GeneratedMethodAccessor27.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291)
at org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider.createChildren(DefaultOutlineTreeProvider.java:77)
at org.eclipse.xtext.ui.editor.outline.impl.AbstractOutlineNode$1.process(AbstractOutlineNode.java:80)
at org.eclipse.xtext.ui.editor.outline.impl.AbstractOutlineNode$1.process(AbstractOutlineNode.java:1)
at org.eclipse.xtext.util.concurrent.IUnitOfWork$Void.exec(IUnitOfWork.java:36)
at org.eclipse.xtext.ui.editor.outline.impl.DocumentRootNode$1.exec(DocumentRootNode.java:47)
at org.eclipse.xtext.ui.editor.outline.impl.DocumentRootNode$1.exec(DocumentRootNode.java:1)
at org.eclipse.xtext.util.concurrent.AbstractReadWriteAcces.readOnly(AbstractReadWriteAcces.java:32)
at org.eclipse.xtext.ui.editor.model.XtextDocument.readOnly(XtextDocument.java:86)
at org.eclipse.xtext.ui.editor.outline.impl.DocumentRootNode.readOnly(DocumentRootNode.java:44)
at org.eclipse.xtext.ui.editor.outline.impl.AbstractOutlineNode.getChildren(AbstractOutlineNode.java:77)
at org.eclipse.xtext.ui.editor.outline.impl.OutlineRefreshJob.restoreChildrenSelectionAndExpansion(OutlineRefreshJob.java:68)
at org.eclipse.xtext.ui.editor.outline.impl.OutlineRefreshJob$1.exec(OutlineRefreshJob.java:60)
at org.eclipse.xtext.ui.editor.outline.impl.OutlineRefreshJob$1.exec(OutlineRefreshJob.java:1)
at org.eclipse.xtext.util.concurrent.AbstractReadWriteAcces.readOnly(AbstractReadWriteAcces.java:32)
at org.eclipse.xtext.ui.editor.model.XtextDocument.readOnly(XtextDocument.java:86)
at org.eclipse.xtext.ui.editor.outline.impl.OutlineRefreshJob.refreshOutlineModel(OutlineRefreshJob.java:57)
at org.eclipse.xtext.ui.editor.outline.impl.OutlineRefreshJob.run(OutlineRefreshJob.java:46)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)

!ENTRY org.eclipse.xtext.ui 4 0 2011-10-10 16:19:38.180
!MESSAGE Error refreshing outline
!STACK 0
java.lang.NullPointerException
at org.eclipse.emf.common.notify.impl.AdapterFactoryImpl.adapt(AdapterFactoryImpl.java:88)
at com.thalesgroup.dts.l905.ptest.provider.PtestItemProviderAdapterFactory.adapt(PtestItemProviderAdapterFactory.java:392)
at org.eclipse.emf.edit.provider.ComposedAdapterFactory.adapt(ComposedAdapterFactory.java:300)
at org.eclipse.emf.edit.provider.ComposedAdapterFactory.adapt(ComposedAdapterFactory.java:277)
at org.eclipse.emf.edit.provider.ComposedAdapterFactory.adapt(ComposedAdapterFactory.java:264)
at org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider.getImage(AdapterFactoryLabelProvider.java:332)
at org.eclipse.xtext.ui.label.AbstractLabelProvider.getImage(AbstractLabelProvider.java:50)
at org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider._image(DefaultOutlineTreeProvider.java:183)
at sun.reflect.GeneratedMethodAccessor23.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291)
at org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider.createEObjectNode(DefaultOutlineTreeProvider.java:113)
at org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider._createNode(DefaultOutlineTreeProvider.java:108)
at sun.reflect.GeneratedMethodAccessor21.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291)
at org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider.createNode(DefaultOutlineTreeProvider.java:104)
at com.thalesgroup.dts.l905.ptest.lang.ui.outline.PTestOutlineTreeProvider._createChildren(PTestOutlineTreeProvider.java:53)
at sun.reflect.GeneratedMethodAccessor27.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291)
at org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider.createChildren(DefaultOutlineTreeProvider.java:77)
at org.eclipse.xtext.ui.editor.outline.impl.AbstractOutlineNode$1.process(AbstractOutlineNode.java:80)
at org.eclipse.xtext.ui.editor.outline.impl.AbstractOutlineNode$1.process(AbstractOutlineNode.java:1)
at org.eclipse.xtext.util.concurrent.IUnitOfWork$Void.exec(IUnitOfWork.java:36)
at org.eclipse.xtext.ui.editor.outline.impl.DocumentRootNode$1.exec(DocumentRootNode.java:47)
at org.eclipse.xtext.ui.editor.outline.impl.DocumentRootNode$1.exec(DocumentRootNode.java:1)
at org.eclipse.xtext.util.concurrent.AbstractReadWriteAcces.readOnly(AbstractReadWriteAcces.java:32)
at org.eclipse.xtext.ui.editor.model.XtextDocument.readOnly(XtextDocument.java:86)
at org.eclipse.xtext.ui.editor.outline.impl.DocumentRootNode.readOnly(DocumentRootNode.java:44)
at org.eclipse.xtext.ui.editor.outline.impl.AbstractOutlineNode.getChildren(AbstractOutlineNode.java:77)
at org.eclipse.xtext.ui.editor.outline.impl.OutlineRefreshJob.restoreChildrenSelectionAndExpansion(OutlineRefreshJob.java:68)
at org.eclipse.xtext.ui.editor.outline.impl.OutlineRefreshJob$1.exec(OutlineRefreshJob.java:60)
at org.eclipse.xtext.ui.editor.outline.impl.OutlineRefreshJob$1.exec(OutlineRefreshJob.java:1)
at org.eclipse.xtext.util.concurrent.AbstractReadWriteAcces.readOnly(AbstractReadWriteAcces.java:32)
at org.eclipse.xtext.ui.editor.model.XtextDocument.readOnly(XtextDocument.java:86)
at org.eclipse.xtext.ui.editor.outline.impl.OutlineRefreshJob.refreshOutlineModel(OutlineRefreshJob.java:57)
at org.eclipse.xtext.ui.editor.outline.impl.OutlineRefreshJob.run(OutlineRefreshJob.java:46)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
Re: Synchronization issues in the Outline view [message #735047 is a reply to message #734977] Mon, 10 October 2011 18:34 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
Hi,

i guess it is a bad idea to change the model when building the outline.
using an adapter you might actually doing this.
why dont you inject just another labelprovider

public class MyDslOutlineTreeProvider extends DefaultOutlineTreeProvider {
	
	@Inject
	@Named("dummy")
	protected ILabelProvider labelProvider2;
	
	@Override
	protected Object _text(Object modelElement) {
		if (labelProvider2 instanceof IStyledLabelProvider)
			return ((IStyledLabelProvider) labelProvider2).getStyledText(modelElement);
		else
			return labelProvider2.getText(modelElement);
	}
	
}


public class MyDslUiModule extends org.xtext.example.mydsl.ui.AbstractMyDslUiModule {
	public MyDslUiModule(AbstractUIPlugin plugin) {
		super(plugin);
	}
	
	public void configureILabelProvider2(Binder binder) {
		binder.bind(ILabelProvider.class).annotatedWith(Names.named("dummy")).to(MyDslLabelProvider2.class);
	}
}


~Christian


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: Synchronization issues in the Outline view [message #735079 is a reply to message #735047] Mon, 10 October 2011 21:32 Go to previous messageGo to next message
Vlad Gheorghe is currently offline Vlad GheorgheFriend
Messages: 127
Registered: May 2011
Senior Member
Hello Christian,

Thanks for the response.

Does this mean that the EMF-edit generated ItemProvider cannot be used as the ILabelProvider in this case, because it is also an adapter ?

Regards,
Vlad


Re: Synchronization issues in the Outline view [message #735085 is a reply to message #735079] Mon, 10 October 2011 21:51 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
Hi,

I have no idea. I just guessed. I don't have emf souce Code here so i cannot check or debug. Regards Christian


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de

[Updated on: Mon, 10 October 2011 21:53]

Report message to a moderator

Re: Synchronization issues in the Outline view [message #735186 is a reply to message #735079] Tue, 11 October 2011 07:36 Go to previous messageGo to next message
Sebastian Zarnekow is currently offline Sebastian ZarnekowFriend
Messages: 3118
Registered: July 2009
Senior Member
Hi Vlad,

IUnitOfWorks should be designed to allow concurrent execution. Otherwise
you'd block e.g. the syntax highlighter if the validation is
performened. If you want to synchronize something in the sense of
exclusive resource access, you could try to use IXtextDocument#modify.

Regards,
Sebastian
--
Need professional support for Eclipse Modeling?
Go visit: http://xtext.itemis.com

On 10.10.11 23:32, Vlad Gheorghe wrote:
> Hello Christian,
>
> Thanks for the response.
>
> Does this mean that the EMF-edit generated ItemProvider cannot be used
> as the ILabelProvider in this case, because it is also an adapter ?
>
> Regards,
> Vlad
>
>
>
Re: Synchronization issues in the Outline view [message #735199 is a reply to message #735079] Tue, 11 October 2011 08:05 Go to previous message
Jan Koehnlein is currently offline Jan KoehnleinFriend
Messages: 760
Registered: July 2009
Location: Hamburg
Senior Member
Xtext's AbstractLabelProvider implements several label provider
superclasses and interfaces from JFace and EMF.

The DefaultEObjectLabelProvider delegates to an EMF
AdapterFactoryLabelProvider by default, so there is no need to register
it as an adapter to the model elements.

As the name suggests, the method IOultineNode.readOnly() should not
change the model. It only aquires a read lock to the model (read
transactions can run in parallel). Adding adapters is a change.

The DefaultOutlineTreeProvider also allows to override images and texts
for the nodes by means of polymorphic dispatch (_text and _image
methods). These are called within a read transaction.

Am 10.10.11 23:32, schrieb Vlad Gheorghe:
> Hello Christian,
>
> Thanks for the response.
>
> Does this mean that the EMF-edit generated ItemProvider cannot be used
> as the ILabelProvider in this case, because it is also an adapter ?
>
> Regards,
> Vlad
>
>
>


--
Need professional support for Eclipse Modeling?
Go visit: http://xtext.itemis.com


---
Get professional support from the Xtext committers at www.typefox.io
Previous Topic:resolve cross-reference during creating EObjectDescription
Next Topic:Automatic braces completion
Goto Forum:
  


Current Time: Fri Apr 19 21:16:26 GMT 2024

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

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

Back to the top