From 7f35214ca57e70b2ef03a0033d6339c06d22bd14 Mon Sep 17 00:00:00 2001 From: Claudenir Fonseca Date: Thu, 6 Jan 2022 16:20:20 +0100 Subject: [PATCH 01/25] Update version and organize used icons resources --- pom.xml | 2 +- .../unibz/inf/ontouml/vp/OntoUMLPlugin.java | 2 +- .../ontouml/vp/utils/ViewManagerUtils.java | 44 +++++++++--------- .../inf/ontouml/vp/views/SetOrderView.java | 12 ++--- src/main/resources/icons/cropped-ontuml.png | Bin 1349 -> 0 bytes src/main/resources/icons/experiment.png | Bin 6828 -> 0 bytes src/main/resources/icons/menu.png | Bin 510 -> 0 bytes .../{add.png => misc/add-black-36x36.png} | Bin .../association-black-20x15.png} | Bin .../asterisk-black-24x24.png} | Bin .../attribute-black-18x18.png} | Bin .../{class.png => misc/class-black-20x15.png} | Bin .../datatype-black-18x18.png} | Bin .../diagram-black-18x18.png} | Bin .../generalization-black-18x18.png} | Bin .../generalizationset-black-18x18.png} | Bin .../more_horiz-black-18x18.png} | Bin .../navigation-black-18x18.png} | Bin .../package-black-18x18.png} | Bin .../subtract-black-36x36.png} | Bin .../ontouml-icon-17x22.png} | Bin .../ontouml-icon-43x55.png} | Bin .../ontouml-logo-143x55.png} | Bin .../ontouml-logo-57x22.png} | Bin .../ufo-logo-785x277.png} | Bin .../icons/ontuml-logo-horizontal.png | Bin 833 -> 0 bytes src/main/resources/icons/play-triangle.png | Bin 3560 -> 0 bytes src/main/resources/icons/refresh4.png | Bin 1186 -> 0 bytes .../icons/stereotypes/DataPipeline.png | Bin 479 -> 0 bytes .../resources/icons/stereotypes/kind1.png | Bin 28909 -> 0 bytes .../icons/stereotypes/kind1_18x18.png | Bin 1202 -> 0 bytes .../icons/toolbar/add-views-18dp.png | Bin 337 -> 0 bytes .../icons/toolbar/check-circle-orange.png | Bin 8104 -> 0 bytes .../icons/toolbar/check-mark-blue.png | Bin 24469 -> 0 bytes .../icons/toolbar/check-mark-orange.png | Bin 24346 -> 0 bytes .../icons/toolbar/check-mark-small-blue.png | Bin 1430 -> 0 bytes .../icons/toolbar/check-mark-small-orange.png | Bin 1437 -> 0 bytes .../icons/toolbar/check-mark-small.png | Bin 1192 -> 0 bytes .../resources/icons/toolbar/check-mark.png | Bin 16033 -> 0 bytes .../icons/toolbar/check-v1-orange-51x51.png | Bin 0 -> 4207 bytes .../icons/toolbar/check-v2-orange-51x51.png | Bin 0 -> 3584 bytes .../icons/toolbar/format-paint-orange.png | Bin 3047 -> 0 bytes .../icons/toolbar/gear-orange-51x51.png | Bin 0 -> 3879 bytes .../resources/icons/toolbar/gear-orange.png | Bin 19290 -> 0 bytes .../icons/toolbar/import-export-orange.png | Bin 2390 -> 0 bytes .../resources/icons/toolbar/list-blue.png | Bin 4966 -> 0 bytes .../resources/icons/toolbar/list-orange.png | Bin 4966 -> 0 bytes .../icons/toolbar/list-small-blue.png | Bin 1098 -> 0 bytes .../icons/toolbar/list-small-orange.png | Bin 1087 -> 0 bytes .../resources/icons/toolbar/list-small.png | Bin 989 -> 0 bytes src/main/resources/icons/toolbar/list.png | Bin 6914 -> 0 bytes .../magnifying-glass-with-check-mark-blue.png | Bin 25974 -> 0 bytes ...agnifying-glass-with-check-mark-orange.png | Bin 25750 -> 0 bytes ...fying-glass-with-check-mark-small-blue.png | Bin 1718 -> 0 bytes ...ing-glass-with-check-mark-small-orange.png | Bin 1752 -> 0 bytes ...magnifying-glass-with-check-mark-small.png | Bin 1276 -> 0 bytes .../magnifying-glass-with-check-mark.png | Bin 16240 -> 0 bytes .../icons/toolbar/plus-orange-51x51.png | Bin 0 -> 4373 bytes .../toolbar/plus-sign-in-circle-blue.png | Bin 23667 -> 0 bytes .../toolbar/plus-sign-in-circle-orange.png | Bin 23726 -> 0 bytes .../plus-sign-in-circle-small-blue.png | Bin 1421 -> 0 bytes .../plus-sign-in-circle-small-orange.png | Bin 1389 -> 0 bytes .../toolbar/plus-sign-in-circle-small.png | Bin 1167 -> 0 bytes .../icons/toolbar/plus-sign-in-circle.png | Bin 19229 -> 0 bytes .../resources/icons/toolbar/share-blue.png | Bin 19003 -> 0 bytes .../resources/icons/toolbar/share-orange.png | Bin 18916 -> 0 bytes .../icons/toolbar/share-small-blue.png | Bin 1526 -> 0 bytes .../icons/toolbar/share-small-orange.png | Bin 1541 -> 0 bytes .../resources/icons/toolbar/share-small.png | Bin 1220 -> 0 bytes src/main/resources/icons/toolbar/share.png | Bin 13300 -> 0 bytes ...{sign-orange.png => sign-orange-30x30.png} | Bin .../icons/toolbar/ufo-logo-cropped.png | Bin 9733 -> 0 bytes ...ate-orange.png => update-orange-40x40.png} | Bin .../icons/toolbar/wand-orange-48x48.png | Bin 0 -> 2226 bytes src/main/resources/plugin.xml | 44 +++++++++--------- 75 files changed, 52 insertions(+), 52 deletions(-) delete mode 100644 src/main/resources/icons/cropped-ontuml.png delete mode 100644 src/main/resources/icons/experiment.png delete mode 100644 src/main/resources/icons/menu.png rename src/main/resources/icons/{add.png => misc/add-black-36x36.png} (100%) rename src/main/resources/icons/{association.png => misc/association-black-20x15.png} (100%) rename src/main/resources/icons/{asterisk.png => misc/asterisk-black-24x24.png} (100%) rename src/main/resources/icons/{attribute.png => misc/attribute-black-18x18.png} (100%) rename src/main/resources/icons/{class.png => misc/class-black-20x15.png} (100%) rename src/main/resources/icons/{datatype.png => misc/datatype-black-18x18.png} (100%) rename src/main/resources/icons/{diagram.png => misc/diagram-black-18x18.png} (100%) rename src/main/resources/icons/{generalization.png => misc/generalization-black-18x18.png} (100%) rename src/main/resources/icons/{generalizationset.png => misc/generalizationset-black-18x18.png} (100%) rename src/main/resources/icons/{more_horiz.png => misc/more_horiz-black-18x18.png} (100%) rename src/main/resources/icons/{navigation.png => misc/navigation-black-18x18.png} (100%) rename src/main/resources/icons/{package.png => misc/package-black-18x18.png} (100%) rename src/main/resources/icons/{subtract.png => misc/subtract-black-36x36.png} (100%) rename src/main/resources/icons/{logo/ontouml-simple-logo-small.png => ontouml/ontouml-icon-17x22.png} (100%) rename src/main/resources/icons/{logo/ontouml-simple-logo.png => ontouml/ontouml-icon-43x55.png} (100%) rename src/main/resources/icons/{logo/ontouml-logo.png => ontouml/ontouml-logo-143x55.png} (100%) rename src/main/resources/icons/{logo/ontouml-logo-small.png => ontouml/ontouml-logo-57x22.png} (100%) rename src/main/resources/icons/{ufo-logo.png => ontouml/ufo-logo-785x277.png} (100%) delete mode 100644 src/main/resources/icons/ontuml-logo-horizontal.png delete mode 100644 src/main/resources/icons/play-triangle.png delete mode 100644 src/main/resources/icons/refresh4.png delete mode 100644 src/main/resources/icons/stereotypes/DataPipeline.png delete mode 100644 src/main/resources/icons/stereotypes/kind1.png delete mode 100644 src/main/resources/icons/stereotypes/kind1_18x18.png delete mode 100644 src/main/resources/icons/toolbar/add-views-18dp.png delete mode 100644 src/main/resources/icons/toolbar/check-circle-orange.png delete mode 100644 src/main/resources/icons/toolbar/check-mark-blue.png delete mode 100644 src/main/resources/icons/toolbar/check-mark-orange.png delete mode 100644 src/main/resources/icons/toolbar/check-mark-small-blue.png delete mode 100644 src/main/resources/icons/toolbar/check-mark-small-orange.png delete mode 100644 src/main/resources/icons/toolbar/check-mark-small.png delete mode 100644 src/main/resources/icons/toolbar/check-mark.png create mode 100644 src/main/resources/icons/toolbar/check-v1-orange-51x51.png create mode 100644 src/main/resources/icons/toolbar/check-v2-orange-51x51.png delete mode 100644 src/main/resources/icons/toolbar/format-paint-orange.png create mode 100644 src/main/resources/icons/toolbar/gear-orange-51x51.png delete mode 100644 src/main/resources/icons/toolbar/gear-orange.png delete mode 100644 src/main/resources/icons/toolbar/import-export-orange.png delete mode 100644 src/main/resources/icons/toolbar/list-blue.png delete mode 100644 src/main/resources/icons/toolbar/list-orange.png delete mode 100644 src/main/resources/icons/toolbar/list-small-blue.png delete mode 100644 src/main/resources/icons/toolbar/list-small-orange.png delete mode 100644 src/main/resources/icons/toolbar/list-small.png delete mode 100644 src/main/resources/icons/toolbar/list.png delete mode 100644 src/main/resources/icons/toolbar/magnifying-glass-with-check-mark-blue.png delete mode 100644 src/main/resources/icons/toolbar/magnifying-glass-with-check-mark-orange.png delete mode 100644 src/main/resources/icons/toolbar/magnifying-glass-with-check-mark-small-blue.png delete mode 100644 src/main/resources/icons/toolbar/magnifying-glass-with-check-mark-small-orange.png delete mode 100644 src/main/resources/icons/toolbar/magnifying-glass-with-check-mark-small.png delete mode 100644 src/main/resources/icons/toolbar/magnifying-glass-with-check-mark.png create mode 100644 src/main/resources/icons/toolbar/plus-orange-51x51.png delete mode 100644 src/main/resources/icons/toolbar/plus-sign-in-circle-blue.png delete mode 100644 src/main/resources/icons/toolbar/plus-sign-in-circle-orange.png delete mode 100644 src/main/resources/icons/toolbar/plus-sign-in-circle-small-blue.png delete mode 100644 src/main/resources/icons/toolbar/plus-sign-in-circle-small-orange.png delete mode 100644 src/main/resources/icons/toolbar/plus-sign-in-circle-small.png delete mode 100644 src/main/resources/icons/toolbar/plus-sign-in-circle.png delete mode 100644 src/main/resources/icons/toolbar/share-blue.png delete mode 100644 src/main/resources/icons/toolbar/share-orange.png delete mode 100644 src/main/resources/icons/toolbar/share-small-blue.png delete mode 100644 src/main/resources/icons/toolbar/share-small-orange.png delete mode 100644 src/main/resources/icons/toolbar/share-small.png delete mode 100644 src/main/resources/icons/toolbar/share.png rename src/main/resources/icons/toolbar/{sign-orange.png => sign-orange-30x30.png} (100%) delete mode 100644 src/main/resources/icons/toolbar/ufo-logo-cropped.png rename src/main/resources/icons/toolbar/{update-orange.png => update-orange-40x40.png} (100%) create mode 100644 src/main/resources/icons/toolbar/wand-orange-48x48.png 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/utils/ViewManagerUtils.java b/src/main/java/it/unibz/inf/ontouml/vp/utils/ViewManagerUtils.java index 4e752583..be3a6746 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() @@ -113,47 +113,47 @@ 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: 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 d6a0c75918e8e0f5a88d4a5640e0e5a1a701867d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1349 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eM!3HFEez+qDq!^2X+?^QKos)S98?tx|+< zfP!;=QL2Keo{64;k{y?Vf`Uy^N}5%WiyKrskY}ruQBqQ1rLSLJUanVete0Puu5V~* zX{m2uq;F)T3sj+7T$xvrSfQI&tPC*(W{yj0adJ^+K}lwQo&w0+#H9Sv5?duDkVS9+ zac4mh4pF`@A3=B+PJzX3_G(>%aynRF*1=hZsH*;=m!~y;j?jlzf zI4Fq=>nEA9EsFE$Su=mLda_N0s@fSh+es2%pBy|=VNl3lWgsW=cveSDNQj-Gi-6-< zErt83>D!j?UK4lVhUfoP_f}V3y{a?u!y2Ds+}ct?qNbtkyBa%}2u!qc*|}iqo5?$m zX2-kb_2xa0xNzfY*+xyNwN-iUr^*F58YW5#N^Dn{q8;^2+^@IxMQx5p+k#wYf_ZE$S$a9MZ!8F5{H%R*Tj#>t&U=13d|z5>kP&-AENrvv;rw-Pq9bSC z@@M>|DSD%fvp6|=y_Bg;OQ~D7E0@5M{S|dNAD(facdjpbaqjv3n-BGtKAGd@`^lyH z@4d}iV+xipjo@f|oZP&(R?SOo@}sqD=NTK%Jon0=;@nEHN!v8V*5*C&5NTD^6!%V9 z+Qqxjee0Gj8pUaICd)P!pPLby^_fds=;oUvihKc?4B5(|K3V6MOcBrZ&<@V{`uxxD z15Dy3J>s%Qk1BsZT(9yu=xAqCIHw+9F>UTOMh^ApQC|wm7D>8!m5u|`wq4JbZGwX?v(Mb?d42O@BjV{ z6IEtjdXn*?W4i0)j}8ZGG~R!1YCEuC=`jgG9i`17Oe_a9e3SVN&pdw^ZWlk}Yq90N zRUeEWDk}YW_x<>4>z9j@{8J}oNod}&h}gRJ$fM(DRvR8GlAnInTu!SZLAZHW^VY!U z?+#qN#W&5*+Mn;bN%_@X{a!lTTqoEE{CIWfz#V?!JAdmo{Y#ELlNB}P3$N*=aK^_g zidZ+ZE{##!JAYc!wsZU9otM4+ccaPb>#b6(cUelrA> NC7!N+F6*2Ung9n-{=WbK diff --git a/src/main/resources/icons/experiment.png b/src/main/resources/icons/experiment.png deleted file mode 100644 index 1f5337bf4436c8c7cad74557c60d5e9b3ed057fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6828 zcmbVRXHZk`vpz|HfJn7aLq|jf1(8lfq_>Djm5zYappXb8K%z)50@9=e1u23MP?Syp z1rY(Ih7JN!LRCWO-u&*J`=488?uUD3&g^q`_kH)A-F@EuaAIzm>am^RKLG#$n}NRe zZ2$n#AqZe*q6@o+CGK>=5TIpnhnaq1neRo@pIQ9%Z2|y*_0&H%2zZgh3jqA42HH37 z1m&zv2G@Zlo;D%G%jD{eno4xxpj4<^Z=Q=JzC8!Aapt5>YC= zt`S%jLYiw!#K7?3KXOuA>>OHC;-lX`!;|I|X!Dmd>PR!n*^*-LFwK9AVcZ_?BoY$K zAQEog8S<1Lzua);p*hVq2ECvdri3H#3Z z$`TMmV9ob=r~H8V@B>1pyjpSj%@^7%`AvJ<9T-_R*dP1|EikU{&*R~Qd!#-5o(*UbkY3Fz>2_2HMzz-@EKnE&!487WKU^n80DwB+ScqeSTsOSP$KM`5cuqW7g>@O?jpmAVy5-Fg<=4%opUn zN(yinTt8Blaf3Yy8hoJtRkbi7zH>jPSY@w!!9roDG0%bQBs3DHUfoI+UaDHRuog&S zRs+W|2mH?HzEm!A!>i#84UPqo6=y>}wvOGiqcn?C&+3oYCj3)QJI(;{hreLEYwh7P z(;~{?-Ll1yY1n-=iN&1)6{&C*3bI+J(WEQQbVlxwHfKX_0KAr?dL&jcXJ`^HWUTA4 z94$}W&-hCz#=bqAm|nybcaA@w2$t&NUhyWakv@|=aIAPj3iia7E|kw8d-+pHd>wn{ zv~#NIoiTxI*Iw#mY0p%2&Vgi41Gvm$T?>XQ>|U?s$ZT=V$gGJ6TPioVfKi-pJOol& zj*5TC6V_wwPOS1yKzpEql-gcb*tnAD4!W8rEQxX8`59|W(!6H5qcK6x_^Ke``p>FF z8I5%5>K5nAf9=SH)XR*CpU<666O2v+uq(@i-vQspy+XeM>}`1`Beog*uWWXbC~1oR z>gz_Ge_)i|noia2BHQpId^hoBqo?fN2*}FyvJh9P=jnBbCkxStW11EmPrd!84e4Eg z+jxfc>G1MV%$M7`nclbzdPKDG% ziZbggYf}MsRd$SzD@m^VgrX1BbMo$hLge}^8DpnXm(ee{o9Nsr6zPN>J7o;Q2l zLv{g^1i_NLF4Rh9(zJO}Bd`7u?bM(Pk4^J(O$~N-Nk#~4T0Pg z9~>~%(D_)nSnZUL(3?d7sD*YXcW- z*z$t;DVL|dEFAFrfS=6~$2qt>Z>1M3raPNsg@HqG14p3DU*A=k4;cl1En=lLZE-i; zfep|HFng!_J`8`2w}RxyC)BY{8*x8fpnuovDZ{M~4BpNhKfcO}2`S(s_3_f6=+l|p zxc@JpR_t#)2qY|qDB#KZu;r;DbSk4Wc=(Z5p(iP{GH z0q7oOUapujo-5UmY^#=BhntdOVV29%^w&nYR5qVY{<(J(x+A+4h3k=L*VX=M!zwt) z@{M5%q@L=lF2>zuw`#E*{uUeTB(-_AzU4Lb^o(obnLN#dK!#Xn%tYmzW+u#J&F+B^ zF(9|k1GK0c``SVV5P~Z1hRtGETAnmUG`+DtOz3DrAbKvn;2mU{j zH>kuwhVrJPM0^W{i9Cv6i%v&g7`b4f$v~Ni_zTpqLDxyDCf^twKt+If^~np1s`xl! z=sxciXi)4<)=R02dSHZ0(}6pv5}e`E9{S|GtzJHeMDlLHpf|1~Tr@0<04}rwf6KI)g_TolIP~)lEQ$cJ&TtV#CF$t`H)stll zwBI!T5Tp2i^#=1YO(f(VZrmIA;SM7Y>RY*7?KO@T$~|o#P4j`noM5KG#=y8U@+!Q; zb#&G`B`DlnoO^VzNxG$lVb>^H)9!aV5CUoe&<4A?0=NezG5UoKP~v)1LOshQcyRjx zzqj+`$zAk}wRXtuw*4I?7tk=@`PfED+*NZdO+-w?maCO%M?xcc1e}V~nQbqXL9jUK zh2)hFjBJU5xwZnihQ)RtU{zI=WbFj6b6YR(OTWznPgtHhG zgFHXbS7fMx_}6z9$&Fv=W(H%#))6;a_?(zMJrp2|*qR*21-}Gyc|wDY0CT+Xwaq3g z+&gfmSPF)&00^XWx3+6ImDz*pRA!^+t%OdIY@NgubAQ`*Ru2$8h+c=MN<|S#po?#z zvW#H>mKW1<$m^r^ECYWX^cQ+4R|e?(7O7;(_kk-e?w_%NilyiUH!^Z2Yd#0GPZ+ak z7Lxuq_&vpupPL)sq||&y1{4NSrxPwEkz13ZT3`15O*gT$y!YIZI$H|YBv_x{14Q_$ z%IulLjVnZ%4ukaPo&yqZbIIG2@hRelK+5oo3Ne*J1`$t_j*ZVe{g3I^gbZB3J9aJp zVg``}>-eTtbok6upPR`FgBP*bqbH&xDL%iGWI;(V*haBJ__wF}cuOM(C&5LTWdqHSxC z%ngv>Hc*j%!`O5n-2;ZxzbI`B-bD?AqTi>8N#Yvt1b0{jU8w~QIc|lnO{p1=SJ$+q;Mze$NICI$-nv2AX)aWA8Ee zhYa7?o2o*GgRSJylA z4EDd+NivI}liE90zWW1RQfwd-JOyI(K*Ir|#4EZw^z6KyBap>Om7Q;HC4m_8IsBQ1 z_thCPS?!<`S#GyXHaRzs%bzT@+RnI%Ash-AM6y9Gki?SRaamFoDFb)eozwhXIa6M@ zYP996yMRin3F6o=131u)*AX)ZKcfxrl|z&zEk(Eq+_;m7y}Eh&ko$(h9^ZL>UgDG? z@X$B6&l04h6MIuWpFyMrkS*JyS&$BJJU=7F<(B300lSmN9sCSYt{F#4FH>9Aq(Se`^5lEh|a34r*DZlQ2@yZoHS42qPfQU-h{jH6E*dC|A-@`;)JJ91S_S48wY zC|cqjZ%|Lwx2tksmK!XZ5?O2{DheJhl*uohK1ioVN&|CkamO?dNXj|jaPhGa~cR9%}gldpkOc8haOEOoGCfPj`vaJ=F%c z_GZmqJ)5}w?~R1RX0Puaa{Pzl%f~o;ng(_UI`fgsHCgaB_{+ypk{RjLnecJokT*za zNB>r#UdYMJ@NlM`r3*K4;m_Xno=<^E;&$ZJD1bzGAnX6lu>VIgD03T^~slbExMW;4PCtJe%Aic zqVs@@MF&lFQ?73VQE>bL&M(sOBT?0mR0>*QadY%Zf4RaN&a%C=d%S$D`K~?s1n1%< zJ=g$vkn5}Fj6;3rt~#--lNL3&>xWY5tVuyPFe-yh{L)s#d7Iqj}C0@$vcJ8_lfolLARKBN8HKlosB-TW?$3Afgur;O1c=|oQ zFp%Fr-!*H9bW@13vRIY({x=b!2X@@F?p++Mr^m}VdO?M+0Tu0&pbepkN)&4~B9t44 zs4VQ!NcT(^$00*5De+m)Rpof!)!Od&qK4LA+w`7*H9A1ne_Ip!K71lq+N_)7%J8ll z=?y)uSt17tcfem>NjX6`rB{LNuE=Ss-G*gi-%Y`ii|XlJZyqhcNd%&7i>%Tdt$S^( zSU`Pb?&to;E-!)~>Pk{C@DsmT_4kgSm!sS^eRaBX`hn{d#PZ1J8sm6|zn% zX>hPHIuefXYI#(S(P8KxXq!O=*3SPq~+2Hli#2V8=KY}GMY$uX1sk`|F&0njz zG1#&DkPQ!wmD+|@)Cg5BDV89)x-d~S*oTfI-hCQsKK!Rg74^Iud3)Hbn{)NeXA9am zcv$6hrcH6hNEKx1bpK?Spk;C5Lz|lcs*A?dl7kl{l*3#JQqdn&<6-%Gh-WvWAdg#7 zxF|z{&Gt!^uKbAGu?HS0X~7*|k$quc z!gNkGy^fGT+YsGuHQj8lKgRGW2CvMKgIEZ8vD82?$4?=`1GSwA_4gbWpojROo2>9sI5-;eQ(|N_Y*gjJYaV_=SU4rsR{|hTC7>Twu9(fS+j%_id;}6Fn zl=2C!zQgdfhOI1mlj8Vm+z81?3@^`DXKR}x{XF&8F`5>q#{RdWk4G<7I>u-#E)*6P z@bl?+=wFAB@S;7d5Cd4mw1pQ7rj64ie1@-&l+N9p?O*Vr_4sAzPuW?&&+I*m5AM}r zV}@(Fmq<)@dmW*u`CY7#UV8VF-5#<)I~O_PBK$$0=#$Yz_KuDI!U$AwC}I^TTYYT5 zvL|%Xu}h@m28-(|V>^L{ln@pZXd5~8Njcje(#(%K5%zIZvV2=oAa$G(D!Gb27Y9KrpyTERJkk?WOb70~# z=5xNjuWCxYXK!Rgnywo4a3P;<5p7Oea4YY_ro)Y^GacL6BX|wUI229WhlHEzbGSu6 zgrM6rZWHS#v>M?ub9gE44qAZijG{lVW2|H_Bk7|R?|vla1G0<$t8r%`X8tOV!^wnr zIl@!w1)q)^KVpt995>->;nNX8{8iV(ay>6}%awYN2667mSGLmz?G`)Q%9`aW!7q(3-o~>+ygPo7AX=GyR~*HlL9=)SIMs%I3;` zu2ix|xTz?1X_YO18Z+Uathh#kkqe(U%qbbyTa8o`T0;W&6?KO$SOpLBjWd*2VhhHp z%sZ!l`5y{gi-JhG1|0Vw%xEY3+0Kt?FMU(zRh!Y;-g1c6mFTdRp!aQoe} zZhYuxzgl_w`;vLfuupu1_s%KC%qRHEb$|SFY++_lvky8rk3N$ub!4D)WcRN7wvS=6 z-56i?Z)r-dwau>|hxqgVG~8d~0HjcTIY?GCoTa8;dnUMgIwQ?Z9-W=-4I|GLls{VM zU;WheO3LybwVLvt+ZgqL1a ziiud}V-ysrH}0BrId%KXNwZ%r<{Jwu4%bVk$lJD$l8-+NQ@{F@Lpq-+XQ$O25ivFd zxy^+1&(@F)c=88n?{=aY8qwbvy3dqujCfVE7;-<>w`vp}X7pRgcF0X*2fK4(74UuC zD&tCr#7NVT^7e{q!R&iG#`1aa$~4myIN5Yc z0OMCLFbq_y?8Jv~qJ>)oG4({C`&$4JKFHxBQ&epRMTdup2+)>!%XvnB`Q*F^3AVBU zt0$}tsE{Qj7w#&K-oNOh-kn_)s(QA;_WZ^`n9oFUca?-K+|t82i4ZykOa%Vrc=Fe{ V=#c@Yf&RM*Fwim8uF!IN{BL2<(>eeE diff --git a/src/main/resources/icons/menu.png b/src/main/resources/icons/menu.png deleted file mode 100644 index 51c68294085ff778d1c911d9cf01a927855ca186..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 510 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SkEalYaqsO7TRz7?fwqU= z7dURY!LU_(Ba@=w?L_8lkM+5@7Ns+)Xqj9Izc69-hK~1Q_lw00jMJCR;F&SAlU2ce z?jD72vxVg|ic|&nat9{(d*5h`RamCtqi}A6Xj{8($P58*HH9>v$f$iYXGUtVEbyPb zNa5RLUT=w0W`|l@93Qxa-e|0DbCHnS7s(Wx$h4T@%ZrY-g0o%`dw}Y*LS}xPuqK&* zSxAE7UC!s47MEq0G8Z&-bgyAdm-?Sv+S|0?m$>@AOaIM{nSU@Im+oEOb%nVe=r7e0 z*NBpo#FA92JsPM%5@bVgep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&Kt&9mu6{1-oD!M< D+8(F- 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 60b665c095e0db6e4c87d46384d52f5218bd4a57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 833 zcmV-H1HSx;P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf02y>eSaefwW^{L9 za%BK_cXuvnZfkR6VQ^(GZ*pgw?mQX*00OZ|L_t(IPqmXy3WJvo`Ri zsU;NUYm_m7t(pXg62aX3vf^2#^VtZqgP$jvHGG}Huwe@Nk4Aj|IS;$TgO_i9uoy8K zFl!IOJm-Ko{F?cKliwiDn-H8BWt!h!oP*8Uzl}riDo)t}H76d!YICFh%u_VAJcnu8 zhDK@$9kAwPC(Y$iUU>(717qmwF@Sq`0mh*bjQ6~NyZ#WX;l6wn!aygy9haEq`+d#0 z;=jj4h!w8{ub(Iiur7IU{&X2Ew0T-;Ji2;E5xpS-g?SpJB*$V~W)ict)wx)-dLTu` zqb$aZk{Anu2|Pse1f+#2a8WVfBBNPN-eL2=?eZ}Z;%0*uy1hw?qDlPf?KzG^RAe~Z z9)W2YiQZat_A$YO;}H@I&VKzDH$Ms0nX-q;Dn(*;yQN(s`Lz~3l2c& zyHBU`Azm+lQ~&!V{wwmE5m9wS$m9jIQQKlh|ym00000 LNkvXXu0mjfj=^x6 diff --git a/src/main/resources/icons/play-triangle.png b/src/main/resources/icons/play-triangle.png deleted file mode 100644 index 324acb0539fce969e4d6928491f0ba3f2954b72a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3560 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 Ao&W#< diff --git a/src/main/resources/icons/stereotypes/DataPipeline.png b/src/main/resources/icons/stereotypes/DataPipeline.png deleted file mode 100644 index 7e8025a27f7344db8a64e2d9ac685ddc3d511c12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 479 zcmV<50U-W~P)xdE#GK^SNd3=?M{x&c@W!f)VQKXnsq27vHn zALakI$_)O0!88nP;MW#26NEtlY7H=rv;9^6_j)S+uXmRFUtlBkKif(Yj4PdF{x1wy z`F|=;_y7AQQ)I&$;08_cR;g-tSNLD)AoD-RS`w}q7tRM-FwtM}|ISpc{|_n+s!+UF z;wH|WYb&9ZZ7tyiG%O?AN}>aZmjm%JCFFc>dl$ zxdDiG0P%Y$2C*Cd?CtR++MuOTdjAjC2K|4!wDSM2eUtwG-aqO8uZ^|;f6R^f|EH!h; VYi9P^Yb^i(002ovPDHLkV1j!x*Bbx; diff --git a/src/main/resources/icons/stereotypes/kind1.png b/src/main/resources/icons/stereotypes/kind1.png deleted file mode 100644 index e11d735b344b377ebf2a258d1569b67723282d02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28909 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 DGx&#D 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 461bfe969331b2862a99cde6ce58bd895eb49c8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1202 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lxRtf@J#ddWzYh$IT%b|fu==fhD4M^`1)8S=jZArrsOB3 z>Q&?xfOIj~R9FF-xv3?I3Kh9IdBs*0wn|_XRzNmLSYJs2tfVB{Rw=?aK*2e`C{@8! z&qU8a$&O1wLBXadCCw_x#SN+*$g@?-C@Cqh($_C9FV`zK*2^zS*Eh7ZwA42+(l;{F z1**_3uFNY*tkBIXR)!b?Gsh*hIJqdZpd>RtPXT0ZVp4u-iLH_n$Rap^xU(cP4PjGW zG1OZ?59)(t^bPe4^x2jMs}o zFPv)KQS>tHU(>gP7tZ+#9A>@C(&!!NDB{w@Hmk`&#%&?{#mQXKrOWo+zda}8apU(gKh@LjKmNaN@|@`t-Po>L)hV4hkT^j=;b^6F z&9lGxKU!RC8s7hFQ!aAid|$|>c%t^)`o~OM5eIT(Tm-*=kWmacxuUP&%R%Np4URDx z^6?kjl}!!?ollh8w)B;YzfG87d)bX<_YEza74HRl3pVQhX*xeoF;hT(&H~ZL28&~R z4%yYVf3A6GsCPIg=11z=JvnMdH&kjaPO7@VYrIir^Uf~CKSw0aR7t1>mMpz6|K6>$ zjD2SJ*y`IF*B^NMT~+#@0DDGT_c6_Ohj(*It#58gFXR=BJ9uW^0j`|p`E5_vJ&2#& zTgBl+TrzBtBf;r8I%+;;i27^&k&O!5+$*$P58M<11ab0Fy6A>nAMW%C|eNBlP9+HfWHO(NI3Nz#vY z-rO-`=2U@nk$+P8JIu7JABO!l{jFP>+xhKeZ{feow=VWvo47^%-GrHuPJ+S(rtd4a zToE_e5ou{-UM;>MUo>2zW%uK5w%miUOCG$cJ9=*Qf!M9)yCa&;|BboicOp@YZ~fUr ziN(3A>M!}p95`zBP=>ihu+_ougcASh(nUAtn$3Ct*~Dnxf5sM}{t0hhF1roNiJq>0 JF6*2UngFNCvyA`% 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 60cdb2a1ef68003f34dc3441edbdc95c9499216a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 337 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 O2%@KDh$z#rkNkgLOxXzl 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 f1b830d0cd737a07d3d9a3c60bf819f9f41c9ad9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24469 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 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 04414aa57d08301c4be707a2e1e8a085717a0ef4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24346 zcmX6_2|Scv7rrxN--Q&$T9FEsvStP&BwN|{Ldcq$>}IH}Whte_-a>Y=C#E7x*(zhp zPGs!+I=(yquivjmy?5?=@44rm^PF>@Q?!wRHam*|3jly!R|j_m03`eo378n*$EyGD zZTLawqOPwFKuJ97?lpS&cTq>3EBXKg9s_`Q9{}1A;xqtwIRIuH08oAo0KZR4jj<|x zz;Inp8wWq(uPx1w1o*-1qhom+0FDOQZ^Y9R9D?v48Sm)oYcY7LVzkhBpz&{0Fy}#74_v47$PYu>2Ess|(-tfJ-;wGtkTrHB{OX1Ij3&SovT#4D`9r1kVXTF^JA4k8M41NVJDPTNfUY&TB zBWoNyL>V2!zCgZ496va1@gM@>GW*KjxCu!0Q<_#$rE_ijPj+IkS6Bk*JJk>sCpy_3 zREXvorF=e>8Y#(qy)0GMS}9YS1~XezU)xztS;zOt>1gh`bPGlb1oZA4`?|dO*rW%j6kH7AIC3NVjXB+VF|Hn2)JY$!V<0@cl|a&YVUW_E0NI8 z%8zr5ZUNC&v4R42Pi0ZdG=q;%(D-8?RPR0;C^ z9DS4eXi}wBLD${AUpYZ4M-gy2e_mF){e_QjK=Q5aWxk#Z7e%j{P8`AxGiUs$>B!zj z42t@Y^QOmHY(=ij&8jSR6AY?D9gFZniNo;a0$J-@C0Uw5seW%VPlq+|3h+26S9MN( zZ~u%vT9{D9s$i$gLW#3Ev{1nzvCP8(a3~8k7lW$Wtf1UCf5ye0GiNZ6x_}1Rv+Nb} zIHSJ?pL=&=x6d#4tP4*m0Zd`8`*4ACnUoYq&P)99%El&!_Z^P$nu3egeqEi+#rk1) zbMo&d+Wk|Uzt{CnyTZzkJAj@MNV^JB-l6~AzjT8|PB7*wNaY}v%x9(eAVQD{jC>X^ z3?5LGo%>#9=f951_W>E<%N~PeT`F%jKS^&Afr!zFEm_~`B0}|D_zu0Vy>7`4=#a?J z_<|rJ^$~r)c`-y($POJcw)Z1Hb-ZXMz9MQO>dC#(~u6_I-S96q_h3D$RDuM*bf}&I_)tdZO6TaW-OJd+C zSs$m_$vV9s9r4U#p^qB*zJRime=lnN8-l3%)_wkmqYa*t`J8q78ueX!s#x0bl@^AC=1-5PZ6!(7fwbS+^2h`HBa+dDU6rY|*R@(}BElb_ zfOFdi{I81}IxX~EpM*$9D8gAJqdSP@Cs*b^MNcssRlt>S2QAO`ZjK$Ori;-7Le~d1 zc}HUHk#f4@y_HltOGII&mz=XSOyj>fBbqcw-%@vXa0S?*~i zV<+@R+Jd5jHHn_mzM8qiTk}cI?snz#V%|`-yh}!Zwj3Qb=h&9V)w7HkQG~?>WCDbJ z>VFM>8s`r_a(eC&3VhOaaa?$g$KlRsCpe^aWE0h+hSsO3UNaSUZ>Xb*GMy2txNT;?vEgm_nY%8$UH(@^su%7b|^ zi8Z)9tNK%8&4cAw6c+I>rzjv&V%`uD+zg+qx&-t$IzLG++yA9}fB7DK-s|{r|2w?g zK~c@Gcy*$i%SqGpUGMl*@`I!*6#<=1X~|5z>C$arOgSjN%!oMu<(6#BpW68%@~I>h zA%K+bvIx0f75Io{Cf_=$IoX6)Pg6@PJ-y1cTaSD?DFlwVh|oQ6V$U>v4t%rPFj|*N zIN-pVVGUg1AH2Qd;HIvC*46qk(1IC3OJ`((f! zmEx6W9iQ9=16*By=iCFL?59}X4xU!oSCY5lYZSLSmY~V2h@%@f#n*yJ;L9{39Nx2! z=Bl9POTAik%drvibld-gXLjaiBm!M>H_o?CdK)m3TPD^6$KPH=KAP}ZQ*C|DeLXH;*x=qtnX==$lI$wUleNdzC zGeQ*HL8RbZx?RwpH+T;@4r-$MS(+WC=N&;BNO|*$j9Z9HbIP=d{Zw~%=J{jex7?CP zjExmo6t!7bE$HLu{R&hK><&)ze}6T=zw+!0wFyC*I)AP~`d30D7=my3IM-iDI6!hF zs?OZpK7IUWlk~w0f1C&ZI!AvSmnaGH`7mVHA&qO5PESm zrjJDkMJn++;ZvkOQR;ft`U#$ios$uW%sdwnq|Eww-Jez>pQ6vT4vW;9P^ULL_;I=O z{M4@?6+v=&yjJo=>}M8q z6VJYgb)e>1a#j-ZN_~I*E!8%#D-n0L)%tiU{j8*on%e-|EuSxi={x^=F}G{sJH0Qlt~Yh9cFPB18Oe z{Ip|Do^MQ4N~yc3ROvj6BK^en{QSJ^@?tW^2P}r+9A{l~PNL+#)*L0-aW%8>2O1hz zO$&RuFns^J;)4E@J|9${lY*Sq1_2-OSABGCGy}aF$JQka^jsZ;fT~Q_p&faXLVBYc zg9qeT8l|KDNaSujt1QEO`TmmS9`ffoh4W~)t%R5qmg&oj3tv12IGQKB{#HC7i} zH5ZHx)6jzUHYa023YEKZ#0z9JzDvI%dlVOnEzIP^>-&zRWM-8kQvemM zbRDVswlM9m?E!meiM+pI{s{l-GcuJW$$})S%FTgxEqnBzFOG@wLNuN7`6V)Nj_pUq z{8F_YUv*j5`#E#CTtP+<-|O>l;&GNa=XSM*Y_Zo;$thqZBzfoRR-3yp^jjmn7UpY( zMmn;@OK9S~f}miJYcr&RWc~k86w@uRc%OZ$J%vl=(lDa&GUXuQu_E!o==|d2=z_e! ze0QlTnj#)q?eG01^mMCcCDVFW<<2x&{Y!e(`2qv0NM2>?=(%S(d1}mYLkuH6l!NI3 z2gTd|nQXsn(d+RngKqP~Qtja@ZRdsLM4az&2*6y0>e`&xw-tvP1(i6^oNZ_>6?>Z zw|Vv~AFvS=0&Mw3smeF*SoU3iK!#$&6-jxSYu5{U#$c|YHOnxzE4e5B$g43@jmE#^xVa`N%*h5P-Lzy#1dXV!t>izYG* zoD0ra5kHOg_rbM3p|?QuYn-jeF`+3LEawNWrSpRT@5QunpMUv{+VY3B@~g3W-!EZ~ zl1#xns}27@2hG=3Tc2&-Ba1xB2)YK&E; z(5b{y2Ea6gkI$c zsUGE-o4FbW+k!%L>)-jhWiMKdVJbM7l{tXYoAUBZoaI)=3_btp<0gP1O`C~cyMy5v)7VivCx z7EI*J2R&0YCh+LB?rg=ZVT6(6;FwrP)YxlPL#dC7z{%KLb8W|V+8YSD4vulBB5nBG zyy~IzY&PUgz-i(Oa_ms*)%bYrTJc;LoYmO(0?lwJ`e#Q3uZtKrqrpYXN`KN_rck&)6n32e>BmYf}{i&c4 ziKiMER+G$Mx6SGKZ>VMcxr#mTsN`(pQ;~z4TL_k?vN-Gh(3|Knb0H9MyvqpBM-;K} zJ2YednKQP6e~)va$1sV|LDm->9OvD~(96hrWLF zxIygNDq{;I`z%9_F0f_wE7GXY#3lPRa1I;`(#@F6c2nA#nHK&79DB)=!KiDatb&o{S3x+tJX( z9fNSR^r@?=8d86cfpmxROm&*OJO2L{ur@=qqMGqnx6y^}2SZ^R7Q1|U8iQI3lVgTB zz~yO`djFx4x~PI><%IhCnBBq;q2J^wT(VM|XrlhgJCPR#k!FbJPJ@pfKN(fOjBh`Z zwWlj@(!sbINJo`MgeX5{5yAWyPwSoJTLp^^wSA09Z-PXCPYPbo>)$V~3upVwyvp&+ z+yU0+UmrftYft4$vaX!yt(l)sd-ATLQ1%C-R3?!V;p*v`b7b%%Zio1{e22 z%G-{Afzl&QPrVM`f3~&tlD9p~AoMCXT>8ubqDvbL5fCFJI%s*4G%*Yf6 zH9Jw*cxo^4S$ST*=JHzy2BMR#z6siv9mdY5s>Sktc`Y;@lMPr6pd1iqdDk}8p{)4y z(jG_WhDGH>IFNn!b3Xq+5AW3ync;P>{y&hJ5w{aLB0~*SaawJ$*^QP;J|<(ecBM*X zS3RuE3Vsbat|_*)x848VG2ePwY!O97o{=7`WFn~)So>;*9*q9h5qG|z_nNH+?z2J( z-qbMQ_JE|=<~w+b&8MB6-|CftyUnP52A)SHvg(sTWVBMk!KdHFPkGV@F|%^_T{>@) zT146xCvqC`Og~NhyID>~SBJzSDkumH0m%h-T#Ai996! zMF#S?_F8@T?nnlS0|-u;8M0LiXfMiG|1+CD%-6Prv5w^8Mqsl_ZpKN?n~6F!wNGxD zv_{jfy+DMiGCF*H`$SKpa44F1ii-5$>5lhZk`$MXK3`s>lNWl3lt(_*_crpu*MBMs zHp)sy9|en8CxFrFj5>zV$a65!cDb}B@KQqM>!{{>Y3nggWuIY5QY`tDr5R7Cr;TWO zmOvFk6vhhnnfw-hPJOp?|0#7HT{;JMfZMq`R4XH6Fnt7cSX4Sa9m{gk?A{_D?mL)s z8$d8|6SoM$@n>3Zn5SNqwkA^tpaw|sq^{(~J(izG$#vBnjlEk{xRTa-)P0~pv-GGO ziWE`(i(krB0aIFMu+bPJKTvFCiC;sfd}0gci^^ z!Q^~F-$)FVpNJJwVU)A_S?Uoo_xm~}A#rgH$c07*Gk&ff+BY?ys24vq$4NVGXKUxH zyQhs|p3RK%Y_`+l-}Fy!3-gEfy*Uwg&YRSmXArdH=2wOb5;)D}D=#=eDJAK(RCi0} zlRw;4;*}a5du;VK=w^*LWswW3@ZK&C|!ChS(jF z@ZWWq7fqyWR_CK*%|1B|o-wIYr4tpP@*#^iPb6GPJX;MnA@<(G?W0JR3rfej@?jE^ z=gPlOd$nhSekg2d$;~vRif7Px1CZv19#$EC(YSNmg=8160CN3jWeHuZ@u#N3Z8g{2GB#X zTMFH8v==Q%jHxKH^5f#RJmDQ@Pd{>y5_eLuQ=cNf*2V8W%m$*JX0L;V^7-cQ^2VcH zuTK))p-i0g0lOc6Drci6)M&Zvypo%Rc-*_-)9+y*A0PEjn3Yty-(EJL;J*A=JH3)a zOnmvVWJla1S($H|#LFdKhcnGJGFMMOIf$9v(iRU2WyB)F-W_CcSQ;M7UAZPh#o@g1 zzfUdkYmy=nwGM-4G#r1qO-YiuUo7rIUCXKCA~EKxTy%{@1?QJK&(%ZQ994Vs%I#WB zF&E@?x!2*tN_ihLXXGg{>L&_N43AZ1*Uz)J)Pslc5#qr}itE*#0@_6jg>$KyXX+KG zT)dcW@b*j7Wy^}crj*BfOY0oi=B?wqpEfmlF*Mars@AzZa0b-%UL3{*1m#GrU7*B- z`NIT?yct0!6B;CmGSw2dALjWIQBk|c`p*58W}@C0JbfT*`Cr_2Z!{UbGxvd`H`(QH zQ)^(*8X~DGd1vJ4?5k+I~&UL)6DqmdD4GVvrQ53LTSd=z^n7)~lHlrcJ z00HfpU|-|1YR^nOJ-0E}5lS8=FH6C~?;%zMH;n!-h$@xrm;+Ve?xW+4_Pl!VI&nK2 zzIi)$QR<*I99EKJ4cfrcx|1~>NsA-_UEyPXloa?WMuXc z0mp1>zuA_vk>GCX=7ubIl5ZX17MrL1y7XvW3(Y!3J;t9i#>;a|tHZ6mZh?^HG>^6U znnf}Y?nm@?ov;rh@Dp;TU1)2VG;nI^zt1F7Jby?n`pu=CqS8YD*WZ)@_Sd^;Z|G5Da|@{A zd@)xl7p{QNkcvz1-)N*&X=ZG3V6$$0TQZswlPzO=iadU6tzr7{rU1=$Y5X)czdETn zuems7>L?wTa;Um`PV76=FEpUXb#HM8SHa*0OBLZKh-dBQ*_2k;YSnuVp1zz_NY#1N zqxK6SYH1(x4172x7-2{i{ugKCXseDh$;nFG^aJ^DbMGu|*-b?%+2jNPEflBA8ZHlB zktpsq-B5M&)Tfy$K50w9e;|!@gpcy<+BOyX*G4nU9}mD(e}4Y#;=&#k^IeY`6*a5% z%1qL9Rf7^YYUJSS=Jvji&*@l`NZNCS9pd9V!xv#R8wk@3?q$_`9uy{V@%~eNMj;;! zMa1?!-VZ2jMIDXz>e%2s--nRWU9+42)wqB36idjEa(GnK&}I5$#BwRVNlvJ1Jjv$9 z(!G^B)Z#>6$x>tEPs9i|RzX!f_fgj~{}0gEaDOr_&729Q_bQz~6j3nhV?5cQm1oyF z#o4yQfi;c}J{)SZ8#bBv%s&=S$IU%w9dLW+I%2*O4!-rC`kQ}cPjf{Xcoe3u-8BwA zKkR*mwI(&eMwDm;1<_T-cj7JOyvEuqGWx60yUyBqHo9bfu2Nz0mbi9KFZ)^oq*7{23B9mHFIw45+|BR}y2)#*KW z2KSol%jDMfwSdDgcIei|Hu}YX=bPq~pm`anXkDEqC+&7P!?wLP%*4|BEEG=3Cbvwv zFk;uFH)jVhME#>jH$`ZNA&_S5wU5N6SIi&E>biEk?u-aVY6?ZVx^^xSEDlx@mVVaOdnxRIaib+$RH~z!GIf6}DDmym zzJ&`HxA9$l56iW(7%Hj8F)Ax@*;6T~;Z{2X(7v|p|CL)O=j`7mGB*yFB&anIOQ3W8 zS>xzB5o7bo*MNbDvt83=F`1l4wWx7dpXo2V9*Jk<=AQi4KsLQ#G^GcZ`nserBDb&F zfAY^PP@JFg-41Yi0p=$4J?qQoMa8rJ#8i|GGB_0An~bE6NV?x7GZNcZvXfE1R`Zz0 zv$yE&N1X}K!l?7I<_kt>WQrKVg!YHMn!aI#PNWQqtF@LyU-8YCcobY=GAj62%{3_#pV6}`j?R`; zw$g0tn05v^nRJm>9jV1+=%H9>y4+f{{I{YWSX_e>j&E;IT(0; z#T~e)f8@hBoKq2WuEGel>w}4zUfK128e2soK>=@Mlb)i1Rt`s~x-wrdDymt~ zq``3N-qUKWMoXo`awky4oFC2Wgp@Drmw9sBDz6p3ariD{mDN=}#PFcTN{qoZ8CkvTE9Q}In)ft3EKrkIP% z0uln?V)D~8TG@$HT(e_cq!|B#W}yO}IIJE39hQDh7dchlcss$|qAM&TsZ!!auOfGY zTh|1GXu7^$7TliV)1%ZR{2Sk1!uV)a5dG*fE&asz>2r<5)!Z{#=lpv&5Yx(2z4!iP zJ>CaWB~-36owje<-~3mpgMt4jt@u<{pTCbnrsQMG!2-$dV-AeiV+dcn&Vv(|VwR>P z_`iKD7+`ID;?neupI?uE_mBb-+s%ta7AYHp&S|VjF{_5F*dJY-g%E!M76FT&Nwh~j1s~2 z;0k^8iKhtlt1g$abHkU@wLRdM}|o5H7NXsp9!yZrwsW}DC7 zyZ-KTe38rv!R{}&k)<6^JM|Zv1|87~d}<-h^={3Wi%z}CLK9D0ebaWean;XYkzGiB z*9COn<@3Fmb^31fnhUr5M+1h{#;Zu%F0rCEO#z@R`#eCASJJA!>&MWG<>-)H^ zk`nBu-E$eLN^~nHyyDvVD&ZGJ>l6882GuBk$ov3;82_dN69&_;Tc zuXDUNbx2vv>Xup0pBGIQE_AxIn}K}>BN~mcKWw1mNBmQDpVBqKAG7+*hE$2Hl*JK+ z{R`2Q8dZML?>4tWZXE)o9iB(GFFJ3>o)rdnS6h!ax9OiMolAsvaSdt_uWH)f-~Aiu zv_x;Ovbc`)tFd_IMMJozhX*}^?BCTZjw7&grBfVJu~JqAf>Bcbs?;_DXJF^^($e6e z*bLFC&VhWvGqXSZ3))>lZ$OCKU)h_-Cu=IL6}XIxHz!{03))mIlzTA=bSKD?4;m|- z`xT_&BoFSiJ_=$fD-37kcJ9+sY<} z+qqG2V|}ArVP8S$8k!4dz*PB}v6A6nn@5}Q9nia0)nZBZmO^=Uz3bM6SYjDN@Y-2; zM{>0tiPx^!(WT)b#28$J;w?xTQ7`HjT;*)$I36lXJV5b#5@ub1ifZ29t(mLmZ$vH- zuC7U#k3@b2Z$sX`@4L5`rOpWIJ@&KF)nDP!@3t)r?`{<92N#>pX@BH67exKQuD=P+UaF>Pi;a&za^K4o*`S{x2yQ!xwo!PCz#*VS?=0vaRb zIr3`3aB~K3zQjOOe4nLvj1#->Y0Kr5I}>@%rJr{7*j8B?gg{Da)Bf3-Oycp+A_Y8A z&FM(r9|YOb{u7A=y&?`JHp#@omgqEWz zBb7w7AKOp?cT#W9s&lnW-wl8Fd+Dng8+U+?QT-OoaOrKnmEy!*AWU0^{S$0Y4H%(P z_d*$ocb0N^PT$X_7toE2{jy=H&6P-?+kAxqtIBSlJ}YN&t*(!C02@l2`u!M3YB8x2avJf)!#oJa&4{8V z>qyRv=*e}cB1im_w?8%B_KFVurJP0b4`n}KzW(vq!fnvm-=83LojiJv`8_oqf{p-t zQso{3%lF*AT8EzPLl`k)#gn}YV}<3fC0;p z85p2)HO5Q799Srwmy%DMd+G@)Ed1EUi0xgeO|umH+1nr?iLy0EAlZtssuGY4+=r!! z-c;g9#d6HLtfdRDI1Fbrm!N-FR~Zc9tlv>#B<<{%z(O=0$sJ%W7QDjfW4^JT78rWC zRHE}Knf;#j{EjLyWC28NFaq<&9T8>j7g9tXDi|q*iQWGHs6m=6FO+AtWM7x2?{f^D zfnh_c=?qfanvwJR&bv0}cxcuWH+UN=FpEvU!>l{T#=O1tN*WM%Aacfq`5hCOdf2~1 zAbbZ20)snVh%e;NsCq%m+y5bbHu2?WG#hD_>bPmX7J;zj?p8z54n!E@JB)N-x_GTjhTAw0_m*6ZAqlqo`QO_kQX#1eP~V1ep9v z+b@omBEV-yF~P?Nd-|zlG+5f@AX1(!TlV0}c=!pW$M!-vKkszVAMyt@Dw{=^pEEV^ z7Har;s?sV- zYQw(*6A+yQ!^RZ|%L05ZPw`(Jt|Yt*-9BdM5cuilSBmd*pqqb9X2&IAY<64h8&=#+m~w*m(*3;YbH=w2qLYeg z`##Z9Dp2afiiP8AXi(KYUp~~ghq*bqXeZ-cVK($vgO zH6U!Kgo3z=-GP+v7oLJxhSxJkXpU;9YR*tS%bA2=`U&Nf2Cfc zS+j6i>QCnRIyeE#W#rv-)W{lQ@luEX9;9d~b}0>j6)w*GQ*)@mi>G>8fedMTb2c55kH zBg^LrnH{y!at(~olD7!OW@XnAD{sPcTp2<2ui=AZC++I_iE%y9RNdZ;8~X~P@a@>2 zZLE`4$-V1w+7Og zKyjn8gQ#2gJt1t9WhC2|Un1h%bKg7(S*gEQ+>_&2H7Bu@hwA=;f)CagUTl?=Qte!x zvHr&5&(QJEOPNL?`y~?eSq6bQSyVny|G%p94S_n`_^t8I69kRo`mN#a!NIF4&E4Vty|zB4Nj!-1ACG@t_iuj~e>3tm z(Tf5ZU3;JDpW$B5ZOkf1TvSW^5BJ#|ip5m!9p{PRzffC-?7YP>^6*3ZAvt4JH7#y{ z_?KpYdR#l1(muq^I4xpa@Gu60knPnNtIh~g(?RW9#x0J-*+ zDIoQmB69sR1x5q&PFaBkIWlxy=p|N`xC32Bqa$+b{o3=CTetVRXcx9$VWG%Yxg8<* zP1#X2OO9xq5}nj z(*>|biwU3U4%ogWp5QG>$tx@g9d2k$m*SaOD%T^PVH}%7h`yC6DqnjJv)(MmHfam# zdEv6YOvR0GkfwB+-A7)j+rXO>AV&%Jg@0Pwn?h28~87oRhCf5=N0r!GO zH)yZJ=shYv9VN=a2#R`PbY?0Pb+Kt$Xorm}nLotjhb+y; z)@=>9c~g`0#+GD@Sndn0ZE|4!gWhLj8Z<`U{Dd66W;#FQ#X@4;7A(rNzJENH(6b-> z0KK%yL8807xE*;YSo}ji&l!VB15)wQD~$1a?c5|w(f(mpr4b2pH!haVndsm@%!ibr z?~qpIASU4(u+-Z|F41_@wa0jp(Je{Q+q-`alS0%iKK|qYJvG-wFMRV$J#nYzc4YIf z_=iK@Dt<_YMsF&vx~smRgMz}guBd?iUkhuTr+aU@qd{7oc>}hJr<>2*p( zSd_?J@cY!-YUH6iKl@)Y6o0L8JW|E8Xhs`j-JiU?nruE;jS@{8LP#+O?P#9l>ab>f z$m@r^3%wxZUYLKPPM(_sGyf2zHEQG`e-@8oujbaB5!8K_$Hs50gta$7GGO;S2rG|9*_S9{Y!dQxVK5k4nLv-W*DxD&CxBs!X$>3^>89|DyRIw zmoficO}08(+@HBwfY+|z`(gm#G52*QRMywBlr?cLt%HP!xC$>((Sr7ld_iBaW=V#- zKjI%vG81s;8^+y}k%Mtx1|k8SZxkMdc&bOPK+%F}8M<3cw1Ahg+M52kF}?YI4!mjV z@u+x_0n@G}GJDw*RJF~8(5dE8mY-ZCI3O*zvPZ^r@GmIsR(2BogIJ8CgmTjVwA*WuZ5ST>-4M$b{S?)o;BQPTAVmCHKqM4Km=?K2 zW4?bnLswg}$q0iWk*kbe7w!%3w#28+=PNN`Y2SZ2PiPNNo2>=d0!IdMw<%9DyS$t* zM>D6_4o`r+)hZJuLcQv#N?iY#$*G4MDF2q48`v>iK98#pGzHdBmzE=w-a+JZ&tKij z`d529fjpJ(&XASGO<`zd<7Av*sN9R*)f8IV28*g-Rsb~oLIF{33bIuwl1PIM6AD9i zAL#r!{6m1zRy@9wRFand&Q(@bQdGtNM|v}%L93zW8dnFhh!ezB?msqLg4QMK@oYzqKTnRVh#>ak-|xjEcn^JsRwQVxvjsE_H><&=yP%lgdBNAJ9M$P z>Oi`bRBgzv2+5t+xqv|GtXX9Uzj!aR z_*3<6T1^zFfG2jbcRr6NBXj-t;ow)lg%+5$yAeiPLJ<5Li*AiLtG zDL=>FO|b4^zx;_h`jd(8%P0|yL(C>`>P^t)8@Xi(HrDnB0#@puHWi>4vl9G{zyPUq zKI6|A*NC3Y?)wZ+7+$e_cB0|m=Ismn3oz(lff!g6Yw^d^uD%87jEDsGqhp5jMcyWX z(!>NP8Ji9JAZj{{D}>k!MEdh4)0gG2pQY~epio4~U2cSr(Aw%c2IP#_{?ntv$RcI6 zK4RUMLFk2ZDt7BCmn6eBzu~4tzZQ`vUyy;vw|HL@v`iob5wpc{LQzsTtQCwxZ%LA# zY__GlaXto7LY|;2A zF$Ds6V}@NHgO^O})$bO97)2-c5P&3PTbz!FVBv@)=0l^AgrG%kqg!Z@X!KVFboI3E zA19rsOhX~powY=Nm=|3b;Y#3xH}uT!bH|i;NMdC4J%9X_t(PHbJ(V2@EHqUtW!C1L z7e_*yYr<+DXp*Af{sm&>cZ(Sc`gS;oMFaZ>Yh>F|37pmn2^(;u*GAz+HQ!{x5Sn)f z^M3g7h(bXbM+deIriko@L&Z?F$__eE-@CXj1l;vd1sx(02YdE*sMJ9!Bk}qM0=Q8& z)$ea-W?N_{C@lG4FVc_}o0e94B=Am;D#Yei=B#G!?d|M+qw$83@tDItJt`yDK));p z0tL4$Z!@-cyOYj;bGq?_{lIX&h*Mx9WBxEH!vvEfOkm;Z8{;ZAgd2{~ zA$I?KXT2Z8R@;yWAWGECxIG^K|;EcCrwVg!-tVVDnFRrv=) z=CxPNfD_f3p-2Zt;Cru&kHLHj@G4P8rTxH+0J%wM=m5-W`kg++7yP>>Y&Vl6%RTWn z6la+kYH?fmMQ7>V@7Q|LCud(`>(B8=q3inm6}BHC(ErW&f^{niuXzkN_>esNkO3Hf>e*&@ zUM~zOIj1SiTbzfYSv3x+k=S#`CR@|bY~c^5HfIp;oHOyf;t;+jDERP1rXP(71dk_4FRRYN+GOxy zeZGq-NQ!%0k36)Rufh4eqNH%f7E0Y)O+}K}v>WZ4bK9=%BSPt0jRb0dTY1s@1$FEp zBaw#b=(qVPe#y}Z_f`r7oA-l#o3KNp@ls7GWkF$h%^Ry7w6>r#q4t^qZssWu<4+yR z)01yM>!c->mkR{r4v`xwqiCvpa+>{mBx>Y<_8J9gHG>CV7mGB+=q z@F4RDM7gTdB7=lu8H_M%bTQ1tyNKhT-gW{5@wHcUy%gyl*;`(d--^-5$A7i~3llm? zl38Q1VvN)7{O+kmb@CLb zoXM)Xom21JjKU^b?+SvOdv<3<<0$PP;xZgg3)9Yc(pcvw{})C>DrzJ~rEHGia0o?e zcxGydD*d)Scmr2f0$bynmG6bW{STQn2h;<>m5r-wcWEoa&@AVPlt7r)zi4^U#sBrvLo;^B1`A zqeg-!_YnD|YCeL*{IL@0Q!sqzm`S%}kN4x@%XZ7tE7q4*k3{VPtnxsSEGgC~#klKt z=!27sO$2Y8y4YAePYa(;b-&+E@zA&r!8NOHTb3&%eeG2T@s+_xZGF2MnfQTn6IVzG zXhH;{c_p1kC%5@5EO=$M2|WA-fi2sgxcOejZNKzW9HX*+-F=+mvT^a%07f-sSaDWC zGONBKwC6>gw&Y3sVkos(*zt70^Je<%u{!>kVQ{FuWP8eFalB08DPP-MGBll~ql)vB zi%nyk^j?SO7tmA=EKECOjJhC_EC}H6w9FNkpZ|3VY39h$+N&5Vr|)s4&~+U)x{UBy z6t2f1Jj@&*uZ(L%Mt0%7KeW#uLZ!l@&QxBTU)B8TmBWgCkJn=e4AeXtDe}pG(*5gJ zn?y~mSQpn0yJ%h2c$!ANU6;_l2!%u1hSnWqE>t}UDiz=S*Dt%l)n$EjCa(_h8A*w| z%=G5m&p+p9vw7oOfeyJRC39?h@*B28{TnV~IfG7ITw3UryUWvet=k`Iy+@Ck`IHJ^ z7tH)9mCB7C?;ZL8;gMZ2ESlb_swqmPl_7CMNzxSe`-TSzpyQLt?2yW1{zF}$m{K$0 zOitH$N9X%iX0a(6QiGB(EKH)wFu=ORdy3X0EfMgDTQCH<|ub&3m)^Mao=DWnYZ&8fI7QOy`W{1?Z$i(9hY_1Jr;cLZbvdh)Yl80;mE+y7o zGOPG%dh5el(`hVAhcg|+`t z<7Qph62M7gJsDH+zncv1;2GkSqf%*5Db4!IYvMc*xZ0Vr(oE*1tn6J=M zkANtRMbM4NxV+9>XD42@R{)mT8|c(jI4>9bT&LuwdDJz z+r?1gGPy?LS`;ch+t(?7|9*y-Nq#C_$IR^{Bo6$lfztEM%gfvr0^N}R@%Z(*b1uVy zJnW|KqeYwnw{@e1LngjddC$8--o%RmTGyv3d7qBfrJ~t+(9^4^rIB@NwyP?4`NN+O zVWrb0Mdo!5G?lAP6c{9&+b!QjN%#Dnd3*ajxZ^1haw4O}=2NJQ)Z)`exAP=vEK1|M zo{D~d>7)uF?$2tUc-Q6kccu}JPJs=+m*_F=ko%%z*=%ZePzT2=H|nz;NozW1iynLV z#5}*b&lIl&|1$#zlhX$g{$j}(3C5Yt3`kQMf!F2-a#0sr`LGKPiXfWX5r(vo=z080Dwa?lB+DRsUK3iE*1tba0{v7wSmDa%F z)Sg{7Q6Slyzd?}P6R0VeYYLEdM5{pgiq!?`Z~>`5BC6I3ZT3yEQLynB+TS?DstOe7 z+i=Qj{dkYIwT_l8_}?x_`Gzu)TzY!G4+N!Lw;wze6BTv$#EBDo2Z@!?+jO1K%FIf! z-LA~8WdnQ)1pyq*^NwsQ>S5nM3fySOhx7?oS7m{`JcJD-OFG4*U$!Zmc^kZ&vpWj| zrRH;seKJIF&D_}-l8h4ZtlZqrH?~rgu4%6&!`A*&nq_;9spH)|l-t+sP;FeF5c;9$o{Z2q}Pz%8u=Q-7R1uBYiW_6Y&mD0&F)Ti$fA zP1reyZu=fANUa361lvJ5Czvd3fB>aoi~{T5BZ9et1&|KvI{cWuo1bMdloEH%zoLpx zseYc|9UuZ)346WYS$e!Xn0mDcrEWv360|Ee-A1F6fz3L6lTXgH-zj0ObO>ZYV2z&* z(mb226` z_u#jkg3#JNs2hBz=KPozGn~KrFw3bJlee59qbW;+FWO^AfKC#Y5MxKYyPmBNTOWJQ z0l{QS`*=}lk}MC0Ppys!22 zyy;+T?(6cRt6=%Nck!~9=`4<$xm|l zPeor1YOxv4IyyhLfO-k<`1vluCy?Cw-{^kW_{96aI?g;Es`u^VXJ$+^YAjh=?2@gd zQbhIF%WhX}hs|7zfw`#rVcRSHY)dDYM#(W`LRcbb9zj zROO(OBUq<4mGt>^!d_^Ve|tLZpXLnW6gqUWH`GhSTXiXTM z&V1!X@Pzc3qH6}Y!Nqv@zsLN7L$3*Z8vlRpTsv#?R@!G{k&)T z4n)eBy=pAc1u@_oF?L?j)+PVtY;A;u zbcRvK%d~jnE~)J`&D05|Q&n&dQi{2p1fdYphlEY1|fIa6e4V?`Q1}FT?Aw>?Ipf~LqE4na>(Akb0^Se zPFiZNWL9J3ESfssy3wr9bfB*WQh%XGG+z{L+l<&C1cTa zESKnR*OlU*;rF7@)Na7PXhoYPPOLm%!7UV`><2o+1j1J)a$Y;2>|-p{$A8&FyHWjo-nAFF znGMJ6ISi7i4fMecypc_p-!frFX&2xu+=d7RFi;VoX|Tz{fWuPyZ=xs*IwH)K89j}M#;D-b)=>+ zpi>YXCfy0F`AGT1GH+_VIL&7APrW!-9kFhTf3rm`-m8LYC`5gDI`f~0yRCoT2BxIV z%Nve8eP##y*$53N-C&#F^2pp^5 zRor)Jg+p>$`=AEowXCrRkP|LemH4<+Vn#1uLJA$;;ysWPgtWX=)(M&Ij)rf%ua_?T z;5EFo8u)IohT|eEI2ZF?>3p9As$r5SpU=qN=!VHJ==QY%h5iH;LMcT@696sv2FcUEY1QSTz9XDlhz=pH5d~D*DVdGjTpL z0e0UmZ%3Q?QASoLp4$Qly=qN^;+FM^W*9uh`RR)AA}fld|Lu@YGYr|hXtlFv z9&ZKht{Zf46ePMcmo^9tLT4hu8VF!#Yr~PVx|kPoAiJ;TOFVk&1{kxd>otSc?(&{=i|M(SrG8j&@3>)Wz|<9gho-E`5BG zNIfusl3}mb>HcMzYK6R5ZJLdVDGUCK!N~MvTa5txb^o6oLCe zh(nXspBc{x40-mR!^1J^V@Ffi1*ODykHXP$B~JaCS%I+sO^@rE_VofBkq+qQqP?@e zMK$+|Mc6D1%JvD!ar*9AaA2;$p&9eZx};{(S)sh6Lb_4NL%z*;{cHgorajs)?mbRF#~qh#3tPGF_e)B9CwN_02P2LI78)-{~&wVld;8 zT_YTwTv076`1)(eviVb(MP4JX{mXKGUqw=w);_CeY$<<}^5XG<_hqvZx~a~!wNgW| zwTMZ?!Ife?yA{7+V#h(h(S3y}b{ic4UoDis+MUP$K^x8XgDVDJtJRzZuJ+zSMuDe% z^`vk-`p(JOMy5U!NMji*aSbbjH5yH`^}M#2P}d>}{np^}x_kTwZobQ8T#==@qA)Lx zq9tP6KCg-*w&VIpP|WkU$+1HxkYMBn3QM^6C-P)jmPp(9%(lf+YA(VqzgP^(SI)>c6XMvrp8bikt`Vu` zZGFC#RC=-(@(JMWe04LGOb1^hl?k0@MTnZa+Uk*Bc0!N+3s;i7a(9J{37N(%{qOf! zrhZiMHo3jnTjXC2pQA6pfj}H%^aA|kjdg(7B8Cep8g;A;A(-(4! zdV?a!68bZPLiL1Kss%76-b9}*vpt{t>n91b3@Y3d8NtAu8KKa{4Z?rJyg4OsC=Jg) zF31*L+{HK}Xd?t~7i{>JB6p$t%_OTuasd`v&BkAb0HX>QXjH}FbT$YuF6jT>ObcnK zsINPtQy8aGwt5`$Ly}ox@)8iAP{)L98seQ2yUyd_os+wYT?;;_1~@$Q6ceNKcOU{I z=Gn+@lSloF|0Eaoy1)utW}DgnBsO{r>v<d4j8a@BckM1IGp=!J-4BOtxTX|HH za<**iMA*>%>F=6@X+0G+ydHN+BitG-GlL=fNVPbJ=hS$-*~-(Z+*P-bpDiMsv~xxs zjfIh{KLr|_H1lJ)70>o`0bwIp0bvYp(>@ND4;A${Sv*-MFWZ+i&+Gu1KnK7=xjIF< zVIh%(9FcKqcHbI4VvV#%ireHvO0dqcia*wf5}vnYdS6ynpi_>_n&T9&wgRhO(Hb~h zVO=k2!m>}3GqQMbXOHie_)5O717fm^!Qz-u_a6@85iuc!S@I#(RJy%4vNaP$r75{D zP18l6hVuJ$u3mF8UeTT6&&rr|VHWz5LkSK^)YxJbk`n#Ui-T6{R)yVg_ESGe>xH6M z*;ezgzR!{7_DpD${AGC0xr6uy%Rl})sw6GG%Wjoj>N~kmR|VwM zOJY`p>MW;(;y-cRc>=g{+0S;7tPkI-7A-p;AuC87X-X{q6M=FnUdeSig=%C9zK@c^ z$jQfrlj0I`WgfGPM)I%TwucL%A{_J$@O1|tH~JMsAcMvtN~<8V)lfmG2=aHw7%(mj zHnB3voqn_0L)Gux1h18?AOHEKiYD^n)5hu7IO~E6tdAJ{7JqzoA=^BuAfQQI2DPBD z)>UF^^<{`!XGQ%L0iI*5)xeQaYUqnok|pd;(}TShi$bJ9=l)^cKl72to7Dqno4T0# z;dGo1(G{@yCn~dB1Z~_vGeTerP->bS1Icv$TL?FlQG7|&VuYcdyl9P=94foOrU#7v2ULQ3f=dbX}J2}ooX z9oDb6C4d*O{)vF)#Hp53j9~N(>eXk416( zFI4P`xy&`U=dRTDid^_!l%JxKsgkx_Ro&TR;K&<p9HMCn!N?YRw6C)TC@bf5%lV z854-{FW+lkmQ)ceJo7kf5u8)>^#$A)aqR&Qf74y=gyoLTl)%8i>HDyVTh!?;Krs)a zHS4zt+!;%lnG1tA!R9rT?{a0?glSCxFPmf9tpfwnlYK;>q=iBgk};Q0R+fj%CC-PQ z?K1tmt|I#~4sIT7;9Y8bOVyB0vy!LBaxB$I5`0dWlqu(GO_|k#A!)6sW5bA0((Q8N zfOd(m?UBZ^$v5nF1l`ZxZy)yOdT108a4FYL6LRTW&^Vx0px<<~W4W3;@UDOcU?vnXI_Q4U`v@w&t$!jwcHou;^{iEn}ab1SPRlN;9E-=4l zlo3+Sy}o5LxLT(P9>O=Q1OD9y*#GPTmkL#gW`ezYu7Ar;Y@g(6_0RWcRffIi*BSW8 z!e?5(VRRc#*hP)&v!; zcr{l3^~YuKP2n`+4JwQ!)m~M|49T+g~5P1T`;B%ouh~nd48T(sXFR?d7uk zh}n?;Yu*~hUh#iZka`8P7y#iV;ee!C)Vy^MMdiGnSLqebuESb?ZZSw>p6M`5Q_MyD(96>H4dBP z95F)_E&4c@gNjpm6q|}3ai_JN(|{4M#cpP&?Gnkyn!>HfN>ZjXuz zIMSHUGV|?dQ)tNuoI|al(dTnxo;B$%nNf%~;+M}Bzfs@K#ShTO;iXBkaHcCZHN(pU z8A%%&v}fB{ypj<-`Q4bQ@8Z88&S*hvRfS*Hj{6QI-L8_}?10ONCyba`teAHMJiqp? zC+AxgHf%nN=6;_dN;MB;#)wVT-Fw*Th&h3237QqauML+sM;oGKrQpk4relaZGe?il`=gnTlxfwLx?*Gi zKZHzaZErQ^eJR!6!TzAj2E{0c(HQ;!Px4wv3v&2o00 zQI5IhbZJOgsN2-iWn_Kh+GlXeOwML9=Z(4$!Z<3=5W|Ch*IixIN2F0yS|KWL(x2}p zg(Zm)&4zd}#8=aQ$1FolZ(F3;QnjtSOQyx9c$<`n2-(p85DvG+)G68ZfK>A>^kW5--kJ`*}!idug%J%%T<@0 z&J6?Ax9<5-8@xW=J@kMxOD_Yv+xYO@9kj;)o=c4t?gwC(gm>3dtW`b%Sx{z~6|&sC zy$nW1OQV>^EHO?b@E==MzNKR9KLyrwIqR#}2{qd<#|*x*UTB~4-zHIg47HQ=Rt7yJ zcx|LPg8|ZIfy1AW^`QH7_+wNnrL^{3b{c67(LA7ihFytE)=Pa7@Yh$$J^+*76&Vy0 zdI+>BV5JHG6W#WXb?;wd&#V<4va4rzBqU!Bo8&P*`gv)c5_Dwsg8H@L(1)}T7fXF% z{aHN1c@`RSJM6BrZg~_hS2sn>Qkae`aW$lsfd(h8c}Ls4)}^tMkY4i0hK#?<|7qbd zYQ4Z9+NCZ{gg;W zSg#x^j~T5Rd3EcvXTlp08`?wh~}E-WC@9U3@H#RZp{Fr4abO$5!pmSIy1TE^?3dEGf(!`hw^L z{O4fM)sQ}#_kn^QE2M(>IiEi5_-^a_Hqo%m8lIrwHoaIe+I*ye+8@iIZUS74CMn># zzCZ!j1T`V$%M{ZwPZ>nTSI{hPnpW!OJ1>WhT^De_BpG-mUwdT=ZP|gCGy=q>0mp&P zQyEgxd%;)t8U7cm8Gf3E#9S>{g$$XFbh}1y+&*6S!rCn=(*iMCSTG!HY2*FIJ0vD- zId?jGtr)nIK{yn6ih#8_{hqjDZ(CHnT1;TXHQuUJM%6nDhdVlFPs@*;@tFOm3ogoj z0(D6kzE-7smJK`)sVK8p1>6)Y&6@7D@=mkkkEKBpKQvdCTsN(JACYP6o6-efA4 zD`>e#p&-*MpV~eg^`Mw2wVg;r1i03{iKlmqo4+z;TC+8FW0p2P~p?5m5}v4 zOqV2G4}M}=5!qw7yC7b0TN_dW~34 zst9I;3V2f7GVjqee0uxP5k-_$hU=mbj4LsCT` zw^bpbrSGVD^&dw1j@W2T&6c<2f%UB~Kscl<6Z-=t7WV2B%1cdJf_L1B{Lle*gdg 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 a09ecda489f9d9afd88ed3eb48faabc1a0f7058e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1430 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>rpqc&7RKGH3zW91N_C zLJZ7679$WcFiJ6iOarnQycnh7>>x%Bs2U~)hW1Pb7O0viAPoWuKn&6Yp_vvi!BvPX zU`DWkDi|6s7QX~ioCO|{#S9F5M?jcysy3fA(1gg$kcg59UmvUF{9L`nl>DSry^7od zkS+$B3M(KpH?<^Dp&~aYuh^=>Rtc=a3djZt>nkaMm6T-LDnNc-DA*LGq*(>IxIwi8dA3R!B_#z``ugSN<$C4Ddih1^`i7R4mih)p`bI{&Koz>h zm3bwJ6}oxF$`C_f=D4I5Cl_TFlw{`TDS*sPOv*1Uu~kw6Sp)|Vca~(PA#BPkhI$L= zL4A;nzM-ChKHO}eRvVD0m48uYD$r(-`F4gjV3jChPEak-A-Fcg+g~_PWM6q&1~-S3r^b=qz{ze)Juc1qprvSd&}CXc zNQo||bmD4;->63@APz3K`x zJ^Ri;Q%YC9?Psg(LDz3ZjO?>89&R%?RrtOV;s?Rn(sF4kd=_vm4QZY{V<2H|E z9l^PEoYOjwGo~~eJ^a`%e|z;@;hBHe@}4`oI z&6_DDS(8|nxbx^aOC{`Eeg5R(2b(9E33A+jJ$LmX#@Lh1IwcFbtGT-seeNH)?3}=0 z5FE&e|C{`pii$C1a$l|_NJ zv-BmJ(sOGM3P$^0wss9YuGqgv)x*4c!ade$PUUu1r$3xxS-4E`7LT|3z6T7-&X%XH z^Uhvd_%Y%AZ}r=8j&55vZd~giCvo7?g)OWTr`LX)YPd@2eD$wG+gl9u*0`m=n><0N z|Mkvq_dfWZtt(QTez$XOeqs6Sw=B(tLXDC8))nP4$W5Df&1dgTZ>JsEesgv`f5~f` z=woiP_h8^z#tkJpFQZ;=S;lE|s>)NorL9m&#D`(??fPd4+LBL=b88n?RhK@F?YFOp z3Y2aB`R3g7CE6D|KWJ&khJQaRV>wI7`AN_R1GnYuC#P0kmiN#PxA*Z6Sd=ciRkztq z@$+(!AcNuHUTdsRHwe|pi{{$#G{ zg{Myi?9wdn{CxeC;qgTe~DWM4f4LcTT 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 c4672643ff652d3db8b242deee356705ac88eea2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1437 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>rpqc&7RKGH3zW91N_C zLJZ7679$WcFiJ6iOarnQycnh7>>x%Bs2U~)hW1Pb7O0viAPoWuKn&6Yp_vvi!BvPX zU`DWkDi|6s7QX~ioCO|{#S9F5M?jcysy3fA(1gg$kcg59UmvUF{9L`nl>DSry^7od zkS+$B3M(KpH?<^Dp&~aYuh^=>Rtc=a3djZt>nkaMm6T-LDnNc-DA*LGq*(>IxIwi8dA3R!B_#z``ugSN<$C4Ddih1^`i7R4mih)p`bI{&Koz>h zm3bwJ6}oxF$`C_f=D4I5Cl_TFlw{`TDS*sPOv*1Uu~kw6Sp)|Vca~(PA#BPkhI$L= zL4A;nzM-ChKHO}eRvVD0m48uYD$r(-`F4gjV3jChPEak-A-Fd5zISk-jD7mKCNdj z%<<8iqAB;iyX4knCj%CT3PH|k2R#GwPP}^j`SG`D2Oh3JsyjV1-{X?Hf$B-&J*CF_ zTVn1+ef7BWYR*}kV4Vn+pF3ai6*~6i`nufWQ{&2>ZRy`pxH;wA;iRK$|JtT@pKJRR zZnMa9+S@bhbNyx+&n!%1?hZ^a(r>spmz!bkq1g4;-_)h4R594kF_pDW$+i;Sk*&jM zo|$7VVaTwiJ>fCaTkk(Lo1bZ3*qA4(rRsiCuDR3x=k_I{uk|yX4)43}wc*nmZXT7( z;RSaXRSu}9GWkSoGtXO)%=qTgA*Y=Q$MviaZ!`|onxrUvz#;WVfYgb!cInE6EXy{h zvdB%#W_{D4c%Z0k&Hl#$52k+E6L{g_S*6!Z&QoV5yYJt;Q~zKKtCiUf^~p{0B0>o} ztPfxN`u3upO5Vgw#|sZ8J~Cw6z$22oGAOWAtdpa8bHKUV8)wIeEw`FHvzouph#JutPivG>~Z$n-)T&%O&z&u@f^ZWPD!|%2~ymla$ zt@hrv6q`uByn2QR`>4r}wJql{MEt*TN^8xL*dxqpw@Wl+NZMh`bIpbH#9H5<`ELg zRMN<(vyfZ*=*p)7W)|5Ab4+>Db>0e|+qL2KweaZm)#381uO)kbpC)wY%2FnSveK>{ zUnRasz56;nWY53D1vlzz)_(r6=;1=~koU~qj?quiWVum4i&+g*9rID=FFxJp_j`g0AWv66mvv4F FO#r_OC58Y1 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 b34c99b427f95c85f82c69d3d112d6b7971d2e9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1192 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 bo}8xGJD&SH%%}mBlY`(oMz^bOIXwG+{={Vs 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 0000000000000000000000000000000000000000..fe6a77489210049b8b3a351b2611182c8784cb7f GIT binary patch literal 4207 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 njikvuA$R93k4%dA^8(7;T8k}QUR?) zTcK63pfF=a1a&|_5u{SFC<}-Rxqy%=LR7#D0W@4PC!t-l=3!oZ@uh1eXMbm(?>qb3 z`~M&Q;;@ha6C+C_0DwtQAUOg6G=ykipaVnKS^HmM&}I44`~kRJV!RZq2lsZ2zz7-u zf~^1u3jk2Tlu!XcDjtAmF#vd-0ANGnscYf80YJ&ag6R}UkZ`CHge>8Z#2k{81Azwr z_lIb4JV_0Jm`#$fiK|CL8i~Jjm5Gp~2w5E!HH`dzs$pvHgtt9T+NIe-CeMEe%Go4o z!tW)-8a@SPdYLo{ETp9k3Zo<(m?ulpyk&ndp`Kuj4g2tOhNbF_0N!dgx zlc4R0JQhP3hGZU!NxZ+U6Tz~Dr ziEwl>NJBL9A50)f*%Wv!1cONd(127sQYnWjM#v*yYVYJypgk#UJdrT08M3A*D{;@+N-mA>dYiMyD#gF;D@Y2`qcTVn^h1qKlxnsn7*_Nd5?6#jDu%C>XLU2=f*>UI;wg1xqGAPos4ul)S#K13709f;j z=8r1Ft+9eh3_plQ!HlCVu|{^o1vlZDfn5;UpPnI`mKCPaqbvem)qQKBCD_5hsCX*eu~BOR^~)*^VjvVJ;_yHXxpj0(RU8&#|+c@J$oA1_y%D!8dv*e9DsTTzxKPwPXO58d1yrR(q8MPKM;^L?J z6kQ(igU=MTuI|lvRTJ%tMn}Op&O>+0>=EXOwNGUCP{Yv&zBmxZ^8|V%L^Us!o#&5{ve*8Ji;Cr0k07g`Uv~1y=0du|-fdW#Vg*JuYab_Ul}7 zR{c7++q`{EXO}3TVe(r=Drmk~(vf^MU>SRQn`CYFM6!2Hi~k8M1Z~wV{uxfH-Y01R zyhE29Aeg5@-~s^^9!YE=2P+!33#L{{!Tycl6sq$bmt(ZFfyert9gIBLfuR3@!-A)9l=03^3^Dk1?It(#_&Pf+U_8v%$@r_ls=(pCiM&>U{G~F) zQ+O3l&Iv|VclGT}J4?CX)^Ca=u>OJB8o3lcl}cQdpRZ8#vm*0#y8RPyWU^+mXH>)p z!n`CZeWk4sh3VeS*zvA4l5+Y)6yTf@3DRQ#&a;Pm__%CM7yxhwj29n1)qe?gy5oS36_ z{bWW6_kP}wvR>%!Io#%eC4_&N=_a_?%Ng?-&6q1dJN8W%S32P)#}b&zQgrL<)WmRQ zg0%Hz8rD`lj&@9VF*Tc8=pBl$-FWA0uRh510KKK=2Qv4#GbUY)1eE|@3x6pIc_s7V75vg=_1;{o2 zrs?R|XV#tRqELD?2G^m!r@)-=a3A}dK%Hk>ZF^2X=fVzQqo_ZU)QG#TmZgd=Mw0Fp z;@Z@rNKr{7Hs=~$w0!$}iXV-3_28NE#TP|6C(4@=;`A0??6X*Qa-V)Q@sF|GH_6JH z2l=vohP97cuIy1b)Vkj|rI0W8FB;2jl+StADxEW98%hFhP>{Eb`-8cgmr`V*xh_`A zY}Lzu-N49Nm!7T+vbL_g^;Dta-`M{6;I@l#y|^5HK5XGrKIb2Z<;Qt3lH*_iu6S3x zGv3wN)q}o$m)CZ@mzygNkN3jkee&9x{zriD4#YDv|Gyx3M8^OMHfkzF@|gVe*yK2n io}Rufp36>Q#3sgV<0Z2yW_DXb5(uJ%kQ<0G`TqefgT)B| 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 0000000000000000000000000000000000000000..ed175634b3b7e4284c6e5c7dbbef5aaed36d23ef GIT binary patch literal 3879 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 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 4017bf98deafdd8af75e74b30dc2f38ab8c37c63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2390 zcmdUwYfMvT9LC>MsVGb#R;U9eE*Uh0Tg6zA;hU;l$#N}FhO)PWuqLrr{A^@`?wD#Z~yOme*for-gC}- zl9p|a3|?VoV@3#B5gHO0LkJ5?7Fo6gQ+v%PotR8Agb_kQ8jqMSB(rh7Zcj)|1R=$a zgwO{GnFpd@5>mh?quVBh?mqzTjN{FumCva8MwdhkRVZnjq5c{JLTrAHCNmLNBvcveJzIR?}3uu}j8WChV$+F>CT3_JQ ze*+v$#$d$JFy;ie} zZ-4FM@q1g9%))MJSKGAV3hTy!Q4y8cHglQ2I6fEe*Ke*=l zy_UA($^?Fe9T5#UrA;MrQheW#6Z ze=*=Q^`e=k^DH`tzt%g8Ii(1)-i;vJqAVrbW%g%uT227=M*^CEng;ml0^r2~1RaY+ zkhymO;EPGXiUBBN+>FZWselvb01tIRxysF`Y{^%$!)Ko|R{ZN-P(GAF$!SGq_^TSg zx?w1f%b?`kKxX)h=YS`Np^RHPeVH!%U`Rv_thw68a$GM#JNe0?S%tb6nvo|cnl~s9 zP4E<-pizyxGg${GQio&nZbBa^oSnU(2%fXC8ccd|w% zF9Df1C2tw4H|L%Kh6#}Au0f_<^Dm2LUYRP$JGbbapV0LP8W0SNs3@&W$@WQWhv%Rx zJnaH}AQswvfTtV6x=51C zI>hm-Bu`B&d9>I2h?01;{Q;kswSB&)wcb>TPw~{;d8NZ19xsq8a;!TuP_x zY-Vc=LY1}HP%2HNnW~0l!2A0ELseE{L#=ch%~)tI61{y>1f}!MEN4wCHP&deZC8s8 zCtO4{Bf44y&rm<0i8<0^U6N=fsworl2gd*d&5<7K8V}f<05}>0$TCNIm`g0pxHpAR zy0-3Bfd1yl42wXfyI?=y$V0%T9AqYiBUA2?1^D1N;1&)tlOm8Q7bF6X#<4X@y3DM> zU^##cp`(*}u{}JRW=v0=A$p6AH&FyFD4th|K1wX6bX9j6Skt~`LilU~;0s&|U){)V zn&BxFX!q2kD32cxne2Jo>HU^36BytNZ>E(LHb3~-4%psSsmdQs(-Kr`2J zaSZZFKT0=#e*oPPW&V0T% zpTDrNOZqQ^RGylZzW=`shcgv@Fnnm-Ay%HAUznViMhXiH-Lhoaiap6WX>Rho4ApBN Q8;D3~P-Nhb{^GCx25~;Zp#T5? 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 cccd3d08589144716ef5aa3138f31298c5c16fb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4966 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 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 c4c8f7dae716ad92bd6a0cfb90a7271d10869d9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1098 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>rpqc&7RKGH3zW91N_C zLJZ7679$WcFiJ6iOarnQycnh7>>x%Bs2U~)hW1Pb7O0viAPoWuKn&6Yp_vvi!BvPX zU`DWkDi|6s7QX~ioCO|{#S9F5M?jcysy3fA(1gg$kcg59UmvUF{9L`nl>DSry^7od zkS+$B3M(KpH?<^Dp&~aYuh^=>Rtc=a3djZt>nkaMm6T-LDnNc-DA*LGq*(>IxIwi8dA3R!B_#z``ugSN<$C4Ddih1^`i7R4mih)p`bI{&Koz>h zm3bwJ6}oxF$`C_f=D4I5Cl_TFlw{`TDS*sPOv*1Uu~kw6Sp)|Vca~(PA#BPkhI$L= zL4A;nzM-ChKHO}eRvVD0m48uYD$r(-`F4gjV3jChP z`Mk*wp0-*0dSLvmtw%jq+$__py!)@>*Ut4$jC+omO}sx(JK>A>vjb&Hwr4J6)nzA| z&5H3d5`6vU^q-K7I=)l)%{xs#{!#ujcR|jB@H(Z9<&%OOc~<50Y+{MJapqIomN}fY z<<_6ev+LGQ-+fFes?z)Q#$Qi;^y~9DwmJpQJ$Cl1s>78sJ0Hoy1726J%=?fPtp%+XM4Q=qg@-X0NY>g9qh9nUX<+3zET9rEuOA^ JF6*2UngE(`c{Kn4 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 7ade922df0c4ed0cc213faa41dc434130113f06c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1087 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>rpqc&7RKGH3zW91N_C zLJZ7679$WcFiJ6iOarnQycnh7>>x%Bs2U~)hW1Pb7O0viAPoWuKn&6Yp_vvi!BvPX zU`DWkDi|6s7QX~ioCO|{#S9F5M?jcysy3fA(1gg$kcg59UmvUF{9L`nl>DSry^7od zkS+$B3M(KpH?<^Dp&~aYuh^=>Rtc=a3djZt>nkaMm6T-LDnNc-DA*LGq*(>IxIwi8dA3R!B_#z``ugSN<$C4Ddih1^`i7R4mih)p`bI{&Koz>h zm3bwJ6}oxF$`C_f=D4I5Cl_TFlw{`TDS*sPOv*1Uu~kw6Sp)|Vca~(PA#BPkhI$L= zL4A;nzM-ChKHO}eRvVD0m48uYD$r(-`F4gjV3jChPa=H0zL=cDh2%^ijcVoDm%C3Buw=`uA<@VfHC z{z81gHL+W_ell=79(3Dy$?sxD@?zI35+3S;kCkWbmMyPgaZxGS*_bMC{`u_px98q% z>~(SKZd(^n}OK;lRWSO_`J5lolowKiek}8j)=N_*upd$NM#9Dj&K6 z<_j&E6sB#F!o9xVNmurs?OtBx2b{HKTQ5~UW8B`DEHL5XypT5638z+zG4wO!dM}y0 zk&o$fGQXy^sY|rx7ROtw`k(Wh&B#4+IcA}eb<(F)k+^;5x=~5tz-MqTZ__f zADJ-0@Z!?@Y!!QhFR8Yi+WAlJ38Tw{-tBAWKfn3a<-Y5VmCHVF`>^Z6zDcw8&N5*S zt$n{DWBQGM!N!6sgLRjlIv)Qy_LF|qRXHxvZ|$|y&(7i1nQGkfeACCh8`i7;E|V_J z-4RffertMg_sbN2_UTFYUSCx{$*lX;%I2Q9@1=D+8{ZXdwtMuk(4h5!#gvock7o&R zvq(f*-wZk*zJL1j)2@3|dNzetA7VN3=O61HX3plD50XAdl!LN}r>mdKI;Vst0PH<^ AIsgCw 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 07f756b3e8fbc92e0847f7bd9649c13889b5b4b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 989 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 M;{!&8dz~)-KMgO-eElX*xV_RF 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 I19BqmB{42tR} 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 T^~JfX)o-__JCk1Kx;5n=oZ7PM 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 a7ddbfe9b5d523fdb86f122b425f9630540ed480..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1276 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VV{wqX6T`Z5GB1IgX{iyOX}-P; zT0k}j11qBt12aeo5Hc`IF|dN!3=Ce3(r|VVqagzmP+Sm*quMhWSfFZhfHV-WMFI(+ zZU|joUaps!mtCBkSdglhUz84%V_v|BuwwxeT))TyW&|5#(vtNyEkKI1z$3Dlf#K&1 z5N159cJLR_{L`5s5hW46K32*3xq68y`AMmI6}bf^+Db#HwJk`-_X+1Qs2Nx-^fT8s6w~6GOr}DLN~8i8Da>`9GBGMVRWk4;laW*WkID7rv05N%*z zK`gTY291?-QEFmIeo;t%evTb_1lj1Lt3bHa24tj_e^F*C(61mL*%{jCV~9c3+vtP5 zi{yPs*n&lYfosPFv~ZB1)Y(#^86zM%z4+PL z@B6>EUw_g1`Fw2JyE{9L-F3+h??=IXt_oJo7f6uR$Chk{1n9bcF=@)v}?j5V@)ZPXA*`C`myfqA% zC4KEfX2tBdh9cpZFRX5kH#zei{yTpV5`SQ)v6ibgUGHAj60f{3#@{$kXv$svQRp@~ zeqEXN!tE&+mM>hgGyLLL_Wqfz;j8}ZES@AMo;+)P_ZqKA)|V$;OOh+oS1dJszpB2U zPsLT_@chf=1rIMidiicfEdPVkmknx|=U6Xpe4<*i_Sf0lzdCC-iN2J49XR<+OL^jo zw#!{f$0`|5cP7Q3Kgi;9NcDtaZ$0zz^a+p6Jl}>_mGS%)wWt&@{;~GVjP-{%PBrP2 zS$oC&WuN;4g`S5026nTLe_)#PUF2Ki`Lp(%{w7@O@;!sgPTw{z3e3w&?bi0)vz_T| zmT%4l!(Wf$c)e!D^PT?ZTQuq4k}&Q6x}L8**PKZSu4k05W~_JO^i4Dadc=d#Wz Gp$Pz<#l;%{ 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 32126c0d29a05a0349638cb825feca8dc0c22a88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16240 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 YC1TMp!etfkc02&rGt;foae4Ir0dk 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 0000000000000000000000000000000000000000..fe0f6f2f528c8dcea5340a7283fb608addab4def GIT binary patch literal 4373 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 wC8)TMoimE2Xz+F%F%D-dWcLgc0fH*h^Z)<= literal 0 HcmV?d00001 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 eeb922a82cf44115d8a975465145cdb55f9767e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23667 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
HI( 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 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 ac4cc84b29b82edb0280809a296c9226fe4e587f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23726 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 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 c69babe5b2df701cb2b59b671f34fb360c394d2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1526 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>rpqc&7RKGH3zW91N_C zLJZ7679$WcFiJ6iOarnQycnh7>>x%Bs2U~)hW1Pb7O0viAPoWuKn&6Yp_vvi!BvPX zU`DWkDi|6s7QX~ioCO|{#S9F5M?jcysy3fA(1gg$kcg59UmvUF{9L`nl>DSry^7od zkS+$B3M(KpH?<^Dp&~aYuh^=>Rtc=a3djZt>nkaMm6T-LDnNc-DA*LGq*(>IxIwi8dA3R!B_#z``ugSN<$C4Ddih1^`i7R4mih)p`bI{&Koz>h zm3bwJ6}oxF$`C_f=D4I5Cl_TFlw{`TDS*sPOv*1Uu~kw6Sp)|Vca~(PA#BPkhI$L= zL4A;nzM-ChKHO}eRvVD0m48uYD$r(-`F4gjV3jChP>Eak-AviT8HY3Dc#IE@Lzq@NzZwgeLw$I~0(w&Z+1MHiXB-Vue z`n<@0E5DtHqdZSWx4q}Fy8?oN-tu0LH|v+yYKl5@PiEsCc7CTL7Bh36l%01w|LiIIpLT|*nTu?++FVwf=v4V?pMs#U(@F*DiRvGM zPaQfEZ#?<1d8OUe`M))#?pG`coO{~OpRZrQv)N(Ch1n;4*Q)$jU+CZ8v*p>we`)uR z+iT5LoujygrR?u)#=XDSADR3uXmQZXtkXL^zWz!R><(P9W9gLzHTQI+aRhUq2Q4 zRc`gn6j@Rd5geLr!{L6d`o|9KzY-r`fa)4u&Ka`9%^ zG=Jurn`>mMIE6x{yOs6ilHm{ZEe$qedD^D2i%xC9#{`_Rd)E0q9LI?UK z&IsDh6v+2>m0$4V`S)UdfeY+)UO%{gsU+oENP1Mhy*1q;w3eCe(8bc(1;)oJ=J?%z z(7Tn#rmZmkx|aJo*{)T2#hpwoF7lsbl=*k~_3l~rQ@g)={<&R$_8f4#({Z_u-0$etKy{CJ=T>mxE zFzx20BPrYyE#$ivdt6~PNjcjka_cy09I`p^DjS$)&oy;Ggn=RS-m+8(RhpY^uNc=2+Pm75z> uFYe%JnzilP`hV$ve_YVYxc;%{={<(Y4%su$tagkBm294_elF{r5}E+zqg3Jm 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 cff1aecf10b702b10a4d539608a2068e5f9e89a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1541 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 b&^G()3SOu4oiC98jR(RT5e&WuL6-?M3CN# z(z{e?@;#jMmh+wUe(SFL&%JBibzvp!%%0ivo0+|5Ci@{&Rau6Z@CG3O0K{^#l1~8u zVgSCb;p2ku??Xx7ffFz@aV2p8D2=*$W_Shs%w#P4R0#k)SOEYN001W-39|wK&i4Rd z4HQNs0ssv9IAM!=E@!Hw1aN?3d;kYR0pNfm2>1&?cmXIlCI?@9!4?4Q4>|xy zf`0*V6FVamlbnsA8R{v@(8L`i;kbYAU%QmW8P+`p0BDYd+H$&H=^5&+~xi9*YPe6BCoLgNZ5PsigEj#KBKU7IP;jGy)EHb#>)&z0YIkUlzx_IXfX)SS}U) z>*r6LP8O#B)@1AW53@i6;g>UTUY>jK|0ITTv-lsxE@%EnG0;cv*X_K#>0*LVut6kCIydmgEx<_^ae!X8s}x+K-TMKp8sOIjGs$S&RIAQwqcX z&hZanVfbYn{}R_fH_abZaMy?sf|CE-fg*&HY`AFvz+x&VDX!)Q*-X=Q8Imo-JRA0Q zZ&)fdT+%6j$;)Y8{*rwRn|N)?=t|->)k5G1_pQg38cobL;ZEw!6`3;xaypmp3D0${ z5q)`fRNnruP*u)ZX!scmm3;2+@X(Efca0gEDua9tjK#CtyJ7C?i(!i=wh5I@E1XW9 zCxm(UZ03RYY29us!zH&9l)PS2kk*q1I#eAk10xV|p4wy=F|z zr(T|*UO5kr;}Gg~^kMW#O>#sEJ%0WCbM8BcX5|)bt(CH?FNRIZQ&;e_(WZ5o@!!Z@ z>IQ3PK6e*VF&I+u+|TZLfM1`Z#d@_FrKXdoMfuygQrP7^rijZbkcRbGbw+m3!o&S{ zlSWUrgZtw9NQ~4Z`o`r6DX^#G#`W1*Ngfjt3=yh?>dG<+{~B9y+Gh2Si9?ImteKsE+Vb#;x<3=DYgfD2Hn48yFi z2zKI>;Dk7{06H=q;x{o2Vuh6C3-@|W-|_F?D9Z@?hZTs}D`-6Phw8w8Cgb99Q3_;OQzdJUD`T9i3VJ8` zb5cc`e9du+wzX1i&L7@)wdtPPGq_rOy6~L+{@6257M5oFdtMqEvuT*WD~+GDjs8U zKlYh|rdB?za%ejWGV$2g_0d9}N8fOq(u|Zkf8_ci9{LqVLhNz3B_{vTlX?;)_ZriLwi(4<%51cDqE_WuFOXJEf?&J(wu?itYA&gA6{U_S$qH7nXXIS zwM1Ze8d4SU@uB^YhRd5~<^{Oo$x86SQdtB~+Si2%{B(z;A~}&tXL{gh2NpO5yMaXl zX6oxqID*+jj#^i)W09Yi3a*-@AwM19>~PaJ2-xZoB*{V1(#_w>XgPpX98R_?%ey3V zny;Ob6t*gpQ_$OY*w(u5lzZe)FsIya5C#suZ+D3o02za{BFKT_>>o^|SQ4g@&_sR%?_g~P zdK&j~TrT*#^|KJ`7r*?W@phjxs?=Mb)wVp`oS1Wa461bPD7ryn`m+^~E(6{|m^QO2%PEnn$C?fqKhB6HP9Vfy5!Qg?64#R-15 zJ^{7R$xQO2j~d4#CI{Mj%FgeXQj5L2MCp0>_UE@-mPWSXJDcv@^Bw>F^wrH7?wQnq zN{Qar9o(6AsJO;`TQxmDbU6)*_qm;k&(I48Qb_S9P4#|(#C_FVv*Bq@3tN*ZU?jFR z=e*bT)`aEazy~LZd71TIb%~hIWsB3B`R?-qyn+h*rS^c7x5tyDq-(`~!Vljl(0&a3`wyLs}jj zWIvEJd4*CyPOk1*7AQt?!KIi#W?$1}&L*%PS=PXmH`m1;UrAz;Q`xmpTDOU_c>RM< zzi$RCAYXfg*C+as@YC-~x6c0R;<&crQ2Pl5l$&71 z%-}Y5>Vzu1S5r1Q`LkaNe#~|%_BSW|QSJ9Rt0ZCHZ-oI;h&wyu;M zuPRsmIEEkx-WJ38QE(o6E5&~aK`!{t!N`;u@iWyn_aV(qpBLPuD2|P6RYBUA0KuQ- z)earAdtNDm==ApR(LL8x0mCt0UMpAqlCQKYa+=Q=1di)d&}f4fi4uCa)x&oxc26Ju zq7-U%_4(4Ar{ZChP>n}E7L*=bW?7P%Tp3!Yga~(j~+C>8eTw34mmQ z{RbN_0g{cEEPS8Hv3?Di`Gzzwv;hrO%zOk$CPot1GhuM*--Zy`!D{G=uADG$g9U@rfr3|XgBbo4*8HwL7FK}bW^(6v3_FCSn@)pM(`d<8Y#=sF_b43vUvaR5$M@=*R6@URW_azlvWnPG7es#vZ2X(^MSaarKQC zzEno$zPaOVYo|HIT6UQq-;-=cmirToD3R|O7B_sYscrn_tnj`f?%k0g@ve#HwbNGa zikU>%wzp3BmA~Sv+|$l;(HM7;?0NKzmwZ*PVD0(duS$8RZfj9zO{&>(zrB}@h4DQ@ zx3~8!{EGCu)6ehTOT$%XJF_oKv5;pY(Wz+to#mfy;+9lxeg7AHP559Fu-?_lW9`#% zyxHoP68kA~EX=pFa?hCE%A0~kKBMQ?K|V9)!K%pc+4_9P_idv$sA>_`lvZnBkCGYd zy5W3kn5isQ0hZ3ZY+iRZY3cqeSm&-*Vp}OkTH?NpuBoWd=&{sjwW%kMolMi2VMFbg zT`w+s1I8g7^SzVXb^_s#?B9LO{i4|54t6*$cgr<~B5+8BnyemGYZlluJIXd(RVuYm znKLpR$d`~_CATxL-bV6gv7syYyV!{NJf;moX6CRGs!~e~P>*j44C4pJGJ-n{L$`?( z#2C3Jg?8VEx%_cnzxj!sJY}fe&OR4Jj4u;*;z4INb+x4XHI^;TIQ=Iu( zX_y#&%~k$2BJnxd)L#Wf2J~a`w2Q&F(FW_Sf;-VmVlFgbJ}C;O6hzas4qZ>i5V1`( zyduK8IYHIAEz5+A84u0Q>lQ>)GVeB!M~{cLXTnG}dW9cM1&Iy1(c;-k#PEp_&=2bt zwfK1_2UWcwk1lY|_(1p_t8OAo8j2NHr;5*i{7d|8EH+SB^|tR)Msh(Eb#6QTdRP>sgNa%&YLhqMZZ=WG+MNfJ(quqcTKz7+`U^G+&=oBw&Y z$=`@ma*l<(s)%5vTC$K+=mQ4l5md;G_oR*8U9{zxmT14y-hO3~!(0reZz~?`8>`)u_?C309TAnOZ&_)is>I3=SM0%$a1SVxh%gk}O_$ zM+1Y<3*z5@E2#<6H64bof*G1V;JRuSCzw;gB6dX_z$0lUy8A5-AeoAzKX?hIXgovQ z*cEvIZ%aPXLmbSY{`YX?o$g?8T<^#%(nB$yVgrUOG1D(MG2N(XtDf_m)`BBOS(1Oey%IoN9kx2o_IkAbDE` z^l?YjL^|lZbYii+bI`Zvzn)Cq2Mf&qW#xH8XLbdP^JC}N+x&cWxuZI^Xg4EN=17f6 zI&7V(@RWs}tgWLf%)T^pMRqLRdyT^ezvMV(ijK5hro)TB>n>uDKpGrjwdfXTW`L0<<1ErY~h;H)NN61yJFjiCX4NUd!abRj3Jc18=M#E za;Y2mN*-qx1DZ;xpsxunXDOMJE5?)&a}?eU5xHR`!Yeb40FlR8$;&|9moCH)iLolTc10b?iKenk{Pl0k#<`qMf`aHOl?; zyWIxI8`V+R@8wNxRnAVT4^!*-1N!AjN47JlIQ#5Qx1MtXxSEiaIi*0pWp&h+;ErBP z&$&Z>qev3NAc~s>%f=35Xr%c_z|q z^>cK*9$t^uEru&{2DP)LmKDQQtVIk18VGbq@VCq&rr=e4dJ_%5#Sen_)%X46@kUsEc_ttbdBw}<@7aS!CKCe65~*hGE$L?Iic`}l^|g?RFw1*Lu2UZ(9J zL#y8&^_agWyG8J^Q^z_DpQ0OYwc%sUAkUP}H#`#QJ9kn7#~W!8(L`HVsZOX0>nx3e zyUB7##pD}CzTwwrh1;cA!!W0M8-0}sp2+$M$y^z?c9( zVZU#|*yDDsU;x(4^fo`wL4U~5l3FI~+ePPUbm8`rE{RP4&QmDZO}6NCa^_te=a1{1 z8GZ>2>w(=`nJFNEqTya@L1MpPU>~MHT&TO82wj_x`yy)lwETQgwB0(7?5zS0y0AK_ z&BM{I@Dt7i?-SG^%*F3``9t+=z^mm`)oT)Pd@%sJNs!}!64mN9V0FDvcVN{F(hu}P zB?413&9MOhEQ=*Ny|aE)<@Vj}N)k8|B_`Y9Zfqa`tD~&B7JZO4>o|KIDgEHD_y8b4>T*W^o>{|3ckWL!@{fkAKJKdh|pt0FrJL?*_5Yw!g zLPniW((z^e7~xt-*&QV91oMi|pxGN*NcEu%;bQ}8Sn+MNuq7eAuG|LB$rkbIN#vDU z|2h9o#0m#|!Q<%5QFR0HH8g+>j}3=ipbLuq~Ezy`}r#Fccp+9S@}j{zt(>;YMi_*tXZ&tG4%w5g<;?sxSdqzJ&Pn@)cKCVguMOt|hWdtbBp z1s_W|*e};?Img51$iu}b!I(dSdMsnS3O42H2kc{C*Nbs%1BN7mBy?G*w=kmye<^>R z>8Tu*sSgQL3a5|lmUrI=7gV9tE{x;2q_JQ#3U2>T~kfCX+iHOWPoB8 z2?UI3E)ElpnRQb)2xuq3-V)0rzz>j~i^7*q;B)vy6p>=(jgKu3Wg&%@ zb&i}sF%n>TELg6B=L~ZN0xh}1^$IkR3@wKNHeR!qU54;E858gVn{^jFhL8jp{{MUI zbDjy!(flgV%jYb#p1;xOBB4+0oYF}k(%8Y$J4inO#&Syxi2P#k4m=Es!2rY!QI*36 z2Ga!eM$C00XYeSkf=*KDh~I}n$wI;bh#;STCJ&719s?9Mw>tJZ9Xud0AfK^ z8{|n~0AYp~1C;n;One|mCs9xx83yZwPlm}iR`7sA@Fk@&0DaPDRT?N+A_)Y#<76$T z0v^0hkmJ^U+BGmlgUn(;dL;KM0gQ?4Is}R~!IjVjk1qm*^dCWI+)j?W zl?=%epgokJJ+@*);FkP;2XxP<;gPfE}>tYcOO|ig}50~Uv#?i1Rc;iNBVIhMkqr* zZ&R~|+WHpf`v_EX0Q%G1Hzedec0UgDC6g~!7O%*X?p!9KseWYK4+z$`$(nTHD^&~`d?e!S^zyWOSOb^KSJ&=q z@Lb)j=swHbJlU>9bP|3O-g4{qc9ih1o`?Rfmb2s z;He;ka_n&9i$5>V2Dh@kw^=`Z)aim8Z9Fob*%$I3vIyEXxsYXZ@YHGuu9%d$fwR-9 z{BbR5x;JjlnulM=m9uMhp_8?`Yvbic=2Gv*sGBzb{hI>Q(@|^tguhdLXv(5wG0Md` zgBSS>3Fkj#bh|~e%zW|cM9THoy>oa0&YJat^Xw#sB>1oa+Mz5h|#m}yILALrY zce;GmELQTO8Cf9(-Z@J=A$ARe?nG&Or}51b^aPz!Upip39zFWAhn>^R2eGUvR@c1Z z9v1+GSB6XRo8^t-MV$*zy_YVQB$bvrRBEN{l&NPAh7rFki!`2*xyL^9jAoh@7*Qao zNbln)LjI7fJ>O9?eXReL_Onjij60(R68cqk&4wLu?^X|3YW}@%ctpFpshf4Uk(pbNG`gYl7F-Y4*7>Ouk;UIt zwSCp^FB+gFgtN0Ad*T|)ZuN4Mvn#u8%rD*GVor0~cfZ6+UX`_{s*QfKZA|mwkOZ4V zad{={(0ziKG`-FMsZF@=%|i16o;4`U63F&@#YQrICGP{ci*>hdeTAY&81nA$QT*g; zd;ikYN=JCV&Z0ZXSirW?lDINTkQ95J32HCRGPS6xe9bnhWiVWfK3!?|2600a5jCb< zdB;RmnkDhhGvd#Q-&0sl#e`QA2EEp8epyN2&4gp;Ac9ur7s>?ACD~jNi;1w;<+Htq zS5(R(x<0*lk&1NrvGjIia>YMyF4g3iNcFV0l@vt~a+zd?hkx z4&4Q7zY-5*E-2!%etb-q2&2J-ZG6nv+7rR1H5l*c?%;+E7mO6+{b*+Oh7Y`iL!XPh(e@Z&)@>kFUJCjpKL?{_!kz-j1@r}MM*Z? z#g`5M@+#s00Xf&zMQ*-SFCT^vZa+Bh2CE=1>s>N{^y30+~=6-Qb7Ge|<0{Ix&J8&Y*_T zbj7}bL1Di$Z1nZTjef2l=VVaHzdF(A>tl%qgo~fR&0q-lPj8VFC9WdfBB&%$XR*Jn z8R|Rp|7z=fP;hbc|2fQ$NxxS`quR=$;6GoRt(=DcurvTj1z|A`UKGhGUtEZ$lWP8# zQ=ALLChTF?lD!V-B(RIjt{PnGIBQGB+1p@=^vdmbw0cv(ht3+{U9^Vw9=^5P1OB3^ zD7?&-I$?<4wAp5+csI^T4yR>w|HGF?|Ix#9tz^xnPgV2rFI;kkr|kxFqvi*g^*w8R zy9$Y|#QJcA@o0RiRmVs!+_L)S+%9l9l+mmqXC@6oYZAG8y1IOB_BJ0lDXc7cJMib) z(6V(q2NSSkd8=VGw@HiAVWg9DxO|7-vpKryH8H^a>BP{dYB4kDX^;(Zwhw=H%X6HOwJ@R#RZgpOo^scD1BC3Q!=CJKKyCCdb%6Z?D zOTUd8Z8yw1_G}J2@U&_Z#_Vps`IojwNB+!ZF4lf&8K_W)rZSM?^b44IIJzzCovheAyL2q7nVwH0peK}h9@kBF5_5G1fA^3UbEoGUqEfz~AkDkTE zKwe(u7v>kG616X;&w|pz#*_vx5HC+Rf|@0nNO|us$^>6UANgpsMtKJSi{q&d#k82wF-m0dONCwq8gr{kXwn5%Q*gx_8x>?=lZ zQjUa}?Jfwem`pC27;tH?b~Ah3?!lX}&*w{o>n5}hPAK-T@VS9giPc$S`c1jk2>d)H z@o`^}QHPG*Kd8CBaRa~4FIb5U?H2IHl-~=}q5f5KZ%*sevhLBYm6w(j(bD_QUr!|i zN`<$}9aNDG8tO*a-&UL)0&+4r?}RG*W**j^ero#FF=V*BTLS05*@9WVuQ%7r!X%Q^ zDVWvP7Eo7H;-}8VDj$i8b!NN|tbE5WeLPtn{_x327dI$+0!qNv#7Hsrbgyjr)}wS= zSobjF#x-;!JoWvNS>b$}Xo61HEcqcpnWRo_wzq-^&BNVeGJvu^9h=@fwpt990tItT- zVVKL8OiP?iNl##RVFpp9{U#2Xk4kgz%tdJIFoy7O!4k4b`IMFFqOLynCC_e@-7^K` z+^&66ZgDN(4rjc*k5e#u+ZY&@u;%u0zUcU)X>@~P>so87bg@(Mt9v9Nm=(L9LxX5C zyW-Aayc4WDvmYe%ZD<(YNzkL @@ -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/#"> @@ -133,7 +133,7 @@ description="Opens the plugin update dialog." style="normal" tooltip="Opens the plugin update dialog." - icon="icons/toolbar/update-orange.png" + icon="icons/toolbar/update-orange-40x40.png" label="Update Plugin" menuPath="it.unibz.inf.ontouml.vp.actionset1.toolbar1/it.unibz.inf.ontouml.vp.actionset1.menu1/#"> @@ -145,7 +145,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,7 +157,7 @@ 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,7 +185,7 @@ + icon="icons/ontouml/ontouml-icon-17x22.png"> @@ -198,7 +198,7 @@ + icon="icons/ontouml/ontouml-icon-17x22.png"/> @@ -237,7 +237,7 @@ + icon="icons/ontouml/ontouml-icon-17x22.png"/> @@ -299,7 +299,7 @@ + icon="icons/ontouml/ontouml-icon-17x22.png"/> @@ -322,7 +322,7 @@ + icon="icons/ontouml/ontouml-icon-17x22.png"/> @@ -446,7 +446,7 @@ + icon="icons/ontouml/ontouml-icon-17x22.png"/> @@ -551,7 +551,7 @@ + icon="icons/ontouml/ontouml-icon-17x22.png"/> + icon="icons/ontouml/ontouml-icon-17x22.png"/> @@ -789,7 +789,7 @@ + icon="icons/ontouml/ontouml-icon-17x22.png"/> From f062f145ee963bc8987ec60b35157c2235b42a55 Mon Sep 17 00:00:00 2001 From: Claudenir Fonseca Date: Thu, 6 Jan 2022 23:23:11 +0100 Subject: [PATCH 02/25] Add FixStereotypesController --- .../controllers/FixStereotypesController.java | 182 ++++++++++++++++++ .../unibz/inf/ontouml/vp/model/uml/Class.java | 10 + .../vp/utils/ApplicationManagerUtils.java | 9 + src/main/resources/plugin.xml | 12 ++ 4 files changed, 213 insertions(+) create mode 100644 src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java diff --git a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java new file mode 100644 index 00000000..4b84ae86 --- /dev/null +++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java @@ -0,0 +1,182 @@ +package it.unibz.inf.ontouml.vp.controllers; + +import com.vp.plugin.action.VPAction; +import com.vp.plugin.action.VPActionController; +import com.vp.plugin.model.IAssociation; +import com.vp.plugin.model.IAttribute; +import com.vp.plugin.model.IClass; +import com.vp.plugin.model.IModelElement; +import com.vp.plugin.model.factory.IModelElementFactory; +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.Stereotype; +import it.unibz.inf.ontouml.vp.utils.StereotypesManager; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +public class FixStereotypesController implements VPActionController { + + private static String[] typesSelection = { IModelElementFactory.MODEL_TYPE_CLASS, + IModelElementFactory.MODEL_TYPE_ASSOCIATION }; + + private Set elements; + private Map associationStereotypesMap; + private Map attributeStereotypesMap; + private Map classStereotypesMap; + + @Override + public void update(VPAction vpAction) {} + + @Override + public void performAction(VPAction vpAction) { + getModelElements(); + fixElementsStereotypes(); + } + + private void fixElementsStereotypes() { + elements.forEach(this::fixElementsStereotypes); + } + + private void fixElementsStereotypes(IModelElement element) { + final String stereotype = ModelElement.getUniqueStereotypeName(element); + final String recognizedStr = getRecognizedStereotypes(element); + + if(hasReplacement(stereotype,recognizedStr)) applyStereotype(element, 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.getModelType(); + + switch(modelType) { + case IModelElementFactory.MODEL_TYPE_ASSOCIATION: + applyAssociationStereotype((IAssociation) element, replacementStereotype); + break; + case IModelElementFactory.MODEL_TYPE_ATTRIBUTE: + applyAttributeStereotype((IAttribute) element, replacementStereotype); + break; + case IModelElementFactory.MODEL_TYPE_CLASS: + applyClassStereotype((IClass) element, replacementStereotype); + break; + default: + throw new RuntimeException("Unexpected model element of type '" + modelType + "'."); + } + } + + private void applyAttributeStereotype(IAttribute attribute, String replacementStereotype) { + StereotypesManager.applyStereotype(attribute, replacementStereotype); + } + + private void applyAssociationStereotype(IAssociation association, String replacementStereotype) { + // TODO: check whether it is necessary to invert the association + StereotypesManager.applyStereotype(association, replacementStereotype); + } + + private void applyClassStereotype(IClass _class, String replacementStereotype) { + StereotypesManager.applyStereotype(_class, replacementStereotype); + } + + private boolean hasReplacement(String originalStereotype, String recognizedStereotype) { + 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); + }); + + // TODO: add a list of misspelled stereotypes to the map + } + + private void initializeAssociationStereotypeMap() { + associationStereotypesMap = new HashMap<>(); + + Stereotype.getOntoUMLAssociationStereotypeNames().forEach(str -> { + String normalizedStr = getNormalizedStereotype(str); + associationStereotypesMap.put(normalizedStr, str); + }); + + // TODO: add a list of misspelled stereotypes to the map + } + + private void initializeAttributeStereotypeMap() { + attributeStereotypesMap = new HashMap<>(); + + Stereotype.getOntoUMLAttributeStereotypeNames().forEach(str -> { + String normalizedStr = getNormalizedStereotype(str); + attributeStereotypesMap.put(normalizedStr, str); + }); + + // TODO: add a list of misspelled stereotypes to the map + } + + private void getModelElements() { + final Iterator iter = ApplicationManagerUtils.getAllLevelModelElements(typesSelection); + elements = new HashSet<>(); + + while(iter != null && iter.hasNext()) { + final IModelElement next = (IModelElement) iter.next(); + elements.add(next); + if(Class.isClass(next)) getAttributes((IClass) next); + } + } + + private void getAttributes(IClass _class) { + final Set attributes = Class.getAttributes(_class); + elements.addAll(attributes); + } + +} 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..63ee6dd5 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,15 @@ 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(); 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..aa30bdf7 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,12 @@ 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); + } } diff --git a/src/main/resources/plugin.xml b/src/main/resources/plugin.xml index 9031ae96..08cd3afe 100644 --- a/src/main/resources/plugin.xml +++ b/src/main/resources/plugin.xml @@ -127,6 +127,18 @@ + + + + Date: Fri, 7 Jan 2022 00:43:36 +0100 Subject: [PATCH 03/25] Add check to invert associations if necessary --- .../controllers/FixStereotypesController.java | 65 ++++++++++++++----- .../vp/listeners/AssociationEventManager.java | 2 +- .../vp/utils/ApplicationManagerUtils.java | 5 ++ 3 files changed, 55 insertions(+), 17 deletions(-) diff --git a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java index 4b84ae86..ff3ac942 100644 --- a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java +++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java @@ -7,9 +7,11 @@ import com.vp.plugin.model.IClass; import com.vp.plugin.model.IModelElement; 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.HashMap; @@ -20,10 +22,9 @@ public class FixStereotypesController implements VPActionController { - private static String[] typesSelection = { IModelElementFactory.MODEL_TYPE_CLASS, - IModelElementFactory.MODEL_TYPE_ASSOCIATION }; - - private Set elements; + private Set attributes; + private Set associations; + private Set classes; private Map associationStereotypesMap; private Map attributeStereotypesMap; private Map classStereotypesMap; @@ -33,12 +34,14 @@ public void update(VPAction vpAction) {} @Override public void performAction(VPAction vpAction) { - getModelElements(); + retrieveModelElements(); fixElementsStereotypes(); } private void fixElementsStereotypes() { - elements.forEach(this::fixElementsStereotypes); + classes.forEach(this::fixElementsStereotypes); + attributes.forEach(this::fixElementsStereotypes); + associations.forEach(this::fixAssociationsStereotypes); } private void fixElementsStereotypes(IModelElement element) { @@ -48,6 +51,13 @@ private void fixElementsStereotypes(IModelElement 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(); @@ -92,10 +102,17 @@ private void applyAttributeStereotype(IAttribute attribute, String replacementSt } private void applyAssociationStereotype(IAssociation association, String replacementStereotype) { - // TODO: check whether it is necessary to invert the association + if(shouldInvert(association, replacementStereotype)) + Association.invertAssociation(association,false); + StereotypesManager.applyStereotype(association, replacementStereotype); } + private boolean shouldInvert(IAssociation association, String stereotype) { + return !OntoUMLConstraintsManager.isStereotypeAllowed(association,stereotype) && + OntoUMLConstraintsManager.isStereotypeAllowedIfInverted(association,stereotype); + } + private void applyClassStereotype(IClass _class, String replacementStereotype) { StereotypesManager.applyStereotype(_class, replacementStereotype); } @@ -163,20 +180,36 @@ private void initializeAttributeStereotypeMap() { // TODO: add a list of misspelled stereotypes to the map } - private void getModelElements() { - final Iterator iter = ApplicationManagerUtils.getAllLevelModelElements(typesSelection); - elements = new HashSet<>(); + private void retrieveModelElements() { + retrieveClasses(); + retrieveAssociations(); + retrieveAttributes(); + } + + private void retrieveAssociations() { + associations = new HashSet<>(); + final Iterator iter = + ApplicationManagerUtils.getAllLevelModelElements(IModelElementFactory.MODEL_TYPE_ASSOCIATION); while(iter != null && iter.hasNext()) { - final IModelElement next = (IModelElement) iter.next(); - elements.add(next); - if(Class.isClass(next)) getAttributes((IClass) next); + associations.add((IAssociation) iter.next()); } } - private void getAttributes(IClass _class) { - final Set attributes = Class.getAttributes(_class); - elements.addAll(attributes); + private void retrieveAttributes() { + attributes = new HashSet<>(); + classes.stream() + .flatMap(c -> Class.getAttributes(c).stream()) + .forEach(attributes::add); } + 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()); + } + } } 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..ade60322 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,7 +33,7 @@ public void processEvent() { } private void processStereotypeChange() { - // checkSourcesDiagrams(); + // checkSourcesDiagrams(); checkAssociationConsistency(); // setDefaultAssociationProperties(); } 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 aa30bdf7..ad002b89 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 @@ -36,4 +36,9 @@ public static Iterator getAllLevelModelElements() { public static Iterator getAllLevelModelElements(String[] typesFilter) { return getCurrentProject().allLevelModelElementIterator(typesFilter); } + + public static Iterator getAllLevelModelElements(String typeFilter) { + final String[] filter = { typeFilter }; + return getCurrentProject().allLevelModelElementIterator(filter); + } } From 0cf64b4dbc0c089dc5e6506f20f61542a4b0cef0 Mon Sep 17 00:00:00 2001 From: Claudenir Fonseca Date: Fri, 7 Jan 2022 01:09:51 +0100 Subject: [PATCH 04/25] Add warning on fix stereotypes action --- ...ApplyAssociationStereotypeMenuManager.java | 2 +- .../controllers/FixStereotypesController.java | 10 ++++++++ .../ontouml/vp/utils/ViewManagerUtils.java | 23 ++++++++++++++++++- 3 files changed, 33 insertions(+), 2 deletions(-) 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..7f48c234 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 @@ -49,7 +49,7 @@ public void performAction() { boolean shouldProceed = true; if (shouldWarnAboutInvertingAssociations()) - shouldProceed = ViewManagerUtils.associationInvertionWarningDialog(); + shouldProceed = ViewManagerUtils.showInvertAssociationWarningDialog(); if (!shouldProceed) return; diff --git a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java index ff3ac942..e4512b1b 100644 --- a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java +++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java @@ -14,6 +14,7 @@ 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 it.unibz.inf.ontouml.vp.utils.ViewManagerUtils; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -22,6 +23,7 @@ public class FixStereotypesController implements VPActionController { + private boolean shouldProceed = false; private Set attributes; private Set associations; private Set classes; @@ -34,10 +36,18 @@ public void update(VPAction vpAction) {} @Override public void performAction(VPAction vpAction) { + showFixStereotypesWarning(); + + if(!shouldProceed) return ; + retrieveModelElements(); fixElementsStereotypes(); } + private void showFixStereotypesWarning() { + shouldProceed = ViewManagerUtils.showFixStereotypesWarningDialog(); + } + private void fixElementsStereotypes() { classes.forEach(this::fixElementsStereotypes); attributes.forEach(this::fixElementsStereotypes); 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 be3a6746..7766b265 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 @@ -477,7 +477,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 +517,25 @@ 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; + } } From 00d4b31aef4d57a98c2cae6add695246a3f11c7e Mon Sep 17 00:00:00 2001 From: Claudenir Fonseca Date: Fri, 7 Jan 2022 01:24:46 +0100 Subject: [PATCH 05/25] Adjust invert association mechanism to keep reading direction --- .../controllers/FixStereotypesController.java | 2 +- .../controllers/ReloadClassesController.java | 53 ++++++++++++++++++- .../inf/ontouml/vp/model/uml/Association.java | 3 ++ 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java index e4512b1b..e4ef27d7 100644 --- a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java +++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java @@ -113,7 +113,7 @@ private void applyAttributeStereotype(IAttribute attribute, String replacementSt private void applyAssociationStereotype(IAssociation association, String replacementStereotype) { if(shouldInvert(association, replacementStereotype)) - Association.invertAssociation(association,false); + Association.invertAssociation(association,true); StereotypesManager.applyStereotype(association, replacementStereotype); } 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..fc55b930 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,21 +1,43 @@ package it.unibz.inf.ontouml.vp.controllers; import com.vp.plugin.ApplicationManager; +import com.vp.plugin.ViewManager; import com.vp.plugin.action.VPAction; import com.vp.plugin.action.VPActionController; +import com.vp.plugin.diagram.IDiagramElement; +import com.vp.plugin.model.IModelElement; +import com.vp.plugin.model.IStereotype; +import com.vp.plugin.model.ITaggedValue; +import com.vp.plugin.model.ITaggedValueContainer; import it.unibz.inf.ontouml.vp.OntoUMLPlugin; +import it.unibz.inf.ontouml.vp.utils.ApplicationManagerUtils; import it.unibz.inf.ontouml.vp.utils.ViewManagerUtils; +import java.util.Iterator; +import javax.swing.JOptionPane; public class ReloadClassesController implements VPActionController { @Override public void performAction(VPAction action) { - reloadPlugin(); + final String dialogResult = showInputDialog(); + if(dialogResult == null || dialogResult.isEmpty()) { + reloadPlugin(); + } else { + applyStereotype(dialogResult); + } } @Override public void update(VPAction action) {} + private String showInputDialog() { + final ViewManager vm = ApplicationManager.instance().getViewManager(); + return vm.showInputDialog(vm.getRootFrame(), + "Enter stereotype or cancel to download:", + "Stereotype Dialog", + JOptionPane.PLAIN_MESSAGE); + } + private void reloadPlugin() { System.out.println("----------------------------------------"); System.out.println("Reloading OntoUML Plugin..."); @@ -24,4 +46,33 @@ private void reloadPlugin() { System.out.println("Plugin reloaded!"); ViewManagerUtils.simpleDialog("Plugin reloaded!"); } + + private void applyStereotype(String stereotype) { + final IDiagramElement[] views = ApplicationManagerUtils.getDiagramManager().getSelectedDiagramElements(); + final IDiagramElement selectedView = views != null && views.length > 0 ? views[0] : null; + final IModelElement selectedElement = selectedView != null ? selectedView.getMetaModelElement() : null; + + if(selectedElement != null) { + applyStereotype(selectedElement,stereotype); + } + } + + private void applyStereotype(IModelElement element, String stereotype) { + removeStereotypes(element); + element.addStereotype(stereotype); + } + + private void removeStereotypes(IModelElement element) { + final ITaggedValueContainer container = element.getTaggedValues(); + final Iterator taggedValuesIterator = container != null ? container.taggedValueIterator() : null; + final Iterator stereotypeIterator = element.stereotypeModelIterator(); + + while(taggedValuesIterator != null && taggedValuesIterator.hasNext()) { + container.removeTaggedValue((ITaggedValue) taggedValuesIterator.next()); + } + + while(stereotypeIterator != null && stereotypeIterator.hasNext()) { + element.removeStereotype((IStereotype) stereotypeIterator.next()); + } + } } 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..9f9ff84e 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 @@ -262,6 +262,7 @@ public static void invertAssociation( final IAssociationEnd originalTargetEnd = getTargetEnd(association); final PropertyDescription sourceEndDescription = new PropertyDescription(originalSourceEnd); final PropertyDescription targetEndDescription = new PropertyDescription(originalTargetEnd); + final int readingDirection = association.getDirection(); final List originalAssociationsDescriptions = retrieveAndDeleteAssociationModels(association); @@ -271,6 +272,8 @@ public static void invertAssociation( if (keepAllAssociationEndPropertiesInPlace) { sourceEndDescription.copyTo(originalTargetEnd); targetEndDescription.copyTo(originalSourceEnd); + association.setDirection(readingDirection == IAssociation.DIRECTION_FROM_TO ? + IAssociation.DIRECTION_TO_FROM : IAssociation.DIRECTION_FROM_TO); } else { sourceEndDescription.partialCopyTo(originalTargetEnd); targetEndDescription.partialCopyTo(originalSourceEnd); From cd7fe9628a0877918c750cec07446df09981ca0b Mon Sep 17 00:00:00 2001 From: github-actions <> Date: Fri, 7 Jan 2022 00:25:55 +0000 Subject: [PATCH 06/25] Google Java Format --- .../controllers/FixStereotypesController.java | 78 ++++++++++--------- .../controllers/ReloadClassesController.java | 22 +++--- .../inf/ontouml/vp/model/uml/Association.java | 6 +- .../unibz/inf/ontouml/vp/model/uml/Class.java | 3 +- .../vp/utils/ApplicationManagerUtils.java | 2 +- .../ontouml/vp/utils/ViewManagerUtils.java | 35 +++++---- 6 files changed, 82 insertions(+), 64 deletions(-) diff --git a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java index e4ef27d7..47c66336 100644 --- a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java +++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java @@ -27,9 +27,9 @@ public class FixStereotypesController implements VPActionController { private Set attributes; private Set associations; private Set classes; - private Map associationStereotypesMap; - private Map attributeStereotypesMap; - private Map classStereotypesMap; + private Map associationStereotypesMap; + private Map attributeStereotypesMap; + private Map classStereotypesMap; @Override public void update(VPAction vpAction) {} @@ -38,7 +38,7 @@ public void update(VPAction vpAction) {} public void performAction(VPAction vpAction) { showFixStereotypesWarning(); - if(!shouldProceed) return ; + if (!shouldProceed) return; retrieveModelElements(); fixElementsStereotypes(); @@ -58,26 +58,26 @@ private void fixElementsStereotypes(IModelElement element) { final String stereotype = ModelElement.getUniqueStereotypeName(element); final String recognizedStr = getRecognizedStereotypes(element); - if(hasReplacement(stereotype,recognizedStr)) applyStereotype(element, recognizedStr); + 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); + 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); + Map stereotypesMap = getStereotypesMap(type); return stereotypesMap.get(normalizedStr); } private Map getStereotypesMap(String modelType) { - switch(modelType) { + switch (modelType) { case IModelElementFactory.MODEL_TYPE_ASSOCIATION: return getAssociationStereotypesMap(); case IModelElementFactory.MODEL_TYPE_ATTRIBUTE: @@ -92,7 +92,7 @@ private Map getStereotypesMap(String modelType) { private void applyStereotype(IModelElement element, String replacementStereotype) { final String modelType = element.getModelType(); - switch(modelType) { + switch (modelType) { case IModelElementFactory.MODEL_TYPE_ASSOCIATION: applyAssociationStereotype((IAssociation) element, replacementStereotype); break; @@ -112,15 +112,15 @@ private void applyAttributeStereotype(IAttribute attribute, String replacementSt } private void applyAssociationStereotype(IAssociation association, String replacementStereotype) { - if(shouldInvert(association, replacementStereotype)) - Association.invertAssociation(association,true); + if (shouldInvert(association, replacementStereotype)) + Association.invertAssociation(association, true); StereotypesManager.applyStereotype(association, replacementStereotype); } private boolean shouldInvert(IAssociation association, String stereotype) { - return !OntoUMLConstraintsManager.isStereotypeAllowed(association,stereotype) && - OntoUMLConstraintsManager.isStereotypeAllowedIfInverted(association,stereotype); + return !OntoUMLConstraintsManager.isStereotypeAllowed(association, stereotype) + && OntoUMLConstraintsManager.isStereotypeAllowedIfInverted(association, stereotype); } private void applyClassStereotype(IClass _class, String replacementStereotype) { @@ -134,7 +134,7 @@ private boolean hasReplacement(String originalStereotype, String recognizedStere } private String getNormalizedStereotype(String stereotype) { - return stereotype != null ? stereotype.toLowerCase().replaceAll("\\s+","") : ""; + return stereotype != null ? stereotype.toLowerCase().replaceAll("\\s+", "") : ""; } private String getNormalizedStereotype(IModelElement element) { @@ -143,27 +143,32 @@ private String getNormalizedStereotype(IModelElement element) { } private Map getClassStereotypesMap() { - if(classStereotypesMap == null || classStereotypesMap.isEmpty()) initializeClassStereotypeMap(); + if (classStereotypesMap == null || classStereotypesMap.isEmpty()) + initializeClassStereotypeMap(); return classStereotypesMap; } private Map getAssociationStereotypesMap() { - if(associationStereotypesMap == null || associationStereotypesMap.isEmpty()) initializeAssociationStereotypeMap(); + if (associationStereotypesMap == null || associationStereotypesMap.isEmpty()) + initializeAssociationStereotypeMap(); return associationStereotypesMap; } private Map getAttributeStereotypesMap() { - if(attributeStereotypesMap == null || attributeStereotypesMap.isEmpty()) initializeAttributeStereotypeMap(); + 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); - }); + Stereotype.getOntoUMLClassStereotypeNames() + .forEach( + str -> { + String normalizedStr = getNormalizedStereotype(str); + classStereotypesMap.put(normalizedStr, str); + }); // TODO: add a list of misspelled stereotypes to the map } @@ -171,10 +176,12 @@ private void initializeClassStereotypeMap() { private void initializeAssociationStereotypeMap() { associationStereotypesMap = new HashMap<>(); - Stereotype.getOntoUMLAssociationStereotypeNames().forEach(str -> { - String normalizedStr = getNormalizedStereotype(str); - associationStereotypesMap.put(normalizedStr, str); - }); + Stereotype.getOntoUMLAssociationStereotypeNames() + .forEach( + str -> { + String normalizedStr = getNormalizedStereotype(str); + associationStereotypesMap.put(normalizedStr, str); + }); // TODO: add a list of misspelled stereotypes to the map } @@ -182,10 +189,12 @@ private void initializeAssociationStereotypeMap() { private void initializeAttributeStereotypeMap() { attributeStereotypesMap = new HashMap<>(); - Stereotype.getOntoUMLAttributeStereotypeNames().forEach(str -> { - String normalizedStr = getNormalizedStereotype(str); - attributeStereotypesMap.put(normalizedStr, str); - }); + Stereotype.getOntoUMLAttributeStereotypeNames() + .forEach( + str -> { + String normalizedStr = getNormalizedStereotype(str); + attributeStereotypesMap.put(normalizedStr, str); + }); // TODO: add a list of misspelled stereotypes to the map } @@ -199,18 +208,17 @@ private void retrieveModelElements() { private void retrieveAssociations() { associations = new HashSet<>(); final Iterator iter = - ApplicationManagerUtils.getAllLevelModelElements(IModelElementFactory.MODEL_TYPE_ASSOCIATION); + ApplicationManagerUtils.getAllLevelModelElements( + IModelElementFactory.MODEL_TYPE_ASSOCIATION); - while(iter != null && iter.hasNext()) { + while (iter != null && iter.hasNext()) { associations.add((IAssociation) iter.next()); } } private void retrieveAttributes() { attributes = new HashSet<>(); - classes.stream() - .flatMap(c -> Class.getAttributes(c).stream()) - .forEach(attributes::add); + classes.stream().flatMap(c -> Class.getAttributes(c).stream()).forEach(attributes::add); } private void retrieveClasses() { @@ -218,7 +226,7 @@ private void retrieveClasses() { final Iterator iter = ApplicationManagerUtils.getAllLevelModelElements(IModelElementFactory.MODEL_TYPE_CLASS); - while(iter != null && iter.hasNext()) { + while (iter != null && iter.hasNext()) { classes.add((IClass) iter.next()); } } 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 fc55b930..a763770a 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 @@ -20,7 +20,7 @@ public class ReloadClassesController implements VPActionController { @Override public void performAction(VPAction action) { final String dialogResult = showInputDialog(); - if(dialogResult == null || dialogResult.isEmpty()) { + if (dialogResult == null || dialogResult.isEmpty()) { reloadPlugin(); } else { applyStereotype(dialogResult); @@ -32,7 +32,8 @@ public void update(VPAction action) {} private String showInputDialog() { final ViewManager vm = ApplicationManager.instance().getViewManager(); - return vm.showInputDialog(vm.getRootFrame(), + return vm.showInputDialog( + vm.getRootFrame(), "Enter stereotype or cancel to download:", "Stereotype Dialog", JOptionPane.PLAIN_MESSAGE); @@ -48,12 +49,14 @@ private void reloadPlugin() { } private void applyStereotype(String stereotype) { - final IDiagramElement[] views = ApplicationManagerUtils.getDiagramManager().getSelectedDiagramElements(); + final IDiagramElement[] views = + ApplicationManagerUtils.getDiagramManager().getSelectedDiagramElements(); final IDiagramElement selectedView = views != null && views.length > 0 ? views[0] : null; - final IModelElement selectedElement = selectedView != null ? selectedView.getMetaModelElement() : null; + final IModelElement selectedElement = + selectedView != null ? selectedView.getMetaModelElement() : null; - if(selectedElement != null) { - applyStereotype(selectedElement,stereotype); + if (selectedElement != null) { + applyStereotype(selectedElement, stereotype); } } @@ -64,14 +67,15 @@ private void applyStereotype(IModelElement element, String stereotype) { private void removeStereotypes(IModelElement element) { final ITaggedValueContainer container = element.getTaggedValues(); - final Iterator taggedValuesIterator = container != null ? container.taggedValueIterator() : null; + final Iterator taggedValuesIterator = + container != null ? container.taggedValueIterator() : null; final Iterator stereotypeIterator = element.stereotypeModelIterator(); - while(taggedValuesIterator != null && taggedValuesIterator.hasNext()) { + while (taggedValuesIterator != null && taggedValuesIterator.hasNext()) { container.removeTaggedValue((ITaggedValue) taggedValuesIterator.next()); } - while(stereotypeIterator != null && stereotypeIterator.hasNext()) { + while (stereotypeIterator != null && stereotypeIterator.hasNext()) { element.removeStereotype((IStereotype) stereotypeIterator.next()); } } 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 9f9ff84e..1a36b9aa 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 @@ -272,8 +272,10 @@ public static void invertAssociation( if (keepAllAssociationEndPropertiesInPlace) { sourceEndDescription.copyTo(originalTargetEnd); targetEndDescription.copyTo(originalSourceEnd); - association.setDirection(readingDirection == IAssociation.DIRECTION_FROM_TO ? - IAssociation.DIRECTION_TO_FROM : IAssociation.DIRECTION_FROM_TO); + association.setDirection( + readingDirection == IAssociation.DIRECTION_FROM_TO + ? IAssociation.DIRECTION_TO_FROM + : IAssociation.DIRECTION_FROM_TO); } else { sourceEndDescription.partialCopyTo(originalTargetEnd); targetEndDescription.partialCopyTo(originalSourceEnd); 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 63ee6dd5..000abfea 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 @@ -209,7 +209,8 @@ public Class(IClass source, HashSet modelElements) { } public static Set getAttributes(IClass _class) { - return _class.attributeCount() > 0 ? new HashSet<>(Arrays.asList(_class.toAttributeArray())) + return _class.attributeCount() > 0 + ? new HashSet<>(Arrays.asList(_class.toAttributeArray())) : Collections.emptySet(); } 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 ad002b89..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 @@ -38,7 +38,7 @@ public static Iterator getAllLevelModelElements(String[] typesFilter) { } public static Iterator getAllLevelModelElements(String typeFilter) { - final String[] filter = { typeFilter }; + final String[] filter = {typeFilter}; return getCurrentProject().allLevelModelElementIterator(filter); } } 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 7766b265..46bb6a6b 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 @@ -141,7 +141,8 @@ public static String getFilePath(String imageName) { .toFile() .getAbsolutePath(); case GENERALIZATION_SET_LOGO: - return Paths.get(pluginDir.getAbsolutePath(), "icons", "misc", GENERALIZATION_SET_LOGO_FILENAME) + return Paths.get( + pluginDir.getAbsolutePath(), "icons", "misc", GENERALIZATION_SET_LOGO_FILENAME) .toFile() .getAbsolutePath(); case DIAGRAM_LOGO: @@ -520,21 +521,23 @@ public static boolean showInvertAssociationWarningDialog() { 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))); + 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; } From bd754046d8216dbf9f1f835f46dfa0b63ec16033 Mon Sep 17 00:00:00 2001 From: Claudenir Fonseca Date: Fri, 7 Jan 2022 02:20:55 +0100 Subject: [PATCH 07/25] Adds stereotypes mappings --- .../controllers/FixStereotypesController.java | 29 +++++++++++++++---- .../java/it/unibz/inf/ontouml/vp/Misc.java | 21 ++++++++++++++ 2 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 src/test/java/it/unibz/inf/ontouml/vp/Misc.java diff --git a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java index 47c66336..05ecfb8d 100644 --- a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java +++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java @@ -134,7 +134,7 @@ private boolean hasReplacement(String originalStereotype, String recognizedStere } private String getNormalizedStereotype(String stereotype) { - return stereotype != null ? stereotype.toLowerCase().replaceAll("\\s+", "") : ""; + return stereotype != null ? stereotype.toLowerCase().replaceAll("(\\s|-)+", "") : ""; } private String getNormalizedStereotype(IModelElement element) { @@ -170,7 +170,16 @@ private void initializeClassStereotypeMap() { classStereotypesMap.put(normalizedStr, str); }); - // TODO: add a list of misspelled stereotypes to the map + 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("collectivekind",Stereotype.COLLECTIVE); + classStereotypesMap.put("quantitykind",Stereotype.QUANTITY); + classStereotypesMap.put("relatorkind",Stereotype.RELATOR); + classStereotypesMap.put("qualitykind",Stereotype.QUALITY); + classStereotypesMap.put("modekind",Stereotype.MODE); } private void initializeAssociationStereotypeMap() { @@ -183,7 +192,19 @@ private void initializeAssociationStereotypeMap() { associationStereotypesMap.put(normalizedStr, str); }); - // TODO: add a list of misspelled stereotypes to the map + // TODO: remove spaces and hyphens + 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() { @@ -195,8 +216,6 @@ private void initializeAttributeStereotypeMap() { String normalizedStr = getNormalizedStereotype(str); attributeStereotypesMap.put(normalizedStr, str); }); - - // TODO: add a list of misspelled stereotypes to the map } private void retrieveModelElements() { 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..7a0570ea --- /dev/null +++ b/src/test/java/it/unibz/inf/ontouml/vp/Misc.java @@ -0,0 +1,21 @@ +package it.unibz.inf.ontouml.vp; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.api.client.util.Sets; +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import org.junit.Test; + +public class Misc { + + @Test + public void testNullable() { + String[] array = {}; + List list = Arrays.asList(array); + + assertThat(list.isEmpty()).isTrue(); + } + +} From ea838025a212dc3bf4c0f68cf13c744b4c9d2e0e Mon Sep 17 00:00:00 2001 From: github-actions <> Date: Fri, 7 Jan 2022 01:21:28 +0000 Subject: [PATCH 08/25] Google Java Format --- .../controllers/FixStereotypesController.java | 44 +++++++++---------- .../java/it/unibz/inf/ontouml/vp/Misc.java | 3 -- 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java index 05ecfb8d..cca695ff 100644 --- a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java +++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java @@ -170,16 +170,16 @@ private void initializeClassStereotypeMap() { 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("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("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("collectivekind", Stereotype.COLLECTIVE); + classStereotypesMap.put("quantitykind", Stereotype.QUANTITY); + classStereotypesMap.put("relatorkind", Stereotype.RELATOR); + classStereotypesMap.put("qualitykind", Stereotype.QUALITY); + classStereotypesMap.put("modekind", Stereotype.MODE); } private void initializeAssociationStereotypeMap() { @@ -193,18 +193,18 @@ private void initializeAssociationStereotypeMap() { }); // TODO: remove spaces and hyphens - 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); + 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() { diff --git a/src/test/java/it/unibz/inf/ontouml/vp/Misc.java b/src/test/java/it/unibz/inf/ontouml/vp/Misc.java index 7a0570ea..de626dc8 100644 --- a/src/test/java/it/unibz/inf/ontouml/vp/Misc.java +++ b/src/test/java/it/unibz/inf/ontouml/vp/Misc.java @@ -2,10 +2,8 @@ import static com.google.common.truth.Truth.assertThat; -import com.google.api.client.util.Sets; import java.util.Arrays; import java.util.List; -import java.util.Set; import org.junit.Test; public class Misc { @@ -17,5 +15,4 @@ public void testNullable() { assertThat(list.isEmpty()).isTrue(); } - } From 31f51f29dedfad5a6a1daeccb678fa218ffec03a Mon Sep 17 00:00:00 2001 From: Claudenir Fonseca Date: Fri, 7 Jan 2022 02:25:15 +0100 Subject: [PATCH 09/25] Temporarily adds the reload button to the interface --- .../inf/ontouml/vp/controllers/FixStereotypesController.java | 1 - src/main/resources/plugin.xml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java index cca695ff..43f85858 100644 --- a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java +++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java @@ -192,7 +192,6 @@ private void initializeAssociationStereotypeMap() { associationStereotypesMap.put(normalizedStr, str); }); - // TODO: remove spaces and hyphens associationStereotypesMap.put("characterizes", Stereotype.CHARACTERIZATION); associationStereotypesMap.put("externaldependenceon", Stereotype.EXTERNAL_DEPENDENCE); associationStereotypesMap.put("externallydepends", Stereotype.EXTERNAL_DEPENDENCE); diff --git a/src/main/resources/plugin.xml b/src/main/resources/plugin.xml index 08cd3afe..4157617f 100644 --- a/src/main/resources/plugin.xml +++ b/src/main/resources/plugin.xml @@ -175,7 +175,6 @@
- From b2e8c918d9d3b160a01d293b90de2e8aefc3cee8 Mon Sep 17 00:00:00 2001 From: Claudenir Fonseca Date: Fri, 7 Jan 2022 23:44:36 +0100 Subject: [PATCH 10/25] Bugfix StackOverflow on large models and stereotype name clashes --- .../controllers/FixStereotypesController.java | 14 ++++--- .../vp/listeners/ClassEventManager.java | 6 +-- .../listeners/GeneralizationEventManager.java | 2 +- .../inf/ontouml/vp/model/uml/Association.java | 2 +- .../unibz/inf/ontouml/vp/model/uml/Class.java | 11 ++---- .../ontouml/vp/utils/SmartColoringUtils.java | 2 +- .../inf/ontouml/vp/utils/Stereotype.java | 38 ++++++++++++++++--- .../ontouml/vp/utils/StereotypesManager.java | 18 ++++----- 8 files changed, 57 insertions(+), 36 deletions(-) diff --git a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java index 43f85858..56b5d9a8 100644 --- a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java +++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java @@ -128,9 +128,11 @@ private void applyClassStereotype(IClass _class, String replacementStereotype) { } private boolean hasReplacement(String originalStereotype, String recognizedStereotype) { - return recognizedStereotype != null - && !recognizedStereotype.isEmpty() - && !recognizedStereotype.equals(originalStereotype); + // 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) { @@ -163,7 +165,7 @@ private Map getAttributeStereotypesMap() { private void initializeClassStereotypeMap() { classStereotypesMap = new HashMap<>(); - Stereotype.getOntoUMLClassStereotypeNames() + Stereotype.getOntoumlClassStereotypeNames() .forEach( str -> { String normalizedStr = getNormalizedStereotype(str); @@ -185,7 +187,7 @@ private void initializeClassStereotypeMap() { private void initializeAssociationStereotypeMap() { associationStereotypesMap = new HashMap<>(); - Stereotype.getOntoUMLAssociationStereotypeNames() + Stereotype.getOntoumlAssociationStereotypeNames() .forEach( str -> { String normalizedStr = getNormalizedStereotype(str); @@ -209,7 +211,7 @@ private void initializeAssociationStereotypeMap() { private void initializeAttributeStereotypeMap() { attributeStereotypesMap = new HashMap<>(); - Stereotype.getOntoUMLAttributeStereotypeNames() + Stereotype.getOntoumlAttributeStereotypeNames() .forEach( str -> { String normalizedStr = getNormalizedStereotype(str); 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/uml/Association.java b/src/main/java/it/unibz/inf/ontouml/vp/model/uml/Association.java index 1a36b9aa..57fde0ec 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 @@ -619,7 +619,7 @@ public static boolean isOntoumlAssociation(IAssociation association) { public static boolean hasOntoumlStereotype(IAssociation association) { final String stereotype = ModelElement.getUniqueStereotypeName(association); - return Stereotype.getOntoUMLAssociationStereotypeNames().contains(stereotype); + return Stereotype.getOntoumlAssociationStereotypeNames().contains(stereotype); } public static boolean hasMereologyStereotype(IAssociation association) { 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 000abfea..7cfdfa55 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 @@ -665,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) { @@ -712,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 = @@ -729,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/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..a1390e5c 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); @@ -155,7 +151,7 @@ public static void generate() { public static void applyStereotype(IModelElement element, String stereotypeName) { final IStereotype stereotype = getStereotype(stereotypeName); - if (stereotype == null || !element.getModelType().equals(stereotype.getBaseType())) { + if (stereotype == null || !element.getModelType().equals(stereotype.getBaseType())) { return; } @@ -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()); From eccdf912b30896774621f2e8bc3cfd1ea58fc342 Mon Sep 17 00:00:00 2001 From: github-actions <> Date: Fri, 7 Jan 2022 22:45:10 +0000 Subject: [PATCH 11/25] Google Java Format --- .../ontouml/vp/controllers/FixStereotypesController.java | 6 +++--- src/main/java/it/unibz/inf/ontouml/vp/model/uml/Class.java | 2 +- .../it/unibz/inf/ontouml/vp/utils/StereotypesManager.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java index 56b5d9a8..99307ec1 100644 --- a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java +++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java @@ -130,9 +130,9 @@ private void applyClassStereotype(IClass _class, String replacementStereotype) { 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); + // return recognizedStereotype != null + // && !recognizedStereotype.isEmpty() + // && !recognizedStereotype.equals(originalStereotype); } private String getNormalizedStereotype(String stereotype) { 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 7cfdfa55..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 @@ -717,7 +717,7 @@ public static void propagateRestrictionsToChildren(IClass _class) { _class, descendent -> { if (!doesItInheritItsRestrictions(descendent)) { - return ; + return; } final Set parents = 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 a1390e5c..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 @@ -28,7 +28,7 @@ public static void generate() { // Retrieves IStereotype objects for OntoUML elements for (IModelElement stereotype : installedStereotypes) { - if(Stereotype.isOntoumlStereotype((IStereotype) stereotype)) { + if (Stereotype.isOntoumlStereotype((IStereotype) stereotype)) { stereotypesMap.put(stereotype.getName(), (IStereotype) stereotype); } } @@ -151,7 +151,7 @@ public static void generate() { public static void applyStereotype(IModelElement element, String stereotypeName) { final IStereotype stereotype = getStereotype(stereotypeName); - if (stereotype == null || !element.getModelType().equals(stereotype.getBaseType())) { + if (stereotype == null || !element.getModelType().equals(stereotype.getBaseType())) { return; } From 8657c9e9d7faec63b48870ace5474225146e1477 Mon Sep 17 00:00:00 2001 From: Claudenir Fonseca Date: Wed, 6 Apr 2022 18:22:41 +0200 Subject: [PATCH 12/25] Add mappings --- .../inf/ontouml/vp/controllers/FixStereotypesController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java index 99307ec1..98d71930 100644 --- a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java +++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java @@ -177,11 +177,13 @@ private void initializeClassStereotypeMap() { 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() { From f158a9b3cf32f464c37ef3b5dcc1cd561022567b Mon Sep 17 00:00:00 2001 From: Claudenir Fonseca Date: Wed, 6 Apr 2022 18:23:42 +0200 Subject: [PATCH 13/25] Fix missing association end's type --- .../controllers/FixStereotypesController.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java index 98d71930..4fbc6e64 100644 --- a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java +++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java @@ -3,6 +3,7 @@ import com.vp.plugin.action.VPAction; import com.vp.plugin.action.VPActionController; 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; @@ -42,6 +43,42 @@ public void performAction(VPAction vpAction) { retrieveModelElements(); fixElementsStereotypes(); + fixAssociationEnds(); + } + + private void fixAssociationEnds() { + associations.forEach(a -> { + if(hasMissingSourceEndType(a)) { + fixSourceEnd(a); + } + if(hasMissingTargetEndType(a)) { + fixTargetEnd(a); + } + }); + } + + private boolean hasMissingSourceEndType(IAssociation association) { + IClass source = Association.getSource(association); + IAssociationEnd sourceEnd = Association.getSourceEnd(association); + return sourceEnd.getTypeAsElement() == null && source != null; + } + + private boolean hasMissingTargetEndType(IAssociation association) { + IClass target = Association.getTarget(association); + IAssociationEnd targetEnd = Association.getTargetEnd(association); + return targetEnd.getTypeAsElement() == null && target != null; + } + + private void fixSourceEnd(IAssociation association) { + IClass source = Association.getSource(association); + IAssociationEnd sourceEnd = Association.getSourceEnd(association); + sourceEnd.setType(source); + } + + private void fixTargetEnd(IAssociation association) { + IClass target = Association.getTarget(association); + IAssociationEnd targetEnd = Association.getTargetEnd(association); + targetEnd.setType(target); } private void showFixStereotypesWarning() { From a733deb320abc25c172a076a48694676b020e6f7 Mon Sep 17 00:00:00 2001 From: Claudenir Fonseca Date: Thu, 7 Apr 2022 02:55:58 +0200 Subject: [PATCH 14/25] Update derivation serialization to have consistent direction --- .../IAssociationClassTransformer.java | 12 +- .../vp2ontouml/IConnectorTransformer.java | 127 ++++++++++++++++-- 2 files changed, 126 insertions(+), 13 deletions(-) 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..6a4d3315 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,14 @@ 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/IConnectorTransformer.java b/src/main/java/it/unibz/inf/ontouml/vp/model/vp2ontouml/IConnectorTransformer.java index 33201f1d..97bba04e 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,140 @@ import com.vp.plugin.diagram.IConnectorUIModel; import com.vp.plugin.diagram.IDiagramElement; +import com.vp.plugin.diagram.connector.IAssociationClassUIModel; +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 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(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"); - Arrays.stream(source.getPoints()) - .forEachOrdered(p -> path.moveTo((int) p.getX(), (int) p.getY())); + + List points = Arrays.asList(source.getPoints()); + 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 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"); + points.forEach(p -> path.moveTo((int) p.getX(), (int) p.getY())); + + target.setPath(path); + } + + 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 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(); + } } From 37283404b992609354580bbd0618a75f9ea00067 Mon Sep 17 00:00:00 2001 From: Claudenir Fonseca Date: Thu, 7 Apr 2022 02:58:15 +0200 Subject: [PATCH 15/25] Update minimize property label --- src/main/java/it/unibz/inf/ontouml/vp/views/GufoExportView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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:"); From d5261e51d386d99fd6a4f5f9eb2a01c699226711 Mon Sep 17 00:00:00 2001 From: github-actions <> Date: Thu, 7 Apr 2022 00:58:46 +0000 Subject: [PATCH 16/25] Google Java Format --- .../controllers/FixStereotypesController.java | 17 +++++++++-------- .../ontouml/vp/model/ProjectConfigurations.java | 4 +++- .../inf/ontouml/vp/model/uml/ModelElement.java | 12 +++++++++--- .../IAssociationClassTransformer.java | 3 ++- .../model/vp2ontouml/IConnectorTransformer.java | 15 +++++++-------- .../inf/ontouml/vp/utils/VPContextUtils.java | 4 +++- 6 files changed, 33 insertions(+), 22 deletions(-) diff --git a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java index 4fbc6e64..236ec1ff 100644 --- a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java +++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java @@ -47,14 +47,15 @@ public void performAction(VPAction vpAction) { } private void fixAssociationEnds() { - associations.forEach(a -> { - if(hasMissingSourceEndType(a)) { - fixSourceEnd(a); - } - if(hasMissingTargetEndType(a)) { - fixTargetEnd(a); - } - }); + associations.forEach( + a -> { + if (hasMissingSourceEndType(a)) { + fixSourceEnd(a); + } + if (hasMissingTargetEndType(a)) { + fixTargetEnd(a); + } + }); } private boolean hasMissingSourceEndType(IAssociation association) { 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/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/vp2ontouml/IAssociationClassTransformer.java b/src/main/java/it/unibz/inf/ontouml/vp/model/vp2ontouml/IAssociationClassTransformer.java index 6a4d3315..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 @@ -22,7 +22,8 @@ public static ModelElement transform(IModelElement sourceElement) { Classifier derivingAssociationStub = createClassifierStub(derivingAssociation); Classifier derivedClassStub = createClassifierStub(derivedClass); - Relation target = Relation.createDerivation(null, null, derivingAssociationStub, derivedClassStub); + 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/IConnectorTransformer.java b/src/main/java/it/unibz/inf/ontouml/vp/model/vp2ontouml/IConnectorTransformer.java index 97bba04e..f2ef3466 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 @@ -42,7 +42,7 @@ private static void setPath(IConnectorUIModel source, ConnectorView target) { private static void setDerivationPath(IAssociationClassUIModel source, ConnectorView target) { List points = Arrays.asList(source.getPoints()); - if(isDerivationInverted(source)) Collections.reverse(points); + if (isDerivationInverted(source)) Collections.reverse(points); Path path = new Path(); path.setId(source.getId() + "_path"); @@ -85,24 +85,23 @@ private static void setConnectorSource(IAssociationClassUIModel source, Connecto target.setSource(connectorStub); } - private static void setClassShapeTarget(IAssociationClassUIModel source, ConnectorView target) { + 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); + 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)) + if (hasFromConnector(derivation) && !hasToConnector(derivation)) return getFromConnector(derivation); - if(hasToConnector(derivation) && !hasFromConnector(derivation)) + if (hasToConnector(derivation) && !hasFromConnector(derivation)) return getToConnector(derivation); return null; } 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)); From 1c73f46145a15fa9becbccefa7a1a031465440d3 Mon Sep 17 00:00:00 2001 From: Claudenir Fonseca Date: Fri, 8 Apr 2022 16:28:25 +0200 Subject: [PATCH 17/25] Update feature name to Model Sanitize --- ...pesController.java => ModelSanitizeController.java} | 2 +- src/main/resources/plugin.xml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) rename src/main/java/it/unibz/inf/ontouml/vp/controllers/{FixStereotypesController.java => ModelSanitizeController.java} (99%) diff --git a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java b/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeController.java similarity index 99% rename from src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java rename to src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeController.java index 236ec1ff..6782958c 100644 --- a/src/main/java/it/unibz/inf/ontouml/vp/controllers/FixStereotypesController.java +++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeController.java @@ -22,7 +22,7 @@ import java.util.Map; import java.util.Set; -public class FixStereotypesController implements VPActionController { +public class ModelSanitizeController implements VPActionController { private boolean shouldProceed = false; private Set attributes; diff --git a/src/main/resources/plugin.xml b/src/main/resources/plugin.xml index 4157617f..52de3f57 100644 --- a/src/main/resources/plugin.xml +++ b/src/main/resources/plugin.xml @@ -128,15 +128,15 @@ - + Date: Fri, 8 Apr 2022 16:34:10 +0200 Subject: [PATCH 18/25] Update deserialization of datatypes --- .../vp/model/ontouml/ModelElementContainer.java | 4 ++-- .../ontouml/vp/model/ontouml/model/Class.java | 17 +++++++++++++++-- .../vp/model/ontouml2vp/IProjectLoader.java | 4 ++-- .../inf/ontouml/vp/model/ontouml/ClassTest.java | 4 ++-- 4 files changed, 21 insertions(+), 8 deletions(-) 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/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/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(); } } From 68294c9b65380870023856cd90a8719f15622184 Mon Sep 17 00:00:00 2001 From: Claudenir Fonseca Date: Sat, 9 Apr 2022 07:42:35 +0200 Subject: [PATCH 19/25] Update several mechanisms - Navigability-based direction - Proper navigability-based serialization - Proper derivation direction serialization - Disabled navigability listener - Update meta-properties menu --- ...ApplyAssociationStereotypeMenuManager.java | 56 +++++- ....java => InvertAssociationController.java} | 4 +- .../controllers/ModelSanitizeController.java | 37 ++-- .../vp/listeners/AssociationEventManager.java | 41 ++--- .../IAssociationClassUIModelLoader.java | 1 + .../model/ontouml2vp/IAssociationLoader.java | 75 ++++++-- .../ontouml2vp/IAssociationUIModelLoader.java | 8 +- .../vp/model/ontouml2vp/LoaderUtils.java | 44 +++++ .../inf/ontouml/vp/model/uml/Association.java | 161 ++++++++++-------- .../uml/AssociationModelDescription.java | 4 +- .../inf/ontouml/vp/model/uml/Property.java | 15 ++ .../vp2ontouml/IAssociationTransformer.java | 18 +- .../vp2ontouml/IConnectorTransformer.java | 54 ++++++ .../vp/utils/OntoUMLConstraintsManager.java | 12 +- src/main/resources/plugin.xml | 2 +- 15 files changed, 389 insertions(+), 143 deletions(-) rename src/main/java/it/unibz/inf/ontouml/vp/controllers/{ModelActionController.java => InvertAssociationController.java} (93%) 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 7f48c234..48d4bd86 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,8 +3,10 @@ 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.model.uml.Property; import it.unibz.inf.ontouml.vp.utils.OntoUMLConstraintsManager; import it.unibz.inf.ontouml.vp.utils.StereotypesManager; import it.unibz.inf.ontouml.vp.utils.VPContextUtils; @@ -58,14 +60,58 @@ 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); + + setSourceEndProperties(association, sourceEnd); + setTargetEndProperties(association, targetEnd); }); } + private 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); + } + } + + private 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); + } + } + @Override public void update() { updateMenuLabel(); 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 index 6782958c..61a25198 100644 --- a/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeController.java +++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeController.java @@ -43,10 +43,18 @@ public void performAction(VPAction vpAction) { retrieveModelElements(); fixElementsStereotypes(); - fixAssociationEnds(); + fixMissingTypeOnAssociationEnds(); + fixNavigability(); } - private void fixAssociationEnds() { + private void fixNavigability() { +// associations.forEach(a -> { +// +// OntoUMLConstraintsManager.isStereotypeAllowed() +// }); + } + + private void fixMissingTypeOnAssociationEnds() { associations.forEach( a -> { if (hasMissingSourceEndType(a)) { @@ -59,26 +67,26 @@ private void fixAssociationEnds() { } private boolean hasMissingSourceEndType(IAssociation association) { - IClass source = Association.getSource(association); - IAssociationEnd sourceEnd = Association.getSourceEnd(association); + IClass source = Association.getFrom(association); + IAssociationEnd sourceEnd = Association.getFromEnd(association); return sourceEnd.getTypeAsElement() == null && source != null; } private boolean hasMissingTargetEndType(IAssociation association) { - IClass target = Association.getTarget(association); - IAssociationEnd targetEnd = Association.getTargetEnd(association); + IClass target = Association.getTo(association); + IAssociationEnd targetEnd = Association.getToEnd(association); return targetEnd.getTypeAsElement() == null && target != null; } private void fixSourceEnd(IAssociation association) { - IClass source = Association.getSource(association); - IAssociationEnd sourceEnd = Association.getSourceEnd(association); + IClass source = Association.getFrom(association); + IAssociationEnd sourceEnd = Association.getFromEnd(association); sourceEnd.setType(source); } private void fixTargetEnd(IAssociation association) { - IClass target = Association.getTarget(association); - IAssociationEnd targetEnd = Association.getTargetEnd(association); + IClass target = Association.getTo(association); + IAssociationEnd targetEnd = Association.getToEnd(association); targetEnd.setType(target); } @@ -150,10 +158,11 @@ private void applyAttributeStereotype(IAttribute attribute, String replacementSt } private void applyAssociationStereotype(IAssociation association, String replacementStereotype) { - if (shouldInvert(association, replacementStereotype)) - Association.invertAssociation(association, true); - - StereotypesManager.applyStereotype(association, replacementStereotype); + throw new RuntimeException("Oops... update invert"); +// if (shouldInvert(association, replacementStereotype)) +// Association.invertAssociation(association, true); +// +// StereotypesManager.applyStereotype(association, replacementStereotype); } private boolean shouldInvert(IAssociation association, String stereotype) { 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 ade60322..1b97da13 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 @@ -34,7 +34,7 @@ public void processEvent() { private void processStereotypeChange() { // checkSourcesDiagrams(); - checkAssociationConsistency(); +// 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/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..8e075f7e 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 @@ -2,14 +2,18 @@ import static it.unibz.inf.ontouml.vp.model.ontouml2vp.LoaderUtils.loadName; import static it.unibz.inf.ontouml.vp.model.ontouml2vp.LoaderUtils.logElementCreation; +import static it.unibz.inf.ontouml.vp.model.ontouml2vp.LoaderUtils.isWholeEnd; +import static it.unibz.inf.ontouml.vp.model.ontouml2vp.LoaderUtils.isNavigable; 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 +40,57 @@ 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 +118,26 @@ 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..f2b7bb68 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,10 @@ 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/LoaderUtils.java b/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml2vp/LoaderUtils.java index 928b9b08..66286641 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,46 @@ 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 57fde0ec..eaa633db 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,71 +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 int readingDirection = association.getDirection(); - 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); - association.setDirection( - readingDirection == IAssociation.DIRECTION_FROM_TO - ? IAssociation.DIRECTION_TO_FROM - : IAssociation.DIRECTION_FROM_TO); - } 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( @@ -311,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); @@ -326,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) { @@ -369,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); @@ -533,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: @@ -569,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: @@ -608,11 +594,11 @@ 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); } @@ -627,24 +613,12 @@ public static boolean hasMereologyStereotype(IAssociation association) { return 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) { @@ -691,4 +665,49 @@ 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)); + } } 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/Property.java b/src/main/java/it/unibz/inf/ontouml/vp/model/uml/Property.java index ebb5f770..1caa7f74 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 @@ -3,6 +3,7 @@ import com.google.gson.JsonObject; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; +import com.vp.plugin.model.IAssociation; import com.vp.plugin.model.IAssociationClass; import com.vp.plugin.model.IAssociationEnd; import com.vp.plugin.model.IAttribute; @@ -13,6 +14,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.Optional; import java.util.stream.Stream; /** @@ -468,4 +470,17 @@ 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/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/IConnectorTransformer.java b/src/main/java/it/unibz/inf/ontouml/vp/model/vp2ontouml/IConnectorTransformer.java index f2ef3466..067d3bd2 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 @@ -3,6 +3,7 @@ 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; @@ -10,6 +11,7 @@ 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; @@ -23,6 +25,12 @@ public static void transform(IConnectorUIModel source, ConnectorView 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); @@ -39,6 +47,20 @@ private static void setPath(IConnectorUIModel source, ConnectorView target) { 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()); @@ -79,6 +101,38 @@ else if (hasToConnector(source)) 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); 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/resources/plugin.xml b/src/main/resources/plugin.xml index 52de3f57..68bca7fb 100644 --- a/src/main/resources/plugin.xml +++ b/src/main/resources/plugin.xml @@ -198,7 +198,7 @@ - + From e74e60be5cc16de266a9c91db1371b17d4a28033 Mon Sep 17 00:00:00 2001 From: Claudenir Fonseca Date: Mon, 11 Apr 2022 02:53:46 +0200 Subject: [PATCH 20/25] Update association's apply stereotype --- ...ApplyAssociationStereotypeMenuManager.java | 45 +------------------ .../inf/ontouml/vp/model/uml/Association.java | 44 +++++++++++++++++- 2 files changed, 44 insertions(+), 45 deletions(-) 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 48d4bd86..deaacb97 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 @@ -6,7 +6,6 @@ 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.model.uml.Property; import it.unibz.inf.ontouml.vp.utils.OntoUMLConstraintsManager; import it.unibz.inf.ontouml.vp.utils.StereotypesManager; import it.unibz.inf.ontouml.vp.utils.VPContextUtils; @@ -67,51 +66,11 @@ public void performAction() { IAssociationEnd targetEnd = !doesRequireInverting(association) ? Association.getTargetEnd(association) : Association.getSourceEnd(association); - setSourceEndProperties(association, sourceEnd); - setTargetEndProperties(association, targetEnd); + Association.setSourceEndProperties(association, sourceEnd); + Association.setTargetEndProperties(association, targetEnd); }); } - private 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); - } - } - - private 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); - } - } - @Override public void update() { updateMenuLabel(); 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 eaa633db..9ed2c372 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 @@ -605,12 +605,12 @@ public static boolean isOntoumlAssociation(IAssociation association) { 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 hasAggregationOnFromEnd(IAssociation association) { @@ -710,4 +710,44 @@ 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); + } + } } From c925e26740d235318c0f96b39c4e25abb33f254f Mon Sep 17 00:00:00 2001 From: Claudenir Fonseca Date: Mon, 11 Apr 2022 02:54:44 +0200 Subject: [PATCH 21/25] Update model sanitize - fix direction wherever possible - show navigability in all associations - wrap sanitize on loader --- .../controllers/ModelSanitizeController.java | 118 ++++++++++++------ 1 file changed, 78 insertions(+), 40 deletions(-) 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 index 61a25198..6c8375b8 100644 --- a/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeController.java +++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeController.java @@ -13,17 +13,22 @@ 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.SimpleServiceWorker; import it.unibz.inf.ontouml.vp.utils.Stereotype; import it.unibz.inf.ontouml.vp.utils.StereotypesManager; import it.unibz.inf.ontouml.vp.utils.ViewManagerUtils; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Set; 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; private Set attributes; private Set associations; @@ -41,17 +46,73 @@ public void performAction(VPAction vpAction) { if (!shouldProceed) return; - retrieveModelElements(); - fixElementsStereotypes(); - fixMissingTypeOnAssociationEnds(); - fixNavigability(); + new SimpleServiceWorker(this::sanitizeModelTask).execute(); + } + + private List sanitizeModelTask(SimpleServiceWorker context) { + try { + if (!context.isCancelled()) { + retrieveModelElements(); + fixElementsStereotypes(); + fixMissingTypeOnAssociationEnds(); + fixAssociationEnds(); + + 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); + } + } + + 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 void fixNavigability() { -// associations.forEach(a -> { -// -// OntoUMLConstraintsManager.isStereotypeAllowed() -// }); + private boolean isAggregation(String aggregationKind) { + return IAssociationEnd.AGGREGATION_KIND_shared.equals(aggregationKind) + || IAssociationEnd.AGGREGATION_KIND_composite.equals(aggregationKind); } private void fixMissingTypeOnAssociationEnds() { @@ -136,42 +197,19 @@ private Map getStereotypesMap(String modelType) { } private void applyStereotype(IModelElement element, String replacementStereotype) { - final String modelType = element.getModelType(); + final String modelType = element != null ? element.getModelType() : null; - switch (modelType) { - case IModelElementFactory.MODEL_TYPE_ASSOCIATION: - applyAssociationStereotype((IAssociation) element, replacementStereotype); - break; - case IModelElementFactory.MODEL_TYPE_ATTRIBUTE: - applyAttributeStereotype((IAttribute) element, replacementStereotype); - break; - case IModelElementFactory.MODEL_TYPE_CLASS: - applyClassStereotype((IClass) element, replacementStereotype); - break; - default: - throw new RuntimeException("Unexpected model element of type '" + modelType + "'."); + if(!isTypeExpected(modelType)) { + throw new RuntimeException("Unexpected model element of type '" + modelType + "'."); } - } - - private void applyAttributeStereotype(IAttribute attribute, String replacementStereotype) { - StereotypesManager.applyStereotype(attribute, replacementStereotype); - } - - private void applyAssociationStereotype(IAssociation association, String replacementStereotype) { - throw new RuntimeException("Oops... update invert"); -// if (shouldInvert(association, replacementStereotype)) -// Association.invertAssociation(association, true); -// -// StereotypesManager.applyStereotype(association, replacementStereotype); - } - private boolean shouldInvert(IAssociation association, String stereotype) { - return !OntoUMLConstraintsManager.isStereotypeAllowed(association, stereotype) - && OntoUMLConstraintsManager.isStereotypeAllowedIfInverted(association, stereotype); + StereotypesManager.applyStereotype(element, replacementStereotype); } - private void applyClassStereotype(IClass _class, String replacementStereotype) { - StereotypesManager.applyStereotype(_class, 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) { From ae0f9e880c1f69740c82a73ddc745d0dc4aac34e Mon Sep 17 00:00:00 2001 From: Claudenir Fonseca Date: Mon, 11 Apr 2022 10:34:27 +0200 Subject: [PATCH 22/25] WIP: repository sanitizer and general fixes --- .../controllers/ModelSanitizeController.java | 303 +-------------- .../vp/controllers/ModelSanitizeManager.java | 328 ++++++++++++++++ .../controllers/ReloadClassesController.java | 367 ++++++++++++++++-- .../ontouml/vp/utils/ViewManagerUtils.java | 6 + 4 files changed, 665 insertions(+), 339 deletions(-) create mode 100644 src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeManager.java 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 index 6c8375b8..bf1f2786 100644 --- a/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeController.java +++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeController.java @@ -2,27 +2,9 @@ import com.vp.plugin.action.VPAction; import com.vp.plugin.action.VPActionController; -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.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.SimpleServiceWorker; -import it.unibz.inf.ontouml.vp.utils.Stereotype; -import it.unibz.inf.ontouml.vp.utils.StereotypesManager; import it.unibz.inf.ontouml.vp.utils.ViewManagerUtils; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; import java.util.List; -import java.util.Map; -import java.util.Set; public class ModelSanitizeController implements VPActionController { @@ -30,12 +12,6 @@ public class ModelSanitizeController implements VPActionController { private static final String MESSAGE_MODEL_IMPORT_UNEXPECTED_ERROR = "Unexpected error performing model sanitize."; private boolean shouldProceed = false; - private Set attributes; - private Set associations; - private Set classes; - private Map associationStereotypesMap; - private Map attributeStereotypesMap; - private Map classStereotypesMap; @Override public void update(VPAction vpAction) {} @@ -49,14 +25,14 @@ public void performAction(VPAction vpAction) { new SimpleServiceWorker(this::sanitizeModelTask).execute(); } + private void showFixStereotypesWarning() { + shouldProceed = ViewManagerUtils.showFixStereotypesWarningDialog(); + } + private List sanitizeModelTask(SimpleServiceWorker context) { try { if (!context.isCancelled()) { - retrieveModelElements(); - fixElementsStereotypes(); - fixMissingTypeOnAssociationEnds(); - fixAssociationEnds(); - + ModelSanitizeManager.run(); ViewManagerUtils.log(MESSAGE_MODEL_SANITIZE_SUCCESS); return List.of(MESSAGE_MODEL_SANITIZE_SUCCESS); } @@ -68,273 +44,4 @@ private List sanitizeModelTask(SimpleServiceWorker context) { return List.of(MESSAGE_MODEL_IMPORT_UNEXPECTED_ERROR); } } - - 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 (hasMissingSourceEndType(a)) { - fixSourceEnd(a); - } - if (hasMissingTargetEndType(a)) { - fixTargetEnd(a); - } - }); - } - - private boolean hasMissingSourceEndType(IAssociation association) { - IClass source = Association.getFrom(association); - IAssociationEnd sourceEnd = Association.getFromEnd(association); - return sourceEnd.getTypeAsElement() == null && source != null; - } - - private boolean hasMissingTargetEndType(IAssociation association) { - IClass target = Association.getTo(association); - IAssociationEnd targetEnd = Association.getToEnd(association); - return targetEnd.getTypeAsElement() == null && target != null; - } - - private void fixSourceEnd(IAssociation association) { - IClass source = Association.getFrom(association); - IAssociationEnd sourceEnd = Association.getFromEnd(association); - sourceEnd.setType(source); - } - - private void fixTargetEnd(IAssociation association) { - IClass target = Association.getTo(association); - IAssociationEnd targetEnd = Association.getToEnd(association); - targetEnd.setType(target); - } - - private void showFixStereotypesWarning() { - shouldProceed = ViewManagerUtils.showFixStereotypesWarningDialog(); - } - - 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() { - associations = new HashSet<>(); - final Iterator iter = - ApplicationManagerUtils.getAllLevelModelElements( - IModelElementFactory.MODEL_TYPE_ASSOCIATION); - - while (iter != null && iter.hasNext()) { - associations.add((IAssociation) iter.next()); - } - } - - private void retrieveAttributes() { - attributes = new HashSet<>(); - classes.stream().flatMap(c -> Class.getAttributes(c).stream()).forEach(attributes::add); - } - - 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()); - } - } } 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..865ce055 --- /dev/null +++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeManager.java @@ -0,0 +1,328 @@ +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); + + return fromEnd.getTypeAsElement() != null + && fromEnd.getTypeAsElement().getModelType().equals(from.getModelType()); + } + + private boolean doesToMatchEndType(IAssociation association) { + IModelElement to = association.getTo(); + IAssociationEnd toEnd = Association.getToEnd(association); + + return toEnd.getTypeAsElement() != null + && toEnd.getTypeAsElement().getModelType().equals(to.getModelType()); + } + + 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 a763770a..2b0c3a84 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,44 +1,200 @@ package it.unibz.inf.ontouml.vp.controllers; import com.vp.plugin.ApplicationManager; -import com.vp.plugin.ViewManager; +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.IDiagramElement; -import com.vp.plugin.model.IModelElement; -import com.vp.plugin.model.IStereotype; -import com.vp.plugin.model.ITaggedValue; -import com.vp.plugin.model.ITaggedValueContainer; +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.utils.ApplicationManagerUtils; +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 javax.swing.JOptionPane; +import java.util.List; +import java.util.Set; +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 = Set.of(".git", ".vscode" +// , "abel2015petroleum-system" +// , "albuquerque2015ontobio" +// , "amaral2019rot" +// , "amaral2020modeling" +// , "ambient-assisted-living2021" +// , "aristotle-ontology2019" +// , "barcelos2015ontology" +// , "barros2020programming" +// , "board-game-ontology2020" +// , "buchtela2020connection" +// , "castro2012cloudvulnerability" +// , "cgts2021sebim" +// , "clergy-ontology" +// , "cservice2015ontology" +// , "dpo2017" +// , "el2020ontology" +// , "experiment-model2015" +// , "ferreira2015ontoemergeplan" +// , "filip2021modelovani" +// , "fraller2019flexible" +// , "g809-2015" +// , "gi2mo-ontology" +// , "grueau2013towards" +// , "guarino2018rea" +// , "guizzardi2014nfr" +// , "guizzardi2020core" +// , "hazard-ontology-train-control2017" +// , "internal-affairs-ontology" +// , "khantong2020ontology" +// , "kostov2017towards" +// , "laurier2018rea" +// , "library" +// , "martinez2013human-genome" +// , "medical-appointment2020" +// , "mono2022ontology" +// , "music-ontology" +// , "nardi2015commitment" +// , "niederkofler2019knowledge" +// , "oliveira2007collaboration" +// , "pereira2015ontologia" +// , "pereira2020ontotrans" +// , "ramirez2015userfeedback" +// , "rdbs-o2018" +// , "real-state-ontology2015" +// , "recommendation-ontology" +// , "rodrigues2017ontological" +// , "rodrigues2019ontocrime" +// , "sales2018cover" +// , "silveira2021oap" +// , "spmo" +// , "van2020ontological" +// , "vanEe2021modular" +// , "vieira2020weathering" +// , "vrepa2021digital" +// , "andersson2018ascribing" +// , "duarte2018ontological" +// , "duarte2018osdef" +// , "franco2018ontology" +// , "hazard-ontology-robotic-strolling2017" +// , "photo2015ontology" +// , "zanetti2019representacao" + , "ANTT-Ontology2015" + , "abrahao2018complex" + , "aguiar2019ooco" + , "ahmad2018aviation" + , "aires2022valuenetworks-geo" + , "amaral2020rome" + , "andersson2018ascribing" + , "bank2015model" + , "barcelos2013ontology" + , "brazilian-federal-organizational-structures2015" + , "buridan-ontology2021" + , "carolla2014methodological" + , "cmpo2017ontology" + , "cons2015model" + , "debbech2019conceptual" + , "digitaldoctor2022ontology" + , "duarte2018ontological" + , "duarte2018osdef" + , "duarte2021ross" + , "eu-rent-refactored2022" + , "fernandez-cejas2022curie-o" + , "fischer2018ontorea" + , "franco2018ontology" + , "gailly2016design" + , "gameplay-ontology2020" + , "guarino2016towards" + , "guizzardi2005ontological" + , "hazard-ontology-robotic-strolling2017" + , "hazard-ontology2017" + , "healthORG2015model" + , "internship" + , "it2015infrastructure" + , "junior2018o4c" + , "moreira2018saref4health" + , "neves2020nwpontology" + , "neves2021ontology" + , "online-mentoring" + , "photo2015ontology" + , "plato-ontology2019" + , "porello2020coex" + , "ppo-o2021" + , "project-management-ontology" + , "public-expense-ontology2020" + , "qam" + , "quality-assurance-process-ontology2017" + , "ramos2021bias" + , "richetti2019tdecision" + , "rodrigues2019ontological" + , "rsystem2020ontology" + , "saleme2019mulseonto" + , "santos2020valuenetworks" + , "silva2012itarchitecture" + , "social-contract2015" + , "software-ontology-swo" + , "spo" + , "sportbooking2021model" + , "srro-ontology" + , "stock-broker2021" + , "tender2015model" + , "university-ontology" + , "weigand2021artifact" + , "zanetti2019representacao" + ); + 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) { - final String dialogResult = showInputDialog(); - if (dialogResult == null || dialogResult.isEmpty()) { + 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(); - } else { - applyStereotype(dialogResult); } } @Override public void update(VPAction action) {} - private String showInputDialog() { - final ViewManager vm = ApplicationManager.instance().getViewManager(); - return vm.showInputDialog( - vm.getRootFrame(), - "Enter stereotype or cancel to download:", - "Stereotype Dialog", - JOptionPane.PLAIN_MESSAGE); - } - private void reloadPlugin() { System.out.println("----------------------------------------"); System.out.println("Reloading OntoUML Plugin..."); @@ -48,35 +204,164 @@ private void reloadPlugin() { ViewManagerUtils.simpleDialog("Plugin reloaded!"); } - private void applyStereotype(String stereotype) { - final IDiagramElement[] views = - ApplicationManagerUtils.getDiagramManager().getSelectedDiagramElements(); - final IDiagramElement selectedView = views != null && views.length > 0 ? views[0] : null; - final IModelElement selectedElement = - selectedView != null ? selectedView.getMetaModelElement() : null; + 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); - if (selectedElement != null) { - applyStereotype(selectedElement, stereotype); + 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 applyStereotype(IModelElement element, String stereotype) { - removeStereotypes(element); - element.addStereotype(stereotype); + private void emptyFolder(File diagramsDir) throws IOException { + Files.newDirectoryStream(diagramsDir.toPath()) + .forEach(path -> path.toFile().delete()); } - private void removeStereotypes(IModelElement element) { - final ITaggedValueContainer container = element.getTaggedValues(); - final Iterator taggedValuesIterator = - container != null ? container.taggedValueIterator() : null; - final Iterator stereotypeIterator = element.stereotypeModelIterator(); - while (taggedValuesIterator != null && taggedValuesIterator.hasNext()) { - container.removeTaggedValue((ITaggedValue) taggedValuesIterator.next()); + 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() + "'!"); } - while (stereotypeIterator != null && stereotypeIterator.hasNext()) { - element.removeStereotype((IStereotype) stereotypeIterator.next()); + 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/utils/ViewManagerUtils.java b/src/main/java/it/unibz/inf/ontouml/vp/utils/ViewManagerUtils.java index 46bb6a6b..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 @@ -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())) + "] "; } From 28edd5981ec22f6dcf6e97189d74671ea604f01a Mon Sep 17 00:00:00 2001 From: github-actions <> Date: Mon, 11 Apr 2022 08:35:14 +0000 Subject: [PATCH 23/25] Google Java Format --- ...ApplyAssociationStereotypeMenuManager.java | 12 +- .../controllers/ModelSanitizeController.java | 6 +- .../vp/controllers/ModelSanitizeManager.java | 109 ++--- .../controllers/ReloadClassesController.java | 406 +++++++++--------- .../vp/listeners/AssociationEventManager.java | 8 +- .../model/ontouml2vp/IAssociationLoader.java | 38 +- .../ontouml2vp/IAssociationUIModelLoader.java | 3 +- .../vp/model/ontouml2vp/LoaderUtils.java | 13 +- .../inf/ontouml/vp/model/uml/Association.java | 24 +- .../inf/ontouml/vp/model/uml/Property.java | 8 +- .../vp2ontouml/IConnectorTransformer.java | 15 +- 11 files changed, 335 insertions(+), 307 deletions(-) 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 deaacb97..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 @@ -61,10 +61,14 @@ public void performAction() { association -> { 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); + 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/ModelSanitizeController.java b/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeController.java index bf1f2786..1075fdcd 100644 --- a/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeController.java +++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeController.java @@ -8,8 +8,10 @@ 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 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; 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 index 865ce055..2e00952d 100644 --- a/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeManager.java +++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeManager.java @@ -41,49 +41,49 @@ public static void run() { } private void filterAssociationBetweenClasses() { - associations = associations.stream() - .filter(Association::holdsBetweenClasses) - .collect(Collectors.toSet()); + 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); - } - } - }); + 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); + 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)) + || Association.hasMereologyStereotype(association)) && isAggregation(originalAggregation); } @@ -177,7 +177,7 @@ private Map getStereotypesMap(String modelType) { private void applyStereotype(IModelElement element, String replacementStereotype) { final String modelType = element != null ? element.getModelType() : null; - if(!isTypeExpected(modelType)) { + if (!isTypeExpected(modelType)) { throw new RuntimeException("Unexpected model element of type '" + modelType + "'."); } @@ -293,36 +293,39 @@ private void retrieveModelElements() { 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()); + 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()); + // 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()); -// } + // 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()); + 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 2b0c3a84..7a06d58f 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 @@ -29,131 +29,134 @@ public class ReloadClassesController implements VPActionController { 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 = Set.of(".git", ".vscode" -// , "abel2015petroleum-system" -// , "albuquerque2015ontobio" -// , "amaral2019rot" -// , "amaral2020modeling" -// , "ambient-assisted-living2021" -// , "aristotle-ontology2019" -// , "barcelos2015ontology" -// , "barros2020programming" -// , "board-game-ontology2020" -// , "buchtela2020connection" -// , "castro2012cloudvulnerability" -// , "cgts2021sebim" -// , "clergy-ontology" -// , "cservice2015ontology" -// , "dpo2017" -// , "el2020ontology" -// , "experiment-model2015" -// , "ferreira2015ontoemergeplan" -// , "filip2021modelovani" -// , "fraller2019flexible" -// , "g809-2015" -// , "gi2mo-ontology" -// , "grueau2013towards" -// , "guarino2018rea" -// , "guizzardi2014nfr" -// , "guizzardi2020core" -// , "hazard-ontology-train-control2017" -// , "internal-affairs-ontology" -// , "khantong2020ontology" -// , "kostov2017towards" -// , "laurier2018rea" -// , "library" -// , "martinez2013human-genome" -// , "medical-appointment2020" -// , "mono2022ontology" -// , "music-ontology" -// , "nardi2015commitment" -// , "niederkofler2019knowledge" -// , "oliveira2007collaboration" -// , "pereira2015ontologia" -// , "pereira2020ontotrans" -// , "ramirez2015userfeedback" -// , "rdbs-o2018" -// , "real-state-ontology2015" -// , "recommendation-ontology" -// , "rodrigues2017ontological" -// , "rodrigues2019ontocrime" -// , "sales2018cover" -// , "silveira2021oap" -// , "spmo" -// , "van2020ontological" -// , "vanEe2021modular" -// , "vieira2020weathering" -// , "vrepa2021digital" -// , "andersson2018ascribing" -// , "duarte2018ontological" -// , "duarte2018osdef" -// , "franco2018ontology" -// , "hazard-ontology-robotic-strolling2017" -// , "photo2015ontology" -// , "zanetti2019representacao" - , "ANTT-Ontology2015" - , "abrahao2018complex" - , "aguiar2019ooco" - , "ahmad2018aviation" - , "aires2022valuenetworks-geo" - , "amaral2020rome" - , "andersson2018ascribing" - , "bank2015model" - , "barcelos2013ontology" - , "brazilian-federal-organizational-structures2015" - , "buridan-ontology2021" - , "carolla2014methodological" - , "cmpo2017ontology" - , "cons2015model" - , "debbech2019conceptual" - , "digitaldoctor2022ontology" - , "duarte2018ontological" - , "duarte2018osdef" - , "duarte2021ross" - , "eu-rent-refactored2022" - , "fernandez-cejas2022curie-o" - , "fischer2018ontorea" - , "franco2018ontology" - , "gailly2016design" - , "gameplay-ontology2020" - , "guarino2016towards" - , "guizzardi2005ontological" - , "hazard-ontology-robotic-strolling2017" - , "hazard-ontology2017" - , "healthORG2015model" - , "internship" - , "it2015infrastructure" - , "junior2018o4c" - , "moreira2018saref4health" - , "neves2020nwpontology" - , "neves2021ontology" - , "online-mentoring" - , "photo2015ontology" - , "plato-ontology2019" - , "porello2020coex" - , "ppo-o2021" - , "project-management-ontology" - , "public-expense-ontology2020" - , "qam" - , "quality-assurance-process-ontology2017" - , "ramos2021bias" - , "richetti2019tdecision" - , "rodrigues2019ontological" - , "rsystem2020ontology" - , "saleme2019mulseonto" - , "santos2020valuenetworks" - , "silva2012itarchitecture" - , "social-contract2015" - , "software-ontology-swo" - , "spo" - , "sportbooking2021model" - , "srro-ontology" - , "stock-broker2021" - , "tender2015model" - , "university-ontology" - , "weigand2021artifact" - , "zanetti2019representacao" - ); + private static Set blacklistSet = + Set.of( + ".git", + ".vscode" + // , "abel2015petroleum-system" + // , "albuquerque2015ontobio" + // , "amaral2019rot" + // , "amaral2020modeling" + // , "ambient-assisted-living2021" + // , "aristotle-ontology2019" + // , "barcelos2015ontology" + // , "barros2020programming" + // , "board-game-ontology2020" + // , "buchtela2020connection" + // , "castro2012cloudvulnerability" + // , "cgts2021sebim" + // , "clergy-ontology" + // , "cservice2015ontology" + // , "dpo2017" + // , "el2020ontology" + // , "experiment-model2015" + // , "ferreira2015ontoemergeplan" + // , "filip2021modelovani" + // , "fraller2019flexible" + // , "g809-2015" + // , "gi2mo-ontology" + // , "grueau2013towards" + // , "guarino2018rea" + // , "guizzardi2014nfr" + // , "guizzardi2020core" + // , "hazard-ontology-train-control2017" + // , "internal-affairs-ontology" + // , "khantong2020ontology" + // , "kostov2017towards" + // , "laurier2018rea" + // , "library" + // , "martinez2013human-genome" + // , "medical-appointment2020" + // , "mono2022ontology" + // , "music-ontology" + // , "nardi2015commitment" + // , "niederkofler2019knowledge" + // , "oliveira2007collaboration" + // , "pereira2015ontologia" + // , "pereira2020ontotrans" + // , "ramirez2015userfeedback" + // , "rdbs-o2018" + // , "real-state-ontology2015" + // , "recommendation-ontology" + // , "rodrigues2017ontological" + // , "rodrigues2019ontocrime" + // , "sales2018cover" + // , "silveira2021oap" + // , "spmo" + // , "van2020ontological" + // , "vanEe2021modular" + // , "vieira2020weathering" + // , "vrepa2021digital" + // , "andersson2018ascribing" + // , "duarte2018ontological" + // , "duarte2018osdef" + // , "franco2018ontology" + // , "hazard-ontology-robotic-strolling2017" + // , "photo2015ontology" + // , "zanetti2019representacao" + , + "ANTT-Ontology2015", + "abrahao2018complex", + "aguiar2019ooco", + "ahmad2018aviation", + "aires2022valuenetworks-geo", + "amaral2020rome", + "andersson2018ascribing", + "bank2015model", + "barcelos2013ontology", + "brazilian-federal-organizational-structures2015", + "buridan-ontology2021", + "carolla2014methodological", + "cmpo2017ontology", + "cons2015model", + "debbech2019conceptual", + "digitaldoctor2022ontology", + "duarte2018ontological", + "duarte2018osdef", + "duarte2021ross", + "eu-rent-refactored2022", + "fernandez-cejas2022curie-o", + "fischer2018ontorea", + "franco2018ontology", + "gailly2016design", + "gameplay-ontology2020", + "guarino2016towards", + "guizzardi2005ontological", + "hazard-ontology-robotic-strolling2017", + "hazard-ontology2017", + "healthORG2015model", + "internship", + "it2015infrastructure", + "junior2018o4c", + "moreira2018saref4health", + "neves2020nwpontology", + "neves2021ontology", + "online-mentoring", + "photo2015ontology", + "plato-ontology2019", + "porello2020coex", + "ppo-o2021", + "project-management-ontology", + "public-expense-ontology2020", + "qam", + "quality-assurance-process-ontology2017", + "ramos2021bias", + "richetti2019tdecision", + "rodrigues2019ontological", + "rsystem2020ontology", + "saleme2019mulseonto", + "santos2020valuenetworks", + "silva2012itarchitecture", + "social-contract2015", + "software-ontology-swo", + "spo", + "sportbooking2021model", + "srro-ontology", + "stock-broker2021", + "tender2015model", + "university-ontology", + "weigand2021artifact", + "zanetti2019representacao"); private static Set targetSet = Set.of(""); private File repositoryFile; @@ -178,16 +181,16 @@ public void performAction(VPAction action) { boolean shouldRunOnRepo = ViewManagerUtils.warningDialog(RUN_ON_REPO_CONFIRMATION); - if(shouldRunOnRepo) { + if (shouldRunOnRepo) { repositoryFile = getDirectory(); new SimpleServiceWorker(this::runOnRepo).execute(); - return ; + return; } boolean shouldReload = ViewManagerUtils.warningDialog(RELOAD_PLUGIN_CONFIRMATION); - if(shouldReload) { + if (shouldReload) { reloadPlugin(); } } @@ -222,64 +225,69 @@ private List runOnRepo(SimpleServiceWorker context) { } private void processRepository() throws IOException { - if(!repositoryFile.isDirectory()) { - throw new RuntimeException("Invalid repository directory: '" + repositoryFile.getAbsolutePath() + "'"); + 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"); - }); - + .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 { @@ -292,7 +300,7 @@ private void exportDiagrams() throws IOException { Iterator iter = project.diagramIterator(); - while(iter != null && iter.hasNext()) { + while (iter != null && iter.hasNext()) { IDiagramUIModel diagram = (IDiagramUIModel) iter.next(); String name = diagram.getName(); File diagramFile = Paths.get(diagramsDir.getAbsolutePath(), name + ".png").toFile(); @@ -303,36 +311,38 @@ private void exportDiagrams() throws IOException { } private void emptyFolder(File diagramsDir) throws IOException { - Files.newDirectoryStream(diagramsDir.toPath()) - .forEach(path -> path.toFile().delete()); + 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 originalDiagramsDir = + Paths.get(ontologyDir.getAbsolutePath(), "original diagrams").toFile(); File newDiagramsDir = Paths.get(ontologyDir.getAbsolutePath(), "new diagrams").toFile(); - if(!ontologyDir.exists()) { + 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 (!ontologyVppFile.exists()) { + throw new RuntimeException( + "Visual Paradigm file not found! (" + ontologyVppFile.getPath() + ")"); } - if(!ontologyJsonFile.exists()) { + if (!ontologyJsonFile.exists()) { throw new RuntimeException("JSON file not found! (" + ontologyJsonFile.getPath() + ")"); } - if(!originalDiagramsDir.isDirectory() && !newDiagramsDir.isDirectory()) { + if (!originalDiagramsDir.isDirectory() && !newDiagramsDir.isDirectory()) { throw new RuntimeException("No folder found at '" + ontologyJsonFile.getPath() + "'!"); } - diagramsDir = shouldExportToOriginalDiagramsDir(originalDiagramsDir, newDiagramsDir) ? - originalDiagramsDir : newDiagramsDir; + diagramsDir = + shouldExportToOriginalDiagramsDir(originalDiagramsDir, newDiagramsDir) + ? originalDiagramsDir + : newDiagramsDir; } private boolean shouldExportToOriginalDiagramsDir(File originalDiagramsDir, File newDiagramsDir) { @@ -343,7 +353,7 @@ 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()) { + if (!ontologyFile.exists() || !ontologyFile.isFile()) { throw new RuntimeException("Ontology file not found"); } @@ -355,8 +365,8 @@ private void openProject(File ontologyDir) throws IOException { 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(); + JFileChooser jc = + ontoumlModelsDir.isDirectory() ? new JFileChooser(ontoumlModelsDir) : new JFileChooser(); jc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 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 1b97da13..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 @@ -34,7 +34,7 @@ public void processEvent() { private void processStereotypeChange() { // checkSourcesDiagrams(); -// checkAssociationConsistency(); + // checkAssociationConsistency(); // setDefaultAssociationProperties(); } @@ -121,9 +121,9 @@ private void checkAssociationEndProperties() { private void checkAggregationPlacement() { throw new RuntimeException("Oops..."); -// if (hasAggregationOnSource() && !hasAggregationOnTarget()) { -// Association.invertAssociation(source, true); -// } + // if (hasAggregationOnSource() && !hasAggregationOnTarget()) { + // Association.invertAssociation(source, true); + // } } private boolean hasAggregationOnTarget() { 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 8e075f7e..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,9 +1,8 @@ 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 static it.unibz.inf.ontouml.vp.model.ontouml2vp.LoaderUtils.isWholeEnd; -import static it.unibz.inf.ontouml.vp.model.ontouml2vp.LoaderUtils.isNavigable; import com.vp.plugin.ApplicationManager; import com.vp.plugin.model.*; @@ -57,24 +56,27 @@ public static IAssociation importElement(Relation fromRelation) { 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 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; + 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 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; + if (toId.equals(classId) && !fromId.equals(classId)) return toEnd; + if (fromId.equals(classId) && !toId.equals(classId)) return fromEnd; return toEnd; } @@ -84,7 +86,7 @@ private static void enforceNavigability(IAssociation association) { fromEnd.setNavigable(IAssociationEnd.NAVIGABLE_UNSPECIFIED); - if(!isWholeEnd(toEnd) && !isWholeEnd(fromEnd)) { + if (!isWholeEnd(toEnd) && !isWholeEnd(fromEnd)) { toEnd.setNavigable(IAssociationEnd.NAVIGABLE_NAVIGABLE); } else { toEnd.setNavigable(IAssociationEnd.NAVIGABLE_UNSPECIFIED); @@ -122,10 +124,12 @@ 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"); + String associationSourceId = + Optional.ofNullable(associationSource.getId()).orElse("nosourceid"); + String associationFromId = + Optional.ofNullable(association.getFrom()).map(IModelElement::getId).orElse("nofromid"); - if(associationFromId.equals(associationSourceId)) association.setFrom(associationSource); + if (associationFromId.equals(associationSourceId)) association.setFrom(associationSource); else association.setTo(associationSource); } @@ -133,10 +137,12 @@ 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"); + String associationTargetId = + Optional.ofNullable(associationTarget.getId()).orElse("notargetid"); + String associationToId = + Optional.ofNullable(association.getTo()).map(IModelElement::getId).orElse("notoid"); - if(associationToId.equals(associationTargetId)) association.setTo(associationTarget); + if (associationToId.equals(associationTargetId)) association.setTo(associationTarget); else association.setFrom(associationTarget); } 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 f2b7bb68..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 @@ -38,7 +38,8 @@ public static void load(IClassDiagramUIModel toDiagram, RelationView fromView) { toView.resetCaption(); } - public boolean isDirectionInverted(IClass source, IClass target, IDiagramElement sourceShape, IDiagramElement targetShape) { + 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/LoaderUtils.java b/src/main/java/it/unibz/inf/ontouml/vp/model/ontouml2vp/LoaderUtils.java index 66286641..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 @@ -87,8 +87,8 @@ static void loadName(ModelElement fromElement, IModelElement toElement) { } static boolean isWholeEnd(IAssociationEnd associationEnd) { - return associationEnd.getAggregationKind() != null && - !IAssociationEnd.AGGREGATION_KIND_none.equals(associationEnd.getAggregationKind()); + return associationEnd.getAggregationKind() != null + && !IAssociationEnd.AGGREGATION_KIND_none.equals(associationEnd.getAggregationKind()); } static boolean isNavigable(IAssociationEnd associationEnd) { @@ -99,13 +99,13 @@ static IAssociationEnd getSourceEndOnNavigability(IAssociation association) { IAssociationEnd fromEnd = (IAssociationEnd) association.getFromEnd(); IAssociationEnd toEnd = (IAssociationEnd) association.getToEnd(); - if(isWholeEnd(toEnd)) { + if (isWholeEnd(toEnd)) { return toEnd; - } else if(isWholeEnd(fromEnd)) { + } else if (isWholeEnd(fromEnd)) { return fromEnd; - } else if(isNavigable(toEnd)) { + } else if (isNavigable(toEnd)) { return toEnd; - } else if(isNavigable(fromEnd)) { + } else if (isNavigable(fromEnd)) { return fromEnd; } else { return toEnd; @@ -126,5 +126,4 @@ static IClass getSourceOnNavigability(IAssociation association) { 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 9ed2c372..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 @@ -605,12 +605,14 @@ public static boolean isOntoumlAssociation(IAssociation association) { public static boolean hasOntoumlStereotype(IAssociation association) { final String stereotype = ModelElement.getUniqueStereotypeName(association); - return stereotype != null && 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 != null && Stereotype.getOntoUMLMereologyStereotypeNames().contains(stereotype); + return stereotype != null + && Stereotype.getOntoUMLMereologyStereotypeNames().contains(stereotype); } public static boolean hasAggregationOnFromEnd(IAssociation association) { @@ -678,13 +680,13 @@ public static IAssociationEnd getTargetEnd(IAssociation association) { IAssociationEnd fromEnd = (IAssociationEnd) association.getFromEnd(); IAssociationEnd toEnd = (IAssociationEnd) association.getToEnd(); - if(hasAggregationOnToEnd(association)) { + if (hasAggregationOnToEnd(association)) { return toEnd; - } else if(hasAggregationOnFromEnd(association)) { + } else if (hasAggregationOnFromEnd(association)) { return fromEnd; - } else if(hasNavigableToEnd(association)) { + } else if (hasNavigableToEnd(association)) { return toEnd; - } else if(hasNavigableFromEnd(association)) { + } else if (hasNavigableFromEnd(association)) { return fromEnd; } else { return toEnd; @@ -717,7 +719,8 @@ public static void setSourceEndProperties(IAssociation association, IAssociation sourceEnd.setNavigable(IAssociationEnd.NAVIGABLE_UNSPECIFIED); sourceEnd.setAggregationKind(IAssociationEnd.AGGREGATION_KIND_none); - if(sourceMultiplicity == null || IAssociationEnd.MULTIPLICITY_UNSPECIFIED.equals(sourceMultiplicity)) { + if (sourceMultiplicity == null + || IAssociationEnd.MULTIPLICITY_UNSPECIFIED.equals(sourceMultiplicity)) { String defaultSourceMultiplicity = Association.getDefaultSourceMultiplicity(association); sourceEnd.setMultiplicity(defaultSourceMultiplicity); } @@ -728,8 +731,8 @@ public static void setSourceEndProperties(IAssociation association, IAssociation } public static void setTargetEndProperties(IAssociation association, IAssociationEnd targetEnd) { - if(Association.hasMereologyStereotype(association)) { - if(!Property.isWholeEnd(targetEnd)) { + if (Association.hasMereologyStereotype(association)) { + if (!Property.isWholeEnd(targetEnd)) { String defaultAggKind = Association.getDefaultAggregationKind(association); targetEnd.setAggregationKind(defaultAggKind); } @@ -741,7 +744,8 @@ public static void setTargetEndProperties(IAssociation association, IAssociation String targetMultiplicity = targetEnd.getMultiplicity(); - if(targetMultiplicity == null || IAssociationEnd.MULTIPLICITY_UNSPECIFIED.equals(targetMultiplicity)) { + if (targetMultiplicity == null + || IAssociationEnd.MULTIPLICITY_UNSPECIFIED.equals(targetMultiplicity)) { String defaultTargetMultiplicity = Association.getDefaultTargetMultiplicity(association); targetEnd.setMultiplicity(defaultTargetMultiplicity); } 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 1caa7f74..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 @@ -3,7 +3,6 @@ import com.google.gson.JsonObject; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; -import com.vp.plugin.model.IAssociation; import com.vp.plugin.model.IAssociationClass; import com.vp.plugin.model.IAssociationEnd; import com.vp.plugin.model.IAttribute; @@ -472,9 +471,10 @@ public static void addSubsettedProperties( } public static boolean isWholeEnd(IAssociationEnd associationEnd) { - String aggregationKind = Optional.ofNullable(associationEnd.getAggregationKind()) - .map(String::toLowerCase) - .orElse(""); + String aggregationKind = + Optional.ofNullable(associationEnd.getAggregationKind()) + .map(String::toLowerCase) + .orElse(""); return IAssociationEnd.AGGREGATION_KIND_shared.equals(aggregationKind) || IAssociationEnd.AGGREGATION_KIND_composite.equals(aggregationKind); 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 067d3bd2..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 @@ -51,8 +51,7 @@ 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); + if (!Association.doesFromAndSourceMatch(association)) Collections.reverse(points); Path path = new Path(); path.setId(source.getId() + "_path"); @@ -105,14 +104,14 @@ private static void setSourceShape(IAssociationUIModel source, ConnectorView IAssociation association = (IAssociation) source.getModelElement(); IDiagramElement shapeOrConnector = null; - if (Association.doesFromAndSourceMatch(association)){ + 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; + ElementView connectorSourceStub = + shapeOrConnector != null ? ReferenceTransformer.transformStub(shapeOrConnector) : null; target.setSource(connectorSourceStub); } @@ -121,14 +120,14 @@ private static void setTargetShape(IAssociationUIModel source, ConnectorView IAssociation association = (IAssociation) source.getModelElement(); IDiagramElement shapeOrConnector = null; - if (Association.doesFromAndSourceMatch(association)){ + 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; + ElementView connectorSourceStub = + shapeOrConnector != null ? ReferenceTransformer.transformStub(shapeOrConnector) : null; target.setTarget(connectorSourceStub); } From e9cfb910c63d55200cc9d05e88a57dde7107a54c Mon Sep 17 00:00:00 2001 From: Claudenir Fonseca Date: Mon, 18 Apr 2022 22:50:09 +0200 Subject: [PATCH 24/25] Fixes bugs - filters out views with no model element from the serialization - bugfix detection of mismatches between source/target and source end/target end --- .../vp/controllers/ModelSanitizeManager.java | 8 +- .../controllers/ReloadClassesController.java | 245 ++++++++---------- .../vp2ontouml/IClassDiagramTransformer.java | 1 + 3 files changed, 112 insertions(+), 142 deletions(-) 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 index 2e00952d..d92cbe9f 100644 --- a/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeManager.java +++ b/src/main/java/it/unibz/inf/ontouml/vp/controllers/ModelSanitizeManager.java @@ -108,17 +108,17 @@ private void fixMissingTypeOnAssociationEnds() { private boolean doesFromMatchEndType(IAssociation association) { IModelElement from = association.getFrom(); IAssociationEnd fromEnd = Association.getFromEnd(association); + IModelElement fromEndType = fromEnd.getTypeAsElement(); - return fromEnd.getTypeAsElement() != null - && fromEnd.getTypeAsElement().getModelType().equals(from.getModelType()); + 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 toEnd.getTypeAsElement() != null - && toEnd.getTypeAsElement().getModelType().equals(to.getModelType()); + return toEndType != null && toEndType.getId().equals(to.getId()); } private void fixFromEndType(IAssociation association) { 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 7a06d58f..e771aa92 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 @@ -20,6 +20,8 @@ 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 { @@ -29,134 +31,100 @@ public class ReloadClassesController implements VPActionController { 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 = - Set.of( - ".git", - ".vscode" - // , "abel2015petroleum-system" - // , "albuquerque2015ontobio" - // , "amaral2019rot" - // , "amaral2020modeling" - // , "ambient-assisted-living2021" - // , "aristotle-ontology2019" - // , "barcelos2015ontology" - // , "barros2020programming" - // , "board-game-ontology2020" - // , "buchtela2020connection" - // , "castro2012cloudvulnerability" - // , "cgts2021sebim" - // , "clergy-ontology" - // , "cservice2015ontology" - // , "dpo2017" - // , "el2020ontology" - // , "experiment-model2015" - // , "ferreira2015ontoemergeplan" - // , "filip2021modelovani" - // , "fraller2019flexible" - // , "g809-2015" - // , "gi2mo-ontology" - // , "grueau2013towards" - // , "guarino2018rea" - // , "guizzardi2014nfr" - // , "guizzardi2020core" - // , "hazard-ontology-train-control2017" - // , "internal-affairs-ontology" - // , "khantong2020ontology" - // , "kostov2017towards" - // , "laurier2018rea" - // , "library" - // , "martinez2013human-genome" - // , "medical-appointment2020" - // , "mono2022ontology" - // , "music-ontology" - // , "nardi2015commitment" - // , "niederkofler2019knowledge" - // , "oliveira2007collaboration" - // , "pereira2015ontologia" - // , "pereira2020ontotrans" - // , "ramirez2015userfeedback" - // , "rdbs-o2018" - // , "real-state-ontology2015" - // , "recommendation-ontology" - // , "rodrigues2017ontological" - // , "rodrigues2019ontocrime" - // , "sales2018cover" - // , "silveira2021oap" - // , "spmo" - // , "van2020ontological" - // , "vanEe2021modular" - // , "vieira2020weathering" - // , "vrepa2021digital" - // , "andersson2018ascribing" - // , "duarte2018ontological" - // , "duarte2018osdef" - // , "franco2018ontology" - // , "hazard-ontology-robotic-strolling2017" - // , "photo2015ontology" - // , "zanetti2019representacao" - , - "ANTT-Ontology2015", - "abrahao2018complex", - "aguiar2019ooco", - "ahmad2018aviation", - "aires2022valuenetworks-geo", - "amaral2020rome", - "andersson2018ascribing", - "bank2015model", - "barcelos2013ontology", - "brazilian-federal-organizational-structures2015", - "buridan-ontology2021", - "carolla2014methodological", - "cmpo2017ontology", - "cons2015model", - "debbech2019conceptual", - "digitaldoctor2022ontology", - "duarte2018ontological", - "duarte2018osdef", - "duarte2021ross", - "eu-rent-refactored2022", - "fernandez-cejas2022curie-o", - "fischer2018ontorea", - "franco2018ontology", - "gailly2016design", - "gameplay-ontology2020", - "guarino2016towards", - "guizzardi2005ontological", - "hazard-ontology-robotic-strolling2017", - "hazard-ontology2017", - "healthORG2015model", - "internship", - "it2015infrastructure", - "junior2018o4c", - "moreira2018saref4health", - "neves2020nwpontology", - "neves2021ontology", - "online-mentoring", - "photo2015ontology", - "plato-ontology2019", - "porello2020coex", - "ppo-o2021", - "project-management-ontology", - "public-expense-ontology2020", - "qam", - "quality-assurance-process-ontology2017", - "ramos2021bias", - "richetti2019tdecision", - "rodrigues2019ontological", - "rsystem2020ontology", - "saleme2019mulseonto", - "santos2020valuenetworks", - "silva2012itarchitecture", - "social-contract2015", - "software-ontology-swo", - "spo", - "sportbooking2021model", - "srro-ontology", - "stock-broker2021", - "tender2015model", - "university-ontology", - "weigand2021artifact", - "zanetti2019representacao"); + 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; @@ -196,7 +164,8 @@ public void performAction(VPAction action) { } @Override - public void update(VPAction action) {} + public void update(VPAction action) { + } private void reloadPlugin() { System.out.println("----------------------------------------"); @@ -266,15 +235,15 @@ private void processRepository() throws IOException { 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 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(); 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)); From 8c53aac1fd70d1a9519bf0af0526a3f7a64d0c91 Mon Sep 17 00:00:00 2001 From: github-actions <> Date: Mon, 18 Apr 2022 20:50:37 +0000 Subject: [PATCH 25/25] Google Java Format --- .../controllers/ReloadClassesController.java | 213 +++++++++--------- 1 file changed, 108 insertions(+), 105 deletions(-) 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 e771aa92..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 @@ -31,100 +31,102 @@ public class ReloadClassesController implements VPActionController { 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 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; @@ -164,8 +166,7 @@ public void performAction(VPAction action) { } @Override - public void update(VPAction action) { - } + public void update(VPAction action) {} private void reloadPlugin() { System.out.println("----------------------------------------"); @@ -235,15 +236,17 @@ private void processRepository() throws IOException { 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 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();

_?q%$uwQUOLRQ%Nm&1${E)!ZuRe#`#{=+EHKF+ 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 z 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 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 4b6d8097e87d9f1c745723e2ad75e48e1ee0daf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1421 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>rpqc&7RKGH3zW91N_C zLJZ7679$WcFiJ6iOarnQycnh7>>x%Bs2U~)hW1Pb7O0viAPoWuKn&6Yp_vvi!BvPX zU`DWkDi|6s7QX~ioCO|{#S9F5M?jcysy3fA(1gg$kcg59UmvUF{9L`nl>DSry^7od zkS+$B3M(KpH?<^Dp&~aYuh^=>Rtc=a3djZt>nkaMm6T-LDnNc-DA*LGq*(>IxIwi8dA3R!B_#z``ugSN<$C4Ddih1^`i7R4mih)p`bI{&Koz>h zm3bwJ6}oxF$`C_f=D4I5Cl_TFlw{`TDS*sPOv*1Uu~kw6Sp)|Vca~(PA#BPkhI$L= zL4A;nzM-ChKHO}eRvVD0m48uYD$r(-`F4gjV3jChPEak-A-Fcg-(T2KWd6**&J#Nr`Q0uYlW1htV@vX3;FkNtq9kJ@ zpk0*A`KhPX>@W_fKA$%@9%eY<~TqKcrvn;)4|I55vZeJ2= zPQE#F?)TpNXJ&tI-`w@#;X})be*G+S=dQ~&nd#iMTD#|?+_5V!1-{LD79R7_{a{&U zUFp@YCyyyed;aE<=;L3TdCmLkRF7EIvpureUD}cx7VY2c-cZwFnR&DKYs`!@-?=I` zNkpGik)Jeg+JnW5PuYK2Dywd2nS9gTZRwZDl`m`syzbuCJ^7}p=Bqk`?Cj_KM=L(Y z9Ju0pxhq!u&@$%z=bsq~Coj2X-ZXnh5rdI+S;>|A`Z*fM-0$i1=r=y`f5hYWZBxVY zx4)i+-T%GH^Wf6Rhs!d}mv#TPmR`oCr=!1Xc7^+dhjZt2uRI;`e4eU&`1|tjyLDCb z_H1}1747}+oWY&v3>|5Y*Crl&)Ts0A>AZV&b+0B#|Nd~~s{>OZThM%i=VFu84V;yF zj4PI37q}J_@afYgfi0Xa!i)!IH}bG&7+n`l4gRIIZ@K#xN2`Q}R^FV0jCze%987qR zy?3jy-K`g-DB}4f=T?$5>w=IPHjsHDgK*XeBi7@+V#Kp zWJ;PB9L~NS?(nud`1hxjZPq#Qr+=PnV>|ukSN3l$dv2u_l`9YW@oK82zl|skZ4UK_ z5|T5EXqI~Ot&!Kv=S@-O!M{__{Me&&V%wv8+p|L^UFrQP*88m>Cz0Q(L~M)pjh6P8 bpZ>6xg`P0BDVe+%RN#2J`njxgN@xNAtUwS8 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 3cee89d2be07ae22728d4b18a897b2dd47eb414d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1389 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>rpqc&7RKGH3zW91N_C zLJZ7679$WcFiJ6iOarnQycnh7>>x%Bs2U~)hW1Pb7O0viAPoWuKn&6Yp_vvi!BvPX zU`DWkDi|6s7QX~ioCO|{#S9F5M?jcysy3fA(1gg$kcg59UmvUF{9L`nl>DSry^7od zkS+$B3M(KpH?<^Dp&~aYuh^=>Rtc=a3djZt>nkaMm6T-LDnNc-DA*LGq*(>IxIwi8dA3R!B_#z``ugSN<$C4Ddih1^`i7R4mih)p`bI{&Koz>h zm3bwJ6}oxF$`C_f=D4I5Cl_TFlw{`TDS*sPOv*1Uu~kw6Sp)|Vca~(PA#BPkhI$L= zL4A;nzM-ChKHO}eRvVD0m48uYD$r(-`F4gjV3jChP8msKgATpK$cTcq_EBzR4zJ-RD-R_}M?pO3dq_FAbl zf4gG)3>6luh>xy`hI1>_mfkQ}l(;ze=A$!jObP;2*`5n8uF?<+6AfIuRU^9l>9_kk zk9~0Ga^EH0KQl!-S$SdT=IrjM+ovoq)#a8txwq#oKG!|p&A)W>?KxYQ#Oz$TGPBl0 zFunI&T26NT+2?}mPBKhBQ}y$PW~$sgk$LLRJwI#@^gC~>G|lRY>a>`3r%QyVJw1Q+ zn}6um=RM}_%WK@5e)vs&`lRUvSE2g$?}{4h_3S0K>!g;4T+f?()mn3xel_C{xvL?M z7d<`W|Ez5PluiC^%eUE?dY%Y8r{cfEFYo=`XQv(}XT0p)@TW(8l~O>tsM}=5AFbxf zlKKiWH|vS`Pu=f#c=o)O^dkb^vir;}Pb@v~{HWNXl~(6g+c7F_)61#vXAigdTl=BM zh;`Q)jv_%3d-tpt&WGJ?p3E-XYjoiG)5w5#$tzEPVbZW;ap1Xf-|pHm-zM#sPnwjE zip9Q(bTw*DU+S}{q4g)n>r@uY>8T4=%)a1ludv@e{NL*Zt*#cy2ALmYANNM+FFtwu z)P^2$|J?Wf#r35D-wz21PY{=!!aPk_yTQT!e3O>~^O?DhA62i3oV{sSFri!T{RXq# zDZv7=KGF=4fBvpe&TWdgJxN>2;>6Mo*&zWhJl>di_f1T`^lzq=QPVwvkDe87JR7ep z)B}2P$3pk(2@4m$xwmP~pCw=KrkgzUn$|L)QbOrb1a9h1^#ytte8vB2g7cWS? zZq|OU`SVfsZR=mg{npC3DyVyB?|JjZv-5thT3q||*IRCz1TK?^B`1XRZt|E#yqUR0 zMz}|f*E(HYzo1&C7s~{IQsCFRFRw<*T zq`*pFALN~KV~|Jm4J|D#^$m>ljf`}GDs+o0^GXscbn}XpA%?)raY-#sF3Kz@$;{7F z0GXSZlwVq6tE2?72o9j`%q@UhlvfP(70`eB6^RAPWAR` zmP5ywD`fm0oZ8yyp13y9$HRh|Tip0xy#LjJNt{y7s;=L!JbqtQBCaXB;!;_{eC6Et zt3zzVHS>@3epELq*)-W#vF5{HM-Cs0h*Oo)4&QF=@4A2FjckqfgQW{u{)??>cseEg z-GaZ9d-9KlCoO6?{z$syV4kYvmBwi%%s2c_MH*WEH5Prrmr!$dOG0M+B^A*FYRi_m zg)M(*qq-wt!t&1Mwl9}G4h0#{^gsLZ(6vo7gxg(teqm`X6}9C3eTn$L3#F? zes%4CqgTJ~T6f49=AE>GxHWN=u^*(k@juJyVR z?~8i&RTf?mr2i;PszYVS8@;d-CU!7=sjp^{lmd z#)~DB_TN}>{?iw+x(D^`%oD%zwXb`S_{hMqqU-qM?!a%ae<)qz3wf!(qWx;?tq)8) uwtSe+rqdv>!0vpBY}J3Jl63$7tToKrXEyb{5_n_}%7dP+elF{r5}E*b!H!x0 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 2c7a9c4d8c34d2fe03af3d1f9b280c1f0ba28bfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19229 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ř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