1 17 package org.eclipse.emf.importer.rose.builder; 18 19 import java.io.File ; 20 import java.util.Collections ; 21 import java.util.HashMap ; 22 import java.util.Iterator ; 23 import java.util.List ; 24 import java.util.Map ; 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 48 public class RoseUtil 49 { 50 protected Map quidTable = new HashMap (); 51 protected Map nameTable = new HashMap (); 52 protected Map superTable = new HashMap (); 53 protected Map refTable = new HashMap (); 54 protected Map typeTable = new HashMap (); 55 protected Map primitiveTable = new HashMap (); 56 protected Map variableToDirectoryMap = new HashMap (); 57 protected Map packageNameToNSNameMap = new HashMap (); 58 protected Map packageNameToNSURIMap = new HashMap (); 59 protected Map ePackageToInformationMap = new HashMap (); 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 fileNameNodeValue, UnitTreeNode topNode) throws Exception 81 { 82 String fileName = resolveFileName(fileNameNodeValue); 83 84 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 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 qualifier; 115 UnitTreeNode unitTree = null; 118 if (modelTree.getKey().equals("") && (Util.getType(modelTree.getValue())).equals(RoseStrings.CLASS_CATEGORY)) 119 { 120 String quid = modelTree.getRoseId(); 127 quid = quid.substring(1, quid.length() - 1); 128 unitTree = new UnitTreeNode(Util.getName(modelTree.getValue()), quid, fileName); 129 String 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 int ind_1 = fileName.lastIndexOf(System.getProperty("file.separator")); 141 int ind_2 = fileName.lastIndexOf("."); 142 String 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 String 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 unitTreeBuilder.traverse(qualifier, modelTree, unitTree); 163 return unitTree; 164 } 165 else 166 { 167 String quid = modelTree.getRoseId(); 169 if (quid != null) 170 { 171 quid = quid.substring(1, quid.length() - 1); 172 topNode.setQUID(quid); 173 } 174 String 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 []{ 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 it = quidTable.keySet().iterator(); 213 while (it.hasNext()) 214 { 215 Object 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 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 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 name) 262 { 263 List 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 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 288 { 289 if (unitTree != null) 290 { 291 loadTree(null, unitTree); 292 String 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 314 { 315 for (Iterator i = node.getExtent().iterator(); i.hasNext();) 316 { 317 roseEcoreBuilder.setIDs(null, (EObject)i.next()); 318 } 319 320 for (Iterator i = node.getNodes().iterator(); i.hasNext();) 323 { 324 setIDs((UnitTreeNode)i.next()); 325 } 326 } 327 328 protected void validate(UnitTreeNode node) throws Exception 329 { 330 for (Iterator i = node.getExtent().iterator(); i.hasNext();) 333 { 334 roseEcoreBuilder.validate((EObject)i.next()); 335 } 336 337 for (Iterator 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 346 { 347 String 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 if (containingNode != null) 364 { 365 modelTree.setParent(containingNode); 366 } 367 368 containingNode = modelTree; 369 370 RoseWalker roseWalker = new RoseWalker(modelTree); 373 roseWalker.traverse(roseEcoreBuilder); 374 } 375 } 376 finally 377 { 378 loader.close(); 379 } 380 381 for (Iterator 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 391 { 392 for (Iterator 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 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 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 resolveFileName(String 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 result = ""; 425 int index; 426 while ((index = name.indexOf(File.separator)) != -1) 427 { 428 String directoryName = name.substring(0, index); 429 if (directoryName.startsWith("$")) { 431 String variableName = directoryName.substring(1); 432 directoryName = (String )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 baseName = (String )variableToDirectoryMap.get(null); 446 if (baseName != null) 447 { 448 result = baseName + result; 449 } 450 } 451 return result; 452 } 453 454 public Map getVariableToDirectoryMap() 455 { 456 return variableToDirectoryMap; 457 } 458 459 public Map getPackageNameToNSNameMap() 460 { 461 return packageNameToNSNameMap; 462 } 463 464 public Map getPackageNameToNSURIMap() 465 { 466 return packageNameToNSURIMap; 467 } 468 469 public Map getEPackageToInformationMap() 470 { 471 return ePackageToInformationMap; 472 } 473 474 public MultiStatus getStatus() 475 { 476 return status; 477 } 478 } 479 | Popular Tags |