View Javadoc
1   package xuml.tools.model.compiler;
2   
3   import java.math.BigInteger;
4   import java.util.ArrayList;
5   import java.util.Date;
6   import java.util.List;
7   import java.util.Map;
8   
9   import com.google.common.base.Optional;
10  import com.google.common.collect.Lists;
11  import com.google.common.collect.Maps;
12  
13  import jakarta.xml.bind.JAXBElement;
14  import xuml.tools.miuml.metamodel.jaxb.Association;
15  import xuml.tools.miuml.metamodel.jaxb.AtomicType;
16  import xuml.tools.miuml.metamodel.jaxb.BinaryAssociation;
17  import xuml.tools.miuml.metamodel.jaxb.BooleanType;
18  import xuml.tools.miuml.metamodel.jaxb.Class;
19  import xuml.tools.miuml.metamodel.jaxb.ConstrainedType;
20  import xuml.tools.miuml.metamodel.jaxb.Domains;
21  import xuml.tools.miuml.metamodel.jaxb.EnumeratedType;
22  import xuml.tools.miuml.metamodel.jaxb.Generalization;
23  import xuml.tools.miuml.metamodel.jaxb.IntegerType;
24  import xuml.tools.miuml.metamodel.jaxb.ModeledDomain;
25  import xuml.tools.miuml.metamodel.jaxb.Named;
26  import xuml.tools.miuml.metamodel.jaxb.RealType;
27  import xuml.tools.miuml.metamodel.jaxb.Relationship;
28  import xuml.tools.miuml.metamodel.jaxb.Subsystem;
29  import xuml.tools.miuml.metamodel.jaxb.SubsystemElement;
30  import xuml.tools.miuml.metamodel.jaxb.SymbolicType;
31  import xuml.tools.miuml.metamodel.jaxb.UnaryAssociation;
32  
33  class Lookups {
34      private final Map<String, Class> classesByName = Maps.newHashMap();
35      private final Map<BigInteger, Relationship> relationshipsByNumber = Maps.newHashMap();
36  
37      private final ModeledDomain domain;
38      private final Domains domains;
39  
40      public Lookups(Domains domains, ModeledDomain domain) {
41          this.domains = domains;
42          this.domain = domain;
43          for (Subsystem subsystem : domain.getSubsystem()) {
44              for (JAXBElement<? extends SubsystemElement> ssElement : subsystem
45                      .getSubsystemElement()) {
46                  SubsystemElement val = ssElement.getValue();
47                  if (val instanceof Relationship) {
48                      relationshipsByNumber.put(((Relationship) val).getRnum(), (Relationship) val);
49                  } else if (val instanceof Class) {
50                      classesByName.put(((Class) val).getName(), (Class) val);
51                  }
52              }
53          }
54      }
55  
56      public Relationship getRelationship(BigInteger number) {
57          return relationshipsByNumber.get(number);
58      }
59  
60      public Class getClassByName(String name) {
61          return classesByName.get(name);
62      }
63  
64      public boolean isSuperclass(String className) {
65          for (Relationship r : relationshipsByNumber.values()) {
66              if (r instanceof Generalization) {
67                  Generalization g = (Generalization) r;
68                  if (className.equals(g.getSuperclass()))
69                      return true;
70              }
71          }
72          return false;
73      }
74  
75      public boolean isSpecialization(String className) {
76          for (Relationship r : relationshipsByNumber.values()) {
77              if (r instanceof Generalization) {
78                  Generalization g = (Generalization) r;
79                  for (Named sp : g.getSpecializedClass())
80                      if (className.equals(sp.getName()))
81                          return true;
82              }
83          }
84          return false;
85      }
86  
87      public List<Association> getAssociations(Class cls) {
88          ArrayList<Association> list = Lists.newArrayList();
89          for (Relationship r : relationshipsByNumber.values()) {
90              if (r instanceof Association) {
91                  Association a = (Association) r;
92                  if (a instanceof BinaryAssociation) {
93                      BinaryAssociation b = (BinaryAssociation) a;
94                      if (b.getActivePerspective().getViewedClass().equals(cls.getName())
95                              || b.getPassivePerspective().getViewedClass().equals(cls.getName()))
96                          list.add(a);
97                  } else {
98                      UnaryAssociation u = (UnaryAssociation) a;
99                      if (u.getSymmetricPerspective().getViewedClass().equals(cls.getName()))
100                         list.add(a);
101                 }
102             }
103         }
104         return list;
105     }
106 
107     public List<Generalization> getGeneralizations() {
108         ArrayList<Generalization> list = Lists.newArrayList();
109         for (Relationship r : relationshipsByNumber.values()) {
110             if (r instanceof Generalization) {
111                 Generalization g = (Generalization) r;
112                 list.add(g);
113             }
114         }
115         return list;
116     }
117 
118     public Optional<Association> associationForAssociationClass(String className) {
119         for (Relationship r : relationshipsByNumber.values()) {
120             if (r instanceof Association) {
121                 Association a = (Association) r;
122                 if (className.equals(a.getAssociationClass()))
123                     return Optional.of(a);
124             }
125         }
126         return Optional.absent();
127     }
128 
129     public String getJavaType(String typeName) {
130         return getJavaType(getAtomicType(typeName), typeName);
131     }
132 
133     public AtomicType getAtomicType(String typeName) {
134         // check domain class types then if not found check global types
135         AtomicType result = getAtomicType(domain.getConstrainedType(), typeName);
136         if (result == null)
137             result = getAtomicType(domains.getConstrainedType(), typeName);
138         if (result == null)
139             throw new RuntimeException("type not found: " + typeName);
140         else
141             return result;
142     }
143 
144     private AtomicType getAtomicType(List<JAXBElement<? extends ConstrainedType>> types,
145             String typeName) {
146         AtomicType result = null;
147         for (JAXBElement<? extends ConstrainedType> element : types) {
148             if (element.getValue() instanceof AtomicType) {
149                 AtomicType t = (AtomicType) element.getValue();
150                 if (typeName.equals(t.getName()))
151                     result = t;
152             } else
153                 throw new RuntimeException("Structure types not implemented yet");
154         }
155         return result;
156     }
157 
158     private String getJavaType(AtomicType t, String name) {
159         String result;
160         if (t instanceof BooleanType)
161             result = Boolean.class.getName();
162         else if (t instanceof EnumeratedType)
163             result = String.class.getName();
164         else if (t instanceof IntegerType && "date".equalsIgnoreCase(name))
165             result = Date.class.getName();
166         else if (t instanceof IntegerType && "timestamp".equalsIgnoreCase(name))
167             result = Date.class.getName();
168         else if (t instanceof IntegerType)
169             result = Integer.class.getName();
170         else if (t instanceof RealType)
171             result = Double.class.getName();
172         else if (t instanceof SymbolicType && "bytes".equalsIgnoreCase(name))
173             result = "byte[]";
174         else if (t instanceof SymbolicType)
175             result = String.class.getName();
176         else
177             throw new RuntimeException(t.getClass().getName() + " not implemented");
178         return result;
179     }
180 }