| /******************************************************************************* |
| * Copyright (c) 2011, 2012 Red Hat, Inc. |
| * All rights reserved. |
| * This program is 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 |
| * |
| * Contributors: |
| * Red Hat, Inc. - initial API and implementation |
| * |
| * @author Bob Brodt |
| ******************************************************************************/ |
| package org.eclipse.bpmn2.modeler.ui; |
| |
| import java.util.Enumeration; |
| |
| import org.apache.xerces.parsers.SAXParser; |
| import org.apache.xerces.xni.Augmentations; |
| import org.apache.xerces.xni.QName; |
| import org.apache.xerces.xni.XMLAttributes; |
| import org.apache.xerces.xni.XNIException; |
| import org.eclipse.bpmn2.Activity; |
| import org.eclipse.bpmn2.Assignment; |
| import org.eclipse.bpmn2.BaseElement; |
| import org.eclipse.bpmn2.BoundaryEvent; |
| import org.eclipse.bpmn2.CallActivity; |
| import org.eclipse.bpmn2.CallChoreography; |
| import org.eclipse.bpmn2.CatchEvent; |
| import org.eclipse.bpmn2.Category; |
| import org.eclipse.bpmn2.CompensateEventDefinition; |
| import org.eclipse.bpmn2.ConditionalEventDefinition; |
| import org.eclipse.bpmn2.CorrelationPropertyRetrievalExpression; |
| import org.eclipse.bpmn2.DataInput; |
| import org.eclipse.bpmn2.DataObject; |
| import org.eclipse.bpmn2.DataObjectReference; |
| import org.eclipse.bpmn2.DataOutput; |
| import org.eclipse.bpmn2.DataStore; |
| import org.eclipse.bpmn2.DataStoreReference; |
| import org.eclipse.bpmn2.EndEvent; |
| import org.eclipse.bpmn2.ErrorEventDefinition; |
| import org.eclipse.bpmn2.EscalationEventDefinition; |
| import org.eclipse.bpmn2.Event; |
| import org.eclipse.bpmn2.Expression; |
| import org.eclipse.bpmn2.FormalExpression; |
| import org.eclipse.bpmn2.Gateway; |
| import org.eclipse.bpmn2.GlobalBusinessRuleTask; |
| import org.eclipse.bpmn2.GlobalManualTask; |
| import org.eclipse.bpmn2.GlobalScriptTask; |
| import org.eclipse.bpmn2.GlobalTask; |
| import org.eclipse.bpmn2.GlobalUserTask; |
| import org.eclipse.bpmn2.HumanPerformer; |
| import org.eclipse.bpmn2.Import; |
| import org.eclipse.bpmn2.InputOutputSpecification; |
| import org.eclipse.bpmn2.Interface; |
| import org.eclipse.bpmn2.ItemDefinition; |
| import org.eclipse.bpmn2.LinkEventDefinition; |
| import org.eclipse.bpmn2.ManualTask; |
| import org.eclipse.bpmn2.Message; |
| import org.eclipse.bpmn2.MessageEventDefinition; |
| import org.eclipse.bpmn2.MessageFlow; |
| import org.eclipse.bpmn2.MultiInstanceLoopCharacteristics; |
| import org.eclipse.bpmn2.Operation; |
| import org.eclipse.bpmn2.Performer; |
| import org.eclipse.bpmn2.PotentialOwner; |
| import org.eclipse.bpmn2.Process; |
| import org.eclipse.bpmn2.Property; |
| import org.eclipse.bpmn2.ResourceAssignmentExpression; |
| import org.eclipse.bpmn2.ResourceParameterBinding; |
| import org.eclipse.bpmn2.ResourceRole; |
| import org.eclipse.bpmn2.ScriptTask; |
| import org.eclipse.bpmn2.SequenceFlow; |
| import org.eclipse.bpmn2.SignalEventDefinition; |
| import org.eclipse.bpmn2.StandardLoopCharacteristics; |
| import org.eclipse.bpmn2.StartEvent; |
| import org.eclipse.bpmn2.SubProcess; |
| import org.eclipse.bpmn2.Task; |
| import org.eclipse.bpmn2.TextAnnotation; |
| import org.eclipse.bpmn2.ThrowEvent; |
| import org.eclipse.bpmn2.TimerEventDefinition; |
| import org.eclipse.bpmn2.modeler.core.IBpmn2RuntimeExtension; |
| import org.eclipse.bpmn2.modeler.core.LifecycleEvent; |
| import org.eclipse.bpmn2.modeler.core.LifecycleEvent.EventType; |
| import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractBpmn2PropertySection; |
| import org.eclipse.bpmn2.modeler.core.merrimac.clad.Bpmn2TabbedPropertySheetPage; |
| import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultDetailComposite; |
| import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultDialogComposite; |
| import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultListComposite; |
| import org.eclipse.bpmn2.modeler.core.merrimac.clad.PropertiesCompositeFactory; |
| import org.eclipse.bpmn2.modeler.core.preferences.ModelEnablements; |
| import org.eclipse.bpmn2.modeler.core.preferences.ShapeStyle; |
| import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil; |
| import org.eclipse.bpmn2.modeler.core.utils.ModelUtil.Bpmn2DiagramType; |
| import org.eclipse.bpmn2.modeler.ui.diagram.Bpmn2FeatureMap; |
| import org.eclipse.bpmn2.modeler.ui.property.StyleChangeAdapter; |
| import org.eclipse.bpmn2.modeler.ui.property.artifact.CategoryDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.artifact.TextAnnotationDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.connectors.MessageFlowDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.connectors.SequenceFlowDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.data.DataAssignmentDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.data.DataObjectPropertySection.DataObjectDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.data.DataObjectReferencePropertySection.DataObjectReferenceDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.data.DataStorePropertySection.DataStoreDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.data.DataStoreReferencePropertySection.DataStoreReferenceDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.data.ExpressionDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.data.InterfaceDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.data.ItemAwareElementDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.data.MessageDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.data.MessageListComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.data.OperationDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.data.ResourceAssignmentExpressionDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.data.ResourceParameterBindingDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.data.ResourceRoleDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.diagrams.CorrelationPropertyREListComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.diagrams.DefinitionsPropertyComposite.ImportDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.diagrams.ItemDefinitionDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.diagrams.ItemDefinitionListComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.diagrams.ProcessDiagramDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.diagrams.PropertyListComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.diagrams.ResourceRoleListComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.events.BoundaryEventDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.events.CatchEventDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.events.CommonEventDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.events.CommonEventPropertySection.EventDefinitionDialogComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.events.ConditionalEventDefinitionDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.events.EndEventDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.events.LinkEventDefinitionDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.events.StartEventDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.events.ThrowEventDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.events.TimerEventDefinitionDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.gateways.GatewayDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.tasks.ActivityDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.tasks.ActivityInputDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.tasks.ActivityOutputDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.tasks.DataAssociationDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.tasks.IoParametersDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.tasks.ManualTaskDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.tasks.MultiInstanceLoopCharacteristicsDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.tasks.ScriptTaskDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.tasks.StandardLoopCharacteristicsDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.property.tasks.TaskDetailComposite; |
| import org.eclipse.bpmn2.modeler.ui.util.PropertyUtil; |
| import org.eclipse.core.runtime.IAdaptable; |
| import org.eclipse.emf.ecore.EClass; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.graphiti.mm.pictograms.PictogramElement; |
| import org.eclipse.ui.IEditorInput; |
| import org.eclipse.ui.part.IPage; |
| import org.eclipse.ui.views.properties.PropertySheet; |
| import org.xml.sax.InputSource; |
| |
| |
| public class DefaultBpmn2RuntimeExtension implements IBpmn2RuntimeExtension { |
| |
| private static final String targetNamespace = "http://org.eclipse.bpmn2/default"; //$NON-NLS-1$ |
| |
| public DefaultBpmn2RuntimeExtension() { |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.bpmn2.modeler.core.IBpmn2RuntimeExtension#isContentForRuntime(org.eclipse.ui.IEditorInput) |
| */ |
| @Override |
| public boolean isContentForRuntime(IEditorInput input) { |
| return false; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.bpmn2.modeler.core.IBpmn2RuntimeExtension#getTargetNamespace(org.eclipse.bpmn2.modeler.core.utils.ModelUtil.Bpmn2DiagramType) |
| */ |
| @Override |
| public String getTargetNamespace(Bpmn2DiagramType diagramType){ |
| String type = ""; //$NON-NLS-1$ |
| switch (diagramType) { |
| case PROCESS: |
| type = "/process"; //$NON-NLS-1$ |
| break; |
| case COLLABORATION: |
| type = "/collaboration"; //$NON-NLS-1$ |
| break; |
| case CHOREOGRAPHY: |
| type = "/choreography"; //$NON-NLS-1$ |
| break; |
| default: |
| type = ""; //$NON-NLS-1$ |
| break; |
| } |
| return targetNamespace + type; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.bpmn2.modeler.core.IBpmn2RuntimeExtension#notify(org.eclipse.bpmn2.modeler.core.LifecycleEvent) |
| */ |
| |
| @Override |
| public void notify(LifecycleEvent event) { |
| // System.out.println(event.eventType+ ": " + event.target); |
| if (event.eventType.equals(EventType.EDITOR_INITIALIZED)) { |
| if (event.target instanceof IAdaptable) { |
| ModelEnablements me = (ModelEnablements) ((IAdaptable)event.target).getAdapter(ModelEnablements.class); |
| me.setEnabled("BaseElement", "style", true); //$NON-NLS-1$ //$NON-NLS-2$ |
| me.setEnabled("ShapeStyle", true); //$NON-NLS-1$ |
| } |
| PropertiesCompositeFactory.register(EObject.class, DefaultDetailComposite.class); |
| PropertiesCompositeFactory.register(EObject.class, DefaultListComposite.class); |
| PropertiesCompositeFactory.register(EObject.class, DefaultDialogComposite.class); |
| PropertiesCompositeFactory.register(Message.class, MessageDetailComposite.class); |
| PropertiesCompositeFactory.register(Message.class, MessageListComposite.class); |
| PropertiesCompositeFactory.register(MessageFlow.class, MessageFlowDetailComposite.class); |
| PropertiesCompositeFactory.register(Property.class, ItemAwareElementDetailComposite.class); |
| PropertiesCompositeFactory.register(CallActivity.class, ActivityDetailComposite.class); |
| PropertiesCompositeFactory.register(GlobalTask.class, ActivityDetailComposite.class); |
| PropertiesCompositeFactory.register(GlobalBusinessRuleTask.class, ActivityDetailComposite.class); |
| PropertiesCompositeFactory.register(GlobalManualTask.class, ActivityDetailComposite.class); |
| PropertiesCompositeFactory.register(GlobalScriptTask.class, ActivityDetailComposite.class); |
| PropertiesCompositeFactory.register(GlobalUserTask.class, ActivityDetailComposite.class); |
| PropertiesCompositeFactory.register(Import.class, ImportDetailComposite.class); |
| PropertiesCompositeFactory.register(Category.class, CategoryDetailComposite.class); |
| PropertiesCompositeFactory.register(TextAnnotation.class, TextAnnotationDetailComposite.class); |
| PropertiesCompositeFactory.register(SequenceFlow.class, SequenceFlowDetailComposite.class); |
| PropertiesCompositeFactory.register(DataObject.class, DataObjectDetailComposite.class); |
| PropertiesCompositeFactory.register(DataObjectReference.class, DataObjectDetailComposite.class); |
| PropertiesCompositeFactory.register(Assignment.class, DataAssignmentDetailComposite.class); |
| PropertiesCompositeFactory.register(Expression.class, ExpressionDetailComposite.class); |
| PropertiesCompositeFactory.register(FormalExpression.class, ExpressionDetailComposite.class); |
| PropertiesCompositeFactory.register(ResourceAssignmentExpression.class, ResourceAssignmentExpressionDetailComposite.class); |
| PropertiesCompositeFactory.register(ResourceParameterBinding.class, ResourceParameterBindingDetailComposite.class); |
| PropertiesCompositeFactory.register(PotentialOwner.class, ResourceRoleDetailComposite.class); |
| PropertiesCompositeFactory.register(HumanPerformer.class, ResourceRoleDetailComposite.class); |
| PropertiesCompositeFactory.register(Performer.class, ResourceRoleDetailComposite.class); |
| PropertiesCompositeFactory.register(DataObjectReference.class, DataObjectReferenceDetailComposite.class); |
| PropertiesCompositeFactory.register(DataStore.class, DataStoreDetailComposite.class); |
| PropertiesCompositeFactory.register(DataStoreReference.class, DataStoreReferenceDetailComposite.class); |
| PropertiesCompositeFactory.register(Interface.class, InterfaceDetailComposite.class); |
| PropertiesCompositeFactory.register(Operation.class, OperationDetailComposite.class); |
| PropertiesCompositeFactory.register(ItemDefinition.class, ItemDefinitionDetailComposite.class); |
| PropertiesCompositeFactory.register(ItemDefinition.class, ItemDefinitionListComposite.class); |
| PropertiesCompositeFactory.register(CorrelationPropertyRetrievalExpression.class, CorrelationPropertyREListComposite.class); |
| PropertiesCompositeFactory.register(Property.class, PropertyListComposite.class); |
| PropertiesCompositeFactory.register(ResourceRole.class, ResourceRoleListComposite.class); |
| PropertiesCompositeFactory.register(Event.class, CommonEventDetailComposite.class); |
| PropertiesCompositeFactory.register(StartEvent.class, StartEventDetailComposite.class); |
| PropertiesCompositeFactory.register(EndEvent.class, EndEventDetailComposite.class); |
| PropertiesCompositeFactory.register(CatchEvent.class, CatchEventDetailComposite.class); |
| PropertiesCompositeFactory.register(ThrowEvent.class, ThrowEventDetailComposite.class); |
| PropertiesCompositeFactory.register(BoundaryEvent.class, BoundaryEventDetailComposite.class); |
| PropertiesCompositeFactory.register(TimerEventDefinition.class, TimerEventDefinitionDetailComposite.class); |
| PropertiesCompositeFactory.register(LinkEventDefinition.class, LinkEventDefinitionDetailComposite.class); |
| PropertiesCompositeFactory.register(ConditionalEventDefinition.class, ConditionalEventDefinitionDetailComposite.class); |
| PropertiesCompositeFactory.register(CompensateEventDefinition.class, EventDefinitionDialogComposite.class); |
| PropertiesCompositeFactory.register(ConditionalEventDefinition.class, EventDefinitionDialogComposite.class); |
| PropertiesCompositeFactory.register(ErrorEventDefinition.class, EventDefinitionDialogComposite.class); |
| PropertiesCompositeFactory.register(EscalationEventDefinition.class, EventDefinitionDialogComposite.class); |
| PropertiesCompositeFactory.register(LinkEventDefinition.class, EventDefinitionDialogComposite.class); |
| PropertiesCompositeFactory.register(MessageEventDefinition.class, EventDefinitionDialogComposite.class); |
| PropertiesCompositeFactory.register(SignalEventDefinition.class, EventDefinitionDialogComposite.class); |
| PropertiesCompositeFactory.register(TimerEventDefinition.class, EventDefinitionDialogComposite.class); |
| PropertiesCompositeFactory.register(Process.class, ProcessDiagramDetailComposite.class); |
| PropertiesCompositeFactory.register(EndEvent.class, EndEventDetailComposite.class); |
| PropertiesCompositeFactory.register(StartEvent.class, StartEventDetailComposite.class); |
| PropertiesCompositeFactory.register(ThrowEvent.class, ThrowEventDetailComposite.class); |
| PropertiesCompositeFactory.register(StandardLoopCharacteristics.class, StandardLoopCharacteristicsDetailComposite.class); |
| PropertiesCompositeFactory.register(MultiInstanceLoopCharacteristics.class, MultiInstanceLoopCharacteristicsDetailComposite.class); |
| PropertiesCompositeFactory.register(Gateway.class, GatewayDetailComposite.class); |
| PropertiesCompositeFactory.register(Activity.class, ActivityInputDetailComposite.class); |
| PropertiesCompositeFactory.register(InputOutputSpecification.class, ActivityInputDetailComposite.class); |
| PropertiesCompositeFactory.register(Activity.class, ActivityOutputDetailComposite.class); |
| PropertiesCompositeFactory.register(CallChoreography.class, ActivityDetailComposite.class); |
| PropertiesCompositeFactory.register(InputOutputSpecification.class, IoParametersDetailComposite.class); |
| PropertiesCompositeFactory.register(DataInput.class, DataAssociationDetailComposite.class); |
| PropertiesCompositeFactory.register(DataOutput.class, DataAssociationDetailComposite.class); |
| PropertiesCompositeFactory.register(ManualTask.class, ManualTaskDetailComposite.class); |
| PropertiesCompositeFactory.register(ScriptTask.class, ScriptTaskDetailComposite.class); |
| PropertiesCompositeFactory.register(SubProcess.class, ActivityDetailComposite.class); |
| PropertiesCompositeFactory.register(Task.class, TaskDetailComposite.class); |
| } |
| else if (event.eventType.equals(EventType.PICTOGRAMELEMENT_ADDED)) { |
| StyleChangeAdapter.adapt((PictogramElement) event.target); |
| // } |
| // else if (event.eventType.equals(EventType.BUSINESSOBJECT_CREATED) && event.target instanceof BaseElement) { |
| |
| BaseElement object = BusinessObjectUtil.getFirstBaseElement((PictogramElement) event.target); //(BaseElement) event.target; |
| EClass ec = object.eClass(); |
| if (Bpmn2FeatureMap.ALL_FIGURES.contains(ec.getInstanceClass()) && ShapeStyle.hasStyle(object)) |
| ShapeStyle.createStyleObject(object); |
| } |
| else if (event.eventType.equals(EventType.COMMAND_UNDO) || event.eventType.equals(EventType.COMMAND_REDO)) { |
| AbstractBpmn2PropertySection section = PropertyUtil.getCurrentPropertySection(); |
| if (section!=null) |
| section.redraw(); |
| } |
| } |
| |
| /** |
| * A simple XML parser that checks if the root element of an xml document contains any |
| * namespace definitions matching the given namespace URI. |
| * |
| * @author bbrodt |
| */ |
| public static class RootElementParser extends SAXParser { |
| private String namespace; |
| private boolean result = false; |
| |
| /** |
| * @param namespace - the namespace URI to scan for. |
| */ |
| public RootElementParser(String namespace) { |
| this.namespace = namespace; |
| } |
| |
| public boolean getResult() { |
| return result; |
| } |
| |
| public void parse(InputSource source) { |
| result = false; |
| try { |
| super.parse(source); |
| } catch (AcceptedException e) { |
| result = true; |
| } catch (Exception e) { |
| } |
| } |
| |
| @Override |
| public void startElement(QName qName, XMLAttributes attributes, Augmentations augmentations) |
| throws XNIException { |
| |
| super.startElement(qName, attributes, augmentations); |
| |
| // search the "definitions" for a namespace that matches the required namespace |
| if ("definitions".equals(qName.localpart)) { //$NON-NLS-1$ |
| String namespace = attributes.getValue("targetNamespace"); //$NON-NLS-1$ |
| if (this.namespace.equals(namespace)) |
| throw new AcceptedException(qName.localpart); |
| Enumeration<?> e = fNamespaceContext.getAllPrefixes(); |
| while (e.hasMoreElements()) { |
| String prefix = (String)e.nextElement(); |
| namespace = fNamespaceContext.getURI(prefix); |
| if (this.namespace.equals(namespace)) |
| throw new AcceptedException(qName.localpart); |
| } |
| throw new RejectedException(); |
| } else { |
| throw new RejectedException(); |
| } |
| } |
| } |
| |
| public static class AcceptedException extends RuntimeException { |
| public String acceptedRootElement; |
| |
| public AcceptedException(String acceptedRootElement) { |
| this.acceptedRootElement = acceptedRootElement; |
| } |
| |
| private static final long serialVersionUID = 1L; |
| } |
| |
| public static class RejectedException extends RuntimeException { |
| private static final long serialVersionUID = 1L; |
| } |
| } |