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"/> @@ -789,7 +801,7 @@ + icon="icons/ontouml/ontouml-icon-17x22.png"/> diff --git a/src/test/java/it/unibz/inf/ontouml/vp/Misc.java b/src/test/java/it/unibz/inf/ontouml/vp/Misc.java new file mode 100644 index 00000000..de626dc8 --- /dev/null +++ b/src/test/java/it/unibz/inf/ontouml/vp/Misc.java @@ -0,0 +1,18 @@ +package it.unibz.inf.ontouml.vp; + +import static com.google.common.truth.Truth.assertThat; + +import java.util.Arrays; +import java.util.List; +import org.junit.Test; + +public class Misc { + + @Test + public void testNullable() { + String[] array = {}; + List list = Arrays.asList(array); + + assertThat(list.isEmpty()).isTrue(); + } +} diff --git a/src/test/java/it/unibz/inf/ontouml/vp/model/ontouml/ClassTest.java b/src/test/java/it/unibz/inf/ontouml/vp/model/ontouml/ClassTest.java index 481947a0..37e8aeb8 100644 --- a/src/test/java/it/unibz/inf/ontouml/vp/model/ontouml/ClassTest.java +++ b/src/test/java/it/unibz/inf/ontouml/vp/model/ontouml/ClassTest.java @@ -35,7 +35,7 @@ void shouldReturnLiteralsAsContent() { @Test void shouldBePrimitiveDatatype() { Class primitive = Class.createDatatype("1", "string"); - assertThat(primitive.isPrimitiveDatatype()).isTrue(); + assertThat(primitive.isInstalledDatatype()).isTrue(); } @Test @@ -46,6 +46,6 @@ void shouldNotBePrimitiveDatatype() { color.createAttribute("green", number); color.createAttribute("blue", number); - assertThat(color.isPrimitiveDatatype()).isFalse(); + assertThat(color.isInstalledDatatype()).isFalse(); } }