View Javadoc
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 }