package edu.isistan.sadanalyzer.pages; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.emf.common.CommonPlugin; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.EMap; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.edit.domain.IEditingDomainProvider; import org.eclipse.jface.action.Action; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.List; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.editor.FormPage; import org.eclipse.ui.forms.events.ExpansionAdapter; import org.eclipse.ui.forms.events.ExpansionEvent; import org.eclipse.ui.forms.widgets.ColumnLayout; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.part.EditorPart; import org.eclipse.wb.swt.ResourceManager; import SadModel.Sad; import edu.isistan.reassistant.ccdetector.model.CompositionRule; import edu.isistan.reassistant.ccdetector.model.CrosscuttingConcernRule; import edu.isistan.reassistant.ccdetector.model.CrosscuttingConcernRuleSet; import edu.isistan.sadanalyzer.editor.Messages; import edu.isistan.sadanalyzer.editor.SadAnalyzerEditor; import edu.isistan.sadanalyzer.model.CompositionRules; import edu.isistan.sadanalyzer.model.CrosscuttingConcern; import edu.isistan.sadanalyzer.model.Impact; import edu.isistan.sadanalyzer.model.SadAnalyzerModelFactory; import edu.isistan.sadanalyzer.model.SadAnalyzerProject; import edu.isistan.sadanalyzer.providers.CrosscuttingConcernRuleLabelProvider; import edu.isistan.sadanalyzer.providers.SadSectionLabelProvider; import edu.isistan.sadanalyzer.query.QueryEngine; import edu.isistan.sadanalyzer.query.UIMASADQueryAdapter; import edu.isistan.uima.unified.typesystems.nlp.Sentence; import edu.isistan.uima.unified.typesystems.sad.SadSection; public class SadAnalyzerSetUpPage extends FormPage { public static final String ID = "edu.isistan.sadanalyzer.pages.SadAnalyzerSetUpPage"; public static final String TITLE = Messages.SadAnalyzerEditor_Configuration; private ListViewer listViewerSections; private ListViewer listViewerSectionsSelected; private ListViewer listQualityAttributesSource; private ListViewer listQualityAttributesSelected; private List listQualityAtributes1; private List listQualityAtributes2; private List listSections; private List listSectionsSelected; private String modelURI; protected CrosscuttingConcernRuleSet rulesModelRoot; private EditingDomain editingDomain; private UIMASADQueryAdapter uimaRoot; private SadAnalyzerProject modelRoot; private Sad sadModelRoot; public SadAnalyzerSetUpPage(){ super(ID, TITLE); } public SadAnalyzerSetUpPage(FormEditor editor) { super(editor, ID, TITLE); editingDomain = ((IEditingDomainProvider)getEditor()).getEditingDomain(); rulesModelRoot =((SadAnalyzerEditor)getEditor()).getRulesModelRoot(); uimaRoot = ((SadAnalyzerEditor)getEditor()).getUimaRoot(); modelRoot = ((SadAnalyzerEditor)getEditor()).getSadProjectModel(); sadModelRoot = ((SadAnalyzerEditor)getEditor()).getSadModel(); } /** * @see org.eclipse.ui.forms.editor.FormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput) */ @Override public void init(IEditorSite site, IEditorInput input) { super.init(site, input); } /** * Create contents of the form. * @param managedForm */ @Override protected void createFormContent(IManagedForm managedForm) { ScrolledForm form = managedForm.getForm(); Composite body = form.getBody(); FormToolkit toolkit = managedForm.getToolkit(); form.setText(Messages.SadAnalyzerEditor_ConfigurationTitle); Action executionAnalyzer = new Action("run", Action.AS_CHECK_BOX){ public void run() { executeUimaSadProcesor(); } }; executionAnalyzer.setToolTipText("Run"); //$NON-NLS-1$ executionAnalyzer.setEnabled(Boolean.TRUE); executionAnalyzer.setImageDescriptor(ResourceManager.getPluginImageDescriptor("edu.isistan.sadanalyzer", "icons/run.gif")); form.getToolBarManager().add(executionAnalyzer); form.getToolBarManager().update(true); toolkit.decorateFormHeading(form.getForm()); toolkit.paintBordersFor(body); ColumnLayout layout = new ColumnLayout(); layout.topMargin = 10; layout.bottomMargin = 5; layout.leftMargin = 10; layout.rightMargin = 10; layout.horizontalSpacing = 20; layout.verticalSpacing = 20; layout.maxNumColumns = 2; layout.minNumColumns = 2; toolkit.paintBordersFor(body); managedForm.getForm().getBody().setLayout(layout); createDetailAnalyzer(managedForm, Messages.SadAnalyzerEditor_ConfigurationDetail, Messages.SadAnalyzerEditor_ConfigurationDetailDescription); createTreeModel(managedForm, Messages.SadAnalyzerEditor_ConfigurationModelTree, Messages.SadAnalyzerEditor_ConfigurationModelTreeDescription); createRunUimasad(managedForm, Messages.SadAnalyzerEditor_ConfigurationRun, Messages.SadAnalyzerEditor_ConfigurationRunDescription); createQualityAttributes(managedForm, Messages.SadAnalyzerEditor_ConfigurationConcern, Messages.SadAnalyzerEditor_ConfigurationConcernDescription); } private void createRunUimasad(IManagedForm mform, String title, String desc) { Composite client = createSection(mform, title, desc, 2); FormToolkit toolkit = mform.getToolkit(); // Run Button btnAdd= toolkit.createButton(client, Messages.SadAnalyzerEditor_ConfigurationRunButton,SWT.BUTTON1); btnAdd.setImage(ResourceManager.getPluginImage("edu.isistan.sadanalyzer", "icons/run.gif")); btnAdd.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { executeUimaSadProcesor(); } }); } private void executeUimaSadProcesor(){ //TODO hacer el filtro para ejecutar los queries con listQualityAttributesSelected y listViewerSectionsSelected if((listViewerSectionsSelected.getList().getItems().length > 0) && (listQualityAttributesSelected.getList().getItems().length > 0)){ // query URI platformURI = URI.createFileURI(modelRoot.getUimaURI()); final String modelUIMA = CommonPlugin.resolve(platformURI).toFileString(); QueryEngine engine = new QueryEngine(modelUIMA); NullProgressMonitor monitor = new NullProgressMonitor(); engine.beginQueriesExecution(monitor); // java.util.List<CrosscuttingConcern> crosscuttingConcerns = null; try { EMap<CrosscuttingConcernRule, EList<EObject>> directRuleResults = engine.queryDirectRules(); EMap<CrosscuttingConcernRule, EList<EObject>> impactRuleResults = engine.queryImpactRules(); crosscuttingConcerns = process(directRuleResults, impactRuleResults); } catch (InterruptedException e) { e.printStackTrace(); } engine.endQueriesExecution(monitor); if(crosscuttingConcerns != null){ java.util.List<CrosscuttingConcern> attributes = new ArrayList<CrosscuttingConcern>(); for(int i=0; i < crosscuttingConcerns.size(); i++){ CrosscuttingConcern c = crosscuttingConcerns.get(i); boolean match = false; for(int j=0; j < listQualityAttributesSelected.getList().getItems().length && !match; j++){ if(listQualityAttributesSelected.getList().getItem(j).equals(c.getName())){ attributes.add(c); match = true; } } } IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); IWorkbenchPage page = window.getActivePage(); for(IEditorReference reference : page.getEditorReferences()){ if(reference .getId().equals(SadAnalyzerEditor.ID)){ EditorPart part = (EditorPart) reference.getEditor(true); SadAnalyzerEditor editor = (SadAnalyzerEditor)part; SadAnalyzerViewerPage pageView = (SadAnalyzerViewerPage) editor.findPage(SadAnalyzerViewerPage.ID); if(null == pageView){ FormPage sdAnalyzerViewerPage = new SadAnalyzerViewerPage(editor, listViewerSectionsSelected, attributes); try { editor.addPage(sdAnalyzerViewerPage); } catch (PartInitException p) { // TODO Auto-generated catch block p.printStackTrace(); } }else{ pageView.refresh(listViewerSectionsSelected, attributes); } editor.setActivePage(SadAnalyzerViewerPage.ID); } } } } } private java.util.List<CrosscuttingConcern> process(EMap<CrosscuttingConcernRule, EList<EObject>> directRuleResults, EMap<CrosscuttingConcernRule, EList<EObject>> impactRuleResults) { java.util.List<CrosscuttingConcern> crosscuttingConcernsList = new ArrayList<CrosscuttingConcern>(); Set<CrosscuttingConcernRule> rules = new HashSet<CrosscuttingConcernRule>(); rules.addAll(directRuleResults.keySet()); rules.addAll(impactRuleResults.keySet()); for(CrosscuttingConcernRule rule : rules) { CrosscuttingConcern crosscuttingConcern = SadAnalyzerModelFactory.eINSTANCE.createCrosscuttingConcern(); crosscuttingConcern.setName(rule.getName()); crosscuttingConcern.setDescription(rule.getMetadata()); // EList<EObject> directResult = directRuleResults.get(rule); if(directResult != null) { for(EObject object : directResult) { Impact impact = process(rule, object); crosscuttingConcern.getImpacts().add(impact); } } EList<EObject> impactResult = impactRuleResults.get(rule); if(impactResult != null) { for(EObject object : impactResult) { Impact impact = process(rule, object); crosscuttingConcern.getImpacts().add(impact); } } crosscuttingConcernsList.add(crosscuttingConcern); } return crosscuttingConcernsList; } private Impact process(CrosscuttingConcernRule rule, EObject object) { Impact impact = SadAnalyzerModelFactory.eINSTANCE.createImpact(); //Location Sentence sentence = (Sentence) object; impact.setSentence(sentence); //Composition rule CompositionRules cRule = null; if(rule.getCompositionRule() == CompositionRule.WRAP) cRule = CompositionRules.WRAP; if(rule.getCompositionRule() == CompositionRule.OVERLAP) cRule = CompositionRules.OVERLAP; if(rule.getCompositionRule() == CompositionRule.OVERRIDE) cRule = CompositionRules.OVERRIDE; impact.setCompositionRules(cRule); impact.setRealization(rule.getCompositionGuidelines()); // return impact; } private void createQualityAttributes(IManagedForm managedForm, String title, String desc) { Composite client = createSection(managedForm, title, desc, 3); FormToolkit toolkit = managedForm.getToolkit(); listQualityAttributesSource = new ListViewer(client, SWT.BORDER | SWT.V_SCROLL); listQualityAttributesSource.setLabelProvider(new CrosscuttingConcernRuleLabelProvider()); Iterator<CrosscuttingConcernRule> rules = rulesModelRoot.getRules().iterator(); for ( ;rules.hasNext();) { CrosscuttingConcernRule rule = rules.next(); listQualityAttributesSource.add(rule); } GridData gd = new GridData(); gd.widthHint = 250; gd.heightHint = 200; listQualityAtributes1 = listQualityAttributesSource.getList(); listQualityAtributes1.setLayoutData(gd); Composite compositeBtn = toolkit.createComposite(client, SWT.NONE); compositeBtn.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false, 1, 1)); toolkit.paintBordersFor(compositeBtn); FillLayout fl_compositeBtn = new FillLayout(SWT.VERTICAL); fl_compositeBtn.marginWidth = 5; fl_compositeBtn.marginHeight = 5; fl_compositeBtn.spacing = 5; compositeBtn.setLayout(fl_compositeBtn); Button btnAddAll = toolkit.createButton(compositeBtn, ">> Add All", SWT.NONE); Button btnAdd = toolkit.createButton(compositeBtn, "Add", SWT.NONE); btnAdd.setImage(ResourceManager.getPluginImage("edu.isistan.sadanalyzer", "icons/add.gif")); btnAdd.setToolTipText("Add Quality attribute"); Button btnRemove = toolkit.createButton(compositeBtn, "Remove", SWT.NONE); btnRemove.setImage(ResourceManager.getPluginImage("edu.isistan.sadanalyzer", "icons/delete.gif")); btnRemove.setToolTipText("Remove Quality attribute"); listQualityAttributesSelected = new ListViewer(client, SWT.BORDER | SWT.V_SCROLL); listQualityAtributes2 = listQualityAttributesSelected.getList(); listQualityAtributes2.setLayoutData(gd); listQualityAttributesSelected.setLabelProvider(new CrosscuttingConcernRuleLabelProvider()); Button btnRemoveAll = toolkit.createButton(compositeBtn, "<< Remove All", SWT.NONE); btnAddAll.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { for(int i = 0; listQualityAttributesSource.getList().getItems().length > 0; ){ CrosscuttingConcernRule crossC = (CrosscuttingConcernRule)listQualityAttributesSource.getElementAt(i); listQualityAttributesSelected.add(crossC); listQualityAttributesSource.remove(crossC); } refreshList(); } }); btnRemoveAll.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { for(int i = 0; listQualityAttributesSelected.getList().getItems().length > 0; ){ CrosscuttingConcernRule crossC = (CrosscuttingConcernRule)listQualityAttributesSelected.getElementAt(i); listQualityAttributesSource.add(crossC); listQualityAttributesSelected.remove(crossC); } refreshList(); } }); btnAdd.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { StructuredSelection selection = (StructuredSelection)listQualityAttributesSource.getSelection(); if(!selection.isEmpty()) { CrosscuttingConcernRule crossCutting = (CrosscuttingConcernRule)selection.getFirstElement(); listQualityAttributesSource.remove(crossCutting); listQualityAttributesSelected.add(crossCutting); refreshList(); } } }); btnRemove.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { StructuredSelection selection = (StructuredSelection)listQualityAttributesSelected.getSelection(); if(!selection.isEmpty()) { CrosscuttingConcernRule crossCutting = (CrosscuttingConcernRule)selection.getFirstElement(); listQualityAttributesSelected.remove(crossCutting); listQualityAttributesSource.add(crossCutting); refreshList(); } } }); } private void createDetailAnalyzer(IManagedForm mform, String title, String desc) { Composite client = createSection(mform, title, desc, 2); FormToolkit toolkit = mform.getToolkit(); IFile file =(IFile)getEditorInput().getAdapter(IFile.class); GridData gd = new GridData(); // Text source toolkit.createLabel(client, Messages.SadAnalyzerEditor_SadSource+":"); String sadFileSource = modelRoot.getSadURI(); Text sadFileSourceText = toolkit.createText(client, sadFileSource, SWT.SINGLE); sadFileSourceText.setEditable(false); gd = new GridData(); gd.widthHint = 500; sadFileSourceText.setLayoutData(gd); toolkit.createLabel(client, Messages.SadAnalyzerEditor_UIMASadFile+":"); String uimaSadFile = modelRoot.getUimaURI(); Text uimaSadFileText = toolkit.createText(client, uimaSadFile, SWT.SINGLE); uimaSadFileText.setEditable(false); gd = new GridData(); gd.widthHint = 500; uimaSadFileText.setLayoutData(gd); } private void createTreeModel(IManagedForm managedForm, String title, String desc) { Composite client = createSection(managedForm, title, desc, 3); FormToolkit toolkit = managedForm.getToolkit(); listViewerSections = new ListViewer(client, SWT.BORDER | SWT.V_SCROLL); listViewerSections.setLabelProvider(new SadSectionLabelProvider(uimaRoot)); EList<SadSection> sections = uimaRoot.getSadSection(); for(Iterator<SadSection> it = sections.iterator();it.hasNext();){ SadSection section = it.next(); if(null != section.getName()){ listViewerSections.add(section); } } GridData gd = new GridData(); gd.widthHint = 250; gd.heightHint = 200; listSections = listViewerSections.getList(); listSections.setLayoutData(gd); Composite compositeBtn = toolkit.createComposite(client, SWT.NONE); compositeBtn.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false, 1, 1)); toolkit.paintBordersFor(compositeBtn); FillLayout fl_compositeBtn = new FillLayout(SWT.VERTICAL); fl_compositeBtn.marginWidth = 5; fl_compositeBtn.marginHeight = 5; fl_compositeBtn.spacing = 5; compositeBtn.setLayout(fl_compositeBtn); Button btnAddAll = toolkit.createButton(compositeBtn, ">> Add All", SWT.NONE); Button btnAdd = toolkit.createButton(compositeBtn, "Add", SWT.NONE); btnAdd.setImage(ResourceManager.getPluginImage("edu.isistan.sadanalyzer", "icons/add.gif")); btnAdd.setToolTipText("Add Quality attribute"); Button btnRemove = toolkit.createButton(compositeBtn, "Remove", SWT.NONE); btnRemove.setImage(ResourceManager.getPluginImage("edu.isistan.sadanalyzer", "icons/delete.gif")); btnRemove.setToolTipText("Remove Quality attribute"); listViewerSectionsSelected = new ListViewer(client, SWT.BORDER | SWT.V_SCROLL); listSectionsSelected = listViewerSectionsSelected.getList(); listSectionsSelected.setLayoutData(gd); listViewerSectionsSelected.setLabelProvider(new SadSectionLabelProvider(uimaRoot)); Button btnRemoveAll = toolkit.createButton(compositeBtn, "<< Remove All", SWT.NONE); btnAddAll.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { for(int i = 0; listViewerSections.getList().getItems().length > 0; ){ SadSection sad = (SadSection)listViewerSections.getElementAt(i); listViewerSectionsSelected.add(sad); listViewerSections.remove(sad); } refreshList(); } }); btnRemoveAll.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { for(int i = 0; listViewerSectionsSelected.getList().getItems().length > 0; ){ SadSection sad = (SadSection)listViewerSectionsSelected.getElementAt(i); listViewerSections.add(sad); listViewerSectionsSelected.remove(sad); } refreshList(); } }); btnAdd.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { StructuredSelection selection = (StructuredSelection)listViewerSections.getSelection(); if(!selection.isEmpty()) { SadSection sadSection = (SadSection)selection.getFirstElement(); listViewerSections.remove(sadSection); listViewerSectionsSelected.add(sadSection); refreshList(); } } }); btnRemove.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { StructuredSelection selection = (StructuredSelection)listViewerSectionsSelected.getSelection(); if(!selection.isEmpty()) { SadSection sadSection = (SadSection)selection.getFirstElement(); listViewerSectionsSelected.remove(sadSection); listViewerSections.add(sadSection); refreshList(); } } }); } private void refreshList(){ listSections.update(); listSectionsSelected.update(); listQualityAtributes1.update(); listQualityAtributes2.update(); } private Composite createSection(IManagedForm mform, String title, String desc, int numColumns) { final ScrolledForm form = mform.getForm(); FormToolkit toolkit = mform.getToolkit(); Composite compositeDetails = new Composite(mform.getForm().getBody(), SWT.NONE); compositeDetails.setLayout(new FillLayout(SWT.HORIZONTAL)); toolkit.adapt(compositeDetails); toolkit.paintBordersFor(compositeDetails); Section section = toolkit.createSection(compositeDetails, Section.TWISTIE | Section.TITLE_BAR | Section.DESCRIPTION | Section.EXPANDED); section.setText(title); section.setDescription(desc); //toolkit.createCompositeSeparator(section); Composite client = toolkit.createComposite(section); GridLayout layout = new GridLayout(); layout.marginWidth = layout.marginHeight = 0; layout.numColumns = numColumns; client.setLayout(layout); section.setClient(client); section.addExpansionListener(new ExpansionAdapter() { public void expansionStateChanged(ExpansionEvent e) { form.reflow(false); } }); return client; } @Override public void setActive(boolean active) { super.setActive(active); } }