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