//------------------------------------------------------------------------------ // Copyright (c) 2005, 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 Corporation - initial implementation //------------------------------------------------------------------------------ package org.eclipse.epf.library.util; import java.util.ArrayList; import java.util.EmptyStackException; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Stack; import org.eclipse.emf.common.util.URI; import org.eclipse.epf.common.serviceability.Logger; import org.eclipse.epf.common.xml.AbstractSAXParser; import org.eclipse.epf.persistence.MultiFileXMISaveImpl.MyEscape; import org.xml.sax.Attributes; /** * This class parses an XMI file, and stores the data in a HashMap called an * "eMap". * <p> * An eMap has 4 entries: * <li>"tag" - the element's tag</li> * <li>"attributes" - an ArrayList of the XML attributes. Each attribute is of * the form (attribute name),(attribute value)</li> * <li>"content" - the element's content</li> * <li>"children" - an ArrayList of the element's sub-elements. Each child is * an eMap.</li> * </p> * <p> * The root element's eMap is referenced by TNGSAXParserXMI.xmiMap * </p> * * @author Jeff Hardy * @since 1.0 */ public class SAXParserXMI extends AbstractSAXParser { public HashMap xmiMap; // private int elementCount = 0; private Stack stack; private MyEscape escape = new MyEscape(); public SAXParserXMI(Logger logger) { // validating is false since we don't have a DTD super(logger, false); } /** * Called when the XML parser starts to parse the document. */ public void startDocument() { super.startDocument(); stack = new Stack(); } /** * */ public void endDocument() { super.endDocument(); } /** * */ public void startElement(String namespaceURL, String localName, String qname, Attributes attributes) { HashMap eMap = new HashMap(); try { HashMap parent = (HashMap) stack.peek(); ((ArrayList) parent.get("children")).add(eMap); //$NON-NLS-1$ } catch (EmptyStackException e) { xmiMap = eMap; } // put tag eMap.put("tag", qname); //$NON-NLS-1$ // put attributeMap List attributeList = new ArrayList(); if (attributes.getLength() > 0) { for (int i = 0; i < attributes.getLength(); i++) { attributeList.add(attributes.getQName(i) + "," + attributes.getValue(i)); //$NON-NLS-1$ } } strBuf = new StringBuffer(); eMap.put("attributes", attributeList); //$NON-NLS-1$ eMap.put("children", new ArrayList()); //$NON-NLS-1$ stack.push(eMap); } public void endElement(String namespaceURL, String localName, String qname) { try { HashMap eMap = (HashMap) stack.peek(); List attributeList = (ArrayList) eMap.get("attributes"); //$NON-NLS-1$ if (attributeList.size() == 0) if (strBuf.toString().trim().length() > 0) { eMap.put("content", escape.convertLines(strBuf.toString())); //$NON-NLS-1$ } } catch (EmptyStackException e) { e.printStackTrace(); } stack.pop(); } /** * For use with TNGSAXParserXMI. Find a guid's element tag within the XMI * file. * * @param elementTag * @param guid * @param xmiMap * @return */ public static HashMap findElementTagofGuid(String elementTag, String guid, HashMap xmiMap) { HashMap eMap = SAXParserXMI.findGuid(guid, xmiMap); // we have hashmap of the guid's element - search children for the // elementTag Iterator iter = ((ArrayList) eMap.get("children")).iterator(); //$NON-NLS-1$ while (iter.hasNext()) { HashMap childMap = (HashMap) iter.next(); if (SAXParserXMI.getTag(childMap).equals(elementTag)) return childMap; } return null; } /** * For use with TNGSAXParserXMI. searches eMap's children for elementTag * * @param elementTag * @param eMap * @return HashMap */ public static HashMap getChildElementTag(String elementTag, HashMap eMap) { // search children for the elementTag Iterator iter = ((ArrayList) eMap.get("children")).iterator(); //$NON-NLS-1$ while (iter.hasNext()) { HashMap childMap = (HashMap) iter.next(); if (SAXParserXMI.getTag(childMap).equals(elementTag)) return childMap; } return null; } /** * For use with TNGSAXParserXMI. returns Tag of element. Does not return * null, returns "" instead. * * @param eMap * @return String */ public static String getTag(HashMap eMap) { String tag = ""; //$NON-NLS-1$ if (eMap != null) tag = (String) eMap.get("tag"); //$NON-NLS-1$ if (tag != null) return tag; return ""; //$NON-NLS-1$ } /** * For use with TNGSAXParserXMI. gets content of element - can be null * * @param eMap * @return String */ public static String getElementContent(HashMap eMap) { String content = null; if (eMap != null) content = (String) eMap.get("content"); //$NON-NLS-1$ return content; } /** * Finds a guid contained within the given eMap - can return null * * @param guid * guid to find * @param eMap * use TNGSAXParserXMI.xmiMap, or a sub-eMap * @return HashMap */ public static HashMap findGuid(String guid, HashMap eMap) { ArrayList attList = (ArrayList) eMap.get("attributes"); //$NON-NLS-1$ if (guid.equals(SAXParserXMI.getGuidOfList(attList))) return eMap; Iterator iter = ((ArrayList) eMap.get("children")).iterator(); //$NON-NLS-1$ while (iter.hasNext()) { HashMap childMap = (HashMap) iter.next(); HashMap result = findGuid(guid, childMap); if (result != null) return result; } return null; } /** * For use with TNGSAXParserXMI. * * @param attList * @return String */ public static String getGuidOfList(ArrayList attList) { Iterator iter = attList.iterator(); while (iter.hasNext()) { String attpair = (String) iter.next(); String attname = attpair.substring(0, attpair.indexOf(",")); //$NON-NLS-1$ String attval = attpair.substring(attpair.indexOf(",") + 1); //$NON-NLS-1$ if (attname.equals("guid")) //$NON-NLS-1$ return attval; } return null; } /** * For use with TNGSAXParserXMI when parsing resmgr.xmi * * @param attList * @return String */ public static String getIdOfList(ArrayList attList) { Iterator iter = attList.iterator(); while (iter.hasNext()) { String attpair = (String) iter.next(); String attname = attpair.substring(0, attpair.indexOf(",")); //$NON-NLS-1$ String attval = attpair.substring(attpair.indexOf(",") + 1); //$NON-NLS-1$ if (attname.equals("id")) //$NON-NLS-1$ return attval; } return null; } /** * * @param eMap * @return URI */ public static URI getPresentationUriOfElement(HashMap eMap) { if (eMap == null) return null; String tag = SAXParserXMI.getTag(eMap); // // check to see if this is an breakdownElement - if so, return null // // because while breakdownElements have presentations, they are not // used. // if (tag.equals("breakdownElements")) { // return null; // } // // processes don't use their presentation either // if (tag.equals("process")) { // return null; // } // look for childPackage presentations, which are an href attribute if (tag.equals("childPackages")) { //$NON-NLS-1$ ArrayList attList = (ArrayList) eMap.get("attributes"); //$NON-NLS-1$ Iterator iter = attList.iterator(); while (iter.hasNext()) { String attpair = (String) iter.next(); String attname = attpair.substring(0, attpair.indexOf(",")); //$NON-NLS-1$ String attval = attpair.substring(attpair.indexOf(",") + 1); //$NON-NLS-1$ if (attname.equals("href")) { //$NON-NLS-1$ try { URI uri = URI.createURI(attval); return uri; } catch (Exception ex) { ex.printStackTrace(); } // if (attval.indexOf("uma://") != -1) { // String presId = // attval.substring(attval.indexOf("uma://")+6); // return presId; // } } } } ArrayList childList = (ArrayList) eMap.get("children"); //$NON-NLS-1$ Iterator iter = childList.iterator(); while (iter.hasNext()) { HashMap childMap = (HashMap) iter.next(); tag = SAXParserXMI.getTag(childMap); if (tag.equals("presentation")) { // || //$NON-NLS-1$ // tag.equals("variabilityBasedOnElement")) // { //$NON-NLS-1$ //$NON-NLS-2$ ArrayList attList = (ArrayList) childMap.get("attributes"); //$NON-NLS-1$ Iterator attIter = attList.iterator(); while (attIter.hasNext()) { String attpair = (String) attIter.next(); String attname = attpair.substring(0, attpair.indexOf(",")); //$NON-NLS-1$ String attval = attpair.substring(attpair.indexOf(",") + 1); //$NON-NLS-1$ if (attname.equals("href")) { //$NON-NLS-1$ try { URI uri = URI.createURI(attval); return uri; } catch (Exception ex) { ex.printStackTrace(); } // if (attval.indexOf("uma://") != -1) { // String presId = // attval.substring(attval.indexOf("uma://")+6); // return presId; // } } } // if (attList.size() == 0) // continue; // String attpair = (String)attList.get(0); // // String attname = attpair.substring(0, // attpair.indexOf(",")); // String attval = attpair.substring(attpair.indexOf(",")+1); // if (attval.indexOf("uma://") != -1) { // String presId = attval.substring(attval.indexOf("uma://")+6); // return presId; // } } } return null; } /** * * @param eMap * @param attributeName * @param attributeValue * @return HashMap */ public static HashMap findElementByAttribute(HashMap eMap, String attributeName, String attributeValue) { // search this eMap's children Iterator iter = ((ArrayList) eMap.get("children")).iterator(); //$NON-NLS-1$ while (iter.hasNext()) { HashMap childMap = (HashMap) iter.next(); HashMap result = findElementByAttribute(childMap, attributeName, attributeValue); if (result != null) return result; } // search this eMap iter = ((ArrayList) eMap.get("attributes")).iterator(); //$NON-NLS-1$ while (iter.hasNext()) { String attpair = (String) iter.next(); String attname = attpair.substring(0, attpair.indexOf(",")); //$NON-NLS-1$ String attval = attpair.substring(attpair.indexOf(",") + 1); //$NON-NLS-1$ if (attname.equals(attributeName) && attval.equals(attributeValue)) return eMap; } return null; } /** * * @param eMap * @param attributeName * @return String */ public static String getAttributeOfElement(HashMap eMap, String attributeName) { Iterator iter = ((ArrayList) eMap.get("attributes")).iterator(); //$NON-NLS-1$ while (iter.hasNext()) { String attpair = (String) iter.next(); String attname = attpair.substring(0, attpair.indexOf(",")); //$NON-NLS-1$ String attval = attpair.substring(attpair.indexOf(",") + 1); //$NON-NLS-1$ if (attname.equals(attributeName)) return attval; } return null; } }