diff options
author | Bob Brodt | 2014-03-06 18:21:31 +0000 |
---|---|---|
committer | Bob Brodt | 2014-03-06 18:21:31 +0000 |
commit | 47f791537d53809290310be3742dc4037d1f313f (patch) | |
tree | c07a724d20b70aebe13d9f0b1808c052774b0814 | |
parent | d43908b9442dd4a517785ce4353e90a3fc0a4851 (diff) | |
download | org.eclipse.bpmn2-modeler-47f791537d53809290310be3742dc4037d1f313f.tar.gz org.eclipse.bpmn2-modeler-47f791537d53809290310be3742dc4037d1f313f.tar.xz org.eclipse.bpmn2-modeler-47f791537d53809290310be3742dc4037d1f313f.zip |
Bug 429699 - Stack Overflow error when creating any <customTask> with a
label
Bug 429774 - Some compound objects are not being updated immediately
after construction
Bug 429784 - XMLHandler can not resolve some object references by QName
11 files changed, 109 insertions, 33 deletions
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/AbstractBpmn2AddElementFeature.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/AbstractBpmn2AddElementFeature.java index 4eca8243..181c0917 100644 --- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/AbstractBpmn2AddElementFeature.java +++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/AbstractBpmn2AddElementFeature.java @@ -45,12 +45,15 @@ import org.eclipse.graphiti.IExecutionInfo; import org.eclipse.graphiti.datatypes.ILocation; import org.eclipse.graphiti.features.ICreateConnectionFeature; import org.eclipse.graphiti.features.IFeatureProvider; +import org.eclipse.graphiti.features.IReason; import org.eclipse.graphiti.features.IReconnectionFeature; import org.eclipse.graphiti.features.context.IAddContext; import org.eclipse.graphiti.features.context.ITargetContext; import org.eclipse.graphiti.features.context.impl.AddContext; import org.eclipse.graphiti.features.context.impl.CreateConnectionContext; +import org.eclipse.graphiti.features.context.impl.LayoutContext; import org.eclipse.graphiti.features.context.impl.ReconnectionContext; +import org.eclipse.graphiti.features.context.impl.UpdateContext; import org.eclipse.graphiti.mm.pictograms.Anchor; import org.eclipse.graphiti.mm.pictograms.AnchorContainer; import org.eclipse.graphiti.mm.pictograms.Connection; @@ -333,4 +336,38 @@ public abstract class AbstractBpmn2AddElementFeature<T extends BaseElement> @Override public void postExecute(IExecutionInfo executionInfo) { } + + /** + * Update the given PictogramElement. A Graphiti UpdateContext is constructed by copying + * the properties from the given AddContext. + * + * @param addContext - the Graphiti AddContext that was used to add the PE to the Diagram + * @param pe - the PictogramElement + * @return a reason code indicating whether or not an update is needed. + */ + protected IReason updatePictogramElement(IAddContext addContext, PictogramElement pe) { + UpdateContext updateContext = new UpdateContext(pe); + for (Object key : addContext.getPropertyKeys()) { + Object value = addContext.getProperty(key); + updateContext.putProperty(key, value); + } + return getFeatureProvider().updateIfPossible(updateContext); + } + + /** + * Layout the given PictogramElement. A Graphiti LayoutContext is constructed by copying + * the properties from the given AddContext. + * + * @param addContext - the Graphiti AddContext that was used to add the PE to the Diagram + * @param pe - the PictogramElement + * @return a reason code indicating whether or not a layout is needed. + */ + protected IReason layoutPictogramElement(IAddContext addContext, PictogramElement pe) { + LayoutContext layoutContext = new LayoutContext(pe); + for (Object key : addContext.getPropertyKeys()) { + Object value = addContext.getProperty(key); + layoutContext.putProperty(key, value); + } + return getFeatureProvider().layoutIfPossible(layoutContext); + } }
\ No newline at end of file diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/AbstractUpdateBaseElementFeature.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/AbstractUpdateBaseElementFeature.java index be8a18b8..e50001ff 100644 --- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/AbstractUpdateBaseElementFeature.java +++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/AbstractUpdateBaseElementFeature.java @@ -13,6 +13,7 @@ package org.eclipse.bpmn2.modeler.core.features; import org.eclipse.bpmn2.modeler.core.utils.FeatureSupport; +import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.transaction.RecordingCommand; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.graphiti.features.IFeatureProvider; @@ -33,6 +34,12 @@ public abstract class AbstractUpdateBaseElementFeature extends AbstractUpdateFea @Override public IReason updateNeeded(final IUpdateContext context) { + Object value = context.getProperty(ContextConstants.BUSINESS_OBJECT); + if (value instanceof EObject) { + // if the UpdateContext has a "businessObject" property, then this update is needed + // as part of the the CreateFeature ("businessObject" is only set in the CreateFeature) + return Reason.createTrueReason("Initial update"); + } PictogramElement pe = context.getPictogramElement(); if (pe instanceof ContainerShape) { String shapeValue = FeatureSupport.getShapeValue(context); diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/AbstractAddActivityFeature.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/AbstractAddActivityFeature.java index 23967540..577b0c87 100644 --- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/AbstractAddActivityFeature.java +++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/AbstractAddActivityFeature.java @@ -133,8 +133,8 @@ public abstract class AbstractAddActivityFeature<T extends Activity> } splitConnection(context, containerShape); - updatePictogramElement(containerShape); - layoutPictogramElement(containerShape); + updatePictogramElement(context, containerShape); + layoutPictogramElement(context, containerShape); return containerShape; } diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/AbstractUpdateMarkerFeature.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/AbstractUpdateMarkerFeature.java index d19a91f8..66dc5fdc 100644 --- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/AbstractUpdateMarkerFeature.java +++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/AbstractUpdateMarkerFeature.java @@ -16,7 +16,9 @@ import java.util.Iterator; import org.eclipse.bpmn2.Activity; import org.eclipse.bpmn2.FlowElement; +import org.eclipse.bpmn2.modeler.core.features.ContextConstants; import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil; +import org.eclipse.emf.ecore.EObject; import org.eclipse.graphiti.features.IFeatureProvider; import org.eclipse.graphiti.features.IReason; import org.eclipse.graphiti.features.context.IUpdateContext; @@ -42,6 +44,12 @@ public abstract class AbstractUpdateMarkerFeature<T extends FlowElement> extends @Override public IReason updateNeeded(IUpdateContext context) { + Object value = context.getProperty(ContextConstants.BUSINESS_OBJECT); + if (value instanceof EObject) { + // if the UpdateContext has a "businessObject" property, then this update is needed + // as part of the the CreateFeature ("businessObject" is only set in the CreateFeature) + return Reason.createTrueReason("Initial update"); + } IPeService peService = Graphiti.getPeService(); PictogramElement element = context.getPictogramElement(); String property = peService.getPropertyValue(element, getPropertyKey()); @@ -50,7 +58,7 @@ public abstract class AbstractUpdateMarkerFeature<T extends FlowElement> extends } T activity = (T) getBusinessObjectForPictogramElement(context.getPictogramElement()); boolean changed = isPropertyChanged(activity, property); - return changed ? Reason.createTrueReason() : Reason.createFalseReason(); + return changed ? Reason.createTrueReason("Marker changed") : Reason.createFalseReason(); } @Override diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/data/AddDataFeature.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/data/AddDataFeature.java index 1c0176c2..64759604 100644 --- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/data/AddDataFeature.java +++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/data/AddDataFeature.java @@ -15,6 +15,8 @@ package org.eclipse.bpmn2.modeler.core.features.data; import org.eclipse.bpmn2.ItemAwareElement; import org.eclipse.bpmn2.modeler.core.di.DIImport; import org.eclipse.bpmn2.modeler.core.features.AbstractBpmn2AddElementFeature; +import org.eclipse.bpmn2.modeler.core.features.IFeatureContainer; +import org.eclipse.bpmn2.modeler.core.features.label.LabelFeatureContainer; import org.eclipse.bpmn2.modeler.core.utils.AnchorUtil; import org.eclipse.bpmn2.modeler.core.utils.FeatureSupport; import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil; @@ -96,10 +98,13 @@ public abstract class AddDataFeature<T extends ItemAwareElement> extends Abstrac peService.createChopboxAnchor(containerShape); AnchorUtil.addFixedPointAnchors(containerShape, invisibleRect); - layoutPictogramElement(containerShape); - updatePictogramElement(containerShape); - this.prepareAddContext(context, containerShape, width, height); - this.getFeatureProvider().getAddFeature(context).add(context); + updatePictogramElement(context, containerShape); + layoutPictogramElement(context, containerShape); + + // prepare the AddContext to create a Label + prepareAddContext(context, containerShape, width, height); + IFeatureContainer fc = new LabelFeatureContainer(); + fc.getAddFeature(getFeatureProvider()).add(context); return containerShape; } diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/event/AddEventFeature.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/event/AddEventFeature.java index b7e1c953..ab59d7c3 100644 --- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/event/AddEventFeature.java +++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/event/AddEventFeature.java @@ -17,6 +17,8 @@ import static org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil.createEventShape import org.eclipse.bpmn2.Event; import org.eclipse.bpmn2.modeler.core.di.DIImport; import org.eclipse.bpmn2.modeler.core.features.AbstractBpmn2AddElementFeature; +import org.eclipse.bpmn2.modeler.core.features.IFeatureContainer; +import org.eclipse.bpmn2.modeler.core.features.label.LabelFeatureContainer; import org.eclipse.bpmn2.modeler.core.utils.AnchorUtil; import org.eclipse.bpmn2.modeler.core.utils.FeatureSupport; import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil; @@ -86,11 +88,13 @@ public class AddEventFeature<T extends Event> splitConnection(context, containerShape); - updatePictogramElement(containerShape); - layoutPictogramElement(containerShape); + updatePictogramElement(context, containerShape); + layoutPictogramElement(context, containerShape); - this.prepareAddContext(context, containerShape, width, height); - this.getFeatureProvider().getAddFeature(context).add(context); + // prepare the AddContext to create a Label + prepareAddContext(context, containerShape, width, height); + IFeatureContainer fc = new LabelFeatureContainer(); + fc.getAddFeature(getFeatureProvider()).add(context); return containerShape; } diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/gateway/AddGatewayFeature.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/gateway/AddGatewayFeature.java index f06e533c..a0eef014 100644 --- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/gateway/AddGatewayFeature.java +++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/gateway/AddGatewayFeature.java @@ -15,6 +15,8 @@ package org.eclipse.bpmn2.modeler.core.features.gateway; import org.eclipse.bpmn2.Gateway; import org.eclipse.bpmn2.modeler.core.di.DIImport; import org.eclipse.bpmn2.modeler.core.features.AbstractBpmn2AddElementFeature; +import org.eclipse.bpmn2.modeler.core.features.IFeatureContainer; +import org.eclipse.bpmn2.modeler.core.features.label.LabelFeatureContainer; import org.eclipse.bpmn2.modeler.core.utils.AnchorUtil; import org.eclipse.bpmn2.modeler.core.utils.FeatureSupport; import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil; @@ -83,8 +85,9 @@ public class AddGatewayFeature<T extends Gateway> layoutPictogramElement(containerShape); // Use context for labeling! - this.prepareAddContext(context, containerShape, width, height); - this.getFeatureProvider().getAddFeature(context).add(context); + prepareAddContext(context, containerShape, width, height); + IFeatureContainer fc = new LabelFeatureContainer(); + fc.getAddFeature(getFeatureProvider()).add(context); return containerShape; } diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/participant/AddParticipantFeature.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/participant/AddParticipantFeature.java index 26bae0cd..28eb3bce 100644 --- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/participant/AddParticipantFeature.java +++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/participant/AddParticipantFeature.java @@ -103,8 +103,8 @@ public class AddParticipantFeature extends AbstractBpmn2AddElementFeature<Partic peCreateService.createChopboxAnchor(containerShape); AnchorUtil.addFixedPointAnchors(containerShape, rect); - updatePictogramElement(containerShape); - layoutPictogramElement(containerShape); + updatePictogramElement(context, containerShape); + layoutPictogramElement(context, containerShape); return containerShape; } diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/participant/UpdateParticipantMultiplicityFeature.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/participant/UpdateParticipantMultiplicityFeature.java index 72b9272e..44cbf5d9 100644 --- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/participant/UpdateParticipantMultiplicityFeature.java +++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/participant/UpdateParticipantMultiplicityFeature.java @@ -15,6 +15,7 @@ package org.eclipse.bpmn2.modeler.core.features.participant; import org.eclipse.bpmn2.ChoreographyActivity; import org.eclipse.bpmn2.Participant; import org.eclipse.bpmn2.ParticipantMultiplicity; +import org.eclipse.bpmn2.modeler.core.features.ContextConstants; import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil; import org.eclipse.bpmn2.modeler.core.utils.FeatureSupport; import org.eclipse.bpmn2.modeler.core.utils.StyleUtil; @@ -57,6 +58,12 @@ public class UpdateParticipantMultiplicityFeature extends AbstractUpdateFeature @Override public IReason updateNeeded(IUpdateContext context) { + Object value = context.getProperty(ContextConstants.BUSINESS_OBJECT); + if (value instanceof EObject) { + // if the UpdateContext has a "businessObject" property, then this update is needed + // as part of the the CreateFeature ("businessObject" is only set in the CreateFeature) + return Reason.createTrueReason("Initial update"); + } EObject container = context.getPictogramElement().eContainer(); if (container instanceof PictogramElement) { PictogramElement containerElem = (PictogramElement) container; diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/model/Bpmn2ModelerResourceImpl.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/model/Bpmn2ModelerResourceImpl.java index 66e50de4..78e2e893 100644 --- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/model/Bpmn2ModelerResourceImpl.java +++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/model/Bpmn2ModelerResourceImpl.java @@ -382,6 +382,7 @@ public class Bpmn2ModelerResourceImpl extends Bpmn2ResourceImpl { Bpmn2Preferences prefs = null; ImportUtil importHandler = new ImportUtil(); + String targetNamespace = null; public Bpmn2ModelerXmlHandler(XMLResource xmiResource, XMLHelper helper, Map<?, ?> options) { super(xmiResource, helper, options); @@ -476,6 +477,10 @@ public class Bpmn2ModelerResourceImpl extends Bpmn2ResourceImpl { itemDef.setImport(imp); } } + else if (obj instanceof Definitions) { + targetNamespace = ((Definitions)obj).getTargetNamespace(); + } + } /** @@ -502,9 +507,17 @@ public class Bpmn2ModelerResourceImpl extends Bpmn2ResourceImpl { String prefix = ids.substring(0,i); String localname = ids.substring(i+1); String namespace = helper.getNamespaceURI(prefix); - Import imp = importHandler.findImportForNamespace(helper.getResource(), namespace); - if (imp!=null) { - value = importHandler.getObjectForLocalname(imp, object, eReference, localname); + if (namespace!=null && namespace.equals(targetNamespace)) { + // namespace for prefix is the same as targetNamespace + // so remove the prefix to avoid confusing the XMLHandler + ids = localname; + } + else { + // this thing is in another namespace, possibly in an external document + Import imp = importHandler.findImportForNamespace(helper.getResource(), namespace); + if (imp!=null) { + value = importHandler.getObjectForLocalname(imp, object, eReference, localname); + } } } diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/ModelUtil.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/ModelUtil.java index f7aafea7..eac94035 100644 --- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/ModelUtil.java +++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/ModelUtil.java @@ -1742,26 +1742,18 @@ public class ModelUtil { List<Tuple<EObject,EObject>> list = new ArrayList<Tuple<EObject,EObject>>(); Definitions definitions = ModelUtil.getDefinitions(resource); TreeIterator<EObject> iter1 = definitions.eAllContents(); - HashSet<EObject> map = new HashSet<EObject>(); + Hashtable<String, EObject> map = new Hashtable<String, EObject>(); while (iter1.hasNext()) { EObject o1 = iter1.next(); EStructuralFeature id1Feature = o1.eClass().getEIDAttribute(); - if (id1Feature!=null && !map.contains(o1)) { - TreeIterator<EObject> iter2 = definitions.eAllContents(); - map.add(o1); + if (id1Feature!=null) { String id1 = (String)o1.eGet(id1Feature); - - while (iter2.hasNext()) { - EObject o2 = iter2.next(); - EStructuralFeature id2Feature = o2.eClass().getEIDAttribute(); - if (id2Feature!=null && o1!=o2 && !map.contains(o2)) { - String id2 = (String)o2.eGet(id2Feature); - if (id1!=null && !id1.isEmpty() && id2!=null && !id2.isEmpty()) { - if (id1.equals(id2)) { - list.add( new Tuple<EObject,EObject>(o1,o2) ); - } - } + if (id1!=null) { + EObject o2 = map.get(id1); + if (o2!=null) { + list.add( new Tuple<EObject,EObject>(o1,o2) ); } + map.put(id1, o1); } } } |