1 package xuml.tools.model.compiler; 2 3 import java.io.InputStream; 4 import java.util.List; 5 import java.util.regex.Pattern; 6 7 import com.google.common.annotations.VisibleForTesting; 8 import com.google.common.collect.Lists; 9 10 import jakarta.xml.bind.JAXBElement; 11 import xuml.tools.miuml.metamodel.jaxb.Class; 12 import xuml.tools.miuml.metamodel.jaxb.Domain; 13 import xuml.tools.miuml.metamodel.jaxb.Domains; 14 import xuml.tools.miuml.metamodel.jaxb.Marshaller; 15 import xuml.tools.miuml.metamodel.jaxb.ModeledDomain; 16 import xuml.tools.miuml.metamodel.jaxb.Perspective; 17 import xuml.tools.miuml.metamodel.jaxb.Subsystem; 18 import xuml.tools.miuml.metamodel.jaxb.SubsystemElement; 19 20 public class Util { 21 22 public static String getMultiplicityAbbreviation(Perspective p) { 23 if (p.isConditional() && p.isOnePerspective()) 24 return "0..1"; 25 else if (!p.isConditional() && p.isOnePerspective()) 26 return "1"; 27 else if (p.isConditional() && !p.isOnePerspective()) 28 return "*"; 29 else 30 return "1..*"; 31 } 32 33 public static String lowerFirst(String s) { 34 return s.substring(0, 1).toLowerCase() + s.substring(1); 35 } 36 37 public static String upperFirst(String s) { 38 return s.substring(0, 1).toUpperCase() + s.substring(1); 39 } 40 41 public static String toClassSimpleName(String name) { 42 return upperFirst(toJavaIdentifier(name)); 43 } 44 45 public static String toJavaIdentifier(String name) { 46 47 StringBuilder s = new StringBuilder(); 48 boolean capitalize = false; 49 for (int i = 0; i < name.length(); i++) { 50 char ch = name.charAt(i); 51 if ((i != 0 && !Character.isJavaIdentifierStart(ch)) 52 || !Character.isJavaIdentifierPart(ch)) { 53 capitalize = true; 54 } else if (capitalize) { 55 s.append(Character.toUpperCase(ch)); 56 capitalize = false; 57 } else 58 s.append(ch); 59 } 60 return lowerFirst(s.toString()); 61 } 62 63 public static String toJavaConstantIdentifier(String name) { 64 StringBuilder s = new StringBuilder(); 65 boolean funnyCharacter = false; 66 for (int i = 0; i < name.length(); i++) { 67 char ch = name.charAt(i); 68 if ((i == 0 && !Character.isJavaIdentifierStart(ch)) 69 || (i > 0 && !Character.isJavaIdentifierPart(ch))) { 70 funnyCharacter = true; 71 } else if (funnyCharacter) { 72 s.append("_"); 73 s.append(Character.toUpperCase(ch)); 74 funnyCharacter = false; 75 } else 76 s.append(Character.toUpperCase(ch)); 77 } 78 return s.toString(); 79 } 80 81 @VisibleForTesting 82 static boolean isLettersAndDigits(String s) { 83 return Pattern.compile("[0-9a-zA-Z]*").matcher(s).matches(); 84 } 85 86 public static String camelCaseToLowerUnderscore(String s) { 87 if (s.toUpperCase().equals(s) && isLettersAndDigits(s)) { 88 return s.toLowerCase(); 89 } 90 91 StringBuilder b = new StringBuilder(); 92 b.append(s.charAt(0)); 93 boolean underscoreAdded = false; 94 boolean lastCharacterUppercase = false; 95 for (int i = 1; i < s.length(); i++) { 96 char ch = s.charAt(i); 97 if (!Character.isLetterOrDigit(ch)) { 98 if (!underscoreAdded) 99 b.append('_'); 100 underscoreAdded = true; 101 lastCharacterUppercase = false; 102 } else if (Character.isUpperCase(ch)) { 103 if (!underscoreAdded && !lastCharacterUppercase) { 104 b.append("_"); 105 } 106 b.append(ch); 107 underscoreAdded = false; 108 lastCharacterUppercase = true; 109 } else { 110 b.append(ch); 111 underscoreAdded = false; 112 lastCharacterUppercase = false; 113 } 114 } 115 return b.toString().toLowerCase(); 116 } 117 118 public static String toTableName(String className) { 119 return camelCaseToLowerUnderscore(className); 120 } 121 122 public static String toTableIdName(String className) { 123 return toTableName(className) + "_id"; 124 } 125 126 public static String toColumnName(String attributeName) { 127 return camelCaseToLowerUnderscore(attributeName); 128 } 129 130 public static ModeledDomain getModeledDomain(Domains domains, String name) { 131 for (JAXBElement<? extends Domain> domain : domains.getDomain()) { 132 if (domain.getValue() instanceof ModeledDomain 133 && name.equals(domain.getValue().getName())) { 134 return (ModeledDomain) domain.getValue(); 135 } 136 } 137 return null; 138 } 139 140 public static ModeledDomain getModeledDomain(InputStream is, String domainName) { 141 Domains domains = new Marshaller().unmarshal(is); 142 return domains.getDomain().stream().map(d -> d.getValue()) 143 .filter(d -> d instanceof ModeledDomain).map(d -> (ModeledDomain) d) 144 .filter(d -> d.getName().equals(domainName)).findFirst().get(); 145 146 } 147 148 public static String getPackage(String className) { 149 if (!className.contains(".")) 150 return className; 151 else 152 return className.substring(0, className.lastIndexOf(".")); 153 } 154 155 public static String getSimpleClassName(String className) { 156 if (!className.contains(".")) 157 return className; 158 else 159 return className.substring(className.lastIndexOf(".") + 1, className.length()); 160 } 161 162 public static List<Class> getClasses(ModeledDomain domain) { 163 List<Class> list = Lists.newArrayList(); 164 for (Subsystem subsystem : domain.getSubsystem()) { 165 for (JAXBElement<? extends SubsystemElement> element : subsystem 166 .getSubsystemElement()) { 167 if (element.getValue() instanceof Class) { 168 Class cls = (Class) element.getValue(); 169 list.add(cls); 170 } 171 } 172 } 173 return list; 174 } 175 176 }