diff --git a/pom.xml b/pom.xml
index 74a0a8fc..46cf02c6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
it.unibz.inf.ontouml
ontouml-vp-plugin
- 0.5.3
+ 0.5.4
OntoUML 2 Plugin for Visual Paradigm
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/OntoUMLPlugin.java b/src/main/java/it/unibz/inf/ontouml/vp/OntoUMLPlugin.java
index b2c6e9c2..005fb50a 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/OntoUMLPlugin.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/OntoUMLPlugin.java
@@ -16,7 +16,7 @@
*/
public class OntoUMLPlugin implements VPPlugin {
- public static final String PLUGIN_VERSION_RELEASE = "0.5.3";
+ public static final String PLUGIN_VERSION_RELEASE = "0.5.4";
public static final String PLUGIN_ID = "it.unibz.inf.ontouml.vp";
public static final String PLUGIN_NAME = "OntoUML Plugin";
public static final String PLUGIN_REPO = "https://github.com/OntoUML/ontouml-vp-plugin/";
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/controllers/ApplyAssociationStereotypeMenuManager.java b/src/main/java/it/unibz/inf/ontouml/vp/controllers/ApplyAssociationStereotypeMenuManager.java
index ebd35337..01cd31a0 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/controllers/ApplyAssociationStereotypeMenuManager.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/ApplyAssociationStereotypeMenuManager.java
@@ -3,6 +3,7 @@
import com.vp.plugin.action.VPAction;
import com.vp.plugin.action.VPContext;
import com.vp.plugin.model.IAssociation;
+import com.vp.plugin.model.IAssociationEnd;
import com.vp.plugin.model.IModelElement;
import it.unibz.inf.ontouml.vp.model.uml.Association;
import it.unibz.inf.ontouml.vp.utils.OntoUMLConstraintsManager;
@@ -49,7 +50,7 @@ public void performAction() {
boolean shouldProceed = true;
if (shouldWarnAboutInvertingAssociations())
- shouldProceed = ViewManagerUtils.associationInvertionWarningDialog();
+ shouldProceed = ViewManagerUtils.showInvertAssociationWarningDialog();
if (!shouldProceed) return;
@@ -58,11 +59,19 @@ public void performAction() {
.filter(Association::holdsBetweenClasses)
.forEach(
association -> {
- if (doesRequireInverting(association))
- Association.invertAssociation(association, true);
-
- StereotypesManager.applyStereotype(
- association, associationStereotypeId.getStereotype());
+ String stereotype = associationStereotypeId.getStereotype();
+ StereotypesManager.applyStereotype(association, stereotype);
+ IAssociationEnd sourceEnd =
+ !doesRequireInverting(association)
+ ? Association.getSourceEnd(association)
+ : Association.getTargetEnd(association);
+ IAssociationEnd targetEnd =
+ !doesRequireInverting(association)
+ ? Association.getTargetEnd(association)
+ : Association.getSourceEnd(association);
+
+ Association.setSourceEndProperties(association, sourceEnd);
+ Association.setTargetEndProperties(association, targetEnd);
});
}
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelActionController.java b/src/main/java/it/unibz/inf/ontouml/vp/controllers/InvertAssociationController.java
similarity index 93%
rename from src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelActionController.java
rename to src/main/java/it/unibz/inf/ontouml/vp/controllers/InvertAssociationController.java
index e64755ed..8769f8aa 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelActionController.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/InvertAssociationController.java
@@ -12,7 +12,7 @@
import it.unibz.inf.ontouml.vp.utils.ViewManagerUtils;
import java.awt.event.ActionEvent;
-public class ModelActionController implements VPContextActionController {
+public class InvertAssociationController implements VPContextActionController {
@Override
public void performAction(VPAction action, VPContext context, ActionEvent event) {
@@ -37,7 +37,7 @@ public void performAction(VPAction action, VPContext context, ActionEvent event)
case ActionIdManager.ASSOCIATION_ACTION_INVERT_ASSOCIATION:
ModelElement.forEachSelectedElement(
clickedAssociation,
- selectedAssociation -> Association.invertAssociation(selectedAssociation, false));
+ selectedAssociation -> Association.invertAssociation(selectedAssociation));
break;
}
}
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeController.java b/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeController.java
new file mode 100644
index 00000000..1075fdcd
--- /dev/null
+++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeController.java
@@ -0,0 +1,49 @@
+package it.unibz.inf.ontouml.vp.controllers;
+
+import com.vp.plugin.action.VPAction;
+import com.vp.plugin.action.VPActionController;
+import it.unibz.inf.ontouml.vp.utils.SimpleServiceWorker;
+import it.unibz.inf.ontouml.vp.utils.ViewManagerUtils;
+import java.util.List;
+
+public class ModelSanitizeController implements VPActionController {
+
+ private static final String MESSAGE_MODEL_SANITIZE_SUCCESS =
+ "Model sanitize executed successfully.";
+ private static final String MESSAGE_MODEL_IMPORT_UNEXPECTED_ERROR =
+ "Unexpected error performing model sanitize.";
+
+ private boolean shouldProceed = false;
+
+ @Override
+ public void update(VPAction vpAction) {}
+
+ @Override
+ public void performAction(VPAction vpAction) {
+ showFixStereotypesWarning();
+
+ if (!shouldProceed) return;
+
+ new SimpleServiceWorker(this::sanitizeModelTask).execute();
+ }
+
+ private void showFixStereotypesWarning() {
+ shouldProceed = ViewManagerUtils.showFixStereotypesWarningDialog();
+ }
+
+ private List sanitizeModelTask(SimpleServiceWorker context) {
+ try {
+ if (!context.isCancelled()) {
+ ModelSanitizeManager.run();
+ ViewManagerUtils.log(MESSAGE_MODEL_SANITIZE_SUCCESS);
+ return List.of(MESSAGE_MODEL_SANITIZE_SUCCESS);
+ }
+
+ return List.of();
+ } catch (Exception e) {
+ e.printStackTrace();
+ ViewManagerUtils.log(MESSAGE_MODEL_IMPORT_UNEXPECTED_ERROR);
+ return List.of(MESSAGE_MODEL_IMPORT_UNEXPECTED_ERROR);
+ }
+ }
+}
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeManager.java b/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeManager.java
new file mode 100644
index 00000000..d92cbe9f
--- /dev/null
+++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeManager.java
@@ -0,0 +1,331 @@
+package it.unibz.inf.ontouml.vp.controllers;
+
+import com.vp.plugin.model.IAssociation;
+import com.vp.plugin.model.IAssociationEnd;
+import com.vp.plugin.model.IAttribute;
+import com.vp.plugin.model.IClass;
+import com.vp.plugin.model.IModelElement;
+import com.vp.plugin.model.IProject;
+import com.vp.plugin.model.factory.IModelElementFactory;
+import it.unibz.inf.ontouml.vp.model.uml.Association;
+import it.unibz.inf.ontouml.vp.model.uml.Class;
+import it.unibz.inf.ontouml.vp.model.uml.ModelElement;
+import it.unibz.inf.ontouml.vp.utils.ApplicationManagerUtils;
+import it.unibz.inf.ontouml.vp.utils.OntoUMLConstraintsManager;
+import it.unibz.inf.ontouml.vp.utils.Stereotype;
+import it.unibz.inf.ontouml.vp.utils.StereotypesManager;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+public class ModelSanitizeManager {
+
+ private Set attributes;
+ private Set associations;
+ private Set classes;
+ private Map associationStereotypesMap;
+ private Map attributeStereotypesMap;
+ private Map classStereotypesMap;
+
+ public static void run() {
+ ModelSanitizeManager sanitizer = new ModelSanitizeManager();
+
+ sanitizer.retrieveModelElements();
+ sanitizer.fixMissingTypeOnAssociationEnds();
+ sanitizer.filterAssociationBetweenClasses();
+ sanitizer.fixElementsStereotypes();
+ sanitizer.fixAssociationEnds();
+ }
+
+ private void filterAssociationBetweenClasses() {
+ associations =
+ associations.stream().filter(Association::holdsBetweenClasses).collect(Collectors.toSet());
+ }
+
+ private void fixAssociationEnds() {
+ associations.forEach(
+ a -> {
+ IAssociationEnd sourceEnd = Association.getSourceEnd(a);
+ IAssociationEnd targetEnd = Association.getTargetEnd(a);
+ String aggKind = targetEnd.getAggregationKind();
+
+ if (shouldInvert(a)) {
+ Association.setSourceEndProperties(a, targetEnd);
+ Association.setTargetEndProperties(a, sourceEnd);
+
+ if (shouldPreserveAggregation(a, aggKind)) {
+ sourceEnd.setAggregationKind(aggKind);
+ sourceEnd.setNavigable(IAssociationEnd.NAVIGABLE_UNSPECIFIED);
+ }
+ } else {
+ Association.setSourceEndProperties(a, sourceEnd);
+ Association.setTargetEndProperties(a, targetEnd);
+
+ if (shouldPreserveAggregation(a, aggKind)) {
+ targetEnd.setAggregationKind(aggKind);
+ targetEnd.setNavigable(IAssociationEnd.NAVIGABLE_UNSPECIFIED);
+ }
+ }
+ });
+ }
+
+ private boolean shouldInvert(IAssociation association) {
+ String str = ModelElement.getUniqueStereotypeName(association);
+
+ return !OntoUMLConstraintsManager.isStereotypeAllowed(association, str)
+ && OntoUMLConstraintsManager.isStereotypeAllowedIfInverted(association, str);
+ }
+
+ private boolean shouldPreserveAggregation(IAssociation association, String originalAggregation) {
+ String str = ModelElement.getUniqueStereotypeName(association);
+
+ return (!Association.hasOntoumlStereotype(association)
+ || Association.hasMereologyStereotype(association))
+ && isAggregation(originalAggregation);
+ }
+
+ private boolean isAggregation(String aggregationKind) {
+ return IAssociationEnd.AGGREGATION_KIND_shared.equals(aggregationKind)
+ || IAssociationEnd.AGGREGATION_KIND_composite.equals(aggregationKind);
+ }
+
+ private void fixMissingTypeOnAssociationEnds() {
+ associations.forEach(
+ a -> {
+ if (!doesFromMatchEndType(a)) {
+ fixFromEndType(a);
+ }
+
+ if (!doesToMatchEndType(a)) {
+ fixToEndType(a);
+ }
+ });
+ }
+
+ private boolean doesFromMatchEndType(IAssociation association) {
+ IModelElement from = association.getFrom();
+ IAssociationEnd fromEnd = Association.getFromEnd(association);
+ IModelElement fromEndType = fromEnd.getTypeAsElement();
+
+ return fromEndType != null && fromEndType.getId().equals(from.getId());
+ }
+
+ private boolean doesToMatchEndType(IAssociation association) {
+ IModelElement to = association.getTo();
+ IAssociationEnd toEnd = Association.getToEnd(association);
+ IModelElement toEndType = toEnd.getTypeAsElement();
+
+ return toEndType != null && toEndType.getId().equals(to.getId());
+ }
+
+ private void fixFromEndType(IAssociation association) {
+ IModelElement from = association.getFrom();
+ IAssociationEnd fromEnd = Association.getFromEnd(association);
+ fromEnd.setType(from);
+ }
+
+ private void fixToEndType(IAssociation association) {
+ IModelElement to = association.getTo();
+ IAssociationEnd toEnd = Association.getToEnd(association);
+ toEnd.setType(to);
+ }
+
+ private void fixElementsStereotypes() {
+ classes.forEach(this::fixElementsStereotypes);
+ attributes.forEach(this::fixElementsStereotypes);
+ associations.forEach(this::fixAssociationsStereotypes);
+ }
+
+ private void fixElementsStereotypes(IModelElement element) {
+ final String stereotype = ModelElement.getUniqueStereotypeName(element);
+ final String recognizedStr = getRecognizedStereotypes(element);
+
+ if (hasReplacement(stereotype, recognizedStr)) applyStereotype(element, recognizedStr);
+ }
+
+ private void fixAssociationsStereotypes(IAssociation association) {
+ final String stereotype = ModelElement.getUniqueStereotypeName(association);
+ final String recognizedStr = getRecognizedStereotypes(association);
+
+ if (hasReplacement(stereotype, recognizedStr)) applyStereotype(association, recognizedStr);
+ }
+
+ private String getRecognizedStereotypes(IModelElement element) {
+ final String normalizedStr = getNormalizedStereotype(element);
+ final String type = element.getModelType();
+ Map stereotypesMap = getStereotypesMap(type);
+
+ return stereotypesMap.get(normalizedStr);
+ }
+
+ private Map getStereotypesMap(String modelType) {
+ switch (modelType) {
+ case IModelElementFactory.MODEL_TYPE_ASSOCIATION:
+ return getAssociationStereotypesMap();
+ case IModelElementFactory.MODEL_TYPE_ATTRIBUTE:
+ return getAttributeStereotypesMap();
+ case IModelElementFactory.MODEL_TYPE_CLASS:
+ return getClassStereotypesMap();
+ default:
+ throw new RuntimeException("Unexpected model element of type '" + modelType + "'.");
+ }
+ }
+
+ private void applyStereotype(IModelElement element, String replacementStereotype) {
+ final String modelType = element != null ? element.getModelType() : null;
+
+ if (!isTypeExpected(modelType)) {
+ throw new RuntimeException("Unexpected model element of type '" + modelType + "'.");
+ }
+
+ StereotypesManager.applyStereotype(element, replacementStereotype);
+ }
+
+ private boolean isTypeExpected(String modelType) {
+ return IModelElementFactory.MODEL_TYPE_ASSOCIATION.equals(modelType)
+ || IModelElementFactory.MODEL_TYPE_ATTRIBUTE.equals(modelType)
+ || IModelElementFactory.MODEL_TYPE_CLASS.equals(modelType);
+ }
+
+ private boolean hasReplacement(String originalStereotype, String recognizedStereotype) {
+ // TODO: Review whether we should reapplying even when original and recognized are equal
+ return recognizedStereotype != null && !recognizedStereotype.isEmpty();
+ // return recognizedStereotype != null
+ // && !recognizedStereotype.isEmpty()
+ // && !recognizedStereotype.equals(originalStereotype);
+ }
+
+ private String getNormalizedStereotype(String stereotype) {
+ return stereotype != null ? stereotype.toLowerCase().replaceAll("(\\s|-)+", "") : "";
+ }
+
+ private String getNormalizedStereotype(IModelElement element) {
+ final String stereotype = ModelElement.getUniqueStereotypeName(element);
+ return getNormalizedStereotype(stereotype);
+ }
+
+ private Map getClassStereotypesMap() {
+ if (classStereotypesMap == null || classStereotypesMap.isEmpty())
+ initializeClassStereotypeMap();
+ return classStereotypesMap;
+ }
+
+ private Map getAssociationStereotypesMap() {
+ if (associationStereotypesMap == null || associationStereotypesMap.isEmpty())
+ initializeAssociationStereotypeMap();
+ return associationStereotypesMap;
+ }
+
+ private Map getAttributeStereotypesMap() {
+ if (attributeStereotypesMap == null || attributeStereotypesMap.isEmpty())
+ initializeAttributeStereotypeMap();
+ return attributeStereotypesMap;
+ }
+
+ private void initializeClassStereotypeMap() {
+ classStereotypesMap = new HashMap<>();
+
+ Stereotype.getOntoumlClassStereotypeNames()
+ .forEach(
+ str -> {
+ String normalizedStr = getNormalizedStereotype(str);
+ classStereotypesMap.put(normalizedStr, str);
+ });
+
+ classStereotypesMap.put("hou", Stereotype.TYPE);
+ classStereotypesMap.put("highordertype", Stereotype.TYPE);
+ classStereotypesMap.put("higherordertype", Stereotype.TYPE);
+ classStereotypesMap.put("powertype", Stereotype.TYPE);
+ classStereotypesMap.put("universal", Stereotype.TYPE);
+ classStereotypesMap.put("2ndot", Stereotype.TYPE);
+ classStereotypesMap.put("collectivekind", Stereotype.COLLECTIVE);
+ classStereotypesMap.put("quantitykind", Stereotype.QUANTITY);
+ classStereotypesMap.put("relatorkind", Stereotype.RELATOR);
+ classStereotypesMap.put("qualitykind", Stereotype.QUALITY);
+ classStereotypesMap.put("modekind", Stereotype.MODE);
+ classStereotypesMap.put("enum", Stereotype.ENUMERATION);
+ }
+
+ private void initializeAssociationStereotypeMap() {
+ associationStereotypesMap = new HashMap<>();
+
+ Stereotype.getOntoumlAssociationStereotypeNames()
+ .forEach(
+ str -> {
+ String normalizedStr = getNormalizedStereotype(str);
+ associationStereotypesMap.put(normalizedStr, str);
+ });
+
+ associationStereotypesMap.put("characterizes", Stereotype.CHARACTERIZATION);
+ associationStereotypesMap.put("externaldependenceon", Stereotype.EXTERNAL_DEPENDENCE);
+ associationStereotypesMap.put("externallydepends", Stereotype.EXTERNAL_DEPENDENCE);
+ associationStereotypesMap.put("externallydependson", Stereotype.EXTERNAL_DEPENDENCE);
+ associationStereotypesMap.put("mediates", Stereotype.MEDIATION);
+ associationStereotypesMap.put("iof", Stereotype.INSTANTIATION);
+ associationStereotypesMap.put("instanceof", Stereotype.INSTANTIATION);
+ associationStereotypesMap.put("terminates", Stereotype.TERMINATION);
+ associationStereotypesMap.put("participates", Stereotype.PARTICIPATION);
+ associationStereotypesMap.put("historicallydepends", Stereotype.HISTORICAL_DEPENDENCE);
+ associationStereotypesMap.put("creates", Stereotype.CREATION);
+ associationStereotypesMap.put("manifests", Stereotype.MANIFESTATION);
+ }
+
+ private void initializeAttributeStereotypeMap() {
+ attributeStereotypesMap = new HashMap<>();
+
+ Stereotype.getOntoumlAttributeStereotypeNames()
+ .forEach(
+ str -> {
+ String normalizedStr = getNormalizedStereotype(str);
+ attributeStereotypesMap.put(normalizedStr, str);
+ });
+ }
+
+ private void retrieveModelElements() {
+ retrieveClasses();
+ retrieveAssociations();
+ retrieveAttributes();
+ }
+
+ private void retrieveAssociations() {
+ IProject project = ApplicationManagerUtils.getCurrentProject();
+
+ associations =
+ Optional.ofNullable(
+ project.toAllLevelModelElementArray(IModelElementFactory.MODEL_TYPE_ASSOCIATION))
+ .stream()
+ .flatMap(Arrays::stream)
+ .map(IAssociation.class::cast)
+ .collect(Collectors.toSet());
+ }
+
+ private void retrieveAttributes() {
+ // attributes = new HashSet<>();
+ // classes.stream().flatMap(c -> Class.getAttributes(c).stream()).forEach(attributes::add);
+ attributes =
+ classes.stream().map(Class::getAttributes).flatMap(Set::stream).collect(Collectors.toSet());
+ }
+
+ private void retrieveClasses() {
+ // classes = new HashSet<>();
+ // final Iterator> iter =
+ //
+ // ApplicationManagerUtils.getAllLevelModelElements(IModelElementFactory.MODEL_TYPE_CLASS);
+ //
+ // while (iter != null && iter.hasNext()) {
+ // classes.add((IClass) iter.next());
+ // }
+ IProject project = ApplicationManagerUtils.getCurrentProject();
+
+ classes =
+ Optional.ofNullable(
+ project.toAllLevelModelElementArray(IModelElementFactory.MODEL_TYPE_CLASS))
+ .stream()
+ .flatMap(Arrays::stream)
+ .map(IClass.class::cast)
+ .collect(Collectors.toSet());
+ }
+}
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/controllers/ReloadClassesController.java b/src/main/java/it/unibz/inf/ontouml/vp/controllers/ReloadClassesController.java
index def74bbd..7ff66f89 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/controllers/ReloadClassesController.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/ReloadClassesController.java
@@ -1,16 +1,168 @@
package it.unibz.inf.ontouml.vp.controllers;
import com.vp.plugin.ApplicationManager;
+import com.vp.plugin.ExportDiagramAsImageOption;
+import com.vp.plugin.ModelConvertionManager;
+import com.vp.plugin.ProjectManager;
import com.vp.plugin.action.VPAction;
import com.vp.plugin.action.VPActionController;
+import com.vp.plugin.diagram.IDiagramUIModel;
+import com.vp.plugin.model.IProject;
import it.unibz.inf.ontouml.vp.OntoUMLPlugin;
+import it.unibz.inf.ontouml.vp.model.vp2ontouml.Uml2OntoumlTransformer;
+import it.unibz.inf.ontouml.vp.utils.SimpleServiceWorker;
import it.unibz.inf.ontouml.vp.utils.ViewManagerUtils;
+import java.awt.Frame;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import javax.swing.JFileChooser;
public class ReloadClassesController implements VPActionController {
+ private static final String RUN_ON_REPO_CONFIRMATION = "Do wish you to run sanitize on folder?";
+ private static final String PROCEDURE_CANCELED = "Procedure cancelled.";
+ private static final String UNEXPECTED_ERROR = "Unexpected error occurred.";
+ private static final String RELOAD_PLUGIN_CONFIRMATION = "Do wish you to reload the plugin?";
+
+ private static Set blacklistSet =
+ Stream.of(
+ ".git", ".vscode"
+ // , "abel2015petroleum-system"
+ // , "aguiar2018rdbs-o"
+ // , "ahmad2018aviation"
+ // , "aires2022valuenetworks-geo"
+ // , "albuquerque2011ontobio"
+ // , "alpinebits2022"
+ // , "amaral2019rot"
+ // , "amaral2020rome"
+ // , "ambient-assisted-living2021"
+ // , "andersson2018value-ascription"
+ // , "aristotle-ontology2019"
+ // , "bank-model"
+ // , "barcelos2013normative-acts"
+ // , "barcelos2015transport-networks"
+ // , "barros2020programming"
+ // , "bernasconi2021ontovcm"
+ // , "brazilian-governmental-organizational-structures"
+ // , "buchtela2020connection"
+ // , "buridan-ontology2021"
+ // , "carolla2014campus-management"
+ // , "castro2012cloudvulnerability"
+ // , "cgts2021sebim"
+ // , "chartered-service"
+ // , "clergy-ontology"
+ // , "cmpo2017"
+ // , "dpo2017"
+ // , "duarte2018osdef"
+ // , "duarte2018reqon"
+ // , "duarte2021ross"
+ // , "eu-rent-refactored2022"
+ // , "experiment2013"
+ // , "fernandez-cejas2022curie-o"
+ // , "ferreira2015ontoemergeplan"
+ // , "franco2018rpg"
+ // , "g809-2015"
+ // , "gailly2016value"
+ // , "gi2mo"
+ // , "grueau2013towards"
+ // , "guarino2016value"
+ // , "guarino2018rea"
+ // , "guizzardi2014nfr"
+ // , "guizzardi2020decision-making"
+ // , "hazard-ontology-robotic-strolling2017"
+ // , "hazard-ontology-train-control2017"
+ // , "health-organizations"
+ // , "internal-affairs2013"
+ // , "internship"
+ // , "khantong2020ontology"
+ // , "kostov2017towards"
+ // , "kritz2020ontobg"
+ // , "laurier2018rea"
+ // , "library"
+ // , "martinez2013human-genome"
+ // , "medical-appointment2020"
+ // , "mgic-antt2011"
+ // , "moreira2018saref4health"
+ // , "music-ontology"
+ // , "neves2021grain-production"
+ // , "niederkofler2019dssapple"
+ // , "oliveira2007collaboration"
+ // , "online-mentoring"
+ // , "pereira2015doacao-orgaos"
+ // , "pereira2020ontotrans"
+ // , "photography"
+ // , "plato-ontology2019"
+ // , "porello2020coex"
+ // , "ppo-o2021"
+ // , "public-tender"
+ // , "ramirez2015userfeedback"
+ // , "ramos2021bias"
+ // , "recommendation-ontology"
+ // , "repa2021public-administration"
+ // , "rodrigues2019ontocrime"
+ // , "rodrigues2019turbidite"
+ // , "sales2018competition"
+ // , "sales2018cover"
+ // , "santos2020valuenetworks"
+ // , "sikora2021online-education"
+ // , "silva2012itarchitecture"
+ // , "silveira2021oap"
+ // , "social-contract"
+ // , "spo2017"
+ // , "sportbooking2021"
+ // , "srro-ontology"
+ // , "stock-broker2021"
+ // , "tourbo2021"
+ // , "van-wingerde2020smart-contracts"
+ // , "vieira2020weathering"
+ // , "weigand2021artifact"
+ // , "zanetti2019orm-o"
+ // , "zhou2017hazard"
+ )
+ .collect(Collectors.toSet());
+ private static Set targetSet = Set.of("");
+
+ private File repositoryFile;
+ private ProjectManager projectManager;
+ private IProject project;
+ private File ontologyDir;
+ private File diagramsDir;
+ private File ontologyVppFile;
+ private File ontologyJsonFile;
+ private ModelConvertionManager modelConvertionManager;
+ private ExportDiagramAsImageOption diagramTypeOption;
+
@Override
public void performAction(VPAction action) {
- reloadPlugin();
+ projectManager = ApplicationManager.instance().getProjectManager();
+ project = projectManager.getProject();
+ modelConvertionManager = ApplicationManager.instance().getModelConvertionManager();
+ diagramTypeOption = new ExportDiagramAsImageOption(ExportDiagramAsImageOption.IMAGE_TYPE_PNG);
+
+ diagramTypeOption.setTextAntiAliasing(true);
+ diagramTypeOption.setScale(3);
+
+ boolean shouldRunOnRepo = ViewManagerUtils.warningDialog(RUN_ON_REPO_CONFIRMATION);
+
+ if (shouldRunOnRepo) {
+ repositoryFile = getDirectory();
+
+ new SimpleServiceWorker(this::runOnRepo).execute();
+ return;
+ }
+
+ boolean shouldReload = ViewManagerUtils.warningDialog(RELOAD_PLUGIN_CONFIRMATION);
+
+ if (shouldReload) {
+ reloadPlugin();
+ }
}
@Override
@@ -24,4 +176,174 @@ private void reloadPlugin() {
System.out.println("Plugin reloaded!");
ViewManagerUtils.simpleDialog("Plugin reloaded!");
}
+
+ private List runOnRepo(SimpleServiceWorker context) {
+ try {
+ if (!context.isCancelled() && repositoryFile != null) {
+ ViewManagerUtils.clean();
+ processRepository();
+
+ return List.of("Directory '" + repositoryFile + "' has been selected");
+ }
+
+ return List.of(PROCEDURE_CANCELED);
+ } catch (Exception e) {
+ e.printStackTrace();
+ ViewManagerUtils.log(UNEXPECTED_ERROR);
+ return List.of(UNEXPECTED_ERROR);
+ }
+ }
+
+ private void processRepository() throws IOException {
+ if (!repositoryFile.isDirectory()) {
+ throw new RuntimeException(
+ "Invalid repository directory: '" + repositoryFile.getAbsolutePath() + "'");
+ }
+
+ Files.newDirectoryStream(repositoryFile.toPath())
+ .forEach(
+ ontologyPath -> {
+ ontologyDir = ontologyPath.toFile();
+
+ if (!ontologyDir.isDirectory() || blacklistSet.contains(ontologyDir.getName())) {
+ System.out.println("Ignoring file '" + ontologyDir.getName() + "'");
+ return;
+ }
+
+ // if(!targetSet.contains(ontologyPath.getFileName().toString())) {
+ // System.out.println("Skipping directory '" + ontologyDir.getName() +
+ // "'");
+ // return ;
+ // }
+
+ System.out.println("Checking '" + ontologyDir.getName() + "'");
+ try {
+ checkOntologyDir(ontologyDir);
+ System.out.println("Checked '" + ontologyDir.getName() + "': OK");
+ } catch (Exception e) {
+ System.out.println("Checked '" + ontologyDir.getName() + "': FAIL!");
+ return;
+ }
+ System.out.println("Opening '" + ontologyDir.getName() + "'");
+ try {
+ openProject(ontologyDir);
+ } catch (IOException e) {
+ e.printStackTrace();
+ throw new RuntimeException(
+ "Unable to open ontology '" + ontologyDir.getName() + "'");
+ }
+ System.out.println("Opened '" + ontologyDir.getName() + "': OK");
+ System.out.println("Sanitizing '" + ontologyDir.getName() + "'");
+ ModelSanitizeManager.run();
+ System.out.println("Sanitized '" + ontologyDir.getName() + "': OK");
+ // System.out.println("Exporting diagrams '" + ontologyDir.getName() +
+ // "'");
+ // try {
+ // exportDiagrams();
+ // } catch (IOException e) {
+ // e.printStackTrace();
+ // throw new RuntimeException(
+ // "Unable to export diagrams of '" + ontologyDir.getName() + "'");
+ // }
+ // System.out.println("Exported diagrams '" + ontologyDir.getName() + "':
+ // OK");
+ System.out.println("Exporting JSON '" + ontologyDir.getName() + "'");
+ try {
+ exportJson();
+ } catch (IOException e) {
+ e.printStackTrace();
+ throw new RuntimeException(
+ "Unable to export JSON of '" + ontologyDir.getName() + "'");
+ }
+ System.out.println("Exported JSON '" + ontologyDir.getName() + "': OK");
+ System.out.println("Saving VPP file '" + ontologyDir.getName() + "'");
+ projectManager.saveProject();
+ System.out.println("Saved VPP file '" + ontologyDir.getName() + "': OK");
+ });
+ }
+
+ private void exportJson() throws IOException {
+ final String exportFileContents = Uml2OntoumlTransformer.transformAndSerialize();
+ Files.write(ontologyJsonFile.toPath(), exportFileContents.getBytes());
+ }
+
+ private void exportDiagrams() throws IOException {
+ emptyFolder(diagramsDir);
+
+ Iterator> iter = project.diagramIterator();
+
+ while (iter != null && iter.hasNext()) {
+ IDiagramUIModel diagram = (IDiagramUIModel) iter.next();
+ String name = diagram.getName();
+ File diagramFile = Paths.get(diagramsDir.getAbsolutePath(), name + ".png").toFile();
+
+ ViewManagerUtils.log("Exporting diagram '" + diagramFile + "'");
+ modelConvertionManager.exportDiagramAsImage(diagram, diagramFile, diagramTypeOption);
+ }
+ }
+
+ private void emptyFolder(File diagramsDir) throws IOException {
+ Files.newDirectoryStream(diagramsDir.toPath()).forEach(path -> path.toFile().delete());
+ }
+
+ private void checkOntologyDir(File ontologyDir) {
+ ontologyVppFile = Paths.get(ontologyDir.getAbsolutePath(), "ontology.vpp").toFile();
+ ontologyJsonFile = Paths.get(ontologyDir.getAbsolutePath(), "ontology.json").toFile();
+
+ File originalDiagramsDir =
+ Paths.get(ontologyDir.getAbsolutePath(), "original diagrams").toFile();
+ File newDiagramsDir = Paths.get(ontologyDir.getAbsolutePath(), "new diagrams").toFile();
+
+ if (!ontologyDir.exists()) {
+ throw new RuntimeException("Ontology directory not found! (" + ontologyDir.getPath() + ")");
+ }
+
+ if (!ontologyVppFile.exists()) {
+ throw new RuntimeException(
+ "Visual Paradigm file not found! (" + ontologyVppFile.getPath() + ")");
+ }
+
+ if (!ontologyJsonFile.exists()) {
+ throw new RuntimeException("JSON file not found! (" + ontologyJsonFile.getPath() + ")");
+ }
+
+ if (!originalDiagramsDir.isDirectory() && !newDiagramsDir.isDirectory()) {
+ throw new RuntimeException("No folder found at '" + ontologyJsonFile.getPath() + "'!");
+ }
+
+ diagramsDir =
+ shouldExportToOriginalDiagramsDir(originalDiagramsDir, newDiagramsDir)
+ ? originalDiagramsDir
+ : newDiagramsDir;
+ }
+
+ private boolean shouldExportToOriginalDiagramsDir(File originalDiagramsDir, File newDiagramsDir) {
+ return !newDiagramsDir.isDirectory() || newDiagramsDir.list().length == 0;
+ }
+
+ private void openProject(File ontologyDir) throws IOException {
+ File tempFile = File.createTempFile("discard-", ".vpp");
+ File ontologyFile = Paths.get(ontologyDir.getAbsolutePath(), "ontology.vpp").toFile();
+
+ if (!ontologyFile.exists() || !ontologyFile.isFile()) {
+ throw new RuntimeException("Ontology file not found");
+ }
+
+ projectManager.saveProjectAs(tempFile);
+ projectManager.openProject(ontologyFile);
+ project = projectManager.getProject();
+ }
+
+ private File getDirectory() {
+ File ontoumlModelsDir = Paths.get("/Users/claudenir/git/github/unibz-core").toFile();
+ Frame rootFrame = (Frame) ApplicationManager.instance().getViewManager().getRootFrame();
+ JFileChooser jc =
+ ontoumlModelsDir.isDirectory() ? new JFileChooser(ontoumlModelsDir) : new JFileChooser();
+
+ jc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
+
+ int result = jc.showOpenDialog(rootFrame);
+
+ return result == JFileChooser.APPROVE_OPTION ? jc.getSelectedFile() : null;
+ }
}
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/listeners/AssociationEventManager.java b/src/main/java/it/unibz/inf/ontouml/vp/listeners/AssociationEventManager.java
index 44871864..b4970308 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/listeners/AssociationEventManager.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/listeners/AssociationEventManager.java
@@ -33,8 +33,8 @@ public void processEvent() {
}
private void processStereotypeChange() {
- // checkSourcesDiagrams();
- checkAssociationConsistency();
+ // checkSourcesDiagrams();
+ // checkAssociationConsistency();
// setDefaultAssociationProperties();
}
@@ -56,26 +56,26 @@ private void checkAssociationConsistency() {
private void checkMultiplicity() {
if (isSourceEndMultiplicityUnspecified()) {
final String mult = Association.getDefaultSourceMultiplicity(source);
- Association.getSourceEnd(source).setMultiplicity(mult);
+ Association.getFromEnd(source).setMultiplicity(mult);
}
if (isTargetEndMultiplicityUnspecified()) {
final String mult = Association.getDefaultTargetMultiplicity(source);
- Association.getTargetEnd(source).setMultiplicity(mult);
+ Association.getToEnd(source).setMultiplicity(mult);
}
}
private boolean isSourceEndMultiplicityUnspecified() {
- final IAssociationEnd targetEnd = Association.getTargetEnd(source);
+ final IAssociationEnd targetEnd = Association.getToEnd(source);
return IAssociationEnd.MULTIPLICITY_UNSPECIFIED.equals(targetEnd.getMultiplicity());
}
private boolean isTargetEndMultiplicityUnspecified() {
- final IAssociationEnd targetEnd = Association.getTargetEnd(source);
+ final IAssociationEnd targetEnd = Association.getToEnd(source);
return IAssociationEnd.MULTIPLICITY_UNSPECIFIED.equals(targetEnd.getMultiplicity());
}
private void checkAggregationKind() {
- final IAssociationEnd targetEnd = Association.getTargetEnd(source);
+ final IAssociationEnd targetEnd = Association.getToEnd(source);
if (shouldSetAggregationKind()) {
final String defaultAggregationKind = Association.getDefaultAggregationKind(source);
@@ -86,7 +86,7 @@ private void checkAggregationKind() {
}
private boolean shouldSetAggregationKind() {
- final IAssociationEnd targetEnd = Association.getTargetEnd(source);
+ final IAssociationEnd targetEnd = Association.getToEnd(source);
final String aggKind = targetEnd.getAggregationKind();
final boolean isAggregationKindNone = IAssociationEnd.AGGREGATION_KIND_none.equals(aggKind);
@@ -96,7 +96,7 @@ private boolean shouldSetAggregationKind() {
}
private boolean shouldRemoveAggregationKind() {
- final IAssociationEnd targetEnd = Association.getTargetEnd(source);
+ final IAssociationEnd targetEnd = Association.getToEnd(source);
final String aggKind = targetEnd.getAggregationKind();
final boolean isAggregationKindNone = IAssociationEnd.AGGREGATION_KIND_none.equals(aggKind);
@@ -106,38 +106,39 @@ private boolean shouldRemoveAggregationKind() {
}
private void checkAssociationEndProperties() {
- final IAssociationEnd sourceEnd = Association.getSourceEnd(source);
- final IAssociationEnd targetEnd = Association.getTargetEnd(source);
+ final IAssociationEnd sourceEnd = Association.getFromEnd(source);
+ final IAssociationEnd targetEnd = Association.getToEnd(source);
final boolean isSourceReadOnly = sourceEnd.isReadOnly();
final boolean isTargetReadOnly = targetEnd.isReadOnly();
if (Association.isSourceAlwaysReadOnly(source) && !isSourceReadOnly) {
- Association.getSourceEnd(source).setReadOnly(true);
+ Association.getFromEnd(source).setReadOnly(true);
}
if (Association.isTargetAlwaysReadOnly(source) && !isTargetReadOnly) {
- Association.getTargetEnd(source).setReadOnly(true);
+ Association.getToEnd(source).setReadOnly(true);
}
}
private void checkAggregationPlacement() {
- if (hasAggregationOnSource() && !hasAggregationOnTarget()) {
- Association.invertAssociation(source, true);
- }
+ throw new RuntimeException("Oops...");
+ // if (hasAggregationOnSource() && !hasAggregationOnTarget()) {
+ // Association.invertAssociation(source, true);
+ // }
}
private boolean hasAggregationOnTarget() {
- final IAssociationEnd targetEnd = Association.getTargetEnd(source);
+ final IAssociationEnd targetEnd = Association.getToEnd(source);
return !IAssociationEnd.AGGREGATION_KIND_none.equals(targetEnd.getAggregationKind());
}
private boolean hasAggregationOnSource() {
- final IAssociationEnd sourceEnd = Association.getSourceEnd(source);
+ final IAssociationEnd sourceEnd = Association.getFromEnd(source);
return !IAssociationEnd.AGGREGATION_KIND_none.equals(sourceEnd.getAggregationKind());
}
private void checkNavigability() {
- final IAssociationEnd sourceEnd = Association.getSourceEnd(source);
- final IAssociationEnd targetEnd = Association.getTargetEnd(source);
+ final IAssociationEnd sourceEnd = Association.getFromEnd(source);
+ final IAssociationEnd targetEnd = Association.getToEnd(source);
if (isSourceEndNavigable()) sourceEnd.setNavigable(IAssociationEnd.NAVIGABLE_UNSPECIFIED);
@@ -146,7 +147,7 @@ private void checkNavigability() {
}
private boolean isSourceEndNavigable() {
- return IAssociationEnd.NAVIGABLE_NAVIGABLE == Association.getSourceEnd(source).getNavigable();
+ return IAssociationEnd.NAVIGABLE_NAVIGABLE == Association.getFromEnd(source).getNavigable();
}
private boolean isAssociationView(Object obj) {
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/listeners/ClassEventManager.java b/src/main/java/it/unibz/inf/ontouml/vp/listeners/ClassEventManager.java
index 3c970d1a..846db061 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/listeners/ClassEventManager.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/listeners/ClassEventManager.java
@@ -106,18 +106,18 @@ private void enforceAndPropagateRestrictedTo() {
if (Class.doesItHaveFixedRestrictions(source) && hasEventChangedValues()) {
enforceFixedRestrictions();
- Class.propagateRestrictionsToDescendants(source);
+ Class.propagateRestrictionsToChildren(source);
return;
}
if (Class.doesItInheritItsRestrictions(source) && hasEventChangedValues()) {
inheritRestrictedTo(source);
- Class.propagateRestrictionsToDescendants(source);
+ Class.propagateRestrictionsToChildren(source);
return;
}
if (Class.canItHaveMultipleRestrictions(source) && hasEventChangedValues()) {
- Class.propagateRestrictionsToDescendants(source);
+ Class.propagateRestrictionsToChildren(source);
return;
}
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/listeners/GeneralizationEventManager.java b/src/main/java/it/unibz/inf/ontouml/vp/listeners/GeneralizationEventManager.java
index e8118b17..f546c760 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/listeners/GeneralizationEventManager.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/listeners/GeneralizationEventManager.java
@@ -54,6 +54,6 @@ private void propagateParentsRestrictions(Object value) {
Class.getParents(_class).stream()
.filter(Class::isOntoumlClass)
- .forEach(Class::propagateRestrictionsToDescendants);
+ .forEach(Class::propagateRestrictionsToChildren);
}
}
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/model/ProjectConfigurations.java b/src/main/java/it/unibz/inf/ontouml/vp/model/ProjectConfigurations.java
index bd5c18e8..44a29863 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/model/ProjectConfigurations.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/model/ProjectConfigurations.java
@@ -10,7 +10,9 @@
* @author Claudenir Fonseca
* @author Victor Viola
*/
-/** @author Victor Viola */
+/**
+ * @author Victor Viola
+ */
public class ProjectConfigurations {
public static final boolean DEFAULT_IS_PLUGIN_ENABLED = true;
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml/ModelElementContainer.java b/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml/ModelElementContainer.java
index 80f4b47b..3884a1fc 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml/ModelElementContainer.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml/ModelElementContainer.java
@@ -166,9 +166,9 @@ default List getAllDatatypes() {
return this.getClassesByStereotype(ClassStereotype.DATATYPE);
}
- default List getAllPrimitiveDatatypes() {
+ default List getAllInstalledDatatypes() {
return getAllDatatypes().stream()
- .filter(d -> d.isPrimitiveDatatype())
+ .filter(Class::isInstalledDatatype)
.collect(Collectors.toList());
}
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml/model/Class.java b/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml/model/Class.java
index f54708da..0f21de6a 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml/model/Class.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml/model/Class.java
@@ -2,11 +2,14 @@
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.vp.plugin.model.IProject;
+import com.vp.plugin.model.factory.IModelElementFactory;
import it.unibz.inf.ontouml.vp.model.ontouml.MultilingualText;
import it.unibz.inf.ontouml.vp.model.ontouml.OntoumlElement;
import it.unibz.inf.ontouml.vp.model.ontouml.OntoumlUtils;
import it.unibz.inf.ontouml.vp.model.ontouml.deserialization.ClassDeserializer;
import it.unibz.inf.ontouml.vp.model.ontouml.serialization.ClassSerializer;
+import it.unibz.inf.ontouml.vp.utils.ApplicationManagerUtils;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -319,8 +322,18 @@ public boolean isDatatype() {
return hasStereotype(ClassStereotype.DATATYPE);
}
- public boolean isPrimitiveDatatype() {
- return isDatatype() && !hasAttributes();
+ private boolean isProjectInstalledDatatype() {
+ IProject p = ApplicationManagerUtils.getCurrentProject();
+ String type = IModelElementFactory.MODEL_TYPE_DATA_TYPE;
+
+ // In VP, data types only exist in the project's root
+ return Optional.ofNullable(p.toModelElementArray(type)).stream()
+ .flatMap(Arrays::stream)
+ .anyMatch(installedDatatype -> installedDatatype.getId().equals(getId()));
+ }
+
+ public boolean isInstalledDatatype() {
+ return isDatatype() && isProjectInstalledDatatype();
}
public static Class createKind(String id, String name) {
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml2vp/IAssociationClassUIModelLoader.java b/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml2vp/IAssociationClassUIModelLoader.java
index 15feea6e..71f25c24 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml2vp/IAssociationClassUIModelLoader.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml2vp/IAssociationClassUIModelLoader.java
@@ -19,6 +19,7 @@ public class IAssociationClassUIModelLoader {
public static void load(IClassDiagramUIModel toDiagram, RelationView fromView) {
IModelElement toModelElement = getIModelElement(fromView);
+ // TODO: review this bit: how does it find the derivation if it was created anew
if (!(toModelElement instanceof IAssociationClass)) {
System.out.println(
LoaderUtils.getIncompatibleMessage(fromView, toModelElement, IAssociationClass.class));
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml2vp/IAssociationLoader.java b/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml2vp/IAssociationLoader.java
index 98bba7d7..5ae0e5cb 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml2vp/IAssociationLoader.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml2vp/IAssociationLoader.java
@@ -1,15 +1,18 @@
package it.unibz.inf.ontouml.vp.model.ontouml2vp;
+import static it.unibz.inf.ontouml.vp.model.ontouml2vp.LoaderUtils.isWholeEnd;
import static it.unibz.inf.ontouml.vp.model.ontouml2vp.LoaderUtils.loadName;
import static it.unibz.inf.ontouml.vp.model.ontouml2vp.LoaderUtils.logElementCreation;
import com.vp.plugin.ApplicationManager;
import com.vp.plugin.model.*;
import com.vp.plugin.model.factory.IModelElementFactory;
+import it.unibz.inf.ontouml.vp.model.ontouml.Element;
import it.unibz.inf.ontouml.vp.model.ontouml.model.Classifier;
import it.unibz.inf.ontouml.vp.model.ontouml.model.Property;
import it.unibz.inf.ontouml.vp.model.ontouml.model.Relation;
import it.unibz.inf.ontouml.vp.utils.StereotypesManager;
+import java.util.Optional;
public class IAssociationLoader {
@@ -36,14 +39,60 @@ public static IAssociation importElement(Relation fromRelation) {
.getStereotype()
.ifPresent(stereotype -> StereotypesManager.applyStereotype(toRelation, stereotype));
- loadEndProperties(fromRelation.getSourceEnd(), (IAssociationEnd) toRelation.getFromEnd());
- loadEndProperties(fromRelation.getTargetEnd(), (IAssociationEnd) toRelation.getToEnd());
+ Property relationSource = fromRelation.getSourceEnd();
+ Property relationTarget = fromRelation.getTargetEnd();
+ IAssociationEnd sourceEnd = getSourceEnd(relationSource, toRelation);
+ IAssociationEnd targetEnd = getTargetEnd(relationTarget, toRelation);
+
+ loadEndProperties(relationSource, sourceEnd);
+ loadEndProperties(relationTarget, targetEnd);
+ enforceNavigability(toRelation);
ITaggedValueLoader.loadTaggedValues(fromRelation, toRelation);
return toRelation;
}
+ private static IAssociationEnd getSourceEnd(Property sourceProperty, IAssociation relation) {
+ IAssociationEnd fromEnd = (IAssociationEnd) relation.getFromEnd();
+ IAssociationEnd toEnd = (IAssociationEnd) relation.getToEnd();
+ String fromId =
+ Optional.ofNullable(relation.getFrom()).map(IModelElement::getId).orElse("noend");
+ String toId =
+ Optional.ofNullable(relation.getToEnd()).map(IModelElement::getId).orElse("noend");
+ String classId = sourceProperty.getPropertyType().map(Element::getId).orElse("noid");
+
+ if (fromId.equals(classId) && !toId.equals(classId)) return fromEnd;
+ if (toId.equals(classId) && !fromId.equals(classId)) return toEnd;
+ return fromEnd;
+ }
+
+ private static IAssociationEnd getTargetEnd(Property targetProperty, IAssociation relation) {
+ IAssociationEnd fromEnd = (IAssociationEnd) relation.getFromEnd();
+ IAssociationEnd toEnd = (IAssociationEnd) relation.getToEnd();
+ String fromId =
+ Optional.ofNullable(relation.getFrom()).map(IModelElement::getId).orElse("noend");
+ String toId = Optional.ofNullable(relation.getTo()).map(IModelElement::getId).orElse("noend");
+ String classId = targetProperty.getPropertyType().map(Element::getId).orElse("noid");
+
+ if (toId.equals(classId) && !fromId.equals(classId)) return toEnd;
+ if (fromId.equals(classId) && !toId.equals(classId)) return fromEnd;
+ return toEnd;
+ }
+
+ private static void enforceNavigability(IAssociation association) {
+ IAssociationEnd fromEnd = (IAssociationEnd) association.getFromEnd();
+ IAssociationEnd toEnd = (IAssociationEnd) association.getToEnd();
+
+ fromEnd.setNavigable(IAssociationEnd.NAVIGABLE_UNSPECIFIED);
+
+ if (!isWholeEnd(toEnd) && !isWholeEnd(fromEnd)) {
+ toEnd.setNavigable(IAssociationEnd.NAVIGABLE_NAVIGABLE);
+ } else {
+ toEnd.setNavigable(IAssociationEnd.NAVIGABLE_UNSPECIFIED);
+ }
+ }
+
private static void loadEndProperties(Property fromProperty, IAssociationEnd toProperty) {
loadName(fromProperty, toProperty);
@@ -71,18 +120,30 @@ private static void loadEndProperties(Property fromProperty, IAssociationEnd toP
ITaggedValueLoader.loadTaggedValues(fromProperty, toProperty);
}
- private static void loadSource(Relation fromRelation, IAssociation toRelation) {
- Classifier, ?> fromSource = fromRelation.getSource();
- IModelElement toSource = vpProject.getModelElementById(fromSource.getId());
+ private static void loadSource(Relation relation, IAssociation association) {
+ Classifier, ?> relationSource = relation.getSource();
+ IModelElement associationSource = vpProject.getModelElementById(relationSource.getId());
+
+ String associationSourceId =
+ Optional.ofNullable(associationSource.getId()).orElse("nosourceid");
+ String associationFromId =
+ Optional.ofNullable(association.getFrom()).map(IModelElement::getId).orElse("nofromid");
- if (toSource != null) toRelation.setFrom(toSource);
+ if (associationFromId.equals(associationSourceId)) association.setFrom(associationSource);
+ else association.setTo(associationSource);
}
- private static void loadTarget(Relation fromRelation, IAssociation toRelation) {
- Classifier, ?> fromTarget = fromRelation.getTarget();
- IModelElement toTarget = vpProject.getModelElementById(fromTarget.getId());
+ private static void loadTarget(Relation relation, IAssociation association) {
+ Classifier, ?> relationTarget = relation.getTarget();
+ IModelElement associationTarget = vpProject.getModelElementById(relationTarget.getId());
+
+ String associationTargetId =
+ Optional.ofNullable(associationTarget.getId()).orElse("notargetid");
+ String associationToId =
+ Optional.ofNullable(association.getTo()).map(IModelElement::getId).orElse("notoid");
- if (toTarget != null) toRelation.setTo(toTarget);
+ if (associationToId.equals(associationTargetId)) association.setTo(associationTarget);
+ else association.setFrom(associationTarget);
}
private static IAssociation getOrCreateAssociation(Relation fromRelation) {
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml2vp/IAssociationUIModelLoader.java b/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml2vp/IAssociationUIModelLoader.java
index 2cde8e44..deb32ad8 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml2vp/IAssociationUIModelLoader.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml2vp/IAssociationUIModelLoader.java
@@ -8,6 +8,7 @@
import com.vp.plugin.diagram.IClassDiagramUIModel;
import com.vp.plugin.diagram.IDiagramElement;
import com.vp.plugin.model.IAssociation;
+import com.vp.plugin.model.IClass;
import com.vp.plugin.model.IModelElement;
import it.unibz.inf.ontouml.vp.model.ontouml.view.RelationView;
import java.awt.*;
@@ -20,7 +21,6 @@ public static void load(IClassDiagramUIModel toDiagram, RelationView fromView) {
IModelElement toModelElement = getIModelElement(fromView);
if (!(toModelElement instanceof IAssociation)) {
- // && !(toModelElement instanceof IAssociationClass)) {
System.out.println(
LoaderUtils.getIncompatibleMessage(fromView, toModelElement, IAssociation.class));
return;
@@ -37,4 +37,11 @@ public static void load(IClassDiagramUIModel toDiagram, RelationView fromView) {
fromView.setId(toView.getId());
toView.resetCaption();
}
+
+ public boolean isDirectionInverted(
+ IClass source, IClass target, IDiagramElement sourceShape, IDiagramElement targetShape) {
+ return !source.getId().equals(target.getId())
+ && source.getId().equals(targetShape.getModelElement().getId())
+ && target.getId().equals(sourceShape.getModelElement().getId());
+ }
}
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml2vp/IProjectLoader.java b/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml2vp/IProjectLoader.java
index 8009b6a2..46e77fd8 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml2vp/IProjectLoader.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml2vp/IProjectLoader.java
@@ -36,10 +36,10 @@ public static void importModel(Project fromProject) {
.forEach(pkg -> IPackageLoader.importElement(pkg));
fromProject.getAllClasses().stream()
- .filter(c -> !c.isPrimitiveDatatype())
+ .filter(c -> !c.isInstalledDatatype())
.forEach(c -> IClassLoader.importElement(c));
- fromProject.getAllPrimitiveDatatypes().forEach(d -> IDataTypeLoader.importElement(d));
+ fromProject.getAllInstalledDatatypes().forEach(d -> IDataTypeLoader.importElement(d));
// transform attributes
fromProject.getAllClasses().stream()
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml2vp/LoaderUtils.java b/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml2vp/LoaderUtils.java
index 928b9b08..77fedcb6 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml2vp/LoaderUtils.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml2vp/LoaderUtils.java
@@ -3,6 +3,8 @@
import com.vp.plugin.ApplicationManager;
import com.vp.plugin.diagram.IClassDiagramUIModel;
import com.vp.plugin.diagram.IDiagramElement;
+import com.vp.plugin.model.IAssociation;
+import com.vp.plugin.model.IAssociationEnd;
import com.vp.plugin.model.IClass;
import com.vp.plugin.model.IDataType;
import com.vp.plugin.model.IModelElement;
@@ -83,4 +85,45 @@ static IClass getToClass(Class fromClass) {
static void loadName(ModelElement fromElement, IModelElement toElement) {
fromElement.getFirstName().ifPresent(name -> toElement.setName(name));
}
+
+ static boolean isWholeEnd(IAssociationEnd associationEnd) {
+ return associationEnd.getAggregationKind() != null
+ && !IAssociationEnd.AGGREGATION_KIND_none.equals(associationEnd.getAggregationKind());
+ }
+
+ static boolean isNavigable(IAssociationEnd associationEnd) {
+ return IAssociationEnd.NAVIGABLE_NAV_NAVIGABLE == associationEnd.getNavigable();
+ }
+
+ static IAssociationEnd getSourceEndOnNavigability(IAssociation association) {
+ IAssociationEnd fromEnd = (IAssociationEnd) association.getFromEnd();
+ IAssociationEnd toEnd = (IAssociationEnd) association.getToEnd();
+
+ if (isWholeEnd(toEnd)) {
+ return toEnd;
+ } else if (isWholeEnd(fromEnd)) {
+ return fromEnd;
+ } else if (isNavigable(toEnd)) {
+ return toEnd;
+ } else if (isNavigable(fromEnd)) {
+ return fromEnd;
+ } else {
+ return toEnd;
+ }
+ }
+
+ static IAssociationEnd getTargetEndOnNavigability(IAssociation association) {
+ IAssociationEnd fromEnd = (IAssociationEnd) association.getFromEnd();
+ IAssociationEnd toEnd = (IAssociationEnd) association.getToEnd();
+
+ return getSourceEndOnNavigability(association) != toEnd ? toEnd : fromEnd;
+ }
+
+ static IClass getSourceOnNavigability(IAssociation association) {
+ return (IClass) getSourceEndOnNavigability(association).getTypeAsElement();
+ }
+
+ static IClass getTargetOnNavigability(IAssociation association) {
+ return (IClass) getTargetEndOnNavigability(association).getTypeAsElement();
+ }
}
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/model/uml/Association.java b/src/main/java/it/unibz/inf/ontouml/vp/model/uml/Association.java
index c6bd570b..c9109276 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/model/uml/Association.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/model/uml/Association.java
@@ -222,66 +222,57 @@ public void setDerived(boolean isDerived) {
this.isDerived = isDerived;
}
- public static IClass getSource(IAssociation association) {
+ public static IClass getFrom(IAssociation association) {
return (IClass) association.getFrom();
}
- public static IClass getTarget(IAssociation association) {
+ public static IClass getTo(IAssociation association) {
return (IClass) association.getTo();
}
- public static void setSource(IAssociation association, IClass newSource) {
- association.setFrom(newSource);
+ public static void setFrom(IAssociation association, IClass iClass) {
+ association.setFrom(iClass);
}
- public static void setTarget(IAssociation association, IClass newTarget) {
- association.setTo(newTarget);
+ public static void setTo(IAssociation association, IClass iClass) {
+ association.setTo(iClass);
}
- public static IAssociationEnd getSourceEnd(IAssociation association) {
+ public static IAssociationEnd getFromEnd(IAssociation association) {
return (IAssociationEnd) association.getFromEnd();
}
- public static IAssociationEnd getTargetEnd(IAssociation association) {
+ public static IAssociationEnd getToEnd(IAssociation association) {
return (IAssociationEnd) association.getToEnd();
}
- public static List getSourceRestrictions(IAssociation association) {
- return Class.getRestrictedToList(getSource(association));
+ public static List getFromRestrictions(IAssociation association) {
+ return Class.getRestrictedToList(getFrom(association));
}
- public static List getTargetRestrictions(IAssociation association) {
- return Class.getRestrictedToList(getTarget(association));
+ public static List getToRestrictions(IAssociation association) {
+ return Class.getRestrictedToList(getTo(association));
}
- public static void invertAssociation(
- IAssociation association, boolean keepAllAssociationEndPropertiesInPlace) {
- final IClass originalSource = getSource(association);
- final IClass originalTarget = getTarget(association);
- final IAssociationEnd originalSourceEnd = getSourceEnd(association);
- final IAssociationEnd originalTargetEnd = getTargetEnd(association);
- final PropertyDescription sourceEndDescription = new PropertyDescription(originalSourceEnd);
- final PropertyDescription targetEndDescription = new PropertyDescription(originalTargetEnd);
- final List originalAssociationsDescriptions =
- retrieveAndDeleteAssociationModels(association);
+ public static void invertAssociation(IAssociation association) {
+ IAssociationEnd originalSourceEnd = getSourceEnd(association);
+ IAssociationEnd originalTargetEnd = getTargetEnd(association);
- setSource(association, originalTarget);
- setTarget(association, originalSource);
+ String originalSourceAgg = originalSourceEnd.getAggregationKind();
+ String originalSourceMult = originalSourceEnd.getMultiplicity();
+ int originalSourceNav = originalSourceEnd.getNavigable();
- if (keepAllAssociationEndPropertiesInPlace) {
- sourceEndDescription.copyTo(originalTargetEnd);
- targetEndDescription.copyTo(originalSourceEnd);
- } else {
- sourceEndDescription.partialCopyTo(originalTargetEnd);
- targetEndDescription.partialCopyTo(originalSourceEnd);
- }
+ String originalTargetAgg = originalTargetEnd.getAggregationKind();
+ String originalTargetMult = originalTargetEnd.getMultiplicity();
+ int originalTargetNav = originalTargetEnd.getNavigable();
- setNavigability(association);
+ originalSourceEnd.setAggregationKind(originalTargetAgg);
+ originalSourceEnd.setMultiplicity(originalTargetMult);
+ originalSourceEnd.setNavigable(originalTargetNav);
- for (AssociationModelDescription originalAssociationsDescription :
- originalAssociationsDescriptions) {
- originalAssociationsDescription.recreateInvertedAssociationModel();
- }
+ originalTargetEnd.setAggregationKind(originalSourceAgg);
+ originalTargetEnd.setMultiplicity(originalSourceMult);
+ originalTargetEnd.setNavigable(originalSourceNav);
}
private static List retrieveAndDeleteAssociationModels(
@@ -306,8 +297,8 @@ public static void setNavigability(IAssociation association) {
return;
}
- final IAssociationEnd sourceEnd = getSourceEnd(association);
- final IAssociationEnd targetEnd = getTargetEnd(association);
+ final IAssociationEnd sourceEnd = getFromEnd(association);
+ final IAssociationEnd targetEnd = getToEnd(association);
final String targetAgg = targetEnd.getAggregationKind().toLowerCase();
sourceEnd.setNavigable(IAssociationEnd.NAVIGABLE_NAV_UNSPECIFIED);
@@ -321,8 +312,8 @@ public static void setNavigability(IAssociation association) {
public static void setDefaultAggregationKind(IAssociation association, boolean forceOverride) {
final String stereotype = ModelElement.getUniqueStereotypeName(association);
- final IAssociationEnd sourceEnd = getSourceEnd(association);
- final IAssociationEnd targetEnd = getTargetEnd(association);
+ final IAssociationEnd sourceEnd = getFromEnd(association);
+ final IAssociationEnd targetEnd = getToEnd(association);
String aggregationKind = IAssociationEnd.AGGREGATION_KIND_none;
switch (stereotype) {
@@ -364,10 +355,10 @@ public static void setDefaultAggregationKind(IAssociation association, boolean f
}
public static void setDefaultMultiplicity(IAssociation association, boolean forceOverride) {
- final IClass source = getSource(association);
- final IClass target = getTarget(association);
- final IAssociationEnd sourceEnd = getSourceEnd(association);
- final IAssociationEnd targetEnd = getTargetEnd(association);
+ final IClass source = getFrom(association);
+ final IClass target = getTo(association);
+ final IAssociationEnd sourceEnd = getFromEnd(association);
+ final IAssociationEnd targetEnd = getToEnd(association);
final String stereotype = ModelElement.getUniqueStereotypeName(association);
final String sourceStereotype = ModelElement.getUniqueStereotypeName(source);
final String targetStereotype = ModelElement.getUniqueStereotypeName(target);
@@ -528,7 +519,7 @@ public static void setDefaultMultiplicity(IAssociation association, boolean forc
public static String getDefaultSourceMultiplicity(IAssociation association) {
final String stereotype = ModelElement.getUniqueStereotypeName(association);
final String targetStereotype =
- ModelElement.getUniqueStereotypeName(Association.getTarget(association));
+ ModelElement.getUniqueStereotypeName(Association.getTo(association));
switch (stereotype != null ? stereotype : "") {
case Stereotype.CHARACTERIZATION:
@@ -564,7 +555,7 @@ public static String getDefaultSourceMultiplicity(IAssociation association) {
public static String getDefaultTargetMultiplicity(IAssociation association) {
final String stereotype = ModelElement.getUniqueStereotypeName(association);
final String sourceStereotype =
- ModelElement.getUniqueStereotypeName(Association.getSource(association));
+ ModelElement.getUniqueStereotypeName(Association.getFrom(association));
switch (stereotype != null ? stereotype : "") {
case Stereotype.TRIGGERS:
@@ -603,43 +594,33 @@ public static String getDefaultTargetMultiplicity(IAssociation association) {
}
public static boolean isOntoumlAssociation(IAssociation association) {
- boolean hasSource = getSource(association) != null;
- boolean hasTarget = getTarget(association) != null;
+ boolean hasSource = getFrom(association) != null;
+ boolean hasTarget = getTo(association) != null;
boolean hasOntoumlStereotype = hasOntoumlStereotype(association);
- boolean hasOntoumlSource = hasSource && Class.isOntoumlClass(getSource(association));
- boolean hasOntoumlTarget = hasTarget && Class.isOntoumlClass(getTarget(association));
+ boolean hasOntoumlSource = hasSource && Class.isOntoumlClass(getFrom(association));
+ boolean hasOntoumlTarget = hasTarget && Class.isOntoumlClass(getTo(association));
return hasSource && hasTarget && (hasOntoumlStereotype || hasOntoumlSource || hasOntoumlTarget);
}
public static boolean hasOntoumlStereotype(IAssociation association) {
final String stereotype = ModelElement.getUniqueStereotypeName(association);
- return Stereotype.getOntoUMLAssociationStereotypeNames().contains(stereotype);
+ return stereotype != null
+ && Stereotype.getOntoumlAssociationStereotypeNames().contains(stereotype);
}
public static boolean hasMereologyStereotype(IAssociation association) {
final String stereotype = ModelElement.getUniqueStereotypeName(association);
- return Stereotype.getOntoUMLMereologyStereotypeNames().contains(stereotype);
+ return stereotype != null
+ && Stereotype.getOntoUMLMereologyStereotypeNames().contains(stereotype);
}
- public static boolean hasAggregationSetOnSource(IAssociation association) {
- var aggregationKind = getSourceEnd(association).getAggregationKind();
-
- // TODO: remove direct comparison to "Shared" once IAssociationEnd.AGGREGATION_KIND_shared is
- // fixed by VP
- return IAssociationEnd.AGGREGATION_KIND_shared.equals(aggregationKind)
- || IAssociationEnd.AGGREGATION_KIND_composite.equals(aggregationKind)
- || "Shared".equals(aggregationKind);
+ public static boolean hasAggregationOnFromEnd(IAssociation association) {
+ return Property.isWholeEnd(getFromEnd(association));
}
- public static boolean hasAggregationSetOnTarget(IAssociation association) {
- var aggregationKind = getTargetEnd(association).getAggregationKind();
-
- // TODO: remove direct comparison to "Shared" once IAssociationEnd.AGGREGATION_KIND_shared is
- // fixed by VP
- return IAssociationEnd.AGGREGATION_KIND_shared.equals(aggregationKind)
- || IAssociationEnd.AGGREGATION_KIND_composite.equals(aggregationKind)
- || "Shared".equals(aggregationKind);
+ public static boolean hasAggregationOnToEnd(IAssociation association) {
+ return Property.isWholeEnd(getToEnd(association));
}
public static boolean isSourceAlwaysReadOnly(IAssociation association) {
@@ -686,4 +667,91 @@ public static String getDefaultAggregationKind(IAssociation association) {
if (compositeDefault.contains(stereotype)) return IAssociationEnd.AGGREGATION_KIND_composite;
return IAssociationEnd.AGGREGATION_KIND_none;
}
+
+ public static boolean hasNavigableFromEnd(IAssociation association) {
+ return Property.isNavigableEnd(getFromEnd(association));
+ }
+
+ public static boolean hasNavigableToEnd(IAssociation association) {
+ return Property.isNavigableEnd(getToEnd(association));
+ }
+
+ public static IAssociationEnd getTargetEnd(IAssociation association) {
+ IAssociationEnd fromEnd = (IAssociationEnd) association.getFromEnd();
+ IAssociationEnd toEnd = (IAssociationEnd) association.getToEnd();
+
+ if (hasAggregationOnToEnd(association)) {
+ return toEnd;
+ } else if (hasAggregationOnFromEnd(association)) {
+ return fromEnd;
+ } else if (hasNavigableToEnd(association)) {
+ return toEnd;
+ } else if (hasNavigableFromEnd(association)) {
+ return fromEnd;
+ } else {
+ return toEnd;
+ }
+ }
+
+ public static IAssociationEnd getSourceEnd(IAssociation association) {
+ IAssociationEnd fromEnd = (IAssociationEnd) association.getFromEnd();
+ IAssociationEnd toEnd = (IAssociationEnd) association.getToEnd();
+
+ return !fromEnd.equals(getTargetEnd(association)) ? fromEnd : toEnd;
+ }
+
+ public static IClass getSource(IAssociation association) {
+ return (IClass) getSourceEnd(association).getTypeAsElement();
+ }
+
+ public static IClass getTarget(IAssociation association) {
+ return (IClass) getTargetEnd(association).getTypeAsElement();
+ }
+
+ public static boolean doesFromAndSourceMatch(IAssociation association) {
+ return association.getFromEnd() != null
+ && association.getFromEnd().equals(getSourceEnd(association));
+ }
+
+ public static void setSourceEndProperties(IAssociation association, IAssociationEnd sourceEnd) {
+ String sourceMultiplicity = sourceEnd.getMultiplicity();
+
+ sourceEnd.setNavigable(IAssociationEnd.NAVIGABLE_UNSPECIFIED);
+ sourceEnd.setAggregationKind(IAssociationEnd.AGGREGATION_KIND_none);
+
+ if (sourceMultiplicity == null
+ || IAssociationEnd.MULTIPLICITY_UNSPECIFIED.equals(sourceMultiplicity)) {
+ String defaultSourceMultiplicity = Association.getDefaultSourceMultiplicity(association);
+ sourceEnd.setMultiplicity(defaultSourceMultiplicity);
+ }
+
+ if (Association.isSourceAlwaysReadOnly(association)) {
+ sourceEnd.setReadOnly(true);
+ }
+ }
+
+ public static void setTargetEndProperties(IAssociation association, IAssociationEnd targetEnd) {
+ if (Association.hasMereologyStereotype(association)) {
+ if (!Property.isWholeEnd(targetEnd)) {
+ String defaultAggKind = Association.getDefaultAggregationKind(association);
+ targetEnd.setAggregationKind(defaultAggKind);
+ }
+ targetEnd.setNavigable(IAssociationEnd.NAVIGABLE_UNSPECIFIED);
+ } else {
+ targetEnd.setAggregationKind(IAssociationEnd.AGGREGATION_KIND_none);
+ targetEnd.setNavigable(IAssociationEnd.NAVIGABLE_NAVIGABLE);
+ }
+
+ String targetMultiplicity = targetEnd.getMultiplicity();
+
+ if (targetMultiplicity == null
+ || IAssociationEnd.MULTIPLICITY_UNSPECIFIED.equals(targetMultiplicity)) {
+ String defaultTargetMultiplicity = Association.getDefaultTargetMultiplicity(association);
+ targetEnd.setMultiplicity(defaultTargetMultiplicity);
+ }
+
+ if (Association.isTargetAlwaysReadOnly(association)) {
+ targetEnd.setReadOnly(true);
+ }
+ }
}
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/model/uml/AssociationModelDescription.java b/src/main/java/it/unibz/inf/ontouml/vp/model/uml/AssociationModelDescription.java
index 245870f9..19961377 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/model/uml/AssociationModelDescription.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/model/uml/AssociationModelDescription.java
@@ -71,8 +71,8 @@ public void deleteAssociationModel() {
}
public IAssociationUIModel recreateInvertedAssociationModel() {
- final IModelElement currentSource = Association.getSource(association);
- final IModelElement currentTarget = Association.getTarget(association);
+ final IModelElement currentSource = Association.getFrom(association);
+ final IModelElement currentTarget = Association.getTo(association);
final IModelElement originalSource = sourceDiagramElement.getModelElement();
final IModelElement originalTarget = targetDiagramElement.getModelElement();
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/model/uml/Class.java b/src/main/java/it/unibz/inf/ontouml/vp/model/uml/Class.java
index 83182e0c..3dfaf2de 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/model/uml/Class.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/model/uml/Class.java
@@ -7,6 +7,7 @@
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import com.vp.plugin.model.*;
+import com.vp.plugin.model.factory.IModelElementFactory;
import it.unibz.inf.ontouml.vp.utils.RestrictedTo;
import it.unibz.inf.ontouml.vp.utils.Stereotype;
import it.unibz.inf.ontouml.vp.utils.StereotypesManager;
@@ -207,6 +208,16 @@ public Class(IClass source, HashSet modelElements) {
loadTags(source);
}
+ public static Set getAttributes(IClass _class) {
+ return _class.attributeCount() > 0
+ ? new HashSet<>(Arrays.asList(_class.toAttributeArray()))
+ : Collections.emptySet();
+ }
+
+ public static boolean isClass(IModelElement element) {
+ return element != null && IModelElementFactory.MODEL_TYPE_CLASS.equals(element.getModelType());
+ }
+
private void loadTags(IClass source) {
if (source.getTaggedValues() != null) {
final JsonParser parser = new JsonParser();
@@ -654,7 +665,7 @@ public static boolean isOntoumlClass(IClass _class) {
if (_class == null) return false;
final String stereotype = ModelElement.getUniqueStereotypeName(_class);
- return Stereotype.getOntoUMLClassStereotypeNames().contains(stereotype);
+ return Stereotype.getOntoumlClassStereotypeNames().contains(stereotype);
}
public static boolean isRestrictedToEditable(IClass _class) {
@@ -701,12 +712,12 @@ public static boolean isSortal(IClass _class) {
return Stereotype.isSortal(stereotype);
}
- public static void propagateRestrictionsToDescendants(IClass _class) {
- Class.applyOnDescendants(
+ public static void propagateRestrictionsToChildren(IClass _class) {
+ Class.applyOnChildren(
_class,
descendent -> {
if (!doesItInheritItsRestrictions(descendent)) {
- return false;
+ return;
}
final Set parents =
@@ -718,10 +729,7 @@ public static void propagateRestrictionsToDescendants(IClass _class) {
if (!parentsRestrictions.equals(descendentRestrictions)) {
Class.setRestrictedTo(descendent, parentsRestrictions);
- return true;
}
-
- return false;
});
}
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/model/uml/ModelElement.java b/src/main/java/it/unibz/inf/ontouml/vp/model/uml/ModelElement.java
index 9e6736d6..6348097e 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/model/uml/ModelElement.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/model/uml/ModelElement.java
@@ -64,13 +64,19 @@ static boolean isPresentInOntoumlDiagram(IModelElement element) {
return ModelElement.getDiagrams(element).stream().anyMatch(Diagram::isOntoUMLDiagram);
}
- /** @return IModelElement on which the object is based. */
+ /**
+ * @return IModelElement on which the object is based.
+ */
public IModelElement getSourceModelElement();
- /** @return object's type in OntoUML Schema. */
+ /**
+ * @return object's type in OntoUML Schema.
+ */
public String getOntoUMLType();
- /** @return object's ID (based on a IModelElement). */
+ /**
+ * @return object's ID (based on a IModelElement).
+ */
public String getId();
/**
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/model/uml/Property.java b/src/main/java/it/unibz/inf/ontouml/vp/model/uml/Property.java
index ebb5f770..e2e76af2 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/model/uml/Property.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/model/uml/Property.java
@@ -13,6 +13,7 @@
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import java.util.Optional;
import java.util.stream.Stream;
/**
@@ -468,4 +469,18 @@ public static void addSubsettedProperties(
.filter(prop -> prop instanceof IAssociationEnd || prop instanceof IAttribute)
.forEach(prop -> associationEnd.addSubsettedProperty((IAssociationEnd) prop));
}
+
+ public static boolean isWholeEnd(IAssociationEnd associationEnd) {
+ String aggregationKind =
+ Optional.ofNullable(associationEnd.getAggregationKind())
+ .map(String::toLowerCase)
+ .orElse("");
+
+ return IAssociationEnd.AGGREGATION_KIND_shared.equals(aggregationKind)
+ || IAssociationEnd.AGGREGATION_KIND_composite.equals(aggregationKind);
+ }
+
+ public static boolean isNavigableEnd(IAssociationEnd associationEnd) {
+ return IAssociationEnd.NAVIGABLE_NAVIGABLE == associationEnd.getNavigable();
+ }
}
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/model/vp2ontouml/IAssociationClassTransformer.java b/src/main/java/it/unibz/inf/ontouml/vp/model/vp2ontouml/IAssociationClassTransformer.java
index 413cb243..6abe8d6f 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/model/vp2ontouml/IAssociationClassTransformer.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/model/vp2ontouml/IAssociationClassTransformer.java
@@ -1,6 +1,8 @@
package it.unibz.inf.ontouml.vp.model.vp2ontouml;
+import com.vp.plugin.model.IAssociation;
import com.vp.plugin.model.IAssociationClass;
+import com.vp.plugin.model.IClass;
import com.vp.plugin.model.IModelElement;
import it.unibz.inf.ontouml.vp.model.ontouml.OntoumlElement;
import it.unibz.inf.ontouml.vp.model.ontouml.model.Classifier;
@@ -13,10 +15,15 @@ public static ModelElement transform(IModelElement sourceElement) {
IAssociationClass source = (IAssociationClass) sourceElement;
- Classifier, ?> fromClassifier = createClassifierStub(source.getFrom());
- Classifier, ?> toClassifier = createClassifierStub(source.getTo());
+ IModelElement from = source.getFrom();
+ IModelElement to = source.getTo();
+ IModelElement derivingAssociation = from instanceof IAssociation ? from : to;
+ IModelElement derivedClass = to instanceof IClass ? to : from;
+ Classifier, ?> derivingAssociationStub = createClassifierStub(derivingAssociation);
+ Classifier, ?> derivedClassStub = createClassifierStub(derivedClass);
- Relation target = Relation.createDerivation(null, null, fromClassifier, toClassifier);
+ Relation target =
+ Relation.createDerivation(null, null, derivingAssociationStub, derivedClassStub);
IModelElementTransformer.transform(source, target);
ITaggedValueTransformer.transform(source, target);
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/model/vp2ontouml/IAssociationTransformer.java b/src/main/java/it/unibz/inf/ontouml/vp/model/vp2ontouml/IAssociationTransformer.java
index b636be66..ccde584b 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/model/vp2ontouml/IAssociationTransformer.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/model/vp2ontouml/IAssociationTransformer.java
@@ -1,11 +1,11 @@
package it.unibz.inf.ontouml.vp.model.vp2ontouml;
import com.vp.plugin.model.IAssociation;
-import com.vp.plugin.model.IAssociationEnd;
import com.vp.plugin.model.IModelElement;
import it.unibz.inf.ontouml.vp.model.ontouml.model.ModelElement;
import it.unibz.inf.ontouml.vp.model.ontouml.model.Property;
import it.unibz.inf.ontouml.vp.model.ontouml.model.Relation;
+import it.unibz.inf.ontouml.vp.model.uml.Association;
import java.util.List;
public class IAssociationTransformer {
@@ -25,24 +25,16 @@ public static ModelElement transform(IModelElement sourceElement) {
boolean isAbstract = source.isAbstract();
target.setAbstract(isAbstract);
- Property sourceEnd = IPropertyTransformer.transform(getSourceEnd(source));
- Property targetEnd = IPropertyTransformer.transform(getTargetEnd(source));
+ Property sourceEnd = IPropertyTransformer.transform(Association.getSourceEnd(source));
+ Property targetEnd = IPropertyTransformer.transform(Association.getTargetEnd(source));
target.setProperties(List.of(sourceEnd, targetEnd));
return target;
}
- private static IAssociationEnd getSourceEnd(IAssociation association) {
- return (IAssociationEnd) association.getFromEnd();
- }
-
- private static IAssociationEnd getTargetEnd(IAssociation association) {
- return (IAssociationEnd) association.getToEnd();
- }
-
private static boolean isDerived(IAssociation association) {
return association.isDerived()
- || getSourceEnd(association).isDerived()
- || getTargetEnd(association).isDerived();
+ || Association.getSourceEnd(association).isDerived()
+ || Association.getTargetEnd(association).isDerived();
}
}
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/model/vp2ontouml/IClassDiagramTransformer.java b/src/main/java/it/unibz/inf/ontouml/vp/model/vp2ontouml/IClassDiagramTransformer.java
index b8b9cf3a..36ec3a69 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/model/vp2ontouml/IClassDiagramTransformer.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/model/vp2ontouml/IClassDiagramTransformer.java
@@ -39,6 +39,7 @@ public static Diagram transform(IDiagramUIModel sourceElement, Package root) {
target.setOwner(owner);
Arrays.stream(source.toDiagramElementArray())
+ .filter(e -> e.getModelElement() != null)
.map(e -> transfromIDiagramElement(e))
.forEach(e -> target.addElement(e));
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/model/vp2ontouml/IConnectorTransformer.java b/src/main/java/it/unibz/inf/ontouml/vp/model/vp2ontouml/IConnectorTransformer.java
index 33201f1d..ff742ebb 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/model/vp2ontouml/IConnectorTransformer.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/model/vp2ontouml/IConnectorTransformer.java
@@ -2,33 +2,192 @@
import com.vp.plugin.diagram.IConnectorUIModel;
import com.vp.plugin.diagram.IDiagramElement;
+import com.vp.plugin.diagram.connector.IAssociationClassUIModel;
+import com.vp.plugin.diagram.connector.IAssociationUIModel;
+import com.vp.plugin.model.IAssociation;
+import com.vp.plugin.model.IAssociationClass;
+import com.vp.plugin.model.IClass;
+import com.vp.plugin.model.IModelElement;
import it.unibz.inf.ontouml.vp.model.ontouml.view.ConnectorView;
import it.unibz.inf.ontouml.vp.model.ontouml.view.ElementView;
import it.unibz.inf.ontouml.vp.model.ontouml.view.Path;
+import it.unibz.inf.ontouml.vp.model.uml.Association;
+import java.awt.Point;
import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
public class IConnectorTransformer {
public static void transform(IConnectorUIModel source, ConnectorView> target) {
+ setPath(source, target);
+ setSourceShape(source, target);
+ setTargetShape(source, target);
+ }
+
+ public static void transform(IAssociationUIModel source, ConnectorView> target) {
+ setPath(source, target);
+ setSourceShape(source, target);
+ setTargetShape(source, target);
+ }
+
+ public static void transform(IAssociationClassUIModel source, ConnectorView> target) {
+ setDerivationPath(source, target);
+ setConnectorSource(source, target);
+ setClassShapeTarget(source, target);
+ }
+
+ private static void setPath(IConnectorUIModel source, ConnectorView> target) {
+ Path path = new Path();
+ path.setId(source.getId() + "_path");
+
+ List points = Arrays.asList(source.getPoints());
+ points.forEach(p -> path.moveTo((int) p.getX(), (int) p.getY()));
+
+ target.setPath(path);
+ }
+
+ private static void setPath(IAssociationUIModel source, ConnectorView> target) {
+ IAssociation association = (IAssociation) source.getModelElement();
+ List points = Arrays.asList(source.getPoints());
+
+ if (!Association.doesFromAndSourceMatch(association)) Collections.reverse(points);
+
+ Path path = new Path();
+ path.setId(source.getId() + "_path");
+ points.forEach(p -> path.moveTo((int) p.getX(), (int) p.getY()));
+
+ target.setPath(path);
+ }
+
+ private static void setDerivationPath(IAssociationClassUIModel source, ConnectorView> target) {
+ List points = Arrays.asList(source.getPoints());
+
+ if (isDerivationInverted(source)) Collections.reverse(points);
Path path = new Path();
path.setId(source.getId() + "_path");
- Arrays.stream(source.getPoints())
- .forEachOrdered(p -> path.moveTo((int) p.getX(), (int) p.getY()));
+ points.forEach(p -> path.moveTo((int) p.getX(), (int) p.getY()));
+
target.setPath(path);
+ }
- IDiagramElement connectorSource = null;
- if (source.getFromShape() != null) connectorSource = source.getFromShape();
- else if (source.getFromConnector() != null) connectorSource = source.getFromConnector();
+ private static boolean isDerivationInverted(IAssociationClassUIModel connector) {
+ IAssociationClass derivation = (IAssociationClass) connector.getModelElement();
+ IModelElement from = derivation.getFrom();
+ IModelElement to = derivation.getTo();
+
+ return from instanceof IClass && to instanceof IAssociation;
+ }
+
+ private static void setSourceShape(IConnectorUIModel source, ConnectorView> target) {
+ ElementView, ?> connectorSourceStub = null;
+ if (hasFromShape(source))
+ connectorSourceStub = ReferenceTransformer.transformStub(getFromShape(source));
+ else if (hasFromConnector(source))
+ connectorSourceStub = ReferenceTransformer.transformStub(getFromConnector(source));
- ElementView, ?> connectorSourceStub = ReferenceTransformer.transformStub(connectorSource);
target.setSource(connectorSourceStub);
+ }
- IDiagramElement connectorTarget = null;
- if (source.getToShape() != null) connectorTarget = source.getToShape();
- else if (source.getToConnector() != null) connectorTarget = source.getToConnector();
+ private static void setTargetShape(IConnectorUIModel source, ConnectorView> target) {
+ ElementView, ?> connectorTargetStub = null;
+ if (hasToShape(source))
+ connectorTargetStub = ReferenceTransformer.transformStub(getToShape(source));
+ else if (hasToConnector(source))
+ connectorTargetStub = ReferenceTransformer.transformStub(getToConnector(source));
- ElementView, ?> connectorTargetStub = ReferenceTransformer.transformStub(connectorTarget);
target.setTarget(connectorTargetStub);
}
+
+ private static void setSourceShape(IAssociationUIModel source, ConnectorView> target) {
+ IAssociation association = (IAssociation) source.getModelElement();
+ IDiagramElement shapeOrConnector = null;
+
+ if (Association.doesFromAndSourceMatch(association)) {
+ shapeOrConnector = hasFromShape(source) ? getFromShape(source) : getFromConnector(source);
+ } else {
+ shapeOrConnector = hasToShape(source) ? getToShape(source) : getToConnector(source);
+ }
+
+ ElementView, ?> connectorSourceStub =
+ shapeOrConnector != null ? ReferenceTransformer.transformStub(shapeOrConnector) : null;
+
+ target.setSource(connectorSourceStub);
+ }
+
+ private static void setTargetShape(IAssociationUIModel source, ConnectorView> target) {
+ IAssociation association = (IAssociation) source.getModelElement();
+ IDiagramElement shapeOrConnector = null;
+
+ if (Association.doesFromAndSourceMatch(association)) {
+ shapeOrConnector = hasToShape(source) ? getToShape(source) : getToConnector(source);
+ } else {
+ shapeOrConnector = hasFromShape(source) ? getFromShape(source) : getFromConnector(source);
+ }
+
+ ElementView, ?> connectorSourceStub =
+ shapeOrConnector != null ? ReferenceTransformer.transformStub(shapeOrConnector) : null;
+
+ target.setTarget(connectorSourceStub);
+ }
+
+ private static void setConnectorSource(IAssociationClassUIModel source, ConnectorView> target) {
+ IDiagramElement relationConnector = getRelationConnector(source);
+ ElementView, ?> connectorStub = ReferenceTransformer.transformStub(relationConnector);
+ target.setSource(connectorStub);
+ }
+
+ private static void setClassShapeTarget(
+ IAssociationClassUIModel source, ConnectorView> target) {
+ IDiagramElement classShape = getClassShape(source);
+ ElementView, ?> shapeStub = ReferenceTransformer.transformStub(classShape);
+ target.setTarget(shapeStub);
+ }
+
+ private static IDiagramElement getClassShape(IAssociationClassUIModel derivation) {
+ if (hasToShape(derivation) && !hasFromShape(derivation)) return getToShape(derivation);
+ if (hasFromShape(derivation) && !hasToShape(derivation)) return getFromShape(derivation);
+ return null;
+ }
+
+ private static IDiagramElement getRelationConnector(IAssociationClassUIModel derivation) {
+ if (hasFromConnector(derivation) && !hasToConnector(derivation))
+ return getFromConnector(derivation);
+ if (hasToConnector(derivation) && !hasFromConnector(derivation))
+ return getToConnector(derivation);
+ return null;
+ }
+
+ private static boolean hasFromShape(IConnectorUIModel connector) {
+ return connector.getFromShape() != null;
+ }
+
+ private static boolean hasFromConnector(IConnectorUIModel connector) {
+ return connector.getFromConnector() != null;
+ }
+
+ private static boolean hasToShape(IConnectorUIModel connector) {
+ return connector.getToShape() != null;
+ }
+
+ private static boolean hasToConnector(IConnectorUIModel connector) {
+ return connector.getToConnector() != null;
+ }
+
+ private static IDiagramElement getFromShape(IConnectorUIModel connector) {
+ return connector.getFromShape();
+ }
+
+ private static IDiagramElement getFromConnector(IConnectorUIModel connector) {
+ return connector.getFromConnector();
+ }
+
+ private static IDiagramElement getToShape(IConnectorUIModel connector) {
+ return connector.getToShape();
+ }
+
+ private static IDiagramElement getToConnector(IConnectorUIModel connector) {
+ return connector.getToConnector();
+ }
}
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/utils/ApplicationManagerUtils.java b/src/main/java/it/unibz/inf/ontouml/vp/utils/ApplicationManagerUtils.java
index 76ebff96..5fbe05fb 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/utils/ApplicationManagerUtils.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/utils/ApplicationManagerUtils.java
@@ -5,6 +5,7 @@
import com.vp.plugin.ProjectManager;
import com.vp.plugin.diagram.IDiagramUIModel;
import com.vp.plugin.model.IProject;
+import java.util.Iterator;
public class ApplicationManagerUtils {
@@ -27,4 +28,17 @@ public static IProject getCurrentProject() {
public static IDiagramUIModel getActiveDiagram() {
return getDiagramManager().getActiveDiagram();
}
+
+ public static Iterator> getAllLevelModelElements() {
+ return getCurrentProject().allLevelModelElementIterator();
+ }
+
+ public static Iterator> getAllLevelModelElements(String[] typesFilter) {
+ return getCurrentProject().allLevelModelElementIterator(typesFilter);
+ }
+
+ public static Iterator> getAllLevelModelElements(String typeFilter) {
+ final String[] filter = {typeFilter};
+ return getCurrentProject().allLevelModelElementIterator(filter);
+ }
}
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/utils/OntoUMLConstraintsManager.java b/src/main/java/it/unibz/inf/ontouml/vp/utils/OntoUMLConstraintsManager.java
index fda59326..690cfdef 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/utils/OntoUMLConstraintsManager.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/utils/OntoUMLConstraintsManager.java
@@ -83,8 +83,10 @@ public static boolean isStereotypeAllowed(IClass _class, String stereotype) {
}
public static boolean isStereotypeAllowed(IAssociation association, String stereotype) {
- final List sourceRestrictions = Association.getSourceRestrictions(association);
- final List targetRestrictions = Association.getTargetRestrictions(association);
+ IClass source = Association.getSource(association);
+ IClass target = Association.getTarget(association);
+ final List sourceRestrictions = Class.getRestrictedToList(source);
+ final List targetRestrictions = Class.getRestrictedToList(target);
boolean isAllowed = false;
for (var sourceRestriction : sourceRestrictions) {
@@ -104,8 +106,10 @@ public static boolean isStereotypeAllowed(IAssociation association, String stere
}
public static boolean isStereotypeAllowedIfInverted(IAssociation association, String stereotype) {
- final List sourceRestrictions = Association.getSourceRestrictions(association);
- final List targetRestrictions = Association.getTargetRestrictions(association);
+ IClass source = Association.getSource(association);
+ IClass target = Association.getTarget(association);
+ final List sourceRestrictions = Class.getRestrictedToList(source);
+ final List targetRestrictions = Class.getRestrictedToList(target);
boolean isAllowed = false;
for (var sourceRestriction : sourceRestrictions) {
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/utils/SmartColoringUtils.java b/src/main/java/it/unibz/inf/ontouml/vp/utils/SmartColoringUtils.java
index 94ad53a7..20fde0b8 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/utils/SmartColoringUtils.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/utils/SmartColoringUtils.java
@@ -92,7 +92,7 @@ public class SmartColoringUtils {
*/
private static Color getColor(IClass _class) {
final String stereotype = ModelElement.getUniqueStereotypeName(_class);
- final List allStereotypes = Stereotype.getOntoUMLClassStereotypeNames();
+ final List allStereotypes = Stereotype.getOntoumlClassStereotypeNames();
if (!allStereotypes.contains(stereotype)) {
return null;
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/utils/Stereotype.java b/src/main/java/it/unibz/inf/ontouml/vp/utils/Stereotype.java
index 4c2ebd20..9a862fbb 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/utils/Stereotype.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/utils/Stereotype.java
@@ -1,5 +1,7 @@
package it.unibz.inf.ontouml.vp.utils;
+import com.vp.plugin.model.IStereotype;
+import com.vp.plugin.model.factory.IModelElementFactory;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -55,7 +57,7 @@ public class Stereotype {
public static final String BEGIN = "begin";
public static final String END = "end";
- public static List getOntoUMLClassStereotypeNames() {
+ public static List getOntoumlClassStereotypeNames() {
return new ArrayList<>(
Arrays.asList(
TYPE,
@@ -81,7 +83,7 @@ public static List getOntoUMLClassStereotypeNames() {
PHASE));
}
- public static List getOntoUMLAssociationStereotypeNames() {
+ public static List getOntoumlAssociationStereotypeNames() {
return new ArrayList<>(
Arrays.asList(
INSTANTIATION,
@@ -104,16 +106,16 @@ public static List getOntoUMLAssociationStereotypeNames() {
SUB_QUANTITY_OF));
}
- public static List getOntoUMLAttributeStereotypeNames() {
+ public static List getOntoumlAttributeStereotypeNames() {
return new ArrayList<>(Arrays.asList(BEGIN, END));
}
public static List getOntoUMLStereotypeNames() {
final List str_names = new ArrayList<>();
- str_names.addAll(getOntoUMLAssociationStereotypeNames());
- str_names.addAll(getOntoUMLAttributeStereotypeNames());
- str_names.addAll(getOntoUMLClassStereotypeNames());
+ str_names.addAll(getOntoumlAssociationStereotypeNames());
+ str_names.addAll(getOntoumlAttributeStereotypeNames());
+ str_names.addAll(getOntoumlClassStereotypeNames());
return str_names;
}
@@ -149,4 +151,28 @@ public static boolean isUltimateSortal(String stereotype) {
public static boolean isSortal(String stereotype) {
return isUltimateSortal(stereotype) || isBaseSortal(stereotype);
}
+
+ public static boolean isOntoumlStereotype(IStereotype stereotype) {
+ return isOntoumlClassStereotype(stereotype)
+ || isOntoumlAssociationStereotype(stereotype)
+ || isOntoumlAttributeStereotype(stereotype);
+ }
+
+ private static boolean isOntoumlAttributeStereotype(IStereotype stereotype) {
+ return stereotype != null
+ && IModelElementFactory.MODEL_TYPE_ATTRIBUTE.equals(stereotype.getBaseType())
+ && getOntoumlAttributeStereotypeNames().contains(stereotype.getName());
+ }
+
+ private static boolean isOntoumlAssociationStereotype(IStereotype stereotype) {
+ return stereotype != null
+ && IModelElementFactory.MODEL_TYPE_ASSOCIATION.equals(stereotype.getBaseType())
+ && getOntoumlAssociationStereotypeNames().contains(stereotype.getName());
+ }
+
+ private static boolean isOntoumlClassStereotype(IStereotype stereotype) {
+ return stereotype != null
+ && IModelElementFactory.MODEL_TYPE_CLASS.equals(stereotype.getBaseType())
+ && getOntoumlClassStereotypeNames().contains(stereotype.getName());
+ }
}
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/utils/StereotypesManager.java b/src/main/java/it/unibz/inf/ontouml/vp/utils/StereotypesManager.java
index 46246d4c..010024c8 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/utils/StereotypesManager.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/utils/StereotypesManager.java
@@ -25,20 +25,16 @@ public static void generate() {
final IModelElement[] installedStereotypes =
project.toAllLevelModelElementArray(IModelElementFactory.MODEL_TYPE_STEREOTYPE);
final Map stereotypesMap = new HashMap<>();
- final List allStereotypeNames = Stereotype.getOntoUMLAssociationStereotypeNames();
-
- allStereotypeNames.addAll(Stereotype.getOntoUMLAttributeStereotypeNames());
- allStereotypeNames.addAll(Stereotype.getOntoUMLClassStereotypeNames());
// Retrieves IStereotype objects for OntoUML elements
for (IModelElement stereotype : installedStereotypes) {
- if (allStereotypeNames.contains(stereotype.getName())) {
+ if (Stereotype.isOntoumlStereotype((IStereotype) stereotype)) {
stereotypesMap.put(stereotype.getName(), (IStereotype) stereotype);
}
}
// Creates missing IStereotype objects for OntoUML classes
- for (String ontoUMLClassStereotype : Stereotype.getOntoUMLClassStereotypeNames()) {
+ for (String ontoUMLClassStereotype : Stereotype.getOntoumlClassStereotypeNames()) {
if (stereotypesMap.get(ontoUMLClassStereotype) == null) {
final IStereotype newStereotypeElement = IModelElementFactory.instance().createStereotype();
newStereotypeElement.setName(ontoUMLClassStereotype);
@@ -47,7 +43,7 @@ public static void generate() {
}
}
- for (String ontoUMLAssociationStereotype : Stereotype.getOntoUMLAssociationStereotypeNames()) {
+ for (String ontoUMLAssociationStereotype : Stereotype.getOntoumlAssociationStereotypeNames()) {
if (stereotypesMap.get(ontoUMLAssociationStereotype) == null) {
final IStereotype newStereotypeElement = IModelElementFactory.instance().createStereotype();
newStereotypeElement.setName(ontoUMLAssociationStereotype);
@@ -56,7 +52,7 @@ public static void generate() {
}
}
- for (String ontoUMLAttributeStereotype : Stereotype.getOntoUMLAttributeStereotypeNames()) {
+ for (String ontoUMLAttributeStereotype : Stereotype.getOntoumlAttributeStereotypeNames()) {
if (stereotypesMap.get(ontoUMLAttributeStereotype) == null) {
final IStereotype newStereotypeElement = IModelElementFactory.instance().createStereotype();
newStereotypeElement.setName(ontoUMLAttributeStereotype);
@@ -66,7 +62,7 @@ public static void generate() {
}
// Checks and adds missing tagged value definitions to IStereotype objects
- final List taggedStereotypeNames = Stereotype.getOntoUMLClassStereotypeNames();
+ final List taggedStereotypeNames = Stereotype.getOntoumlClassStereotypeNames();
for (String stereotypeName : taggedStereotypeNames) {
final IStereotype stereotype = stereotypesMap.get(stereotypeName);
@@ -254,7 +250,7 @@ private static boolean reapplyCurrentStereotype(IClass _class) {
: null;
// Escape in case the stereotype is missing or incorrect
- if (stereotype == null || !Stereotype.getOntoUMLClassStereotypeNames().contains(stereotype))
+ if (stereotype == null || !Stereotype.getOntoumlClassStereotypeNames().contains(stereotype))
return false;
System.out.println("Reapplying " + stereotype + " to " + _class.getName());
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/utils/VPContextUtils.java b/src/main/java/it/unibz/inf/ontouml/vp/utils/VPContextUtils.java
index 533c7c17..8aaacbc3 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/utils/VPContextUtils.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/utils/VPContextUtils.java
@@ -7,7 +7,9 @@
public class VPContextUtils {
- /** @return a set including selected model elements of the same type */
+ /**
+ * @return a set including selected model elements of the same type
+ */
public static Set getModelElements(VPContext context) {
if (isDiagramContext(context)) {
return Diagram.getSelectedModelElements(context.getDiagram(), getModelType(context));
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/utils/ViewManagerUtils.java b/src/main/java/it/unibz/inf/ontouml/vp/utils/ViewManagerUtils.java
index 4e752583..e2673217 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/utils/ViewManagerUtils.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/utils/ViewManagerUtils.java
@@ -44,27 +44,27 @@ public class ViewManagerUtils {
public static final String SCOPE_PLUGIN = "OntoUML";
public static final String SIMPLE_LOGO = "simple_logo";
- public static final String SIMPLE_LOGO_FILENAME = "ontouml-simple-logo.png";
+ public static final String SIMPLE_LOGO_FILENAME = "ontouml-icon-43x55.png";
public static final String NAVIGATION_LOGO = "navigation";
- public static final String NAVIGATION_LOGO_FILENAME = "navigation.png";
+ public static final String NAVIGATION_LOGO_FILENAME = "navigation-black-18x18.png";
public static final String MORE_HORIZ_LOGO = "more_horiz";
- public static final String MORE_HORIZ_LOGO_FILENAME = "more_horiz.png";
+ public static final String MORE_HORIZ_LOGO_FILENAME = "more_horiz-black-18x18.png";
public static final String PACKAGE_LOGO = "package";
- public static final String PACKAGE_LOGO_FILENAME = "package.png";
+ public static final String PACKAGE_LOGO_FILENAME = "package-black-18x18.png";
public static final String CLASS_LOGO = "class";
- public static final String CLASS_LOGO_FILENAME = "class.png";
+ public static final String CLASS_LOGO_FILENAME = "class-black-20x15.png";
public static final String ASSOCIATION_LOGO = "association";
- public static final String ASSOCIATION_LOGO_FILENAME = "association.png";
+ public static final String ASSOCIATION_LOGO_FILENAME = "association-black-20x15.png";
public static final String GENERALIZATION_LOGO = "generalization";
- public static final String GENERALIZATION_LOGO_FILENAME = "generalization.png";
+ public static final String GENERALIZATION_LOGO_FILENAME = "generalization-black-18x18.png";
public static final String GENERALIZATION_SET_LOGO = "generalizationSet";
- public static final String GENERALIZATION_SET_LOGO_FILENAME = "generalizationset.png";
+ public static final String GENERALIZATION_SET_LOGO_FILENAME = "generalizationset-black-18x18.png";
public static final String DIAGRAM_LOGO = "diagram";
- public static final String DIAGRAM_LOGO_FILENAME = "diagram.png";
+ public static final String DIAGRAM_LOGO_FILENAME = "diagram-black-18x18.png";
public static final String DATATYPE_LOGO = "datatype";
- public static final String DATATYPE_LOGO_FILENAME = "datatype.png";
+ public static final String DATATYPE_LOGO_FILENAME = "datatype-black-18x18.png";
public static final String ATTRIBUTE_LOGO = "attribute";
- public static final String ATTRIBUTE_LOGO_FILENAME = "attribute.png";
+ public static final String ATTRIBUTE_LOGO_FILENAME = "attribute-black-18x18.png";
public static void simpleDialog(String message) {
ApplicationManager.instance()
@@ -102,6 +102,12 @@ public static void cleanAndShowMessage(String message) {
log(list);
}
+ public static void clean() {
+ ApplicationManager.instance()
+ .getViewManager()
+ .removeMessagePaneComponent(OntoUMLPlugin.PLUGIN_ID);
+ }
+
private static String timestamp() {
return "[" + (new Timestamp(System.currentTimeMillis())) + "] ";
}
@@ -113,47 +119,48 @@ public static String getFilePath(String imageName) {
switch (imageName) {
case SIMPLE_LOGO:
- return Paths.get(pluginDir.getAbsolutePath(), "icons", "logo", SIMPLE_LOGO_FILENAME)
+ return Paths.get(pluginDir.getAbsolutePath(), "icons", "ontouml", SIMPLE_LOGO_FILENAME)
.toFile()
.getAbsolutePath();
case NAVIGATION_LOGO:
- return Paths.get(pluginDir.getAbsolutePath(), "icons", NAVIGATION_LOGO_FILENAME)
+ return Paths.get(pluginDir.getAbsolutePath(), "icons", "misc", NAVIGATION_LOGO_FILENAME)
.toFile()
.getAbsolutePath();
case MORE_HORIZ_LOGO:
- return Paths.get(pluginDir.getAbsolutePath(), "icons", MORE_HORIZ_LOGO_FILENAME)
+ return Paths.get(pluginDir.getAbsolutePath(), "icons", "misc", MORE_HORIZ_LOGO_FILENAME)
.toFile()
.getAbsolutePath();
case PACKAGE_LOGO:
- return Paths.get(pluginDir.getAbsolutePath(), "icons", PACKAGE_LOGO_FILENAME)
+ return Paths.get(pluginDir.getAbsolutePath(), "icons", "misc", PACKAGE_LOGO_FILENAME)
.toFile()
.getAbsolutePath();
case CLASS_LOGO:
- return Paths.get(pluginDir.getAbsolutePath(), "icons", CLASS_LOGO_FILENAME)
+ return Paths.get(pluginDir.getAbsolutePath(), "icons", "misc", CLASS_LOGO_FILENAME)
.toFile()
.getAbsolutePath();
case ASSOCIATION_LOGO:
- return Paths.get(pluginDir.getAbsolutePath(), "icons", ASSOCIATION_LOGO_FILENAME)
+ return Paths.get(pluginDir.getAbsolutePath(), "icons", "misc", ASSOCIATION_LOGO_FILENAME)
.toFile()
.getAbsolutePath();
case GENERALIZATION_LOGO:
- return Paths.get(pluginDir.getAbsolutePath(), "icons", GENERALIZATION_LOGO_FILENAME)
+ return Paths.get(pluginDir.getAbsolutePath(), "icons", "misc", GENERALIZATION_LOGO_FILENAME)
.toFile()
.getAbsolutePath();
case GENERALIZATION_SET_LOGO:
- return Paths.get(pluginDir.getAbsolutePath(), "icons", GENERALIZATION_SET_LOGO_FILENAME)
+ return Paths.get(
+ pluginDir.getAbsolutePath(), "icons", "misc", GENERALIZATION_SET_LOGO_FILENAME)
.toFile()
.getAbsolutePath();
case DIAGRAM_LOGO:
- return Paths.get(pluginDir.getAbsolutePath(), "icons", DIAGRAM_LOGO_FILENAME)
+ return Paths.get(pluginDir.getAbsolutePath(), "icons", "misc", DIAGRAM_LOGO_FILENAME)
.toFile()
.getAbsolutePath();
case DATATYPE_LOGO:
- return Paths.get(pluginDir.getAbsolutePath(), "icons", DATATYPE_LOGO_FILENAME)
+ return Paths.get(pluginDir.getAbsolutePath(), "icons", "misc", DATATYPE_LOGO_FILENAME)
.toFile()
.getAbsolutePath();
case ATTRIBUTE_LOGO:
- return Paths.get(pluginDir.getAbsolutePath(), "icons", ATTRIBUTE_LOGO_FILENAME)
+ return Paths.get(pluginDir.getAbsolutePath(), "icons", "misc", ATTRIBUTE_LOGO_FILENAME)
.toFile()
.getAbsolutePath();
default:
@@ -477,7 +484,7 @@ private static GitHubRelease selectReleaseToInstall() {
return map.get(selectedValue);
}
- public static boolean associationInvertionWarningDialog() {
+ public static boolean showInvertAssociationWarningDialog() {
final Configurations config = Configurations.getInstance();
final ProjectConfigurations projectConfig = config.getProjectConfigurations();
@@ -517,4 +524,27 @@ public static boolean associationInvertionWarningDialog() {
return JOptionPane.YES_OPTION == selectedOption;
}
+
+ public static boolean showFixStereotypesWarningDialog() {
+ final ViewManager vm = ApplicationManager.instance().getViewManager();
+ final JLabel message =
+ new JLabel(
+ "This action will affect all elements in your model
"
+ + "changing stereotypes and inverting associations
"
+ + "whenever inconsistencies are detected. Please
"
+ + "beware of these changes and save your project
"
+ + "before proceeding.
"
+ + "Do you wish to continue?");
+
+ int selectedOption =
+ vm.showConfirmDialog(
+ vm.getRootFrame(),
+ message,
+ "Fix OntoUML Stereotypes Warning",
+ JOptionPane.YES_NO_OPTION,
+ JOptionPane.INFORMATION_MESSAGE,
+ new ImageIcon(getFilePath(SIMPLE_LOGO)));
+
+ return JOptionPane.YES_OPTION == selectedOption;
+ }
}
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/views/GufoExportView.java b/src/main/java/it/unibz/inf/ontouml/vp/views/GufoExportView.java
index b2acb0a8..0615bd36 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/views/GufoExportView.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/views/GufoExportView.java
@@ -199,7 +199,7 @@ public GufoExportView(ProjectConfigurations configurations) {
optionsPanelLeft.add(uriFormatBox, gbc_insidePanelLeft);
JLabel inverseLabel = new JLabel("Create inverse properties:");
- JLabel objectLabel = new JLabel("Minimize property creation:");
+ JLabel objectLabel = new JLabel("Create sub-properties:");
JLabel analysisLabel = new JLabel("Run pre analysis:");
JLabel prefixPackageLabel = new JLabel("Add prefix per package:");
diff --git a/src/main/java/it/unibz/inf/ontouml/vp/views/SetOrderView.java b/src/main/java/it/unibz/inf/ontouml/vp/views/SetOrderView.java
index 64eed9a4..298d9458 100644
--- a/src/main/java/it/unibz/inf/ontouml/vp/views/SetOrderView.java
+++ b/src/main/java/it/unibz/inf/ontouml/vp/views/SetOrderView.java
@@ -17,9 +17,9 @@ public class SetOrderView implements IDialogHandler {
private static final String ADD_LOGO = "add";
private static final String ASTERISK_LOGO = "asterisk";
private static final String SUBTRACT_LOGO = "subtract";
- private static final String ADD_LOGO_FILENAME = "add.png";
- private static final String ASTERISK_LOGO_FILENAME = "asterisk.png";
- private static final String SUBTRACT_LOGO_FILENAME = "subtract.png";
+ private static final String ADD_LOGO_FILENAME = "add-black-36x36.png";
+ private static final String ASTERISK_LOGO_FILENAME = "asterisk-black-24x24.png";
+ private static final String SUBTRACT_LOGO_FILENAME = "subtract-black-36x36.png";
private IDialog _dialog;
private boolean cancelledExit = true;
@@ -157,15 +157,15 @@ private static String getFilePath(String imageName) {
switch (imageName) {
case ADD_LOGO:
- return Paths.get(pluginDir.getAbsolutePath(), "icons", ADD_LOGO_FILENAME)
+ return Paths.get(pluginDir.getAbsolutePath(), "icons", "misc", ADD_LOGO_FILENAME)
.toFile()
.getAbsolutePath();
case ASTERISK_LOGO:
- return Paths.get(pluginDir.getAbsolutePath(), "icons", ASTERISK_LOGO_FILENAME)
+ return Paths.get(pluginDir.getAbsolutePath(), "icons", "misc", ASTERISK_LOGO_FILENAME)
.toFile()
.getAbsolutePath();
case SUBTRACT_LOGO:
- return Paths.get(pluginDir.getAbsolutePath(), "icons", SUBTRACT_LOGO_FILENAME)
+ return Paths.get(pluginDir.getAbsolutePath(), "icons", "misc", SUBTRACT_LOGO_FILENAME)
.toFile()
.getAbsolutePath();
default:
diff --git a/src/main/resources/icons/cropped-ontuml.png b/src/main/resources/icons/cropped-ontuml.png
deleted file mode 100644
index d6a0c759..00000000
Binary files a/src/main/resources/icons/cropped-ontuml.png and /dev/null differ
diff --git a/src/main/resources/icons/experiment.png b/src/main/resources/icons/experiment.png
deleted file mode 100644
index 1f5337bf..00000000
Binary files a/src/main/resources/icons/experiment.png and /dev/null differ
diff --git a/src/main/resources/icons/menu.png b/src/main/resources/icons/menu.png
deleted file mode 100644
index 51c68294..00000000
Binary files a/src/main/resources/icons/menu.png and /dev/null differ
diff --git a/src/main/resources/icons/add.png b/src/main/resources/icons/misc/add-black-36x36.png
similarity index 100%
rename from src/main/resources/icons/add.png
rename to src/main/resources/icons/misc/add-black-36x36.png
diff --git a/src/main/resources/icons/association.png b/src/main/resources/icons/misc/association-black-20x15.png
similarity index 100%
rename from src/main/resources/icons/association.png
rename to src/main/resources/icons/misc/association-black-20x15.png
diff --git a/src/main/resources/icons/asterisk.png b/src/main/resources/icons/misc/asterisk-black-24x24.png
similarity index 100%
rename from src/main/resources/icons/asterisk.png
rename to src/main/resources/icons/misc/asterisk-black-24x24.png
diff --git a/src/main/resources/icons/attribute.png b/src/main/resources/icons/misc/attribute-black-18x18.png
similarity index 100%
rename from src/main/resources/icons/attribute.png
rename to src/main/resources/icons/misc/attribute-black-18x18.png
diff --git a/src/main/resources/icons/class.png b/src/main/resources/icons/misc/class-black-20x15.png
similarity index 100%
rename from src/main/resources/icons/class.png
rename to src/main/resources/icons/misc/class-black-20x15.png
diff --git a/src/main/resources/icons/datatype.png b/src/main/resources/icons/misc/datatype-black-18x18.png
similarity index 100%
rename from src/main/resources/icons/datatype.png
rename to src/main/resources/icons/misc/datatype-black-18x18.png
diff --git a/src/main/resources/icons/diagram.png b/src/main/resources/icons/misc/diagram-black-18x18.png
similarity index 100%
rename from src/main/resources/icons/diagram.png
rename to src/main/resources/icons/misc/diagram-black-18x18.png
diff --git a/src/main/resources/icons/generalization.png b/src/main/resources/icons/misc/generalization-black-18x18.png
similarity index 100%
rename from src/main/resources/icons/generalization.png
rename to src/main/resources/icons/misc/generalization-black-18x18.png
diff --git a/src/main/resources/icons/generalizationset.png b/src/main/resources/icons/misc/generalizationset-black-18x18.png
similarity index 100%
rename from src/main/resources/icons/generalizationset.png
rename to src/main/resources/icons/misc/generalizationset-black-18x18.png
diff --git a/src/main/resources/icons/more_horiz.png b/src/main/resources/icons/misc/more_horiz-black-18x18.png
similarity index 100%
rename from src/main/resources/icons/more_horiz.png
rename to src/main/resources/icons/misc/more_horiz-black-18x18.png
diff --git a/src/main/resources/icons/navigation.png b/src/main/resources/icons/misc/navigation-black-18x18.png
similarity index 100%
rename from src/main/resources/icons/navigation.png
rename to src/main/resources/icons/misc/navigation-black-18x18.png
diff --git a/src/main/resources/icons/package.png b/src/main/resources/icons/misc/package-black-18x18.png
similarity index 100%
rename from src/main/resources/icons/package.png
rename to src/main/resources/icons/misc/package-black-18x18.png
diff --git a/src/main/resources/icons/subtract.png b/src/main/resources/icons/misc/subtract-black-36x36.png
similarity index 100%
rename from src/main/resources/icons/subtract.png
rename to src/main/resources/icons/misc/subtract-black-36x36.png
diff --git a/src/main/resources/icons/logo/ontouml-simple-logo-small.png b/src/main/resources/icons/ontouml/ontouml-icon-17x22.png
similarity index 100%
rename from src/main/resources/icons/logo/ontouml-simple-logo-small.png
rename to src/main/resources/icons/ontouml/ontouml-icon-17x22.png
diff --git a/src/main/resources/icons/logo/ontouml-simple-logo.png b/src/main/resources/icons/ontouml/ontouml-icon-43x55.png
similarity index 100%
rename from src/main/resources/icons/logo/ontouml-simple-logo.png
rename to src/main/resources/icons/ontouml/ontouml-icon-43x55.png
diff --git a/src/main/resources/icons/logo/ontouml-logo.png b/src/main/resources/icons/ontouml/ontouml-logo-143x55.png
similarity index 100%
rename from src/main/resources/icons/logo/ontouml-logo.png
rename to src/main/resources/icons/ontouml/ontouml-logo-143x55.png
diff --git a/src/main/resources/icons/logo/ontouml-logo-small.png b/src/main/resources/icons/ontouml/ontouml-logo-57x22.png
similarity index 100%
rename from src/main/resources/icons/logo/ontouml-logo-small.png
rename to src/main/resources/icons/ontouml/ontouml-logo-57x22.png
diff --git a/src/main/resources/icons/ufo-logo.png b/src/main/resources/icons/ontouml/ufo-logo-785x277.png
similarity index 100%
rename from src/main/resources/icons/ufo-logo.png
rename to src/main/resources/icons/ontouml/ufo-logo-785x277.png
diff --git a/src/main/resources/icons/ontuml-logo-horizontal.png b/src/main/resources/icons/ontuml-logo-horizontal.png
deleted file mode 100644
index 60b665c0..00000000
Binary files a/src/main/resources/icons/ontuml-logo-horizontal.png and /dev/null differ
diff --git a/src/main/resources/icons/play-triangle.png b/src/main/resources/icons/play-triangle.png
deleted file mode 100644
index 324acb05..00000000
Binary files a/src/main/resources/icons/play-triangle.png and /dev/null differ
diff --git a/src/main/resources/icons/refresh4.png b/src/main/resources/icons/refresh4.png
deleted file mode 100644
index 8a844db4..00000000
Binary files a/src/main/resources/icons/refresh4.png and /dev/null differ
diff --git a/src/main/resources/icons/stereotypes/DataPipeline.png b/src/main/resources/icons/stereotypes/DataPipeline.png
deleted file mode 100644
index 7e8025a2..00000000
Binary files a/src/main/resources/icons/stereotypes/DataPipeline.png and /dev/null differ
diff --git a/src/main/resources/icons/stereotypes/kind1.png b/src/main/resources/icons/stereotypes/kind1.png
deleted file mode 100644
index e11d735b..00000000
Binary files a/src/main/resources/icons/stereotypes/kind1.png and /dev/null differ
diff --git a/src/main/resources/icons/stereotypes/kind1_18x18.png b/src/main/resources/icons/stereotypes/kind1_18x18.png
deleted file mode 100644
index 461bfe96..00000000
Binary files a/src/main/resources/icons/stereotypes/kind1_18x18.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/add-views-18dp.png b/src/main/resources/icons/toolbar/add-views-18dp.png
deleted file mode 100644
index 60cdb2a1..00000000
Binary files a/src/main/resources/icons/toolbar/add-views-18dp.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/check-circle-orange.png b/src/main/resources/icons/toolbar/check-circle-orange.png
deleted file mode 100644
index ac1726f3..00000000
Binary files a/src/main/resources/icons/toolbar/check-circle-orange.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/check-mark-blue.png b/src/main/resources/icons/toolbar/check-mark-blue.png
deleted file mode 100644
index f1b830d0..00000000
Binary files a/src/main/resources/icons/toolbar/check-mark-blue.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/check-mark-orange.png b/src/main/resources/icons/toolbar/check-mark-orange.png
deleted file mode 100644
index 04414aa5..00000000
Binary files a/src/main/resources/icons/toolbar/check-mark-orange.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/check-mark-small-blue.png b/src/main/resources/icons/toolbar/check-mark-small-blue.png
deleted file mode 100644
index a09ecda4..00000000
Binary files a/src/main/resources/icons/toolbar/check-mark-small-blue.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/check-mark-small-orange.png b/src/main/resources/icons/toolbar/check-mark-small-orange.png
deleted file mode 100644
index c4672643..00000000
Binary files a/src/main/resources/icons/toolbar/check-mark-small-orange.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/check-mark-small.png b/src/main/resources/icons/toolbar/check-mark-small.png
deleted file mode 100644
index b34c99b4..00000000
Binary files a/src/main/resources/icons/toolbar/check-mark-small.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/check-mark.png b/src/main/resources/icons/toolbar/check-mark.png
deleted file mode 100644
index ddc6fe3e..00000000
Binary files a/src/main/resources/icons/toolbar/check-mark.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/check-v1-orange-51x51.png b/src/main/resources/icons/toolbar/check-v1-orange-51x51.png
new file mode 100644
index 00000000..fe6a7748
Binary files /dev/null and b/src/main/resources/icons/toolbar/check-v1-orange-51x51.png differ
diff --git a/src/main/resources/icons/toolbar/check-v2-orange-51x51.png b/src/main/resources/icons/toolbar/check-v2-orange-51x51.png
new file mode 100644
index 00000000..d6fbc993
Binary files /dev/null and b/src/main/resources/icons/toolbar/check-v2-orange-51x51.png differ
diff --git a/src/main/resources/icons/toolbar/format-paint-orange.png b/src/main/resources/icons/toolbar/format-paint-orange.png
deleted file mode 100644
index e62aacc8..00000000
Binary files a/src/main/resources/icons/toolbar/format-paint-orange.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/gear-orange-51x51.png b/src/main/resources/icons/toolbar/gear-orange-51x51.png
new file mode 100644
index 00000000..ed175634
Binary files /dev/null and b/src/main/resources/icons/toolbar/gear-orange-51x51.png differ
diff --git a/src/main/resources/icons/toolbar/gear-orange.png b/src/main/resources/icons/toolbar/gear-orange.png
deleted file mode 100644
index 8ac2548e..00000000
Binary files a/src/main/resources/icons/toolbar/gear-orange.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/import-export-orange.png b/src/main/resources/icons/toolbar/import-export-orange.png
deleted file mode 100644
index 4017bf98..00000000
Binary files a/src/main/resources/icons/toolbar/import-export-orange.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/list-blue.png b/src/main/resources/icons/toolbar/list-blue.png
deleted file mode 100644
index cccd3d08..00000000
Binary files a/src/main/resources/icons/toolbar/list-blue.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/list-orange.png b/src/main/resources/icons/toolbar/list-orange.png
deleted file mode 100644
index 96cbaf6a..00000000
Binary files a/src/main/resources/icons/toolbar/list-orange.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/list-small-blue.png b/src/main/resources/icons/toolbar/list-small-blue.png
deleted file mode 100644
index c4c8f7da..00000000
Binary files a/src/main/resources/icons/toolbar/list-small-blue.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/list-small-orange.png b/src/main/resources/icons/toolbar/list-small-orange.png
deleted file mode 100644
index 7ade922d..00000000
Binary files a/src/main/resources/icons/toolbar/list-small-orange.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/list-small.png b/src/main/resources/icons/toolbar/list-small.png
deleted file mode 100644
index 07f756b3..00000000
Binary files a/src/main/resources/icons/toolbar/list-small.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/list.png b/src/main/resources/icons/toolbar/list.png
deleted file mode 100644
index 7ab1bd64..00000000
Binary files a/src/main/resources/icons/toolbar/list.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/magnifying-glass-with-check-mark-blue.png b/src/main/resources/icons/toolbar/magnifying-glass-with-check-mark-blue.png
deleted file mode 100644
index c96dc52c..00000000
Binary files a/src/main/resources/icons/toolbar/magnifying-glass-with-check-mark-blue.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/magnifying-glass-with-check-mark-orange.png b/src/main/resources/icons/toolbar/magnifying-glass-with-check-mark-orange.png
deleted file mode 100644
index 7c96fefb..00000000
Binary files a/src/main/resources/icons/toolbar/magnifying-glass-with-check-mark-orange.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/magnifying-glass-with-check-mark-small-blue.png b/src/main/resources/icons/toolbar/magnifying-glass-with-check-mark-small-blue.png
deleted file mode 100644
index 5bbe12c7..00000000
Binary files a/src/main/resources/icons/toolbar/magnifying-glass-with-check-mark-small-blue.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/magnifying-glass-with-check-mark-small-orange.png b/src/main/resources/icons/toolbar/magnifying-glass-with-check-mark-small-orange.png
deleted file mode 100644
index 44742b42..00000000
Binary files a/src/main/resources/icons/toolbar/magnifying-glass-with-check-mark-small-orange.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/magnifying-glass-with-check-mark-small.png b/src/main/resources/icons/toolbar/magnifying-glass-with-check-mark-small.png
deleted file mode 100644
index a7ddbfe9..00000000
Binary files a/src/main/resources/icons/toolbar/magnifying-glass-with-check-mark-small.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/magnifying-glass-with-check-mark.png b/src/main/resources/icons/toolbar/magnifying-glass-with-check-mark.png
deleted file mode 100644
index 32126c0d..00000000
Binary files a/src/main/resources/icons/toolbar/magnifying-glass-with-check-mark.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/plus-orange-51x51.png b/src/main/resources/icons/toolbar/plus-orange-51x51.png
new file mode 100644
index 00000000..fe0f6f2f
Binary files /dev/null and b/src/main/resources/icons/toolbar/plus-orange-51x51.png differ
diff --git a/src/main/resources/icons/toolbar/plus-sign-in-circle-blue.png b/src/main/resources/icons/toolbar/plus-sign-in-circle-blue.png
deleted file mode 100644
index eeb922a8..00000000
Binary files a/src/main/resources/icons/toolbar/plus-sign-in-circle-blue.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/plus-sign-in-circle-orange.png b/src/main/resources/icons/toolbar/plus-sign-in-circle-orange.png
deleted file mode 100644
index ac4cc84b..00000000
Binary files a/src/main/resources/icons/toolbar/plus-sign-in-circle-orange.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/plus-sign-in-circle-small-blue.png b/src/main/resources/icons/toolbar/plus-sign-in-circle-small-blue.png
deleted file mode 100644
index 4b6d8097..00000000
Binary files a/src/main/resources/icons/toolbar/plus-sign-in-circle-small-blue.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/plus-sign-in-circle-small-orange.png b/src/main/resources/icons/toolbar/plus-sign-in-circle-small-orange.png
deleted file mode 100644
index 3cee89d2..00000000
Binary files a/src/main/resources/icons/toolbar/plus-sign-in-circle-small-orange.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/plus-sign-in-circle-small.png b/src/main/resources/icons/toolbar/plus-sign-in-circle-small.png
deleted file mode 100644
index ba1faa7f..00000000
Binary files a/src/main/resources/icons/toolbar/plus-sign-in-circle-small.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/plus-sign-in-circle.png b/src/main/resources/icons/toolbar/plus-sign-in-circle.png
deleted file mode 100644
index 2c7a9c4d..00000000
Binary files a/src/main/resources/icons/toolbar/plus-sign-in-circle.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/share-blue.png b/src/main/resources/icons/toolbar/share-blue.png
deleted file mode 100644
index 202aac7a..00000000
Binary files a/src/main/resources/icons/toolbar/share-blue.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/share-orange.png b/src/main/resources/icons/toolbar/share-orange.png
deleted file mode 100644
index 3e66e87c..00000000
Binary files a/src/main/resources/icons/toolbar/share-orange.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/share-small-blue.png b/src/main/resources/icons/toolbar/share-small-blue.png
deleted file mode 100644
index c69babe5..00000000
Binary files a/src/main/resources/icons/toolbar/share-small-blue.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/share-small-orange.png b/src/main/resources/icons/toolbar/share-small-orange.png
deleted file mode 100644
index cff1aecf..00000000
Binary files a/src/main/resources/icons/toolbar/share-small-orange.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/share-small.png b/src/main/resources/icons/toolbar/share-small.png
deleted file mode 100644
index 8ca21ba3..00000000
Binary files a/src/main/resources/icons/toolbar/share-small.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/share.png b/src/main/resources/icons/toolbar/share.png
deleted file mode 100644
index 2ed0eb40..00000000
Binary files a/src/main/resources/icons/toolbar/share.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/sign-orange.png b/src/main/resources/icons/toolbar/sign-orange-30x30.png
similarity index 100%
rename from src/main/resources/icons/toolbar/sign-orange.png
rename to src/main/resources/icons/toolbar/sign-orange-30x30.png
diff --git a/src/main/resources/icons/toolbar/ufo-logo-cropped.png b/src/main/resources/icons/toolbar/ufo-logo-cropped.png
deleted file mode 100644
index 968baf28..00000000
Binary files a/src/main/resources/icons/toolbar/ufo-logo-cropped.png and /dev/null differ
diff --git a/src/main/resources/icons/toolbar/update-orange.png b/src/main/resources/icons/toolbar/update-orange-40x40.png
similarity index 100%
rename from src/main/resources/icons/toolbar/update-orange.png
rename to src/main/resources/icons/toolbar/update-orange-40x40.png
diff --git a/src/main/resources/icons/toolbar/wand-orange-48x48.png b/src/main/resources/icons/toolbar/wand-orange-48x48.png
new file mode 100644
index 00000000..d9e8d1ea
Binary files /dev/null and b/src/main/resources/icons/toolbar/wand-orange-48x48.png differ
diff --git a/src/main/resources/plugin.xml b/src/main/resources/plugin.xml
index db236a25..68bca7fb 100644
--- a/src/main/resources/plugin.xml
+++ b/src/main/resources/plugin.xml
@@ -1,6 +1,6 @@
@@ -20,7 +20,7 @@
description="Tests if the model complies to OntoUML's syntactical constraints."
style="normal"
tooltip="Tests if the model complies to OntoUML's syntactical constraints."
- icon="icons/toolbar/check-circle-orange.png"
+ icon="icons/toolbar/check-v2-orange-51x51.png"
label="Check Model"
menuPath="it.unibz.inf.ontouml.vp.actionset1.toolbar1/it.unibz.inf.ontouml.vp.actionset1.menu1/#">
@@ -32,7 +32,7 @@
description="Tests if the model complies to OntoUML's syntactical constraints and filters the issues related to the open diagram."
style="normal"
tooltip="Tests if the model complies to OntoUML's syntactical constraints and filters the issues related to the open diagram."
- icon="icons/toolbar/check-mark-orange.png"
+ icon="icons/toolbar/check-v1-orange-51x51.png"
label="Check Diagram"
menuPath="it.unibz.inf.ontouml.vp.actionset1.toolbar1/it.unibz.inf.ontouml.vp.actionset1.menu1/#">
@@ -44,7 +44,7 @@
description="Generates diagrams from identified OntoUML modules present in the project."
style="normal"
tooltip="Generates diagrams from identified OntoUML modules present in the project."
- icon="icons/toolbar/plus-sign-in-circle-orange.png"
+ icon="icons/toolbar/plus-orange-51x51.png"
label="Generate Diagrams"
menuPath="it.unibz.inf.ontouml.vp.actionset1.toolbar1/it.unibz.inf.ontouml.vp.actionset1.menu1/#">
@@ -69,7 +69,7 @@
description="Imports a project from a JSON file formatted according to the OntoUML JSON Schema."
style="normal"
tooltip="Imports a project from a JSON file formatted according to the OntoUML JSON Schema."
- icon="icons/logo/ontouml-simple-logo-small.png"
+ icon="icons/ontouml/ontouml-icon-43x55.png"
label="Import from JSON"
ribbonPath="Project/Import/#">
@@ -83,7 +83,7 @@
description="Exports the project as a JSON file formatted according to the OntoUML JSON Schema."
style="normal"
tooltip="Exports the project as a JSON file formatted according to the OntoUML JSON Schema."
- icon="icons/logo/ontouml-simple-logo-small.png"
+ icon="icons/ontouml/ontouml-icon-43x55.png"
label="Export to JSON"
menuPath="it.unibz.inf.ontouml.vp.actionset1.toolbar1/it.unibz.inf.ontouml.vp.actionset1.menu1/#">
@@ -95,7 +95,7 @@
description="Exports the project as a JSON file formatted according to the OntoUML JSON Schema."
style="normal"
tooltip="Exports the project as a JSON file formatted according to the OntoUML JSON Schema."
- icon="icons/logo/ontouml-simple-logo-small.png"
+ icon="icons/ontouml/ontouml-icon-43x55.png"
label="Export to JSON"
ribbonPath="Project/Export/#">
@@ -107,7 +107,7 @@
description="Exports the OntoUML ontology to OWL gUFO."
style="normal"
tooltip="Exports the OntoUML ontology to OWL gUFO."
- icon="icons/logo/ontouml-simple-logo-small.png"
+ icon="icons/ontouml/ontouml-icon-43x55.png"
label="Export to gUFO"
menuPath="it.unibz.inf.ontouml.vp.actionset1.toolbar1/it.unibz.inf.ontouml.vp.actionset1.menu1/#">
@@ -119,7 +119,7 @@
description="Exports the OntoUML ontology to OWL gUFO."
style="normal"
tooltip="Exports the OntoUML ontology to OWL gUFO."
- icon="icons/logo/ontouml-simple-logo-small.png"
+ icon="icons/ontouml/ontouml-icon-43x55.png"
label="Export to gUFO"
ribbonPath="Project/Export/#">
@@ -127,13 +127,25 @@
+
+
+
+
@@ -145,7 +157,7 @@
description="Opens the settings menu for the plugin."
style="normal"
tooltip="Opens the settings menu for the plugin."
- icon="icons/toolbar/gear-orange.png"
+ icon="icons/toolbar/gear-orange-51x51.png"
label="Settings"
menuPath="it.unibz.inf.ontouml.vp.actionset1.toolbar1/it.unibz.inf.ontouml.vp.actionset1.menu1/#">
@@ -157,13 +169,12 @@
description="Opens a bug report form on the browser."
style="normal"
tooltip="Opens a bug report form on the browser."
- icon="icons/toolbar/sign-orange.png"
+ icon="icons/toolbar/sign-orange-30x30.png"
label="Report Error"
menuPath="it.unibz.inf.ontouml.vp.actionset1.toolbar1/it.unibz.inf.ontouml.vp.actionset1.menu1/#">
-
@@ -185,8 +197,8 @@
-
+ icon="icons/ontouml/ontouml-icon-17x22.png">
+
@@ -198,7 +210,7 @@
+ icon="icons/ontouml/ontouml-icon-17x22.png"/>
@@ -237,7 +249,7 @@
+ icon="icons/ontouml/ontouml-icon-17x22.png"/>
@@ -299,7 +311,7 @@
+ icon="icons/ontouml/ontouml-icon-17x22.png"/>
@@ -322,7 +334,7 @@
+ icon="icons/ontouml/ontouml-icon-17x22.png"/>
@@ -446,7 +458,7 @@
+ icon="icons/ontouml/ontouml-icon-17x22.png"/>
@@ -551,7 +563,7 @@
+ icon="icons/ontouml/ontouml-icon-17x22.png"/>
+ icon="icons/ontouml/ontouml-icon-17x22.png"/>