/** * <copyright> * * Copyright (c) 2002-2006 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM - Initial API and implementation * * </copyright> * * $Id: UnitTreeBuilder.java,v 1.4 2006/12/28 06:56:06 marcelop Exp $ */ package com.sap.emf.importer.moin.rose.builder; import java.util.List; import com.sap.emf.importer.moin.rose.parser.RoseNode; import com.sap.emf.importer.moin.rose.parser.Util; /** * Traverses the Rose files the first time to build unit tree and class information. * * Unit tree contains tree UnitTreeNodes. * Each tree node has name, quid and cat file name * * Table information is a map from String quid to TableObjects. * Each table info has name, quid, xml file, uuid, model id and it parent model id. */ public class UnitTreeBuilder { protected UnitTreeNode topNode; protected RoseUtil roseUtil; public UnitTreeBuilder(RoseUtil roseUtil) { this.roseUtil = roseUtil; } public void traverse(String qualifier, RoseNode tree, UnitTreeNode unitNode) throws Exception { topNode = unitNode; List<RoseNode> nodes = tree.getNodes(); for (int i = 0; i < nodes.size(); i++) { RoseNode node = nodes.get(i); if (node.getRoseNodeType() == RoseNode.OBJECT) { traverseObject(qualifier, node, unitNode); } else if (node.getRoseNodeType() == RoseNode.LIST) { traverseList(qualifier, node, unitNode); } } } private void traverseObject(String qualifier, RoseNode tree, UnitTreeNode unitNode) throws Exception { String objKey = tree.getKey(); String objType = Util.getType(tree.getValue()); String objName = Util.getName(tree.getValue()); if (objKey.equals(RoseStrings.ROOT_CATEGORY) && objType.equals(RoseStrings.CLASS_CATEGORY)) { // For the model information. // String quid = unitNode.getQUID(); if (quid.equals("")) { quid = tree.getRoseId(); if (quid != null) { quid = quid.substring(1, quid.length() - 1); } else { quid = ""; } } if (!quid.equals("")) { unitNode.setQUID(quid); } unitNode.setRoseNode(tree); traverse(qualifier, tree, unitNode); } else if (objKey.equals("") && objType.equals(RoseStrings.CLASS_CATEGORY)) { // This is package, // so check the package information if this is in cat file. // If it is, then load the .cat file into the tree thereby traversing it; // otherwise, just traverse the tree. // RoseNode loadingNode = tree.findNodeWithKey(RoseStrings.IS_LOADED); String quid = tree.getRoseId(); if (quid != null) { quid = quid.substring(1, quid.length() - 1); } if (loadingNode != null) { // The package is in a .cat file. // RoseNode fileNameNode = tree.findNodeWithKey(RoseStrings.FILE_NAME); if (fileNameNode != null) { String fileNameNodeValue = fileNameNode.getValue(); String fileName = roseUtil.resolveFileName(fileNameNodeValue); UnitTreeNode unitTreeNode = new UnitTreeNode(objName, quid, fileName); unitNode.addNode(unitTreeNode); roseUtil.createRoseUnitTreeAndTable(fileNameNodeValue, unitTreeNode); } } else { // The package not in a .cat file. // String qualifiedName = objName; if (qualifier != null) { qualifiedName = qualifier + "." + objName; } TableObject obj = new TableObject(qualifiedName, quid, topNode); roseUtil.quidTable.put(quid, obj); if (qualifier != null) { roseUtil.nameTable.put(qualifiedName, obj); } roseUtil.nameTable.put(objName, obj); unitNode.setRoseNode(tree); traverse(qualifiedName, tree, unitNode); } } else if (objType.equals(RoseStrings.CLASS)) { String quid = tree.getRoseId(); if (quid != null) { quid = quid.substring(1, quid.length() - 1); } String qualifiedName = objName; if (qualifier != null) { qualifiedName = qualifier + "." + objName; } TableObject obj = new TableObject(qualifiedName, quid, topNode); roseUtil.quidTable.put(quid, obj); roseUtil.nameTable.put(objName, obj); if (qualifiedName != null) { roseUtil.nameTable.put(qualifiedName, obj); } traverse(qualifiedName, tree, unitNode); } else if (objType.equals(RoseStrings.OPERATION) || objType.equals(RoseStrings.CLASSATTRIBUTE) || objType.equals(RoseStrings.INHERITANCE_RELATIONSHIP) || objType.equals(RoseStrings.ASSOCIATION) || objType.equals(RoseStrings.ROLE) || objType.equals(RoseStrings.VISIBILITY_RELATIONSHIP) || objType.equals(RoseStrings.USES_RELATIONSHIP)) { traverse(qualifier, tree, unitNode); } } private void traverseList(String qualifier, RoseNode tree, UnitTreeNode unitNode) throws Exception { traverse(qualifier, tree, unitNode); } }