1 package net.sf.quarrel.uml;
2
3 import net.sf.quarrel.file.ElementType;
4 import net.sf.quarrel.file.FeatureType;
5 import net.sf.quarrel.file.FileElement;
6
7 import java.util.Collection;
8 import java.util.HashMap;
9 import java.util.Iterator;
10 import java.util.Map;
11
12 /***
13 * @deprecated
14 */
15 public class ModelBuilderImpl implements ModelBuilder {
16
17 /***
18 * A map of ElementTypes to handlers. Will be used to remove a potentially
19 * ugly if statement in add(FileElement).
20 */
21 private final Map _handlerMap = new HashMap();
22
23 private final Model _model = new Model();
24
25 public ModelBuilderImpl() {
26 _handlerMap.put(ElementType.CLASS, ClassElementHandler.class);
27 _handlerMap.put(ElementType.INTERFACE, InterfaceElementHandler.class);
28 }
29
30 public void addClass(String className) {
31 _model.addElement(new UmlClass(className));
32 }
33
34 public Model getModel() {
35 return _model;
36 }
37
38 public void addInterface(String interfaceName) {
39 _model.addElement(new UmlInterface(interfaceName));
40 }
41
42 /***
43 * Adds the specified attribute to a class
44 *
45 * @param name the name of the Structured Element
46 * @param attribute the name of the attribute
47 */
48 public void addAttribute(String name,
49 String attribute) {
50
51 Element element = _model.getElement(name);
52 AttributeAggregator aggregator = (AttributeAggregator) element;
53 aggregator.addAttribute(attribute);
54
55 }
56
57 public void addOperation(String name,
58 String operation) {
59
60 Element element = _model.getElement(name);
61 OperationAggregator theClass = (OperationAggregator) element;
62 theClass.addOperation(operation);
63
64 }
65
66 public void addRelationship(String clientName, String supplierName, RelationshipType relationshipType) {
67
68 final Element client = _model.getElement(clientName);
69 final Element supplier = _model.getElement(supplierName);
70
71 _model.addRelationship(relationshipType, client, supplier);
72
73 }
74
75 public void add(FileElement element) {
76
77 final ElementType elementType = element.getElementType();
78
79 final ElementHandler elementHandler;
80
81 System.out.println("adding [" + elementType.getName() + "] element [" + element.getName() + "]");
82
83
84 if (ElementType.CLASS.equals(elementType)) {
85 elementHandler = new ClassElementHandler(this);
86 } else if (ElementType.INTERFACE.equals(elementType)) {
87 elementHandler = new InterfaceElementHandler(this);
88 } else {
89 throw new IllegalStateException("element type " + elementType.getName() + " not supported");
90 }
91
92 elementHandler.handle(element);
93
94 }
95
96 private boolean elementExists(String elementName) {
97 return _model.elementExists(elementName);
98 }
99
100 private static abstract class ElementHandler {
101
102 final ModelBuilderImpl _builder;
103
104 public ElementHandler(ModelBuilderImpl builder) {
105 _builder = builder;
106 }
107
108 public void handle(FileElement element) {
109
110 final String className = element.getName();
111 addElement(className);
112 processRelationships(element, className);
113 processAttributes(element, className);
114 processOperations(element, className);
115
116 }
117
118 void processRelationships(final FileElement element,
119 final String className) {
120
121 final ElementType elementType = element.getElementType();
122
123 if (elementType.supportFeatureType(FeatureType.IMPLEMENTS)) {
124
125 final Collection realizations = element.getFeatures(FeatureType.IMPLEMENTS);
126
127 for (Iterator iterator = realizations.iterator(); iterator.hasNext();)
128 {
129
130 String supplier = (String) iterator.next();
131
132 if (!_builder.elementExists(supplier)) {
133 _builder.addClass(supplier);
134 }
135
136 _builder.addRelationship(className, supplier, RelationshipType.Realization);
137
138 }
139
140 }
141
142 }
143
144 void processOperations(FileElement element, final String className) {
145
146 final Collection operations = element.getFeatures(FeatureType.OPERATIONS);
147
148 Object next;
149 for (Iterator iterator = operations.iterator(); iterator.hasNext();)
150 {
151 next = iterator.next();
152 System.out.println(next.getClass());
153 String operationName = (String) next;
154 _builder.addOperation(className, operationName);
155 }
156
157 }
158
159 void processAttributes(FileElement element, final String className) {
160
161 final Collection attributes = element.getFeatures(FeatureType.ATTRIBUTES);
162
163 for (Iterator iterator = attributes.iterator(); iterator.hasNext();)
164 {
165 String attributeName = (String) iterator.next();
166 _builder.addAttribute(className, attributeName);
167 }
168
169 }
170
171 protected abstract void addElement(String elementName);
172
173 }
174
175 private static class ClassElementHandler extends ElementHandler {
176
177 public ClassElementHandler(ModelBuilderImpl builder) {
178 super(builder);
179 }
180
181 protected void addElement(final String elementName) {
182 _builder.addClass(elementName);
183 }
184
185 }
186
187 public static class InterfaceElementHandler extends ElementHandler {
188 public InterfaceElementHandler(ModelBuilderImpl builder) {
189 super(builder);
190 }
191
192 protected void addElement(String elementName) {
193 _builder.addInterface(elementName);
194 }
195
196 }
197
198 }