/******************************************************************************* | |
* Copyright (c) 2017, MDH | |
* | |
* All rights reserved. This program and the accompanying materials | |
* are made available under the terms of the Eclipse Public License v2.0 | |
* which accompanies this distribution, and is available at | |
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html | |
* | |
* SPDX-License-Identifier: EPL-2.0 | |
* | |
* Contributors: | |
* Faiz Ul Muram <faiz.ul.muram@mdh.se> | |
* Initial API and implementation and/or initial documentation | |
*******************************************************************************/ | |
package org.eclipse.opencert.process2assurproj.assuranceproject.utils; | |
import java.util.HashMap; | |
import org.eclipse.core.commands.ExecutionException; | |
import org.eclipse.core.runtime.IProgressMonitor; | |
import org.eclipse.core.runtime.NullProgressMonitor; | |
import org.eclipse.emf.cdo.dawn.preferences.PreferenceConstants; | |
import org.eclipse.emf.cdo.dawn.ui.views.DawnExplorer; | |
import org.eclipse.emf.cdo.dawn.util.connection.CDOConnectionUtil; | |
import org.eclipse.emf.cdo.eresource.CDOResource; | |
import org.eclipse.emf.cdo.eresource.CDOResourceFolder; | |
import org.eclipse.emf.cdo.session.CDOSession; | |
import org.eclipse.emf.cdo.transaction.CDOTransaction; | |
import org.eclipse.emf.common.util.EList; | |
import org.eclipse.emf.common.util.URI; | |
import org.eclipse.emf.ecore.EObject; | |
import org.eclipse.emf.ecore.xmi.XMLResource; | |
import org.eclipse.emf.edit.provider.ComposedAdapterFactory; | |
import org.eclipse.emf.edit.ui.util.EditUIUtil; | |
import org.eclipse.jface.dialogs.Dialog; | |
import org.eclipse.jface.dialogs.IDialogConstants; | |
import org.eclipse.jface.dialogs.MessageDialog; | |
import org.eclipse.jface.dialogs.ProgressMonitorDialog; | |
import org.eclipse.jface.window.IShellProvider; | |
import org.eclipse.opencert.apm.assurproj.assuranceproject.AssetsPackage; | |
import org.eclipse.opencert.apm.assurproj.assuranceproject.AssuranceProject; | |
import org.eclipse.opencert.apm.assurproj.assuranceproject.AssuranceprojectFactory; | |
import org.eclipse.opencert.apm.assurproj.assuranceproject.AssuranceprojectPackage; | |
import org.eclipse.opencert.process2assurproj.assuranceproject.utils.DawnArgDiagramUtil; | |
import org.eclipse.opencert.process2assurproj.assuranceproject.etl.EPF2ARGTransformHandler; | |
import org.eclipse.swt.SWT; | |
import org.eclipse.swt.events.SelectionAdapter; | |
import org.eclipse.swt.events.SelectionEvent; | |
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.Control; | |
import org.eclipse.swt.widgets.FileDialog; | |
import org.eclipse.swt.widgets.Group; | |
import org.eclipse.swt.widgets.Label; | |
import org.eclipse.swt.widgets.Shell; | |
import org.eclipse.swt.widgets.Text; | |
import org.eclipse.ui.IEditorPart; | |
import org.eclipse.ui.IViewReference; | |
import org.eclipse.ui.PlatformUI; | |
//import org.eclipse.opencert.evm.evidspec.evidence.ArtefactModel; | |
//import org.eclipse.opencert.pam.procspec.process.ProcessModel; | |
import org.eclipse.opencert.sam.arg.arg.Case; | |
public class EPF2ARGUI extends Dialog { | |
private static final String EXTENSION_DIAGRAM = "_diagram"; | |
private static final String ARGUMENTATION_Extension = ".arg"; | |
private static final String ARGUMENTATION_Folder = "ARGUMENTATION"; | |
private static final String IMPORT = "Generate"; | |
private static final String CLOSE = "Close"; | |
protected AssuranceprojectPackage dprojectPackage = AssuranceprojectPackage.eINSTANCE; | |
protected AssuranceprojectFactory dprojectFactory = dprojectPackage.getAssuranceprojectFactory(); | |
CDOResourceFolder assuranceprojectFolder; | |
CDOResourceFolder argFolder; | |
private IEditorPart editor; | |
private URI resourceURI; | |
private static URI diagramURI; | |
private CDOSession sessionCDO = null; | |
private CDOTransaction transaction; | |
HashMap<Object, Object> options = new HashMap<Object, Object>(); | |
private static final String UTF_8 = "UTF-8"; | |
private Label methodLabel; | |
private Text methodText; | |
private Button methodButton; | |
private String methodPath; | |
private String methodDirectory; | |
private Label argLabel; | |
private Text argNameText; | |
private Label importedArgModelPath; | |
public EPF2ARGUI(Shell parentShell) { | |
super(parentShell); | |
options.put(XMLResource.OPTION_ENCODING, UTF_8); | |
editor = PlatformUI.getWorkbench().getActiveWorkbenchWindow() | |
.getActivePage().getActiveEditor(); | |
resourceURI = EditUIUtil.getURI(editor.getEditorInput()); | |
CDOConnectionUtil.instance.init( | |
PreferenceConstants.getRepositoryName(), | |
PreferenceConstants.getProtocol(), | |
PreferenceConstants.getServerName()); | |
sessionCDO = CDOConnectionUtil.instance.getCurrentSession(); | |
transaction = sessionCDO.openTransaction(); | |
} | |
public EPF2ARGUI(IShellProvider parentShell) { | |
super(parentShell); | |
} | |
@Override | |
protected void createButtonsForButtonBar(Composite parent) { | |
super.createButtonsForButtonBar(parent); | |
Button ok = getButton(IDialogConstants.OK_ID); | |
ok.setText(IMPORT); | |
setButtonLayoutData(ok); | |
Button cancel = getButton(IDialogConstants.CANCEL_ID); | |
cancel.setText(CLOSE); | |
setButtonLayoutData(cancel); | |
} | |
@Override | |
protected Control createDialogArea(final Composite parent) { | |
ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory( | |
ComposedAdapterFactory.Descriptor.Registry.INSTANCE); | |
final Composite contents = (Composite) super.createDialogArea(parent); | |
GridData contentsGridData = (GridData) contents.getLayoutData(); | |
contentsGridData.horizontalAlignment = SWT.FILL; | |
contentsGridData.verticalAlignment = SWT.FILL; | |
createSourceDialogArea(contents, adapterFactory); | |
createTargetDialogArea(contents, adapterFactory); | |
return contents; | |
} | |
protected void createSourceDialogArea(final Composite contents, | |
ComposedAdapterFactory adapterFactory) { | |
final Composite sourceComposite = new Composite(contents, SWT.NONE); | |
{ | |
GridData data = new GridData(SWT.FILL, SWT.FILL, false, true); | |
data.horizontalAlignment = SWT.END; | |
data.horizontalAlignment = SWT.FILL; | |
sourceComposite.setLayoutData(data); | |
GridLayout layout = new GridLayout(); | |
layout.marginHeight = 0; | |
layout.marginWidth = 5; | |
sourceComposite.setLayout(layout); | |
} | |
Group groupSource = new Group(sourceComposite, SWT.NULL); | |
groupSource.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true)); | |
groupSource.setText("EPF Source Files"); | |
GridLayout layoutNew = new GridLayout(); | |
layoutNew.marginHeight = 10; | |
layoutNew.marginWidth = 10; | |
layoutNew.numColumns = 3; | |
groupSource.setLayout(layoutNew); | |
// Label Method | |
methodLabel = new Label(groupSource, SWT.NONE); | |
methodLabel.setText("EPF Delivery Process:"); | |
GridData methodLabelGridData = new GridData(); | |
methodLabelGridData.horizontalAlignment = SWT.FILL; | |
methodLabelGridData.verticalAlignment = SWT.FILL; | |
methodLabel.setLayoutData(methodLabelGridData); | |
// Text Method | |
methodText = new Text(groupSource, SWT.BORDER); | |
GridData methodTextGridData = new GridData(); | |
methodTextGridData.grabExcessHorizontalSpace = true; | |
methodTextGridData.minimumWidth = 500; | |
methodTextGridData.horizontalAlignment = SWT.FILL; | |
methodTextGridData.verticalAlignment = SWT.FILL; | |
methodText.setLayoutData(methodTextGridData); | |
methodText.setEditable(true); | |
// Button Method | |
methodButton = new Button(groupSource, SWT.NONE); | |
methodButton.setText("Browse..."); | |
methodButton.addSelectionListener(new SelectionAdapter() { | |
public void widgetSelected(SelectionEvent event) { | |
FileDialog dlg = new FileDialog(methodButton.getShell(), SWT.None); | |
// Set the initial filter path according | |
// to anything they've selected or typed in | |
dlg.setFilterPath(methodDirectory); | |
// Change the title bar text | |
dlg.setText("Select a EPF Delivery Process"); //Select a EPF Method File | |
String[] methodFilterExt = {"*.xml"}; | |
dlg.setFilterExtensions(methodFilterExt); | |
// Calling open() will open and run the dialog. | |
// It will return the selected directory, or | |
// null if user cancels | |
// I hide below three lines and subsequent two are added | |
methodPath = dlg.open(); | |
methodDirectory = dlg.getFilterPath(); | |
String methodFileName = dlg.getFileName(); | |
////// | |
if (methodPath != null) { | |
// Set the text box to the new selection | |
methodText.setText(methodPath); | |
setDefaultTargetModelNames(methodFileName); | |
} | |
} | |
}); | |
} | |
protected void setDefaultTargetModelNames (final String fileName){ | |
String defaultArgName=""; | |
defaultArgName=fileName.substring(0, fileName.lastIndexOf('.')) + "_Arg"; | |
argNameText.setText(defaultArgName); | |
} | |
protected void createTargetDialogArea(final Composite contents, | |
ComposedAdapterFactory adapterFactory) { | |
final Composite targetComposite = new Composite(contents, SWT.NONE); | |
{ | |
GridData data = new GridData(SWT.FILL, SWT.FILL, false, true); | |
data.horizontalAlignment = SWT.END; | |
data.horizontalAlignment = SWT.FILL; | |
targetComposite.setLayoutData(data); | |
GridLayout layout = new GridLayout(); | |
layout.marginHeight = 0; | |
layout.marginWidth = 5; | |
targetComposite.setLayout(layout); | |
} | |
Group groupTarget = new Group(targetComposite, SWT.NULL); | |
groupTarget.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true)); | |
groupTarget.setText("Imported Model"); | |
GridLayout layoutNew = new GridLayout(); | |
layoutNew.marginHeight = 10; | |
layoutNew.marginWidth = 10; | |
layoutNew.numColumns = 3; | |
groupTarget.setLayout(layoutNew); | |
Label modelLabel = new Label(groupTarget, SWT.NONE); | |
modelLabel.setText(""); | |
GridData modelLabelGridData = new GridData(); | |
modelLabelGridData.horizontalAlignment = SWT.FILL; | |
modelLabelGridData.verticalAlignment = SWT.FILL; | |
modelLabel.setLayoutData(modelLabelGridData); | |
Label nameLabel = new Label(groupTarget, SWT.NONE); | |
nameLabel.setText("Import using Name:"); | |
GridData nameLabelGridData = new GridData(); | |
nameLabelGridData.horizontalAlignment = SWT.FILL; | |
nameLabelGridData.verticalAlignment = SWT.FILL; | |
nameLabel.setLayoutData(nameLabelGridData); | |
Label importedLabel = new Label(groupTarget, SWT.NONE); | |
String projectPath = resourceURI.path().substring(0, resourceURI.path().lastIndexOf("/")); | |
projectPath=projectPath.substring(0, projectPath.lastIndexOf("/")); | |
importedLabel.setText("Generating Result" + projectPath); | |
GridData importedLabelGridData = new GridData(); | |
importedLabelGridData.horizontalAlignment = SWT.FILL; | |
importedLabelGridData.verticalAlignment = SWT.FILL; | |
importedLabel.setLayoutData(importedLabelGridData); | |
argLabel = new Label(groupTarget, SWT.NONE); | |
argLabel.setText("ARGUMENTATION model:"); | |
GridData argLabelGridData = new GridData(); | |
argLabelGridData.horizontalAlignment = SWT.FILL; | |
argLabelGridData.verticalAlignment = SWT.FILL; | |
argLabel.setLayoutData(argLabelGridData); | |
// Argument Name Text | |
argNameText = new Text(groupTarget, SWT.BORDER); | |
GridData argNameTextGridData = new GridData(); | |
argNameTextGridData.grabExcessHorizontalSpace = true; | |
argNameTextGridData.minimumWidth = 200; | |
argNameText.setLayoutData(argNameTextGridData); | |
argNameText.setEditable(true); | |
// Path of imported Argumentation model | |
importedArgModelPath = new Label(groupTarget, SWT.BORDER); | |
GridData importedArgModelPathGridData = new GridData(); | |
importedArgModelPathGridData.grabExcessHorizontalSpace = true; | |
importedArgModelPathGridData.minimumWidth = 350; | |
importedArgModelPathGridData.horizontalAlignment = SWT.FILL; | |
importedArgModelPathGridData.verticalAlignment = SWT.FILL; | |
importedArgModelPath.setLayoutData(importedArgModelPathGridData); | |
} | |
// protected void setImportBottom(){ | |
//if((configurationText.getText().length()==0) || (methodText.getText().length()==0)){ | |
//} | |
//} | |
protected void setImportBottom(){ | |
if((methodText.getText().length()==0)){ | |
} | |
} | |
@Override | |
protected void configureShell(Shell newShell) { | |
super.configureShell(newShell); | |
newShell.setText("EPF Composer to Argumentation"); | |
} | |
@Override | |
protected void okPressed() { | |
boolean allOK=true; | |
if(methodText.getText().length()==0){ | |
MessageDialog.openError(getShell(), "EPF Process File", | |
"You must select the EPF process file."); | |
return; | |
} | |
ProgressMonitorDialog dialog = new ProgressMonitorDialog(getShell()); | |
dialog.open(); | |
IProgressMonitor monitor = dialog.getProgressMonitor(); | |
monitor.beginTask("Generating the process-based arguments ... ", 5); | |
monitor.worked(1); | |
try { | |
runImportFromEPF(monitor, resourceURI); | |
} catch (ExecutionException e) { | |
// TODO Auto-generated catch block | |
e.printStackTrace(); | |
} | |
monitor.worked(5); | |
monitor.done(); | |
dialog.close(); | |
if(allOK){ | |
MessageDialog.openInformation(getShell(), "Transformation completed", "The model and diagram are generated under the argumentation folder"); //Selected EPF files imported | |
getButton(IDialogConstants.OK_ID).setEnabled(false); | |
} | |
} | |
@Override | |
public boolean close() { | |
//Refresh the Repository explorer view | |
DawnExplorer repoView =null; | |
IViewReference viewReferences[] = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getViewReferences(); | |
for (int i = 0; i < viewReferences.length; i++) { | |
if ("org.eclipse.emf.cdo.dawn.ui.views.DawnExplorer".equals(viewReferences[i].getId())) { | |
repoView = (DawnExplorer)viewReferences[i].getView(false); | |
repoView.refreshViewer(false); | |
break; | |
} | |
} | |
if (!transaction.isClosed()) transaction.close(); | |
return super.close(); | |
} | |
private void runImportFromEPF( | |
final IProgressMonitor monitor, final URI projectModel) throws ExecutionException { | |
CDOResource assuranceprojectResource=null; | |
String path = projectModel.path(); | |
path=path.substring(0, path.lastIndexOf("/")); | |
assuranceprojectFolder= transaction.getResourceFolder(path); | |
String argFolderPath = assuranceprojectFolder.getPath().substring(0, assuranceprojectFolder.getPath().lastIndexOf("/")); | |
argFolderPath=argFolderPath + "/" + ARGUMENTATION_Folder; | |
argFolder= transaction.getResourceFolder(argFolderPath); | |
//CDOResource targetResource = transaction.createResource(targetPath); | |
//String sourceDiagram= sourceResource.getPath() + "_diagram";*/ | |
URI argModelURI=null; | |
URI diagramURI=null; | |
CDOResource argModelResource=null; | |
CDOResource argDiagramResource=null; | |
argModelResource = transaction.getOrCreateResource(argFolder.getPath() + "/" + argNameText.getText() + ARGUMENTATION_Extension); //.evidence | |
argModelURI = argModelResource.getURI(); | |
argDiagramResource = transaction.getOrCreateResource(argFolder.getPath() + "/" + argNameText.getText() + ARGUMENTATION_Extension + EXTENSION_DIAGRAM); | |
diagramURI = argDiagramResource.getURI(); | |
// end here | |
try { | |
synchronized (transaction) | |
{ | |
EPF2ARGTransformHandler transfo = new EPF2ARGTransformHandler(assuranceprojectFolder, methodText.getText(), argModelResource, argDiagramResource, transaction); //URI diagram, | |
transfo.execute(); | |
transaction.commit(); | |
String argSubPath=argModelURI.path().substring(argModelURI.path().indexOf("/")+1); | |
argSubPath=argSubPath.substring(argSubPath.indexOf("/")); | |
importedArgModelPath.setText(argSubPath); | |
monitor.worked(4); | |
String argSubPath1=diagramURI.path().substring(diagramURI.path().indexOf("/")+1); | |
argSubPath1=argSubPath1.substring(argSubPath1.indexOf("/")); | |
importedArgModelPath.setText(argSubPath1); | |
} | |
} catch (Exception e) { | |
e.printStackTrace(); | |
transaction.rollback(); | |
String msgError="Problems occur while importing the process model:"; | |
importedArgModelPath.setText(msgError + e.getMessage()); | |
monitor.done(); | |
} | |
try { | |
assuranceprojectResource = transaction.getResource(projectModel.path()); | |
EList<EObject> contents = assuranceprojectResource.getContents(); | |
EObject rootObject =contents.get(0); | |
AssuranceProject assurproj = (AssuranceProject)rootObject; | |
AssetsPackage assPackageconfig = null; | |
for (AssetsPackage assetPackage: assurproj.getAssetsPackage()) { | |
if(assetPackage.isIsActive()){ | |
assPackageconfig=assetPackage; | |
} | |
} | |
CDOResource argResource = transaction.getResource(argModelURI.path()); | |
EList<EObject> argContents = argResource.getContents(); | |
EObject argRootObject =argContents.get(0); | |
Case argCase = (Case)argRootObject; | |
//assPackageconfig.getArgumentationModel().add(argCase); | |
// Save the contents of the resource to the file system. | |
assuranceprojectResource.save(options); | |
transaction.commit(); | |
} catch (Exception e) { | |
// TODO Auto-generated catch block | |
e.printStackTrace(); | |
//MessageDialog.openWarning(getShell(), "Models not Linked", "The generated models cannot be linked to the Assurance Project"); | |
transaction.rollback(); | |
monitor.done(); | |
} | |
} | |
} |