/****************************************************************************** * Copyright (c) 2007 g-Eclipse consortium * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Initial development of the original code was made for * project g-Eclipse founded by European Union * project number: FP6-IST-034327 http://www.geclipse.eu/ * * Contributor(s): * UCY (http://www.ucy.cs.ac.cy) * - Nicholas Loulloudes (loulloudes.n@cs.ucy.ac.cy) * *****************************************************************************/ package eu.geclipse.jsdl.ui.editors; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.EventObject; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IResourceDeltaVisitor; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.emf.common.command.BasicCommandStack; import org.eclipse.emf.common.command.CommandStackListener; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl; import org.eclipse.emf.common.ui.MarkerHelper; import org.eclipse.emf.common.util.BasicDiagnostic; import org.eclipse.emf.common.util.Diagnostic; import org.eclipse.emf.common.util.TreeIterator; import org.eclipse.emf.common.util.URI; 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.util.EContentAdapter; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.edit.domain.IEditingDomainProvider; import org.eclipse.emf.edit.provider.ComposedAdapterFactory; import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory; import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory; import org.eclipse.emf.edit.ui.util.EditUIMarkerHelper; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.PartInitException; import org.eclipse.ui.actions.WorkspaceModifyOperation; import org.eclipse.ui.dialogs.SaveAsDialog; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.events.IHyperlinkListener; import org.eclipse.ui.forms.widgets.Form; import org.eclipse.ui.ide.FileStoreEditorInput; import org.eclipse.ui.part.FileEditorInput; import org.eclipse.ui.part.MultiPageEditorSite; import org.eclipse.wst.sse.ui.StructuredTextEditor; import eu.geclipse.core.model.GridModel; import eu.geclipse.jsdl.JSDLJobDescription; import eu.geclipse.jsdl.model.base.DocumentRoot; import eu.geclipse.jsdl.model.base.JobDefinitionType; import eu.geclipse.jsdl.ui.adapters.posix.PosixAdaptersFactory; import eu.geclipse.jsdl.ui.internal.Activator; import eu.geclipse.jsdl.ui.internal.pages.DataStagingPage; import eu.geclipse.jsdl.ui.internal.pages.JobApplicationPage; import eu.geclipse.jsdl.ui.internal.pages.JobDefinitionPage; import eu.geclipse.jsdl.ui.internal.pages.NewParametricPage; import eu.geclipse.jsdl.ui.internal.pages.OverviewPage; import eu.geclipse.jsdl.ui.internal.pages.ResourcesPage; /** * This class provides a Multi-Page Editor for editing JSDL Documents. It * comprises of four pages and a raw source editor. * * @see JobDefinitionPage <p> * @see JobApplicationPage <p> * @see ResourcesPage <p> * @see DataStagingPage <p> */ public final class JsdlEditor extends FormEditor implements IEditingDomainProvider { protected AdapterFactoryEditingDomain editingDomain; protected Collection<Resource> savedResources = new ArrayList<Resource>(); protected Collection<Resource> removedResources = new ArrayList<Resource>(); protected Collection<Resource> changedResources = new ArrayList<Resource>(); protected ISelection editorSelection = StructuredSelection.EMPTY; protected Map<Resource, Diagnostic> resourceToDiagnosticMap = new LinkedHashMap<Resource, Diagnostic>(); protected boolean updateProblemIndication = true; protected MarkerHelper markerHelper = new EditUIMarkerHelper(); protected ComposedAdapterFactory adapterFactory; protected JobDefinitionType jobDefType = null; protected DocumentRoot documentRoot = null; /** * This listens for workspace changes. */ protected IResourceChangeListener resourceChangeListener = new IResourceChangeListener() { public void resourceChanged( final IResourceChangeEvent event ) { // Only listening to these. // if (event.getType() == IResourceDelta.POST_CHANGE) { IResourceDelta delta = event.getDelta(); try { class ResourceDeltaVisitor implements IResourceDeltaVisitor { protected ResourceSet resourceSet = JsdlEditor.this.editingDomain.getResourceSet(); protected Collection<Resource> changedRes = new ArrayList<Resource>(); protected Collection<Resource> removedRes = new ArrayList<Resource>(); public boolean visit( final IResourceDelta visitDelta ) { if( visitDelta.getFlags() != IResourceDelta.MARKERS && visitDelta.getResource().getType() == IResource.FILE ) { if( ( visitDelta.getKind() & ( IResourceDelta.CHANGED | IResourceDelta.REMOVED ) ) != 0 ) { Resource resource = this.resourceSet.getResource( URI.createURI( visitDelta.getFullPath() .toString() ), false ); if( resource != null ) { if( ( visitDelta.getKind() & IResourceDelta.REMOVED ) != 0 ) { this.removedRes.add( resource ); } else if( !JsdlEditor.this.savedResources.remove( resource ) ) { this.changedRes.add( resource ); } } } } return true; } public Collection<Resource> getChangedResources() { return this.changedRes; } public Collection<Resource> getRemovedResources() { return this.removedRes; } } ResourceDeltaVisitor visitor = new ResourceDeltaVisitor(); delta.accept( visitor ); if( !visitor.getRemovedResources().isEmpty() ) { JsdlEditor.this.removedResources.addAll( visitor.getRemovedResources() ); if( !isDirty() ) { getSite().getShell().getDisplay().syncExec( new Runnable() { public void run() { getSite().getPage().closeEditor( JsdlEditor.this, false ); // close editor also disposes editor } } ); } } if( !visitor.getChangedResources().isEmpty() ) { JsdlEditor.this.changedResources.addAll( visitor.getChangedResources() ); if( getSite().getPage().getActiveEditor() == JsdlEditor.this ) { getSite().getShell().getDisplay().asyncExec( new Runnable() { public void run() { handleActivate(); } } ); } } } catch( CoreException exception ) { Activator.logException( exception ); } } } }; /** * Adapter used to update the problem indication when resources are demanded * loaded. */ protected EContentAdapter problemIndicationAdapter = new EContentAdapter() { @Override public void notifyChanged( final Notification notification ) { if( notification.getNotifier() instanceof Resource ) { switch( notification.getFeatureID( Resource.class ) ) { case Resource.RESOURCE__IS_LOADED: case Resource.RESOURCE__ERRORS: case Resource.RESOURCE__WARNINGS: { Resource resource = ( Resource )notification.getNotifier(); Diagnostic diagnostic = analyzeResourceProblems( ( Resource )notification.getNotifier(), null ); if( diagnostic.getSeverity() != Diagnostic.OK ) { JsdlEditor.this.resourceToDiagnosticMap.put( resource, diagnostic ); } else { JsdlEditor.this.resourceToDiagnosticMap.remove( resource ); } if( JsdlEditor.this.updateProblemIndication ) { getSite().getShell().getDisplay().asyncExec( new Runnable() { public void run() { updateProblemIndication(); } } ); } } } } else { super.notifyChanged( notification ); } } @Override protected void setTarget( final Resource target ) { basicSetTarget( target ); } @Override protected void unsetTarget( final Resource unSetTarget ) { basicUnsetTarget( unSetTarget ); } }; private StructuredTextEditor editor = null; private int sourcePageIndex; private boolean refreshedModel = false; private boolean isDirtyFlag = false; private OverviewPage overviewPage = new OverviewPage( this ); private JobDefinitionPage jobDefPage = new JobDefinitionPage( this ); private JobApplicationPage jobApplicationPage = new JobApplicationPage( this ); private DataStagingPage dataStagingPage = new DataStagingPage( this ); private ResourcesPage resourcesPage = new ResourcesPage( this ); private NewParametricPage parametricPage = new NewParametricPage( this ); private IHyperlinkListener messageHyperLinkListener; private JSDLJobDescription jsdlJobDescription; /** * JsdlEditor Class Constructor. */ public JsdlEditor() { super(); /* * Create an adapter factory that yields item providers. */ List<AdapterFactoryImpl> factories = new ArrayList<AdapterFactoryImpl>(); factories.add( new ResourceItemProviderAdapterFactory() ); // factories.add( new JsdlAdaptersFactory() ); factories.add( new PosixAdaptersFactory() ); factories.add( new ReflectiveItemProviderAdapterFactory() ); this.adapterFactory = new ComposedAdapterFactory( factories ); /* * Create the command stack that will notify this editor as commands are * executed. */ BasicCommandStack commandStack = new BasicCommandStack(); /* * Add a listener to set the most recent command's affected objects to be * the selection of the viewer with focus. */ commandStack.addCommandStackListener( new CommandStackListener() { @SuppressWarnings("synthetic-access") public void commandStackChanged( final EventObject event ) { Composite container2 = getContainer(); container2.getDisplay().asyncExec( new Runnable() { public void run() { firePropertyChange( IEditorPart.PROP_DIRTY ); } } ); } } ); /* * Create the editing domain with a special command stack. */ this.editingDomain = new AdapterFactoryEditingDomain( this.adapterFactory, commandStack, new HashMap<Resource, Boolean>() ); } protected void cleanDirtyState() { this.overviewPage.setDirty( false ); this.jobDefPage.setDirty( false ); this.jobApplicationPage.setDirty( false ); this.resourcesPage.setDirty( false ); this.dataStagingPage.setDirty( false ); this.parametricPage.setDirty( false ); } /** * This method set's the dirty status of the editor. * * @param dirtyFlag If TRUE then the page is Dirty and a Save operation is * needed. */ public void setDirty( final boolean dirtyFlag ) { if( this.isDirtyFlag != dirtyFlag ) { this.isDirtyFlag = dirtyFlag; this.editorDirtyStateChanged(); } } // End void setDirty() @Override public void dispose() { this.updateProblemIndication = false; ResourcesPlugin.getWorkspace() .removeResourceChangeListener( this.resourceChangeListener ); this.adapterFactory.dispose(); super.dispose(); if( this.documentRoot != null ) { this.documentRoot.eResource().unload(); this.documentRoot = null; } if( this.jobDefType != null ) { this.jobDefType.eResource().unload(); this.jobDefType = null; } if( this.editor != null ) { this.editor = null; } } @Override protected void addPages() { try { if( getJsdlModel() ) { addPage( this.overviewPage ); addPage( this.jobDefPage ); addPage( this.jobApplicationPage ); addPage( this.dataStagingPage ); addPage( this.resourcesPage ); addPage( this.parametricPage ); pushContentToPages(); } updateProblemIndication(); addResourceEditorPage(); } catch( PartInitException e ) { Activator.logException( e ); } } /** * Returns the header form of the JSDL editors Active Page * * @return the header of the active page. */ public IManagedForm getHeaderForm() { return this.getActivePageInstance().getManagedForm(); } private void setMessage( final String message, final int type, final IHyperlinkListener listener ) { if( this.getHeaderForm() != null && this.getHeaderForm().getForm() != null ) { if( !this.getHeaderForm().getForm().isDisposed() ) { getTopForm().setMessage( message, type ); if( this.messageHyperLinkListener != null ) { getTopForm().removeMessageHyperlinkListener( this.messageHyperLinkListener ); } if( listener != null ) { getTopForm().addMessageHyperlinkListener( listener ); } this.messageHyperLinkListener = listener; } } } /** * Used to define the message that will appear in the header of a page. This * can be a message concerning a warning or an error that needs to be * displayed to the user. * * @param message The message that needs to be displayed. * @param type The type of the message. Possible message types are:<br> * IMessageProvider.WARNING,<br> * IMessageProvider.ERROR,<br> * IMessageProvider.INFORMATION */ public void setMessage( final String message, final int type ) { setMessage( message, type, null ); } /** * @return the top Form */ public Form getTopForm() { return this.getHeaderForm().getForm().getForm(); } /* * This method is responsible for pushing content to the pages. The content * pushed is actually the JobDefinition element, which is the root element. */ private void pushContentToPages() { if( this.overviewPage != null ) { this.overviewPage.setPageContent( this.jobDefType, isModelRefreshed() ); } if( this.jobDefPage != null ) { this.jobDefPage.setPageContent( this.jobDefType, isModelRefreshed() ); } if( this.jobApplicationPage != null ) { this.jobApplicationPage.setPageContent( this.jobDefType, isModelRefreshed() ); } if( this.resourcesPage != null ) { this.resourcesPage.setPageContent( this.jobDefType, isModelRefreshed() ); } if( this.dataStagingPage != null ) { this.dataStagingPage.setPageContent( this.jobDefType, isModelRefreshed() ); } if( this.parametricPage != null ) { this.parametricPage.setPageContent( this.jobDefType, isModelRefreshed(), this.jsdlJobDescription ); } } /** * @return true if the the JSDL Model was refreshed / changed. This could be * caused by an external editor. */ public boolean isModelRefreshed() { return this.refreshedModel; } /* * This method adds the Resource Editor Page to the JSDL editor */ private void addResourceEditorPage() throws PartInitException { this.sourcePageIndex = addPage( getSourceEditor(), getEditorInput() ); setPageText( this.sourcePageIndex, getEditorInput().getName() ); getSourceEditor().setInput( getEditorInput() ); } /* * This method returns a Text Editor for addResourceEditorPage method. */ private StructuredTextEditor getSourceEditor() { if( this.editor == null ) { this.editor = new StructuredTextEditor(); this.editor.setEditorPart( this ); } return this.editor; } /** * @see org.eclipse.ui.part.MultiPageEditorPart#createSite(org.eclipse.ui.IEditorPart) */ @Override protected IEditorSite createSite( final IEditorPart page ) { IEditorSite site = null; if( page == this.editor ) { site = new MultiPageEditorSite( this, page ) { @Override public String getId() { // Sets this ID so nested editor is configured for XML source return "org.eclipse.core.runtime.xml" + ".source"; //$NON-NLS-1$ //$NON-NLS-2$ } }; } else { site = super.createSite( page ); } return site; } @Override public void init( final IEditorSite site, final IEditorInput editorInput ) { setSite( site ); setInputWithNotify( editorInput ); setPartName( editorInput.getName() ); ResourcesPlugin.getWorkspace() .addResourceChangeListener( this.resourceChangeListener, IResourceChangeEvent.POST_CHANGE ); } protected void handleActivate() { // Recompute the read only state. if( this.editingDomain.getResourceToReadOnlyMap() != null ) { this.editingDomain.getResourceToReadOnlyMap().clear(); // Refresh any actions that may become enabled or disabled. } if( !this.removedResources.isEmpty() ) { if( handleDirtyConflict() ) { getSite().getPage().closeEditor( JsdlEditor.this, false ); JsdlEditor.this.dispose(); } else { this.removedResources.clear(); this.changedResources.clear(); this.savedResources.clear(); } } else if( !this.changedResources.isEmpty() ) { this.changedResources.removeAll( this.savedResources ); handleChangedResources(); this.changedResources.clear(); this.savedResources.clear(); } } protected void handleChangedResources() { if( !this.changedResources.isEmpty() && ( !isDirty() || handleDirtyConflict() ) ) { this.editingDomain.getCommandStack().flush(); this.updateProblemIndication = false; for( Iterator<Resource> i = this.changedResources.iterator(); i.hasNext(); ) { Resource resource = i.next(); if( resource.isLoaded() ) { resource.unload(); try { resource.load( Collections.EMPTY_MAP ); } catch( IOException exception ) { if( !this.resourceToDiagnosticMap.containsKey( resource ) ) { this.resourceToDiagnosticMap.put( resource, analyzeResourceProblems( resource, exception ) ); } } } } this.updateProblemIndication = true; updateProblemIndication(); getJsdlModel(); } } protected boolean handleDirtyConflict() { return MessageDialog.openQuestion( getSite().getShell(), "JsdlEditor_FileConflict_label", //$NON-NLS-1$ "JsdlEditor_WARN_FileConflict" ); //$NON-NLS-1$ } @Override public void doSave( final IProgressMonitor monitor ) { /* * Do the work within an operation because this is a long running activity * that modifies the workbench. */ WorkspaceModifyOperation operation = new WorkspaceModifyOperation() { // This is the method that gets invoked when the operation runs. @Override public void execute( @SuppressWarnings("hiding") final IProgressMonitor monitor ) { // Save the resources to the file system. boolean first = true; for( Iterator<?> i = JsdlEditor.this.editingDomain.getResourceSet() .getResources() .iterator(); i.hasNext(); ) { Resource resource = ( Resource )i.next(); if( ( first || !resource.getContents().isEmpty() || isPersisted( resource ) ) && !JsdlEditor.this.editingDomain.isReadOnly( resource ) ) { try { JsdlEditor.this.savedResources.add( resource ); resource.save( Collections.EMPTY_MAP ); } catch( Exception exception ) { JsdlEditor.this.resourceToDiagnosticMap.put( resource, analyzeResourceProblems( resource, exception ) ); // setDirty( false ); doTextEditorSave(); cleanDirtyState(); refreshEditor(); } first = false; } } } }; this.updateProblemIndication = false; try { // This runs the options, and shows progress. new ProgressMonitorDialog( getSite().getShell() ).run( true, false, operation ); // Refresh the necessary state. ( ( BasicCommandStack )this.editingDomain.getCommandStack() ).saveIsDone(); // setDirty( false ); doTextEditorSave(); cleanDirtyState(); refreshEditor(); } catch( Exception exception ) { // Something went wrong that shouldn't. Activator.logException( exception ); } this.updateProblemIndication = true; updateProblemIndication(); } @Override public void doSaveAs() { SaveAsDialog saveAsDialog = new SaveAsDialog( getSite().getShell() ); saveAsDialog.open(); IPath path = saveAsDialog.getResult(); if( path != null ) { IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile( path ); if( file != null ) { doSaveAs( URI.createPlatformResourceURI( file.getFullPath().toString(), false ), new FileEditorInput( file ) ); } } } /* * Save the JSDL file (used as the editor input) as a different name. */ protected void doSaveAs( final URI uri, final IEditorInput editorInput ) { this.editingDomain.getResourceSet().getResources().get( 0 ).setURI( uri ); setInputWithNotify( editorInput ); setPartName( editorInput.getName() ); IProgressMonitor progressMonitor = new NullProgressMonitor(); doSave( progressMonitor ); } protected void doTextEditorSave() { try { this.editor.doSave( null ); } catch( Exception e ) { Activator.logException( e ); } } @Override public boolean isSaveAsAllowed() { return true; } protected void updateProblemIndication() { if( this.updateProblemIndication ) { BasicDiagnostic diagnostic = new BasicDiagnostic( Diagnostic.OK, Activator.PLUGIN_ID, 0, null, new Object[]{ this.editingDomain.getResourceSet() } ); for( Iterator<Diagnostic> i = this.resourceToDiagnosticMap.values() .iterator(); i.hasNext(); ) { Diagnostic childDiagnostic = i.next(); if( childDiagnostic.getSeverity() != Diagnostic.OK ) { diagnostic.add( childDiagnostic ); /* * There are errors in the resource so add the Markers. */ try { this.markerHelper.createMarkers( diagnostic ); if( this.editor != null ) { /* * The source editor is the last page of the JSDL editor. So * activate it to show the errors for manual correction */ this.setActivePage( getPageCount() ); this.editor.update(); } } catch( CoreException e ) { Activator.logException( e ); } } } if( this.markerHelper.hasMarkers( this.editingDomain.getResourceSet() ) ) { this.markerHelper.deleteMarkers( this.editingDomain.getResourceSet() ); if( diagnostic.getSeverity() != Diagnostic.OK ) { try { this.markerHelper.createMarkers( diagnostic ); } catch( CoreException exception ) { Activator.logException( exception ); } } } } } /** * Responsible for de-serializing the model from the resource file. The * resource is passed to the getResourceRoot method. * * @return Returns TRUE if the Model was loaded. */ public boolean getJsdlModel() { boolean result = false; URI resourceURI = null; // IFile[] files = null; // Assumes that the input is a file object. if( getEditorInput() instanceof IFileEditorInput ) { IFileEditorInput modelFile = ( IFileEditorInput )getEditorInput(); resourceURI = URI.createPlatformResourceURI( modelFile.getFile() .getFullPath() .toString(), false ); this.jsdlJobDescription = ( JSDLJobDescription )GridModel.getRoot() .findElement( new Path( modelFile.getFile().getFullPath().toString() ) ); } else if( getEditorInput() instanceof FileStoreEditorInput ) { FileStoreEditorInput modelFile = ( FileStoreEditorInput )getEditorInput(); resourceURI = URI.createFileURI( modelFile.getURI().getPath() ); GridModel.getRoot() .findElement( new Path( modelFile.getURI().toString() ) ); // resourceURI = URI.createPlatformResourceURI( // modelFile.getURI().getPath(), false); } Exception exception = null; Resource resource = null; try { /* Load the resource through the editing domain. */ resource = this.editingDomain.getResourceSet().getResource( resourceURI, true ); } catch( Exception e ) { exception = e; resource = this.editingDomain.getResourceSet().getResource( resourceURI, false ); } Diagnostic diagnostic = analyzeResourceProblems( resource, exception ); if( diagnostic.getSeverity() != Diagnostic.OK ) { this.resourceToDiagnosticMap.put( resource, analyzeResourceProblems( resource, exception ) ); result = false; } else { getResourceRoot( resource ); result = true; } this.editingDomain.getResourceSet() .eAdapters() .add( this.problemIndicationAdapter ); // This means the file was edited from an external editor so // push the new JSDL model to the pages. if( !this.changedResources.isEmpty() ) { refreshEditor(); } return result; } protected void refreshEditor() { this.refreshedModel = true; pushContentToPages(); this.refreshedModel = false; } /* * This method parses the resource in order to find which JSDL types appear. * Each JSDL type is then passed as a reference parameter (EList) in the * appropriate page of the JSDL editor. */ private void getResourceRoot( final Resource resource ) { // Get an iterator to iterate through all contents of the resource. TreeIterator<EObject> iterator = resource.getAllContents(); while( iterator.hasNext() ) { EObject testElement = iterator.next(); /* * Instace-of checks for each EObject that appears in the resource. We * want to get the JobDefinition EObject which is the root Element of a * JSDL Document. */ if( testElement instanceof JobDefinitionType ) { this.jobDefType = ( JobDefinitionType )testElement; } } } /** * This looks up a string in plug-in.properties, making a substitution. * Returns a diagnostic describing the errors and warnings listed in the * resource and the specified exception. * * @param resource The Resource. * @param exception The Exception. * @return Diagnostic The Diagnostic. */ public Diagnostic analyzeResourceProblems( final Resource resource, final Exception exception ) { Diagnostic basicDiagnostic = null; if( !resource.getErrors().isEmpty() || !resource.getWarnings().isEmpty() ) { basicDiagnostic = new BasicDiagnostic( Diagnostic.ERROR, Activator.PLUGIN_ID, 0, String.format( Messages.getString( "JsdlEditor.CreateModelErrorMessage" ), //$NON-NLS-1$ resource.getURI() ), new Object[]{ exception == null ? ( Object )resource : exception } ); ( ( BasicDiagnostic )basicDiagnostic ).merge( EcoreUtil.computeDiagnostic( resource, true ) ); } else if( exception != null ) { basicDiagnostic = new BasicDiagnostic( Diagnostic.ERROR, Activator.PLUGIN_ID, 0, Messages.getString( "JsdlMultiPageEditor.CreateModelErrorMessage" ), //$NON-NLS-1$ new Object[]{ exception } ); } else { basicDiagnostic = Diagnostic.OK_INSTANCE; } return basicDiagnostic; } public EditingDomain getEditingDomain() { return this.editingDomain; } protected boolean isPersisted( final Resource resource ) { boolean result = false; try { InputStream stream = this.editingDomain.getResourceSet() .getURIConverter() .createInputStream( resource.getURI() ); if( stream != null ) { result = true; stream.close(); } } catch( IOException e ) { Activator.logException( e ); } return result; } /* * Method triggered when there are changes between the form pages. */ @Override protected void pageChange( final int pageIndex ) { super.pageChange( pageIndex ); } } // End JsdlEditor Class