package edu.isistan.sadanalyzer.editor;
import java.util.EventObject;
import java.util.HashMap;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.common.command.BasicCommandStack;
import org.eclipse.emf.common.command.CommandStackListener;
import org.eclipse.emf.common.util.URI;
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.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.EditUIUtil;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.editor.FormPage;
import SadModel.Sad;
import edu.isistan.reassistant.ccdetector.model.CrosscuttingConcernRuleSet;
import edu.isistan.sadanalyzer.CCDetector;
import edu.isistan.sadanalyzer.model.SadAnalyzerProject;
import edu.isistan.sadanalyzer.pages.SadAnalyzerSetUpPage;
import edu.isistan.sadanalyzer.query.UIMASADQueryAdapter;
/**
* An example showing how to create a multi-page editor.
* This example has 3 pages:
* <ul>
* <li>page 0 contains a nested text editor.
* <li>page 1 allows you to change the font used in page 2
* <li>page 2 shows the words in page 0 in sorted order
* </ul>
*/
public class SadAnalyzerEditor extends FormEditor implements IEditingDomainProvider{
public static final String ID = "edu.isistan.sadanalyzer.editor.SadAnalyzerEditor";
protected ComposedAdapterFactory adapterFactory;
protected AdapterFactoryEditingDomain editingDomain;
private CrosscuttingConcernRuleSet rulesModelRoot;
private UIMASADQueryAdapter uimaRoot;
private SadAnalyzerProject modelRoot;
private Sad sadModelRoot;
public SadAnalyzerEditor(){
super();
initializeEditingDomain();
}
/**
* @see org.eclipse.ui.forms.editor.FormEditor#addPages()
*/
@Override
protected void addPages() {
createModel();
int index;
try {
FormPage sadAnalyzerSetUpPage = new SadAnalyzerSetUpPage(this);
index = addPage(sadAnalyzerSetUpPage);
setPageText(index, Messages.SadAnalyzerEditor_Configuration);
} catch (PartInitException e) {
e.printStackTrace();
}
}
@Override
public void doSave(IProgressMonitor arg0) {
// TODO Auto-generated method stub
}
@Override
public void doSaveAs() {
// TODO Auto-generated method stub
}
@Override
public boolean isSaveAsAllowed() {
// TODO Auto-generated method stub
return false;
}
protected void initializeEditingDomain() {
// Create an adapter factory that yields item providers.
adapterFactory = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
adapterFactory.addAdapterFactory(new ResourceItemProviderAdapterFactory());
adapterFactory.addAdapterFactory(new ReflectiveItemProviderAdapterFactory());
// 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() {
public void commandStackChanged(final EventObject event) {
getContainer().getDisplay().asyncExec(new Runnable() {
public void run() {
firePropertyChange(IEditorPart.PROP_DIRTY);
}
});
}
});
// Create the editing domain with a special command stack.
editingDomain = new AdapterFactoryEditingDomain(adapterFactory, commandStack, new HashMap<Resource, Boolean>());
}
public EditingDomain getEditingDomain() {
return editingDomain;
}
private void createModel() {
ResourceSet resourceSet = new ResourceSetImpl();
URI resourceURI = EditUIUtil.getURI(getEditorInput());
Resource resource = null;
try {
resource = resourceSet.getResource(resourceURI, true);
}
catch (Exception e) {
resource = resourceSet.getResource(resourceURI, true);
}
modelRoot = (SadAnalyzerProject) resource.getContents().get(0);
createUIMAModel();
createRulesModel();
createSadModel();
}
private void createRulesModel() {
URI resourceURI = URI.createFileURI(CCDetector.getRuleSetPath());
Exception exception = null;
Resource resource = null;
try {
// Load the resource through the editing domain.
resource = editingDomain.getResourceSet().getResource(resourceURI, true);
}
catch (Exception e) {
exception = e;
resource = editingDomain.getResourceSet().getResource(resourceURI, false);
}
rulesModelRoot = (CrosscuttingConcernRuleSet) resource.getContents().get(0);
}
private void createUIMAModel() {
ResourceSet resourceSet = new ResourceSetImpl();
URI fileURI = URI.createFileURI(modelRoot.getUimaURI());
Resource resource = null;
try {
resource = resourceSet.getResource(fileURI, true);
}
catch (Exception e) {
resource = resourceSet.getResource(fileURI, true);
}
uimaRoot = new UIMASADQueryAdapter(resource.getContents());
}
private void createSadModel() {
ResourceSet resourceSet = new ResourceSetImpl();
URI fileURI = URI.createFileURI(modelRoot.getSadURI());
Resource resource = null;
try {
resource = resourceSet.getResource(fileURI, true);
}
catch (Exception e) {
resource = resourceSet.getResource(fileURI, true);
}
sadModelRoot = (Sad) resource.getContents().get(resource.getContents().size()-1);
}
public CrosscuttingConcernRuleSet getRulesModelRoot() {
return rulesModelRoot;
}
public UIMASADQueryAdapter getUimaRoot() {
return uimaRoot;
}
public Sad getSadModel(){
return sadModelRoot;
}
public SadAnalyzerProject getSadProjectModel(){
return modelRoot;
}
}