diff options
Diffstat (limited to 'plugins/uml')
-rw-r--r-- | plugins/uml/nattable/org.eclipse.papyrus.uml.nattable.matrix/src/org/eclipse/papyrus/uml/nattable/matrix/validator/RelationshipOwnerValidator.java | 67 |
1 files changed, 61 insertions, 6 deletions
diff --git a/plugins/uml/nattable/org.eclipse.papyrus.uml.nattable.matrix/src/org/eclipse/papyrus/uml/nattable/matrix/validator/RelationshipOwnerValidator.java b/plugins/uml/nattable/org.eclipse.papyrus.uml.nattable.matrix/src/org/eclipse/papyrus/uml/nattable/matrix/validator/RelationshipOwnerValidator.java index ff447ec3ccd..ba561d7a40c 100644 --- a/plugins/uml/nattable/org.eclipse.papyrus.uml.nattable.matrix/src/org/eclipse/papyrus/uml/nattable/matrix/validator/RelationshipOwnerValidator.java +++ b/plugins/uml/nattable/org.eclipse.papyrus.uml.nattable.matrix/src/org/eclipse/papyrus/uml/nattable/matrix/validator/RelationshipOwnerValidator.java @@ -8,6 +8,7 @@ * * Contributors: * CEA LIST - Initial API and implementation + * CEA LIST - bug 532639 [Table][Matrix]System shall enable to specify the creation location of relationships created using a matrix editor. * *****************************************************************************/ @@ -32,6 +33,7 @@ import org.eclipse.papyrus.infra.nattable.model.nattable.nattablewrapper.EObject import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService; import org.eclipse.papyrus.infra.types.ElementTypeConfiguration; import org.eclipse.papyrus.infra.types.MetamodelTypeConfiguration; +import org.eclipse.papyrus.infra.types.SpecializationTypeConfiguration; import org.eclipse.papyrus.infra.ui.emf.dialog.NestedEditingDialogContext; import org.eclipse.papyrus.uml.nattable.matrix.Activator; import org.eclipse.papyrus.uml.nattable.matrix.messages.Messages; @@ -136,12 +138,16 @@ public class RelationshipOwnerValidator implements IValidator { private final IStatus hasADefinedRelationship() { final ElementTypeConfiguration etc = this.conf.getEditedElement(); if (null == etc) { + return createErrorStatus(Messages.RelationshipOwnerValidator_NoRelationshipDefined); } - final EClass eclass = ((MetamodelTypeConfiguration) etc).getEClass(); + + final EClass eclass = getBaseMetamodelEClass(etc); + if (null != eclass) { if (eclass.isAbstract()) { return createErrorStatus(Messages.RelationshipOwnerValidator_ChosenRelationshipIsAbstract); // very unlucky case, probably impossible } + } return Status.OK_STATUS; } @@ -156,15 +162,64 @@ public class RelationshipOwnerValidator implements IValidator { private final boolean hasFeatureAcceptingRelationShip(final EObject wantedOwner) { Assert.isNotNull(wantedOwner); final ElementTypeConfiguration etc = this.conf.getEditedElement(); - final EClass eclass = ((MetamodelTypeConfiguration) etc).getEClass(); - final EObject dummyRelationship = eclass.getEPackage().getEFactoryInstance().create(eclass); - for (EStructuralFeature current : wantedOwner.eClass().getEAllContainments()) { - if (current.getEType().isInstance(dummyRelationship)) { - return true; + final EClass eclass = getBaseMetamodelEClass(etc); + if (null != eclass) { + final EObject dummyRelationship = eclass.getEPackage().getEFactoryInstance().create(eclass); + for (EStructuralFeature current : wantedOwner.eClass().getEAllContainments()) { + if (current.getEType().isInstance(dummyRelationship)) { + return true; + } } } return false; } + + + // TODO : move these 3 methods in a util class. Such methods already exists in UMLRelationshipHelper + /** + * + * @param elementTypeConfiguration + * an element type configuration + * @return + * the base EClass for this element type configuration(when it is unique) and <code>null</code> otherwise + * @since 1.0.100 + * + */ + private EClass getBaseMetamodelEClass(final ElementTypeConfiguration elementTypeConfiguration) { + return getBaseMetamodelTypeConfiguration(elementTypeConfiguration) != null ? getBaseMetamodelTypeConfiguration(elementTypeConfiguration).getEClass() : null; + } + + /** + * + * @param elementTypeConfiguration + * an element type configuration + * @return + * the base metamodel type configuration (when it is unique) and <code>null</code> otherwise + * @since 1.0.100 + */ + private MetamodelTypeConfiguration getBaseMetamodelTypeConfiguration(final ElementTypeConfiguration elementTypeConfiguration) { + if (elementTypeConfiguration instanceof MetamodelTypeConfiguration) { + return (MetamodelTypeConfiguration) elementTypeConfiguration; + } else if (elementTypeConfiguration instanceof SpecializationTypeConfiguration) { + return getBaseMetamodelTypeConfiguration((SpecializationTypeConfiguration) elementTypeConfiguration); + } + return null; + } + + /** + * + * @param elementTypeConfiguration + * an element type configuration + * @return + * the base metamodel type configuration (when it is unique) and <code>null</code> otherwise + * @since 1.0.100 + */ + private MetamodelTypeConfiguration getBaseMetamodelTypeConfiguration(final SpecializationTypeConfiguration elementTypeConfiguration) { + return 1 == elementTypeConfiguration.getSpecializedTypes().size() ? getBaseMetamodelTypeConfiguration(elementTypeConfiguration.getSpecializedTypes().get(0)) : null; + } + + + /** * |