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 }