package org.activiti.designer.eclipse.ui.wizard.diagram; import java.io.InputStream; import java.util.Collection; import org.activiti.designer.eclipse.Logger; import org.activiti.designer.eclipse.bpmnimport.BpmnFileReader; import org.activiti.designer.eclipse.common.ActivitiBPMNDiagramConstants; import org.activiti.designer.eclipse.common.ActivitiPlugin; import org.activiti.designer.eclipse.common.FileService; import org.activiti.designer.eclipse.extension.export.ExportMarshaller; import org.activiti.designer.eclipse.navigator.nodes.base.AbstractInstancesOfTypeContainerNode; import org.activiti.designer.eclipse.preferences.PreferencesUtil; import org.activiti.designer.eclipse.ui.ExportMarshallerRunnable; import org.activiti.designer.eclipse.util.ExtensionPointUtil; import org.activiti.designer.eclipse.util.Util; import org.activiti.designer.util.preferences.Preferences; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.WordUtils; import org.eclipse.bpmn2.Bpmn2Factory; import org.eclipse.bpmn2.Documentation; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.transaction.RecordingCommand; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.graphiti.dt.IDiagramTypeProvider; import org.eclipse.graphiti.features.IFeatureProvider; import org.eclipse.graphiti.mm.pictograms.Diagram; import org.eclipse.graphiti.services.Graphiti; import org.eclipse.graphiti.ui.editor.DiagramEditorInput; import org.eclipse.graphiti.ui.services.GraphitiUi; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.internal.core.PackageFragment; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.progress.IProgressService; import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard; /** * The Class CreateDefaultActivitiDiagramWizard. */ public class CreateDefaultActivitiDiagramWizard extends BasicNewResourceWizard { private Diagram diagram; private CreateDefaultActivitiDiagramInitialContentPage initialContentPage; @Override public void addPages() { super.addPages(); addPage(new CreateDefaultActivitiDiagramNameWizardPage(super.getSelection())); initialContentPage = new CreateDefaultActivitiDiagramInitialContentPage(); addPage(initialContentPage); } @Override public boolean canFinish() { return canCreateDiagramFile(); } private boolean canCreateDiagramFile() { final IFile fileToCreate = getDiagramFile(); if (fileToCreate != null) { return !fileToCreate.exists(); } return false; } private IFile getDiagramFile() { final String diagramName = getDiagramName(); if (StringUtils.isBlank(diagramName)) { return null; } IProject project = null; IFolder diagramFolder = null; // Added check on IJavaProject // Kept IProject check for future facet implementation Object element = getSelection().getFirstElement(); if (element instanceof IProject) { project = (IProject) element; } else if (element instanceof IJavaProject) { IJavaProject javaProject = (IJavaProject) element; project = javaProject.getProject(); } else if (element instanceof AbstractInstancesOfTypeContainerNode) { AbstractInstancesOfTypeContainerNode aiocn = (AbstractInstancesOfTypeContainerNode) element; project = aiocn.getProject(); } else if (element instanceof IFolder) { diagramFolder = (IFolder) element; project = diagramFolder.getProject(); } else if (element instanceof PackageFragment) { // access is // discouraged, but // inevitable when // the selection is // the diagrams // package itself PackageFragment fragment = (PackageFragment) element; project = fragment.getJavaProject().getProject(); } if (project == null || !project.isAccessible()) { String error = "No open project was found for the current selection. Select a project and restart the wizard."; IStatus status = new Status(IStatus.ERROR, ActivitiPlugin.getID(), error); ErrorDialog.openError(getShell(), "No Project Found", null, status); return null; } if (diagramFolder == null) { diagramFolder = project.getFolder(ActivitiBPMNDiagramConstants.DIAGRAM_FOLDER); } return diagramFolder.getFile(diagramName); } /* * (non-Javadoc) * * @see * org.eclipse.ui.wizards.newresource.BasicNewResourceWizard#init(org.eclipse * .ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection) */ @Override public void init(IWorkbench workbench, IStructuredSelection currentSelection) { super.init(workbench, currentSelection); } @Override public IWizardPage getNextPage(IWizardPage page) { if (page instanceof CreateDefaultActivitiDiagramNameWizardPage) { } return super.getNextPage(page); } /* * (non-Javadoc) * * @see org.eclipse.jface.wizard.Wizard#performFinish() */ @Override public boolean performFinish() { final String diagramTypeId = "BPMNdiagram"; final IFile diagramFile = getDiagramFile(); final String diagramName = getDiagramName(); URI uri = URI.createPlatformResourceURI(diagramFile.getFullPath().toString(), true); TransactionalEditingDomain domain = null; boolean createContent = PreferencesUtil.getBooleanPreference(Preferences.EDITOR_ADD_DEFAULT_CONTENT_TO_DIAGRAMS); if (createContent) { final InputStream contentStream = Util.getContentStream(Util.Content.NEW_DIAGRAM_CONTENT); InputStream replacedStream = Util.swapStreamContents(diagramName, contentStream); domain = FileService.createEmfFileForDiagram(uri, null, replacedStream, diagramFile); diagram = org.eclipse.graphiti.ui.internal.services.GraphitiUiInternal.getEmfService().getDiagramFromFile(diagramFile, domain.getResourceSet()); } else { diagram = Graphiti.getPeCreateService().createDiagram(diagramTypeId, diagramName, true); domain = FileService.createEmfFileForDiagram(uri, diagram, null, null); final String simpleDiagramName = StringUtils.substringBefore(diagramName, ActivitiBPMNDiagramConstants.DIAGRAM_EXTENSION); final String diagramId = StringUtils.deleteWhitespace(WordUtils.capitalize(simpleDiagramName)); if(initialContentPage.contentSourceTemplate.getSelection() == true && initialContentPage.templateTable.getSelectionIndex() >= 0) { domain.getCommandStack().execute(new RecordingCommand(domain, "template process content") { protected void doExecute() { IDiagramTypeProvider dtp = GraphitiUi.getExtensionManager().createDiagramTypeProvider(diagram, GraphitiUi.getExtensionManager().getDiagramTypeProviderId(diagram.getDiagramTypeId())); //$NON-NLS-1$ IFeatureProvider featureProvider = dtp.getFeatureProvider(); final InputStream contentStream = Util.class.getClassLoader().getResourceAsStream("src/main/resources/templates/" + TemplateInfo.templateFilenames[initialContentPage.templateTable.getSelectionIndex()]); BpmnFileReader bpmnFileReader = new BpmnFileReader(contentStream, diagramId, diagram, featureProvider); bpmnFileReader.readBpmn(); } }); } else { final Runnable runnable = new Runnable() { public void run() { org.eclipse.bpmn2.Process process = Bpmn2Factory.eINSTANCE.createProcess(); process.setId(diagramId); process.setName(simpleDiagramName); Documentation documentation = Bpmn2Factory.eINSTANCE.createDocumentation(); documentation.setId("documentation_process"); documentation.setText(String.format("Place documentation for the '%s' process here.", simpleDiagramName)); process.getDocumentation().add(documentation); diagram.eResource().getContents().add(process); } }; domain.getCommandStack().execute(new RecordingCommand(domain, "default process content") { protected void doExecute() { runnable.run(); } }); } } String providerId = GraphitiUi.getExtensionManager().getDiagramTypeProviderId(diagram.getDiagramTypeId()); DiagramEditorInput editorInput = new DiagramEditorInput(EcoreUtil.getURI(diagram), domain, providerId); try { PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().openEditor(editorInput, ActivitiBPMNDiagramConstants.DIAGRAM_EDITOR_ID); } catch (PartInitException e) { String error = "Error while opening diagram editor"; IStatus status = new Status(IStatus.ERROR, ActivitiPlugin.getID(), error, e); ErrorDialog.openError(getShell(), "An error occured", null, status); return false; } if(initialContentPage.contentSourceTemplate.getSelection() == true && initialContentPage.templateTable.getSelectionIndex() >= 0) { // Determine list of ExportMarshallers to invoke after regular save final Collection<ExportMarshaller> marshallers = ExtensionPointUtil .getActiveExportMarshallers(); if (marshallers.size() > 0) { // Get the resource belonging to the editor part final Diagram diagram = editorInput.getDiagram(); // Get the progress service so we can have a progress monitor final IProgressService progressService = PlatformUI.getWorkbench().getProgressService(); try { final ExportMarshallerRunnable runnable = new ExportMarshallerRunnable( diagram, marshallers); progressService.busyCursorWhile(runnable); } catch (Exception e) { Logger.logError("Exception while performing save", e); } } } return true; } /** * Gets the diagram. * * @return the diagram */ public Diagram getDiagram() { return diagram; } private CreateDefaultActivitiDiagramNameWizardPage getNamePage() { return (CreateDefaultActivitiDiagramNameWizardPage) getPage(CreateDefaultActivitiDiagramNameWizardPage.PAGE_NAME); } private String getDiagramName() { return getNamePage().getDiagramName(); } }