1:
42:
43: package ;
44:
45: import ;
46: import ;
47: import ;
48: import ;
49: import ;
50: import ;
51: import ;
52: import ;
53:
54: import ;
55: import ;
56: import ;
57: import ;
58: import ;
59: import ;
60: import ;
61: import ;
62: import ;
63:
64:
67: public class SplittingModelWriter extends ModelWriter {
68:
69:
70: private HashNMap classDescriptionByPackage;
71:
72:
73: private ArrayList sources;
74:
75:
76: private File targetFile;
77:
78:
79: private String extension;
80:
81:
82: private String plainFileName;
83:
84:
85: private HashNMap manualMappingByPackage;
86:
87:
88: private HashNMap multiplexMappingByPackage;
89:
90:
93: public SplittingModelWriter() {
94: super();
95: }
96:
97:
104: public synchronized void write(final String target) throws IOException {
105:
106: final DescriptionModel model = getModel();
107: this.sources = new ArrayList(Arrays.asList(model.getSources()));
108: this.targetFile = new File(target);
109: this.plainFileName = IOUtils.getInstance().stripFileExtension(this.targetFile.getName());
110: this.extension = IOUtils.getInstance().getFileExtension(target);
111:
112:
113: this.classDescriptionByPackage = new HashNMap();
114: for (int i = 0; i < model.size(); i++) {
115: final ClassDescription cd = model.get(i);
116: if (cd.getSource() == null) {
117: final String packageName = getPackage(cd.getObjectClass());
118: final String includeFileName = this.plainFileName + "-" + packageName
119: + this.extension;
120: this.classDescriptionByPackage.add(includeFileName, cd);
121: }
122: else {
123: this.classDescriptionByPackage.add(cd.getSource(), cd);
124: }
125: }
126:
127: final MappingModel mappingModel = model.getMappingModel();
128:
129:
130: final ManualMappingInfo[] manualMappings = mappingModel.getManualMapping();
131: this.manualMappingByPackage = new HashNMap();
132: for (int i = 0; i < manualMappings.length; i++) {
133: final ManualMappingInfo mapping = manualMappings[i];
134: if (mapping.getSource() == null) {
135: this.manualMappingByPackage.add("", mapping);
136: }
137: else {
138: this.manualMappingByPackage.add(mapping.getSource(), mapping);
139: }
140: }
141:
142:
143: final MultiplexMappingInfo[] multiplexMappings = mappingModel.getMultiplexMapping();
144: this.multiplexMappingByPackage = new HashNMap();
145: for (int i = 0; i < multiplexMappings.length; i++) {
146: final MultiplexMappingInfo mapping = multiplexMappings[i];
147: if (mapping.getSource() == null) {
148: this.multiplexMappingByPackage.add("", mapping);
149: }
150: else {
151: this.multiplexMappingByPackage.add(mapping.getSource(), mapping);
152: }
153: }
154:
155:
156: final Object[] keys = this.classDescriptionByPackage.keySet().toArray();
157: for (int i = 0; i < keys.length; i++) {
158:
159: final String includeFileName = (String) keys[i];
160:
161: if (!includeFileName.equals("")) {
162: writePackageFile(includeFileName);
163: }
164: }
165:
166: writeMasterFile();
167:
168: this.manualMappingByPackage = null;
169: this.multiplexMappingByPackage = null;
170: this.classDescriptionByPackage = null;
171: this.sources = null;
172: }
173:
174:
181: private void writePackageFile(final String includeFileName) throws IOException {
182:
183: final Iterator values = this.classDescriptionByPackage.getAll(includeFileName);
184: final Iterator manualMappings = this.manualMappingByPackage.getAll(includeFileName);
185: final Iterator multiplexMappings = this.multiplexMappingByPackage.getAll(includeFileName);
186: if (!values.hasNext() && !manualMappings.hasNext() && !multiplexMappings.hasNext()) {
187: return;
188: }
189:
190: Log.debug ("Writing included file: " + includeFileName);
191:
192: this.sources.remove(includeFileName);
193:
194: final BufferedWriter writer = new BufferedWriter(
195: new OutputStreamWriter(
196: new FileOutputStream(
197: new File(this.targetFile.getParentFile(), includeFileName)
198: ),
199: "UTF-8"
200: )
201: );
202:
203: writeXMLHeader(writer);
204: writeStandardComment(writer, getModel().getModelComments());
205: getWriterSupport().writeTag(writer, ClassModelTags.OBJECTS_TAG);
206:
207: while (values.hasNext()) {
208: final ClassDescription cd = (ClassDescription) values.next();
209: writeClassDescription(writer, cd);
210: }
211:
212:
213: while (manualMappings.hasNext()) {
214: final ManualMappingInfo mi = (ManualMappingInfo) manualMappings.next();
215: writeManualMapping(writer, mi);
216: }
217:
218: while (multiplexMappings.hasNext()) {
219: final MultiplexMappingInfo mi = (MultiplexMappingInfo) multiplexMappings.next();
220: writeMultiplexMapping(writer, mi);
221: }
222:
223: writeCloseComment(writer, getModel().getModelComments());
224: getWriterSupport().writeCloseTag(writer, ClassModelTags.OBJECTS_TAG);
225: writer.close();
226: }
227:
228:
237: public static String getPackage(final Class c) {
238: final String className = c.getName();
239: final int idx = className.lastIndexOf('.');
240: if (idx <= 0) {
241:
242: return "";
243: }
244: else {
245: return className.substring(0, idx);
246: }
247: }
248:
249:
254: private void writeMasterFile() throws IOException {
255:
256: Log.debug ("Writing master file: " + this.targetFile);
257:
258: final BufferedWriter writer = new BufferedWriter(
259: new OutputStreamWriter(new FileOutputStream(this.targetFile), "UTF-8")
260: );
261:
262: writeXMLHeader(writer);
263: writeStandardComment(writer, getModel().getModelComments());
264: getWriterSupport().writeTag(writer, ClassModelTags.OBJECTS_TAG);
265:
266: for (int i = 0; i < this.sources.size(); i++) {
267: final String includeFileName = (String) this.sources.get(i);
268: if (!includeFileName.equals("")) {
269: writeTag(writer, ClassModelTags.INCLUDE_TAG, ClassModelTags.SOURCE_ATTR,
270: includeFileName, getModel().getIncludeComment(includeFileName));
271: }
272: }
273:
274: final Object[] keys = this.classDescriptionByPackage.keySet().toArray();
275: Arrays.sort(keys);
276: for (int i = 0; i < keys.length; i++) {
277: final String includeFileName = (String) keys[i];
278: if (!includeFileName.equals("")) {
279: writeTag(writer, ClassModelTags.INCLUDE_TAG, ClassModelTags.SOURCE_ATTR,
280: includeFileName, getModel().getIncludeComment(includeFileName));
281: }
282: }
283:
284: final Iterator values = this.classDescriptionByPackage.getAll("");
285: while (values.hasNext()) {
286: final ClassDescription cd = (ClassDescription) values.next();
287: writeClassDescription(writer, cd);
288: }
289:
290: final Iterator manualMappings = this.manualMappingByPackage.getAll("");
291: while (manualMappings.hasNext()) {
292: final ManualMappingInfo mi = (ManualMappingInfo) manualMappings.next();
293: writeManualMapping(writer, mi);
294: }
295:
296: final Iterator multiplexMappings = this.multiplexMappingByPackage.getAll("");
297: while (multiplexMappings.hasNext()) {
298: final MultiplexMappingInfo mi = (MultiplexMappingInfo) multiplexMappings.next();
299: writeMultiplexMapping(writer, mi);
300: }
301:
302: writeCloseComment(writer, getModel().getModelComments());
303: getWriterSupport().writeCloseTag(writer, ClassModelTags.OBJECTS_TAG);
304: writer.close();
305: }
306:
307: }