KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > emf > importer > rose > builder > RoseUtil


1 /**
2  * <copyright>
3  *
4  * Copyright (c) 2002-2004 IBM Corporation and others.
5  * All rights reserved. This program and the accompanying materials
6  * are made available under the terms of the Eclipse Public License v1.0
7  * which accompanies this distribution, and is available at
8  * http://www.eclipse.org/legal/epl-v10.html
9  *
10  * Contributors:
11  * IBM - Initial API and implementation
12  *
13  * </copyright>
14  *
15  * $Id: RoseUtil.java,v 1.4 2005/06/12 13:36:38 emerks Exp $
16  */

17 package org.eclipse.emf.importer.rose.builder;
18
19 import java.io.File JavaDoc;
20 import java.util.Collections JavaDoc;
21 import java.util.HashMap JavaDoc;
22 import java.util.Iterator JavaDoc;
23 import java.util.List JavaDoc;
24 import java.util.Map JavaDoc;
25
26 import org.eclipse.core.runtime.IStatus;
27 import org.eclipse.core.runtime.MultiStatus;
28 import org.eclipse.core.runtime.Status;
29
30 import org.eclipse.emf.common.util.BasicEList;
31 import org.eclipse.emf.common.util.EList;
32 import org.eclipse.emf.common.util.URI;
33 import org.eclipse.emf.ecore.EObject;
34 import org.eclipse.emf.ecore.resource.Resource;
35 import org.eclipse.emf.ecore.resource.ResourceSet;
36 import org.eclipse.emf.ecore.resource.URIConverter;
37 import org.eclipse.emf.importer.rose.RoseImporterPlugin;
38 import org.eclipse.emf.importer.rose.parser.RoseLexer;
39 import org.eclipse.emf.importer.rose.parser.RoseLoader;
40 import org.eclipse.emf.importer.rose.parser.RoseNode;
41 import org.eclipse.emf.importer.rose.parser.RoseParser;
42 import org.eclipse.emf.importer.rose.parser.Util;
43
44
45 /**
46  * Provide functions to process a rose file.
47  */

48 public class RoseUtil
49 {
50   protected Map JavaDoc quidTable = new HashMap JavaDoc();
51   protected Map JavaDoc nameTable = new HashMap JavaDoc();
52   protected Map JavaDoc superTable = new HashMap JavaDoc();
53   protected Map JavaDoc refTable = new HashMap JavaDoc();
54   protected Map JavaDoc typeTable = new HashMap JavaDoc();
55   protected Map JavaDoc primitiveTable = new HashMap JavaDoc();
56   protected Map JavaDoc variableToDirectoryMap = new HashMap JavaDoc();
57   protected Map JavaDoc packageNameToNSNameMap = new HashMap JavaDoc();
58   protected Map JavaDoc packageNameToNSURIMap = new HashMap JavaDoc();
59   protected Map JavaDoc ePackageToInformationMap = new HashMap JavaDoc();
60   protected URIConverter uriConverter;
61   
62   public RoseUtil(URIConverter uriConverter)
63   {
64     this.uriConverter = uriConverter;
65   }
66
67   MultiStatus status = new MultiStatus(
68     RoseImporterPlugin.getPlugin().getBundle().getSymbolicName(),
69     0,
70     RoseImporterPlugin.INSTANCE.getString("_UI_ProblemsWereEncounteredLoadingTheRoseModel_message"),
71     null);
72
73   protected RoseEcoreBuilder roseEcoreBuilder = new RoseEcoreBuilder(this);
74
75   public RoseEcoreBuilder getRoseEcoreBuilder()
76   {
77     return roseEcoreBuilder;
78   }
79
80   public UnitTreeNode createRoseUnitTreeAndTable(String JavaDoc fileNameNodeValue, UnitTreeNode topNode) throws Exception JavaDoc
81   {
82     String JavaDoc fileName = resolveFileName(fileNameNodeValue);
83
84     // Store the base name for relative .cat file references.
85
//
86
if (topNode == null)
87     {
88       int index = fileName.lastIndexOf(File.separator);
89       if (index != -1)
90       {
91         variableToDirectoryMap.put(null, fileName.substring(0, index + 1));
92       }
93     }
94
95     // read mdl file...
96
RoseLoader loader = new RoseLoader(fileName, uriConverter);
97     try
98     {
99       if (loader.isValid())
100       {
101         status = new MultiStatus(
102           RoseImporterPlugin.getPlugin().getBundle().getSymbolicName(),
103           1,
104           RoseImporterPlugin.INSTANCE.getString("_UI_ProblemsWereEncounteredConvertingTheRoseModel_message"),
105           null);
106
107         RoseLexer lexer = new RoseLexer(loader);
108         RoseParser parser = new RoseParser(lexer, true, true);
109         parser.parse();
110         RoseNode modelTree = parser.getModelTree();
111         UnitTreeBuilder unitTreeBuilder = new UnitTreeBuilder(this);
112         if (topNode == null)
113         {
114           String JavaDoc qualifier;
115           // special case, traverse cat file or mdl file
116
//
117
UnitTreeNode unitTree = null;
118           if (modelTree.getKey().equals("") && (Util.getType(modelTree.getValue())).equals(RoseStrings.CLASS_CATEGORY))
119           {
120             // this is the case that starting process rose file by passing cat file name
121
// this is a special case.
122
// normally, user should pass mdl file instead of cat file
123
//
124
// file is a cat file
125
// modelTree did contain quid info
126
String JavaDoc quid = modelTree.getRoseId();
127             quid = quid.substring(1, quid.length() - 1);
128             unitTree = new UnitTreeNode(Util.getName(modelTree.getValue()), quid, fileName);
129             String JavaDoc objName = Util.getName(modelTree.getValue());
130             TableObject obj = new TableObject(objName, quid, unitTree);
131             quidTable.put(quid, obj);
132             nameTable.put(objName, obj);
133             qualifier = objName;
134           }
135           else
136           {
137             // file is a mdl file
138
//
139
// get model name
140
int ind_1 = fileName.lastIndexOf(System.getProperty("file.separator"));
141             int ind_2 = fileName.lastIndexOf(".");
142             String JavaDoc modelName;
143             if (ind_2 != -1)
144               modelName = fileName.substring(ind_1 + 1, ind_2);
145             else
146               modelName = fileName.substring(ind_1 + 1, fileName.length());
147             //if (!modelName.toLowerCase().endsWith("model"))
148
// modelName = modelName + "model";
149
String JavaDoc quid = modelTree.getRoseId();
150             if (quid != null)
151             {
152               quid = quid.substring(1, quid.length() - 1);
153               unitTree = new UnitTreeNode(modelName, quid, fileName);
154             }
155             else
156             {
157               unitTree = new UnitTreeNode(modelName, "", fileName);
158             }
159             qualifier = null;
160           }
161           // starting traverse file and build unit tree and table info
162
unitTreeBuilder.traverse(qualifier, modelTree, unitTree);
163           return unitTree;
164         }
165         else
166         {
167           // cat(unit) file referenced by mdl file
168
String JavaDoc quid = modelTree.getRoseId();
169           if (quid != null)
170           {
171             quid = quid.substring(1, quid.length() - 1);
172             topNode.setQUID(quid);
173           }
174           String JavaDoc objName = Util.getName(modelTree.getValue());
175           TableObject obj = new TableObject(objName, quid, topNode);
176           quidTable.put(quid, obj);
177           nameTable.put(objName, obj);
178           unitTreeBuilder.traverse(objName, modelTree, topNode);
179           return null;
180         }
181       }
182       else
183       {
184         getStatus().add(
185           new Status(IStatus.INFO, RoseImporterPlugin.getPlugin().getBundle().getSymbolicName(), 0,
186             RoseImporterPlugin.INSTANCE.getString("_UI_TheUnitResolvesTo_message",
187             new Object JavaDoc []{ Util.trimQuotes(fileNameNodeValue), fileName }), null));
188         return null;
189       }
190     }
191     finally
192     {
193       loader.close();
194     }
195   }
196
197   public void showRoseUnitTree(UnitTreeNode unitTree)
198   {
199     if (unitTree != null)
200     {
201       System.out.println(" ");
202       System.out.println("======= Unit Tree Info =============");
203       System.out.println("[0]: " + unitTree.getName() + ", " + unitTree.getQUID() + ", " + unitTree.getRoseFileName() + ", "
204         + unitTree.getEcoreFileName());
205       int i = 1;
206       traverseOut(unitTree, i);
207     }
208
209     if (quidTable.size() > 0)
210     {
211       System.out.println("=========== Class Info ============");
212       Iterator JavaDoc it = quidTable.keySet().iterator();
213       while (it.hasNext())
214       {
215         Object JavaDoc key = it.next();
216         TableObject obj = (TableObject)quidTable.get(key);
217         System.out.println(key + ",\t" + obj.getName() + ",\t" + obj.getContainer().getEcoreFileName());
218       }
219     }
220   }
221
222   protected void traverseOut(UnitTreeNode tree, int index)
223   {
224     List JavaDoc nodes = tree.getNodes();
225     if (nodes.size() > 0)
226     {
227       for (int i = 0; i < nodes.size(); i++)
228       {
229         UnitTreeNode node = (UnitTreeNode)nodes.get(i);
230         System.out.println("[" + index + "]: " + node.getName() + ", " + node.getQUID() + ", " + node.getEcoreFileName());
231         traverseOut(node, index + 1);
232       }
233     }
234   }
235
236   public void createExtent4RoseUnitTree(UnitTreeNode unitTree)
237   {
238     if (unitTree != null)
239     {
240       checkConflictFileName(unitTree);
241       createExtent(unitTree);
242     }
243     refTable.clear();
244   }
245
246   public void checkConflictFileName(UnitTreeNode unitTree)
247   {
248     String JavaDoc rootEcoreFileName = unitTree.getEcoreFileName();
249     if (checkFileName(unitTree, rootEcoreFileName))
250     {
251       int index = rootEcoreFileName.lastIndexOf(".");
252       if (index != -1)
253       {
254         rootEcoreFileName = rootEcoreFileName.substring(0, index) + "model"
255           + rootEcoreFileName.substring(index, rootEcoreFileName.length());
256       }
257       unitTree.setEcoreFileName(rootEcoreFileName);
258     }
259   }
260
261   public boolean checkFileName(UnitTreeNode unitTree, String JavaDoc name)
262   {
263     List JavaDoc nodes = unitTree.getNodes();
264     for (int i = 0; i < nodes.size(); i++)
265     {
266       UnitTreeNode node = (UnitTreeNode)nodes.get(i);
267       if (node.getEcoreFileName().equals(name) || checkFileName(node, name))
268       {
269         return true;
270       }
271     }
272
273     return false;
274   }
275
276   public void createExtent(UnitTreeNode unitTree)
277   {
278     EList ext = new BasicEList();
279     unitTree.setExtent(ext);
280     List JavaDoc nodes = unitTree.getNodes();
281     for (int i = 0; i < nodes.size(); i++)
282     {
283       createExtent((UnitTreeNode)nodes.get(i));
284     }
285   }
286
287   public void processUnitTree(UnitTreeNode unitTree) throws Exception JavaDoc
288   {
289     if (unitTree != null)
290     {
291       loadTree(null, unitTree);
292       String JavaDoc packageName = unitTree.getEcoreFileName();
293       int fileSeparatorIndex = packageName.lastIndexOf(File.separator);
294       if (fileSeparatorIndex != -1)
295       {
296         packageName = packageName.substring(fileSeparatorIndex + 1);
297       }
298       int dotIndex = packageName.lastIndexOf(".");
299       if (dotIndex != -1)
300       {
301         packageName = packageName.substring(0, dotIndex);
302       }
303       roseEcoreBuilder.createEPackageForRootClasses(unitTree.getExtent(), unitTree.getRoseNode(), packageName);
304       roseEcoreBuilder.setEEnums();
305       roseEcoreBuilder.setEReferences();
306       roseEcoreBuilder.setSuper();
307       roseEcoreBuilder.setETypeClassifier();
308       setIDs(unitTree);
309       validate(unitTree);
310     }
311   }
312
313   protected void setIDs(UnitTreeNode node) throws Exception JavaDoc
314   {
315     for (Iterator JavaDoc i = node.getExtent().iterator(); i.hasNext();)
316     {
317       roseEcoreBuilder.setIDs(null, (EObject)i.next());
318     }
319
320     // Process the children of the UnitTreeNode recursively.
321
//
322
for (Iterator JavaDoc i = node.getNodes().iterator(); i.hasNext();)
323     {
324       setIDs((UnitTreeNode)i.next());
325     }
326   }
327
328   protected void validate(UnitTreeNode node) throws Exception JavaDoc
329   {
330     // Process the contents of the extent
331
//
332
for (Iterator JavaDoc i = node.getExtent().iterator(); i.hasNext();)
333     {
334       roseEcoreBuilder.validate((EObject)i.next());
335     }
336
337     // Process the children of the UnitTreeNode recursively.
338
//
339
for (Iterator JavaDoc i = node.getNodes().iterator(); i.hasNext();)
340     {
341       validate((UnitTreeNode)i.next());
342     }
343   }
344
345   protected void loadTree(RoseNode containingNode, UnitTreeNode node) throws Exception JavaDoc
346   {
347     // Load the Rose .mdl or .cat file, and create mappings for the objects.
348
//
349
String JavaDoc roseFile = node.getRoseFileName();
350     RoseLoader loader = new RoseLoader(roseFile, uriConverter);
351     try
352     {
353       if (loader.isValid())
354       {
355         RoseLexer lexer = new RoseLexer(loader);
356         RoseParser parser = new RoseParser(lexer, true, true);
357         parser.parse();
358         RoseNode modelTree = parser.getModelTree();
359         modelTree.setNode(node.getExtent());
360
361         // This sets the parent so that the nodes can traverse to the root to find default eCore settings.
362
//
363
if (containingNode != null)
364         {
365           modelTree.setParent(containingNode);
366         }
367
368         containingNode = modelTree;
369
370         // Start second traverse to create mapping objects in memory.
371
//
372
RoseWalker roseWalker = new RoseWalker(modelTree);
373         roseWalker.traverse(roseEcoreBuilder);
374       }
375     }
376     finally
377     {
378       loader.close();
379     }
380
381     // Process the children of the UnitTreeNode recursively.
382
//
383
for (Iterator JavaDoc i = node.getNodes().iterator(); i.hasNext();)
384     {
385       UnitTreeNode subNode = (UnitTreeNode)i.next();
386       loadTree(containingNode, subNode);
387     }
388   }
389
390   public void saveEcoreFiles(ResourceSet resourceSet) throws Exception JavaDoc
391   {
392     for (Iterator JavaDoc it = resourceSet.getResources().iterator(); it.hasNext();)
393     {
394       Resource resource = (Resource)it.next();
395       resource.save(Collections.EMPTY_MAP);
396     }
397   }
398
399   public void createResource(UnitTreeNode tree, ResourceSet resourceSet)
400   {
401     EList ext = tree.getExtent();
402     if (ext.size() > 0)
403     {
404       String JavaDoc ecoreFileName = tree.getEcoreFileName();
405       URI ecoreURI = URI.createURI(ecoreFileName);
406       Resource res = Resource.Factory.Registry.INSTANCE.getFactory(ecoreURI).createResource(ecoreURI);
407       res.getContents().addAll(tree.getExtent());
408       resourceSet.getResources().add(res);
409     }
410     List JavaDoc nodes = tree.getNodes();
411     for (int i = 0; i < nodes.size(); i++)
412     {
413       createResource((UnitTreeNode)nodes.get(i), resourceSet);
414     }
415   }
416
417   public String JavaDoc resolveFileName(String JavaDoc name)
418   {
419     name = Util.trimQuotes(name);
420     name = Util.updateFileName(name, "\\\\");
421     name = Util.updateFileName(name, "\\");
422     name = Util.updateFileName(name, "/");
423
424     String JavaDoc result = "";
425     int index;
426     while ((index = name.indexOf(File.separator)) != -1)
427     {
428       String JavaDoc directoryName = name.substring(0, index);
429       if (directoryName.startsWith("$")) //directoryName.length() > 0 && directoryName.charAt(0) == '$')
430
{
431         String JavaDoc variableName = directoryName.substring(1);
432         directoryName = (String JavaDoc)variableToDirectoryMap.get(variableName);
433         if (directoryName == null)
434         {
435           variableToDirectoryMap.put(variableName, null);
436           directoryName = "";
437         }
438       }
439       result += directoryName + File.separator;
440       name = name.substring(index + 1);
441     }
442     result += name;
443     if (result.indexOf(":") == -1 && !result.startsWith(File.separator))
444     {
445       String JavaDoc baseName = (String JavaDoc)variableToDirectoryMap.get(null);
446       if (baseName != null)
447       {
448         result = baseName + result;
449       }
450     }
451     return result;
452   }
453
454   public Map JavaDoc getVariableToDirectoryMap()
455   {
456     return variableToDirectoryMap;
457   }
458
459   public Map JavaDoc getPackageNameToNSNameMap()
460   {
461     return packageNameToNSNameMap;
462   }
463
464   public Map JavaDoc getPackageNameToNSURIMap()
465   {
466     return packageNameToNSURIMap;
467   }
468
469   public Map JavaDoc getEPackageToInformationMap()
470   {
471     return ePackageToInformationMap;
472   }
473
474   public MultiStatus getStatus()
475   {
476     return status;
477   }
478 }
479
Popular Tags