diff options
Diffstat (limited to 'plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths')
6 files changed, 81 insertions, 3 deletions
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/constants/ArchitecturePluginValidationConstants.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/constants/ArchitecturePluginValidationConstants.java index b5f61beafac..01ec98c44fc 100644 --- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/constants/ArchitecturePluginValidationConstants.java +++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/constants/ArchitecturePluginValidationConstants.java @@ -10,12 +10,13 @@ * * Contributors: * Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation - * Christian W. Damus - bug 570097 + * Christian W. Damus - bugs 570097, 573788 * *****************************************************************************/ package org.eclipse.papyrus.toolsmiths.validation.architecture.constants; +import org.eclipse.emf.common.util.URI; import org.eclipse.papyrus.toolsmiths.validation.common.checkers.CommonProblemConstants; /** @@ -41,6 +42,10 @@ public class ArchitecturePluginValidationConstants { /** Problem IDs for the markers generated by architecture plug-in validation. */ public static final int PROBLEM_ID_BASE = CommonProblemConstants.MAX_PROBLEM_ID + 0x01; public static final int MISSING_ARCHITECTURE_MODEL_EXTENSION_ID = PROBLEM_ID_BASE + 0x00; + public static final int MISSING_REPRESENTATIONS_ADVICE_ID = PROBLEM_ID_BASE + 0x01; public static final int MAX_PROBLEM_ID = PROBLEM_ID_BASE + 0x3f; + /** The URI of the <em>Element Types Configurations</em> model that has the Representations Advice. */ + public static final URI REPRESENTATIONS_ADVICE_URI = URI.createURI("pathmap://PAPYRUS_VIEWPOINTS_POLICY/representations/advice", true); //$NON-NLS-1$ + } diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/checkers/ArchitectureCustomValidator.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/checkers/ArchitectureCustomValidator.java index aa8df738a0f..77567166dab 100644 --- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/checkers/ArchitectureCustomValidator.java +++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/checkers/ArchitectureCustomValidator.java @@ -25,10 +25,14 @@ import java.util.stream.Collectors; import org.eclipse.emf.common.util.Diagnostic; import org.eclipse.emf.common.util.DiagnosticChain; +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.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.ecore.resource.URIConverter; import org.eclipse.emf.ecore.util.ECrossReferenceAdapter; +import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.papyrus.infra.core.architecture.ADElement; import org.eclipse.papyrus.infra.core.architecture.ArchitectureContext; import org.eclipse.papyrus.infra.core.architecture.ArchitectureDomain; @@ -38,10 +42,13 @@ import org.eclipse.papyrus.infra.core.architecture.Concern; import org.eclipse.papyrus.infra.core.architecture.RepresentationKind; import org.eclipse.papyrus.infra.core.architecture.Stakeholder; import org.eclipse.papyrus.infra.core.architecture.util.ArchitectureSwitch; +import org.eclipse.papyrus.infra.emf.utils.EMFHelper; import org.eclipse.papyrus.infra.types.ElementTypeSetConfiguration; import org.eclipse.papyrus.infra.types.core.extensionpoints.IElementTypeSetExtensionPoint; +import org.eclipse.papyrus.toolsmiths.validation.architecture.constants.ArchitecturePluginValidationConstants; import org.eclipse.papyrus.toolsmiths.validation.architecture.internal.messages.Messages; import org.eclipse.papyrus.toolsmiths.validation.common.checkers.CustomModelChecker; +import org.eclipse.papyrus.toolsmiths.validation.common.checkers.IPluginChecker2; import org.eclipse.papyrus.toolsmiths.validation.common.internal.utils.ArchitectureIndex; import org.eclipse.pde.core.plugin.IPluginElement; @@ -70,6 +77,9 @@ public class ArchitectureCustomValidator extends CustomModelChecker.SwitchValida if (architecture.getId() != null) { // Missing ID is reported separately architecture.getElementTypes().forEach(typeSet -> validateElementTypesContextID(architecture, typeSet, diagnostics, context)); } + if (!architecture.isExtension()) { + validateContextHasRepresentationsAdvice(architecture, diagnostics, context); + } } private void validateElementTypesContextID(ArchitectureContext architecture, ElementTypeSetConfiguration typeSet, DiagnosticChain diagnostics, Map<Object, Object> context) { @@ -151,6 +161,44 @@ public class ArchitectureCustomValidator extends CustomModelChecker.SwitchValida return ArchitectureIndex.getInstance().isReferenced(context, ArchitecturePackage.Literals.ARCHITECTURE_CONTEXT__EXTENDED_CONTEXTS); } + /** + * Check whether an {@code architecture} references the <em>Element Types Configurations</em> model that provides the + * representations advice, whether itself, or by inheritance or extension. + */ + void validateContextHasRepresentationsAdvice(ArchitectureContext architecture, DiagnosticChain diagnostics, Map<Object, Object> context) { + boolean hasAdvice = hasRepresentationsAdvice(architecture); + if (!hasAdvice && architecture.getGeneralContext() != null) { + // Does not need to be recursive because extension content is not inherited + hasAdvice = architecture.allGeneralContexts().stream().anyMatch(this::hasRepresentationsAdvice); + } + if (!hasAdvice && hasExtensions(architecture)) { + hasAdvice = ArchitectureIndex.getInstance().getAllExtensions(architecture).stream().anyMatch(this::hasOrInheritsRepresentationsAdvice); + } + + if (!hasAdvice) { + diagnostics.add(createDiagnostic(Diagnostic.WARNING, architecture, ArchitecturePackage.Literals.ARCHITECTURE_CONTEXT__ELEMENT_TYPES, + format(Messages.ArchitectureCustomValidator_0, context, architecture), + IPluginChecker2.problem(ArchitecturePluginValidationConstants.MISSING_REPRESENTATIONS_ADVICE_ID))); + } + } + + private boolean hasOrInheritsRepresentationsAdvice(ArchitectureContext architecture) { + boolean result = hasRepresentationsAdvice(architecture); + if (!result && architecture.getGeneralContext() != null) { + result = architecture.allGeneralContexts().stream().anyMatch(this::hasRepresentationsAdvice); + } + return result; + } + + private boolean hasRepresentationsAdvice(ArchitectureContext architecture) { + URIConverter converter = EMFHelper.getResourceSet(architecture).getURIConverter(); + URI normalized = converter.normalize(ArchitecturePluginValidationConstants.REPRESENTATIONS_ADVICE_URI); + + @SuppressWarnings("unchecked") + EList<? extends EObject> representations = (EList<? extends EObject>) architecture.eGet(ArchitecturePackage.Literals.ARCHITECTURE_CONTEXT__ELEMENT_TYPES, false); + return representations.stream().map(EcoreUtil::getURI).map(URI::trimFragment).map(converter::normalize).anyMatch(normalized::equals); + } + // // Nested types // diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/checkers/ArchitectureDependencies.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/checkers/ArchitectureDependencies.java index 6ad1c950150..e6eca97cd14 100644 --- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/checkers/ArchitectureDependencies.java +++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/checkers/ArchitectureDependencies.java @@ -94,7 +94,7 @@ class ArchitectureDependencies { bundleName = Optional.empty(); } - return URI.createURI(String.format("bundleclass://%s/%s", bundleName.orElse(hostBundle), className)); + return URI.createURI(String.format("bundleclass://%s/%s", bundleName.orElse(hostBundle), className)); //$NON-NLS-1$ } } diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/messages/Messages.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/messages/Messages.java index 68c4375484c..3b9aba8615b 100644 --- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/messages/Messages.java +++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/messages/Messages.java @@ -22,6 +22,7 @@ import org.eclipse.osgi.util.NLS; */ public class Messages extends NLS { private static final String BUNDLE_NAME = "org.eclipse.papyrus.toolsmiths.validation.architecture.internal.messages.messages"; //$NON-NLS-1$ + public static String ArchitectureCustomValidator_0; public static String ArchitectureCustomValidator_2; public static String ArchitectureCustomValidator_3; public static String ArchitectureCustomValidator_4; @@ -29,6 +30,8 @@ public class Messages extends NLS { public static String ArchitecturePluginChecker_1; public static String MissingArchitectureExtension_0; public static String MissingArchitectureExtension_1; + public static String MissingRepresentationsAdvice_0; + public static String MissingRepresentationsAdvice_1; static { // initialize resource bundle NLS.initializeMessages(BUNDLE_NAME, Messages.class); diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/messages/messages.properties b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/messages/messages.properties index 8b3bebe222b..15987b1439d 100644 --- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/messages/messages.properties +++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/messages/messages.properties @@ -10,10 +10,11 @@ # # Contributors: # CEA LIST - Initial API and implementation -# Christian W. Damus - bugs 570097, 542945, 570486 +# Christian W. Damus - bugs 570097, 542945, 570486, 573788 # ################################################################################## +ArchitectureCustomValidator_0=Context should have the Representations Advice: {0}. ArchitectureCustomValidator_2=''{0}'' is registered to a different context. ArchitectureCustomValidator_3=No viewpoint includes ''{0}'', so it is not accessible. ArchitectureCustomValidator_4={0} will be merged implicitly with another registered under the same qualified name. \ @@ -22,3 +23,5 @@ ArchitecturePluginChecker_0=Validate Architecture plug-in ArchitecturePluginChecker_1=Prepare plug-in validation MissingArchitectureExtension_0=Register architecture model MissingArchitectureExtension_1=Add a plug-in extension registering the architecture model +MissingRepresentationsAdvice_0=Add Representations Advice +MissingRepresentationsAdvice_1=Add a reference to the Element Types Configurations model that defined the representations advice. diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/quickfix/ArchitectureMarkerResolutionGenerator.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/quickfix/ArchitectureMarkerResolutionGenerator.java index 06a2f781919..0ba87cbeec8 100644 --- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/quickfix/ArchitectureMarkerResolutionGenerator.java +++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/quickfix/ArchitectureMarkerResolutionGenerator.java @@ -20,16 +20,27 @@ import static org.eclipse.papyrus.toolsmiths.validation.architecture.constants.A import static org.eclipse.papyrus.toolsmiths.validation.architecture.constants.ArchitecturePluginValidationConstants.ELEM_MODEL; import static org.eclipse.papyrus.toolsmiths.validation.architecture.constants.ArchitecturePluginValidationConstants.MAX_PROBLEM_ID; import static org.eclipse.papyrus.toolsmiths.validation.architecture.constants.ArchitecturePluginValidationConstants.MISSING_ARCHITECTURE_MODEL_EXTENSION_ID; +import static org.eclipse.papyrus.toolsmiths.validation.architecture.constants.ArchitecturePluginValidationConstants.MISSING_REPRESENTATIONS_ADVICE_ID; import static org.eclipse.papyrus.toolsmiths.validation.architecture.constants.ArchitecturePluginValidationConstants.PROBLEM_ID_BASE; +import static org.eclipse.papyrus.toolsmiths.validation.architecture.constants.ArchitecturePluginValidationConstants.REPRESENTATIONS_ADVICE_URI; import static org.eclipse.papyrus.toolsmiths.validation.common.quickfix.CommonMarkerResolutionUtils.getModelPath; import static org.eclipse.papyrus.toolsmiths.validation.common.quickfix.SimpleMissingExtensionMarkerResolution.optionalAttribute; import org.eclipse.core.resources.IMarker; import org.eclipse.core.runtime.IPath; +import org.eclipse.emf.common.command.Command; +import org.eclipse.emf.edit.command.AddCommand; +import org.eclipse.emf.edit.domain.EditingDomain; +import org.eclipse.papyrus.infra.core.architecture.ArchitectureContext; +import org.eclipse.papyrus.infra.core.architecture.ArchitecturePackage; +import org.eclipse.papyrus.infra.types.ElementTypeSetConfiguration; +import org.eclipse.papyrus.infra.types.ElementTypesConfigurationsPackage; import org.eclipse.papyrus.toolsmiths.validation.architecture.internal.messages.Messages; import org.eclipse.papyrus.toolsmiths.validation.common.quickfix.CommonMarkerResolutionGenerator; import org.eclipse.papyrus.toolsmiths.validation.common.quickfix.SimpleMissingExtensionMarkerResolution; +import org.eclipse.papyrus.toolsmiths.validation.common.quickfix.SimpleModelEditMarkerResolution; import org.eclipse.ui.IMarkerResolution; +import org.eclipse.uml2.common.util.UML2Util; /** * Resolution generator for markers created by the validation of <em>Architecture Description</em> models. @@ -53,6 +64,9 @@ public class ArchitectureMarkerResolutionGenerator extends CommonMarkerResolutio Messages.MissingArchitectureExtension_0, Messages.MissingArchitectureExtension_1, ARCHITECTURE_EXTENSION_POINT_IDENTIFIER, ELEM_MODEL, optionalAttribute(ATTR_PATH, m -> getModelPath(m).map(IPath::toPortableString)))); + case MISSING_REPRESENTATIONS_ADVICE_ID: + return only(SimpleModelEditMarkerResolution.create(problemID, Messages.MissingRepresentationsAdvice_0, Messages.MissingRepresentationsAdvice_1, + ArchitectureContext.class, this::getAddRepresentationsAdviceCommand)); default: return noResolutions(); } @@ -64,4 +78,9 @@ public class ArchitectureMarkerResolutionGenerator extends CommonMarkerResolutio || matchProblemID(marker, PROBLEM_ID_BASE, MAX_PROBLEM_ID); } + private Command getAddRepresentationsAdviceCommand(EditingDomain domain, ArchitectureContext context) { + ElementTypeSetConfiguration set = UML2Util.load(domain.getResourceSet(), REPRESENTATIONS_ADVICE_URI, ElementTypesConfigurationsPackage.Literals.ELEMENT_TYPE_SET_CONFIGURATION); + return AddCommand.create(domain, context, ArchitecturePackage.Literals.ARCHITECTURE_CONTEXT__ELEMENT_TYPES, set); + } + } |