/******************************************************************************* * Copyright (c) 2007, 2009 Symbian Software Limited 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: * Bala Torati (Symbian) - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.core.templateengine; import java.io.IOException; import java.net.URL; import com.ibm.icu.text.MessageFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.SAXException; /** * This class contains methods to get first process block element, next process block * element and checks for next process block element. */ public class TemplateDescriptor { public static final String PROPERTY_GROUP = "property-group"; //$NON-NLS-1$ public static final String PROCESS = "process"; //$NON-NLS-1$ public static final String IF = "if"; //$NON-NLS-1$ public static final String ID = "id"; //$NON-NLS-1$ public static final String DEFAULT = "default"; //$NON-NLS-1$ public static final String PERSIST = "persist"; //$NON-NLS-1$ public static final String BOOL_TRUE = "true"; //$NON-NLS-1$ private Document document; private Element rootElement; private List<String> persistVector; private String pluginId; /** * Constructor which construct the Document based the URL * @param descriptorURL * @throws TemplateInitializationException */ public TemplateDescriptor(URL descriptorURL, String pluginId) throws TemplateInitializationException { String msg= MessageFormat.format(TemplateEngineMessages.getString("TemplateCore.InitFailed"), new Object[]{descriptorURL}); //$NON-NLS-1$ try { this.document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(descriptorURL.openStream()); } catch(ParserConfigurationException pce) { throw new TemplateInitializationException(msg, pce); } catch(IOException ioe) { throw new TemplateInitializationException(msg, ioe); } catch(SAXException se) { throw new TemplateInitializationException(msg, se); } this.rootElement = document.getDocumentElement(); this.persistVector = new ArrayList<String>(); this.pluginId = pluginId; } /** * This method is to get the default key value pair (HashMap) form template * descriptor root element. * * @return default values with keys */ public Map<String, String> getTemplateDefaults(Element element) { Map<String, String> templateDefaults = new HashMap<String, String>(); Element propertyGroupElement; List<Element> children = TemplateEngine.getChildrenOfElement(element); for (int i = 0, l = children.size(); i < l; i++) { propertyGroupElement = children.get(i); if (isNestedElement(propertyGroupElement)) { templateDefaults = getTemplateDefaults(propertyGroupElement); } propertyElements(templateDefaults, propertyGroupElement); } return templateDefaults; } /** * Checks whether element nested or not * @param element * @return */ private boolean isNestedElement(Element element){ boolean result=false; if (element!=null){ List<Element> children = TemplateEngine.getChildrenOfElement(element); String elementName = element.getNodeName(); Element testElement; String testElementName = null; if (children.size() > 0){ testElement = children.get(0); testElementName=testElement.getNodeName(); } if(elementName.equals(testElementName)) result=true; else result=false; } return result; } /** * This method is to get the list of property-group elements from template * descriptor root element. * * @return list of property-group elements */ public List<Element> getPropertyGroupList() { List<Element> resultList = null; List<Element> list = new ArrayList<Element>(); resultList = list; if (rootElement != null) { List<Element> tempList = TemplateEngine.getChildrenOfElement(rootElement); for (int i = 0, l = tempList.size(); i < l; i++) { Element nextPropertyGroup = tempList.get(i); String nextPGName = nextPropertyGroup.getNodeName(); if (nextPGName.equalsIgnoreCase(PROPERTY_GROUP)) { list.add(nextPropertyGroup); } } } return resultList; } /** * This method is to get the complex property-group from template descriptor * root element. complex means a property-group contains other * property-group(s) * * @param element * root element of type JDOM Element * @return property-group root element of type JDOM Element */ public Element getRootPropertyGroup(Element element) { if (element != null) { String rootElementName = element.getNodeName(); if (rootElementName.equalsIgnoreCase(PROPERTY_GROUP) && isNestedElement(element)) { return element; } return element; } else { String nextPGElementName = null; List<Element> propertyGroupList = TemplateEngine.getChildrenOfElement(element); for (int i = 0, l = propertyGroupList.size(); i < l; i++) { Element nextPGElement = propertyGroupList.get(i); if (isNestedElement(nextPGElement)) nextPGElementName = nextPGElement.getNodeName(); if (PROPERTY_GROUP.equalsIgnoreCase(nextPGElementName) && isNestedElement(nextPGElement)) { return nextPGElement; } } } return null; } /** * This private method is used in getTemplateDefaults() to get defaults from * property elements * * @param defaults * HashMap to store deraults * @param propertyGroupElement * traverse the complex property-group element */ private void propertyElements(Map<String, String> defaults, Element propertyGroupElement) { List<Element> children = TemplateEngine.getChildrenOfElement(propertyGroupElement); for (int i = 0, l = children.size(); i < l; i++) { Element propertyElement = children.get(i); String key = propertyElement.getAttribute(ID); String value = propertyElement.getAttribute(DEFAULT); if (key != null && !key.equals("")) { //$NON-NLS-1$ defaults.put(key, value); } String persist = propertyElement.getAttribute(PERSIST); if ((persist != null) && (persist.trim().equalsIgnoreCase(BOOL_TRUE))) { persistVector.add(key); } } } /** * added to return root of this document. */ public Element getRootElement() { return rootElement; } /** * return the list of IDs whose Persist attribute is true. * * @return Vector. */ public List<String> getPersistTrueIDs() { return persistVector; } public String getPluginId() { return pluginId; } }