Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths')
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/constants/ArchitecturePluginValidationConstants.java7
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/checkers/ArchitectureCustomValidator.java48
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/checkers/ArchitectureDependencies.java2
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/messages/Messages.java3
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/messages/messages.properties5
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/quickfix/ArchitectureMarkerResolutionGenerator.java19
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);
+ }
+
}

Back to the top