This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository eugene. See http://git.nuiton.org/eugene.git commit 8cbe464641f651a46e93dea69e98d5ee9de1ab8f Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Aug 15 13:39:24 2015 +0200 Scan also sub packages while searching for a tag value or a stereotype. See #3749 --- .../stereotype/MissingStereoTypeException.java | 43 ++++++++++++++++ .../eugene/models/stereotype/Stereotypes.java | 58 +++++++++++++++++++-- .../models/tagvalue/MissingTagValueException.java | 46 +++++++++++++++++ .../nuiton/eugene/models/tagvalue/TagValues.java | 59 +++++++++++++++++++++- 4 files changed, 201 insertions(+), 5 deletions(-) diff --git a/eugene/src/main/java/org/nuiton/eugene/models/stereotype/MissingStereoTypeException.java b/eugene/src/main/java/org/nuiton/eugene/models/stereotype/MissingStereoTypeException.java new file mode 100644 index 0000000..346b32e --- /dev/null +++ b/eugene/src/main/java/org/nuiton/eugene/models/stereotype/MissingStereoTypeException.java @@ -0,0 +1,43 @@ +package org.nuiton.eugene.models.stereotype; + +import com.google.common.base.Joiner; +import org.nuiton.eugene.models.object.ObjectModelClass; +import org.nuiton.eugene.models.object.ObjectModelPackage; + +import java.util.Set; + +/** + * When a missing tag value is detected. + * + * Created on 15/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.0 + */ +public class MissingStereoTypeException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + protected final String stereoTypeName; + + protected final String prefixMessage; + + protected final Set<String> stack; + + public MissingStereoTypeException(String stereoTypeName, String prefixMessage, ObjectModelPackage aPackage, ObjectModelClass aClass) { + this.stereoTypeName = stereoTypeName; + this.prefixMessage = prefixMessage; + this.stack = Stereotypes.getUsageStack(stereoTypeName, aPackage, aClass); + } + + @Override + public String toString() { + + return "\n\n" + prefixMessage + + "\n==========================================================================================" + + "\n" + Joiner.on("\n").join(stack) + + "\n=========================================================================================="; + + } + +} diff --git a/eugene/src/main/java/org/nuiton/eugene/models/stereotype/Stereotypes.java b/eugene/src/main/java/org/nuiton/eugene/models/stereotype/Stereotypes.java index 95281ef..1d1f2ba 100644 --- a/eugene/src/main/java/org/nuiton/eugene/models/stereotype/Stereotypes.java +++ b/eugene/src/main/java/org/nuiton/eugene/models/stereotype/Stereotypes.java @@ -23,8 +23,11 @@ package org.nuiton.eugene.models.stereotype; */ import com.google.common.collect.ImmutableSet; +import org.nuiton.eugene.models.object.ObjectModelClass; import org.nuiton.eugene.models.object.ObjectModelElement; +import org.nuiton.eugene.models.object.ObjectModelPackage; +import java.util.LinkedHashSet; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -121,14 +124,61 @@ public class Stereotypes { * @since 2.12 */ public static boolean findDirectStereotype(String stereotypeName, StereotypeAble... elements) { - + boolean value = false; for (StereotypeAble element : elements) { - if (element != null && element.hasStereotype(stereotypeName)) { - return true; + if (element != null) { + if (element instanceof ObjectModelPackage) { + value = findDirectStereotype(stereotypeName, (ObjectModelPackage) element); + } else { + value = element.hasStereotype(stereotypeName); + } + if (value) { + break; + } } } - return false; + return value; + + } + + /** + * Build the stack of usage of the given stereoType. + * + * Order of usage is : model, packages (from root to final package), then class. + * + * @param stereoTypeName + * @param aPackage + * @param aClass + * @return the orderer set of stack usage. + */ + public static LinkedHashSet<String> getUsageStack(String stereoTypeName, ObjectModelPackage aPackage, ObjectModelClass aClass) { + String suffix = ".stereotype." + stereoTypeName ; + LinkedHashSet<String> stack = new LinkedHashSet<>(); + + stack.add("model" + suffix); + + addPackageStereoTypes(aPackage, suffix, stack); + stack.add(aClass.getQualifiedName() + ".class" + suffix); + + return stack; + } + + protected static void addPackageStereoTypes(ObjectModelPackage aPackage, String suffix, Set<String> stack) { + + if (aPackage.getParentPackage() != null) { + addPackageStereoTypes(aPackage.getParentPackage(), suffix, stack); + } + stack.add("package." + aPackage.getName() + suffix); + + } + + protected static boolean findDirectStereotype(String stereotypeName, ObjectModelPackage element) { + boolean withStereotype = element.hasStereotype(stereotypeName); + if (!withStereotype && element.getParentPackage() != null) { + withStereotype = findDirectStereotype(stereotypeName, element.getParentPackage()); + } + return withStereotype; } } diff --git a/eugene/src/main/java/org/nuiton/eugene/models/tagvalue/MissingTagValueException.java b/eugene/src/main/java/org/nuiton/eugene/models/tagvalue/MissingTagValueException.java new file mode 100644 index 0000000..b08f3c3 --- /dev/null +++ b/eugene/src/main/java/org/nuiton/eugene/models/tagvalue/MissingTagValueException.java @@ -0,0 +1,46 @@ +package org.nuiton.eugene.models.tagvalue; + +import com.google.common.base.Joiner; +import org.nuiton.eugene.models.object.ObjectModelClass; +import org.nuiton.eugene.models.object.ObjectModelPackage; + +import java.util.Set; + +/** + * When a missing tag value is detected. + * + * Created on 15/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.0 + */ +public class MissingTagValueException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + protected final String tagValueName; + + protected final String tagValueValue; + + protected final String prefixMessage; + + protected final Set<String> stack; + + public MissingTagValueException(String tagValueName, String tagValueValue, String prefixMessage, ObjectModelPackage aPackage, ObjectModelClass aClass) { + this.tagValueName = tagValueName; + this.tagValueValue = tagValueValue; + this.prefixMessage = prefixMessage; + this.stack = TagValues.getUsageStack(tagValueName, tagValueValue, aPackage, aClass); + } + + @Override + public String toString() { + + return "\n\n" + prefixMessage + + "\n==========================================================================================" + + "\n" + Joiner.on("\n").join(stack) + + "\n=========================================================================================="; + + } + +} diff --git a/eugene/src/main/java/org/nuiton/eugene/models/tagvalue/TagValues.java b/eugene/src/main/java/org/nuiton/eugene/models/tagvalue/TagValues.java index fb49d77..dde2457 100644 --- a/eugene/src/main/java/org/nuiton/eugene/models/tagvalue/TagValues.java +++ b/eugene/src/main/java/org/nuiton/eugene/models/tagvalue/TagValues.java @@ -23,8 +23,12 @@ package org.nuiton.eugene.models.tagvalue; */ import org.apache.commons.lang3.StringUtils; +import org.nuiton.eugene.models.object.ObjectModelClass; import org.nuiton.eugene.models.object.ObjectModelElement; +import org.nuiton.eugene.models.object.ObjectModelPackage; +import java.util.LinkedHashSet; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -282,10 +286,63 @@ public class TagValues { } public static String findNotEmptyTagValue(String tagName, TagValueAble element) { - String value = element == null ? null : element.getTagValue(tagName); + + String value = null; + if (element != null) { + if (element instanceof ObjectModelPackage) { + value = findNotEmptyTagValue(tagName, (ObjectModelPackage) element); + } else { + value = element.getTagValue(tagName); + if (StringUtils.isEmpty(value)) { + value = null; + } + } + } + return value; + + } + + /** + * Build the stack of usage of the given tag value. + * + * Order of usage is : model, packages (from root to final package), then class. + * + * @param tagValueName + * @param tagValueValue + * @param aPackage + * @param aClass + * @return the orderer set of stack usage. + */ + public static LinkedHashSet<String> getUsageStack(String tagValueName, String tagValueValue, ObjectModelPackage aPackage, ObjectModelClass aClass) { + String suffix = ".tagvalue." + tagValueName + "=" + tagValueValue; + LinkedHashSet<String> stack = new LinkedHashSet<>(); + + stack.add("model" + suffix); + + addPackageTagValue(aPackage, suffix, stack); + stack.add(aClass.getQualifiedName() + ".class" + suffix); + + return stack; + } + + protected static void addPackageTagValue(ObjectModelPackage aPackage, String suffix, Set<String> stack) { + + if (aPackage.getParentPackage() != null) { + addPackageTagValue(aPackage.getParentPackage(), suffix, stack); + } + stack.add("package." + aPackage.getName() + suffix); + + } + + protected static String findNotEmptyTagValue(String tagName, ObjectModelPackage element) { + + String value = element.getTagValue(tagName); if (StringUtils.isEmpty(value)) { value = null; } + if (value == null && element.getParentPackage() != null) { + value = findNotEmptyTagValue(tagName, element.getParentPackage()); + } return value; } -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.