| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| package com.sun.star.filter.config.tools.utils; |
| |
| //_______________________________________________ |
| |
| import java.lang.*; |
| import java.util.*; |
| import java.io.*; |
| |
| //_______________________________________________ |
| |
| /** |
| * It provides some constant values and some static helper routines |
| * which are neccessary to work with a xml file - especialy |
| * the filter configuration. |
| * |
| * |
| */ |
| public class XMLHelper |
| { |
| //___________________________________________ |
| // public const |
| |
| /** its a possible value of the xml attribute "oor:type" and identify an integer type. */ |
| public static final java.lang.String XMLTYPE_INTEGER = "xs:int"; |
| |
| /** its a possible value of the xml attribute "oor:type" and identify an boolean type. */ |
| public static final java.lang.String XMLTYPE_BOOLEAN = "xs:boolean"; |
| |
| /** its a possible value of the xml attribute "oor:type" and identify an string type. */ |
| public static final java.lang.String XMLTYPE_STRING = "xs:string"; |
| |
| /** its a possible value of the xml attribute "oor:type" and identify an string list type. */ |
| public static final java.lang.String XMLTYPE_STRINGLIST = "oor:string-list"; |
| |
| /** its a xml attribute, which specify a property name. */ |
| public static final java.lang.String XMLATTRIB_OOR_NAME = "oor:name"; |
| |
| /** its a xml attribute, which specify a property type. */ |
| public static final java.lang.String XMLATTRIB_OOR_TYPE = "oor:type"; |
| |
| /** its a xml attribute, which specify a list separator. */ |
| public static final java.lang.String XMLATTRIB_OOR_SEPARATOR = "oor:separator"; |
| |
| /** its a xml attribute, which specify a localized value. */ |
| public static final java.lang.String XMLATTRIB_OOR_LOCALIZED = "oor:localized"; |
| |
| /** its a xml attribute, which specify a merge operation for cfg layering. */ |
| public static final java.lang.String XMLATTRIB_OOR_OP = "oor:op"; |
| |
| /** can be used as value for XMLATTRIB_OOR_OP. */ |
| public static final java.lang.String XMLATTRIB_OP_REPLACE = "replace"; |
| |
| /** its a xml attribute, which specify a locale value. */ |
| public static final java.lang.String XMLATTRIB_XML_LANG = "xml:lang"; |
| |
| /** its the tag name of a <value ...> entry. */ |
| public static final java.lang.String XMLTAG_VALUE = "value"; |
| |
| /** its the tag name of a <prop ...> entry. */ |
| public static final java.lang.String XMLTAG_PROP = "prop"; |
| |
| /** its the tag name of a <node ...> entry. */ |
| public static final java.lang.String XMLTAG_NODE = "node"; |
| |
| //___________________________________________ |
| // private const |
| |
| /** a static list of all possible separators, which can be used for configuration type string-list. */ |
| private static final java.lang.String[] DELIMS = {" ", ",", ";", ".", ":", "-", "_", "#", "'", "+", "*", "~", "=", "?"}; |
| |
| /** index of the default separator inside list DELIMS. |
| * Its neccessary to know such default separator; because it can |
| * be supressed as xml attribute of the corresponding value tag. */ |
| private static final int DEFAULT_SEPARATOR = 0; |
| |
| //___________________________________________ |
| |
| /** analyze the structures of the given XML node and |
| * return a property set of all found sub nodes. |
| * |
| * Such properties are organized as [name, value] pairs. |
| * The type of a xml node will be detected automaticly. |
| * Following types are supported: |
| * xs:int => java.lang.Integer |
| * xs:bool => java.lang.Boolean |
| * xs:string => java.lang.String |
| * oor:string-list => java.util.LinkedList[java.lang.String] |
| * oor:set => java.util.Vector[java.lang.Object] |
| * oor:localized => java.util.HashMap[java.lang.Object] |
| * |
| * @param aNode |
| * points directly to the xml node, where we should analyze |
| * the children nodes. |
| * |
| * @return [java.util.HashMap] |
| * contains every node name as key and its string(!) as value. |
| */ |
| public static java.util.HashMap convertNodeToPropSet(org.w3c.dom.Node aNode) |
| throws java.lang.Exception |
| { |
| java.util.HashMap aPropSet = new java.util.HashMap(); |
| |
| // get all child nodes, which seems to be properties |
| java.util.Vector lChildNodes = XMLHelper.extractChildNodesByTagName(aNode, XMLTAG_PROP); |
| java.util.Enumeration en1 = lChildNodes.elements(); |
| while(en1.hasMoreElements()) |
| { |
| org.w3c.dom.Node aChildNode = (org.w3c.dom.Node)en1.nextElement(); |
| |
| // read its name |
| java.lang.String sChildName = XMLHelper.extractNodeAttribByName(aChildNode, XMLATTRIB_OOR_NAME); |
| if (sChildName == null) |
| throw new java.io.IOException("unsupported format: could not extract child node name"); |
| |
| // read its type info |
| java.lang.String sChildType = XMLHelper.extractNodeAttribByName(aChildNode, XMLATTRIB_OOR_TYPE); |
| if (sChildType == null) |
| { |
| /** Special patch: |
| * If an xml tag has no type information set ... we can restore it |
| * by analyzing the already readed tag name :-) |
| * Not very nice - but it can help to read stripped xml files too. */ |
| sChildType = XMLHelper.getTypeForTag(sChildName); |
| if (sChildType == null) |
| throw new java.io.IOException("unsupported format: could not extract child node type"); |
| } |
| |
| // read its value(s?) |
| java.util.Vector lChildValues = XMLHelper.extractChildNodesByTagName(aChildNode, XMLTAG_VALUE); |
| java.util.Enumeration en2 = lChildValues.elements(); |
| int nValue = 0; |
| java.lang.Object aValue = null; |
| while(en2.hasMoreElements()) |
| { |
| org.w3c.dom.Node aValueNode = (org.w3c.dom.Node)en2.nextElement(); |
| java.lang.String sChildLocale = XMLHelper.extractNodeAttribByName(aValueNode, XMLATTRIB_XML_LANG); |
| boolean bLocalized = (sChildLocale != null); |
| |
| ++nValue; |
| |
| if (sChildType.equals(XMLTYPE_INTEGER)) |
| { |
| if (!bLocalized && nValue > 1) |
| throw new java.io.IOException("unsupported format: more then one value for non localized but atomic type detected"); |
| java.lang.String sData = ((org.w3c.dom.CharacterData)aValueNode.getFirstChild()).getData(); |
| aValue = new java.lang.Integer(sData); |
| } |
| else |
| if (sChildType.equals(XMLTYPE_BOOLEAN)) |
| { |
| if (!bLocalized && nValue > 1) |
| throw new java.io.IOException("unsupported format: more then one value for non localized but atomic type detected"); |
| java.lang.String sData = ((org.w3c.dom.CharacterData)aValueNode.getFirstChild()).getData(); |
| aValue = new java.lang.Boolean(sData); |
| } |
| else |
| if (sChildType.equals(XMLTYPE_STRING)) |
| { |
| if (!bLocalized && nValue > 1) |
| throw new java.io.IOException("unsupported format: more then one value for non localized but atomic type detected"); |
| |
| java.lang.String sData = ((org.w3c.dom.CharacterData)aValueNode.getFirstChild()).getData(); |
| |
| java.util.HashMap lLocalized = null; |
| if (bLocalized) |
| { |
| if (aValue == null) |
| aValue = new java.util.HashMap(); |
| lLocalized = (java.util.HashMap)aValue; |
| lLocalized.put(sChildLocale, sData); |
| } |
| else |
| aValue = sData; |
| } |
| else |
| if (sChildType.equals(XMLTYPE_STRINGLIST)) |
| { |
| if (!bLocalized && nValue > 1) |
| throw new java.io.IOException("unsupported format: more then one value for non localized but atomic type detected"); |
| |
| java.lang.String sSeparator = XMLHelper.extractNodeAttribByName(aChildNode, XMLATTRIB_OOR_SEPARATOR); |
| if (sSeparator == null) |
| sSeparator = " "; |
| |
| java.lang.String sData = ((org.w3c.dom.CharacterData)aValueNode.getFirstChild()).getData(); |
| sData = sData.replace('\t', ' '); |
| sData = sData.replace('\n', ' '); |
| java.util.StringTokenizer aTokenizer = new java.util.StringTokenizer(sData, sSeparator); |
| java.util.Vector lList = new java.util.Vector(); |
| while(aTokenizer.hasMoreTokens()) |
| { |
| java.lang.String sToken = (java.lang.String)aTokenizer.nextToken(); |
| sToken.trim(); |
| if (sToken.length() < 1) |
| continue; |
| lList.add(sToken); |
| } |
| aValue = lList; |
| } |
| |
| aPropSet.put(sChildName, aValue); |
| } |
| } |
| |
| return aPropSet; |
| } |
| |
| //___________________________________________ |
| |
| private static java.lang.String getTypeForTag(java.lang.String sTag) |
| { |
| java.lang.String sType = null; |
| |
| if ( |
| (sTag.equals(Cache.PROPNAME_DATA )) || |
| (sTag.equals(Cache.PROPNAME_NAME )) || |
| (sTag.equals(Cache.PROPNAME_UINAME )) || |
| (sTag.equals(Cache.PROPNAME_MEDIATYPE )) || |
| (sTag.equals(Cache.PROPNAME_CLIPBOARDFORMAT )) || |
| (sTag.equals(Cache.PROPNAME_PREFERREDFILTER )) || |
| (sTag.equals(Cache.PROPNAME_DETECTSERVICE )) || |
| (sTag.equals(Cache.PROPNAME_FRAMELOADER )) || |
| (sTag.equals(Cache.PROPNAME_CONTENTHANDLER )) || |
| (sTag.equals(Cache.PROPNAME_DOCUMENTSERVICE )) || |
| (sTag.equals(Cache.PROPNAME_FILTERSERVICE )) || |
| (sTag.equals(Cache.PROPNAME_TEMPLATENAME )) || |
| (sTag.equals(Cache.PROPNAME_TYPE )) || |
| (sTag.equals(Cache.PROPNAME_UICOMPONENT )) |
| ) |
| sType = XMLTYPE_STRING; |
| else |
| if ( |
| (sTag.equals(Cache.PROPNAME_PREFERRED )) || |
| (sTag.equals("Installed" )) |
| ) |
| sType = XMLTYPE_BOOLEAN; |
| else |
| if ( |
| (sTag.equals(Cache.PROPNAME_UIORDER )) || |
| (sTag.equals(Cache.PROPNAME_DOCUMENTICONID )) || |
| (sTag.equals(Cache.PROPNAME_FILEFORMATVERSION)) |
| ) |
| sType = XMLTYPE_INTEGER; |
| else |
| if ( |
| (sTag.equals(Cache.PROPNAME_URLPATTERN )) || |
| (sTag.equals(Cache.PROPNAME_EXTENSIONS )) || |
| (sTag.equals(Cache.PROPNAME_USERDATA )) || |
| (sTag.equals(Cache.PROPNAME_FLAGS )) || |
| (sTag.equals(Cache.PROPNAME_TYPES )) |
| ) |
| sType = XMLTYPE_STRINGLIST; |
| |
| if (sType == null) |
| System.err.println("getTypeForTag("+sTag+") = "+sType); |
| |
| return sType; |
| } |
| |
| //___________________________________________ |
| |
| /** return a xml representation of the given property set. |
| * |
| * @param aPropSet |
| * a set of <name,value> pairs, which should be translated to xml |
| * |
| * @return [java.lang.String] |
| * the xml string representation. |
| * |
| * @throws [java.lang.Exception] |
| * if anything during convertion fill fail. |
| */ |
| public static java.lang.String convertPropSetToXML(java.util.HashMap aPropSet , |
| int nPrettyTabs) |
| throws java.lang.Exception |
| { |
| java.lang.StringBuffer sXML = new java.lang.StringBuffer(256); |
| |
| java.util.Iterator it1 = aPropSet.keySet().iterator(); |
| while(it1.hasNext()) |
| { |
| java.lang.String sProp = (java.lang.String)it1.next(); |
| java.lang.Object aVal = aPropSet.get(sProp); |
| |
| sProp = encodeHTMLSigns(sProp); |
| |
| // is it a simple type? |
| if ( |
| (aVal instanceof java.lang.Integer) || |
| (aVal instanceof java.lang.Boolean) || |
| (aVal instanceof java.lang.String ) |
| ) |
| { |
| sXML.append(XMLHelper.convertSimpleObjectToXML(sProp, aVal, nPrettyTabs)); |
| continue; |
| } |
| |
| // no! |
| // is it a list value? |
| if (aVal instanceof java.util.Vector) |
| { |
| java.util.Vector lVal = (java.util.Vector)aVal; |
| sXML.append(XMLHelper.convertListToXML(sProp, lVal, nPrettyTabs)); |
| continue; |
| } |
| |
| // its a localized value? |
| if (aVal instanceof java.util.HashMap) |
| { |
| java.util.HashMap lVal = (java.util.HashMap)aVal; |
| sXML.append(XMLHelper.convertLocalizedValueToXML(sProp, lVal, nPrettyTabs)); |
| continue; |
| } |
| |
| // unknown type! |
| java.lang.StringBuffer sMsg = new java.lang.StringBuffer(256); |
| sMsg.append("unsupported object type detected."); |
| sMsg.append("\ttype ? : \""+sProp+"\" = "+aVal); |
| sMsg.append("\tprop set: \""+aPropSet ); |
| throw new java.lang.Exception(sMsg.toString()); |
| } |
| |
| return sXML.toString(); |
| } |
| |
| public static java.lang.String encodeHTMLSigns(java.lang.String sValue) |
| { |
| java.lang.StringBuffer sSource = new java.lang.StringBuffer(sValue); |
| java.lang.StringBuffer sDestination = new java.lang.StringBuffer(1000 ); |
| |
| for (int i=0; i<sSource.length(); ++i) |
| { |
| char c = sSource.charAt(i); |
| if (c == '&') |
| sDestination.append("&"); |
| else |
| sDestination.append(c); |
| } |
| |
| java.lang.String sReturn = sDestination.toString(); |
| if (!sReturn.equals(sValue)) |
| System.out.println("encode \""+sValue+"\" => \""+sReturn+"\""); |
| |
| return sReturn; |
| } |
| |
| //___________________________________________ |
| |
| /** return a xml representation of an atomic property. |
| * |
| * Atomic property types are e.g. Integer, Boolean, String. |
| * |
| * @param sName |
| * the name of the property. |
| |
| * @param aValue |
| * the value of the property. |
| * |
| * @param nPrettyTabs |
| * count of tab signs for pretty format the xml code :-) |
| * |
| * @return [java.lang.String] |
| * the xml string representation. |
| * |
| * @throws [java.lang.Exception] |
| * if anything during convertion fill fail. |
| */ |
| private static java.lang.String convertSimpleObjectToXML(java.lang.String sName , |
| java.lang.Object aValue , |
| int nPrettyTabs) |
| throws java.lang.Exception |
| { |
| java.lang.StringBuffer sXML = new java.lang.StringBuffer(256); |
| for (int t=0; t<nPrettyTabs; ++t) |
| sXML.append("\t"); |
| |
| if (aValue instanceof java.lang.Integer) |
| { |
| sXML.append("<prop "+XMLATTRIB_OOR_NAME+"=\""+sName+"\">"); |
| sXML.append("<value>"+aValue.toString()+"</value>"); |
| sXML.append("</prop>\n"); |
| } |
| else |
| if (aValue instanceof java.lang.Boolean) |
| { |
| sXML.append("<prop "+XMLATTRIB_OOR_NAME+"=\""+sName+"\">"); |
| sXML.append("<value>"+aValue.toString()+"</value>"); |
| sXML.append("</prop>\n"); |
| } |
| else |
| if (aValue instanceof java.lang.String) |
| { |
| sXML.append("<prop "+XMLATTRIB_OOR_NAME+"=\""+sName+"\""); |
| java.lang.String sValue = (java.lang.String)aValue; |
| |
| sValue = encodeHTMLSigns(sValue); |
| |
| if (sValue.length() < 1) |
| sXML.append("/>\n"); |
| else |
| { |
| sXML.append("><value>"+sValue+"</value>"); |
| sXML.append("</prop>\n"); |
| } |
| } |
| else |
| { |
| System.err.println("name = "+sName); |
| System.err.println("value = "+aValue); |
| // ! can be used outside to detect - that it was not a simple type :-) |
| throw new java.lang.Exception("not an atomic type."); |
| } |
| |
| return sXML.toString(); |
| } |
| |
| //___________________________________________ |
| |
| /** return a xml representation of a string-list property. |
| * |
| * @param sName |
| * the name of the property. |
| |
| * @param aValue |
| * the value of the property. |
| * |
| * @param nPrettyTabs |
| * count of tab signs for pretty format the xml code :-) |
| * |
| * @return [java.lang.String] |
| * the xml string representation. |
| * |
| * @throws [java.lang.Exception] |
| * if anything during convertion fill fail. |
| */ |
| private static java.lang.String convertListToXML(java.lang.String sName , |
| java.util.Vector aValue , |
| int nPrettyTabs) |
| throws java.lang.Exception |
| { |
| java.lang.StringBuffer sXML = new java.lang.StringBuffer(256); |
| |
| for (int t=0; t<nPrettyTabs; ++t) |
| sXML.append("\t"); |
| |
| int c = aValue.size(); |
| if (c < 1) |
| { |
| sXML.append("<prop "+XMLATTRIB_OOR_NAME+"=\""+sName+"\"/>\n"); |
| return sXML.toString(); |
| } |
| |
| // step over all list items and add it to a string buffer |
| // Every item will be separated by a default separator "\n" first. |
| // Because "\n" is not a valid separator at all and can`t occure inside |
| // our list items. During we step over all items, we check if our current separator |
| // (we use a list of possible ones!) clash with an item. |
| // If it clash - we step to the next possible separator. |
| // If our list of possible separator values runs out of range we throw |
| // an exception :-) Its better then generating of wrong values |
| // If we found a valid seperator - we use it to replace our "\n" place holder |
| // at the end of the following loop ... |
| |
| int d = 0; |
| java.lang.StringBuffer sValBuff = new java.lang.StringBuffer(256); |
| for (int i=0; i<c; ++i) |
| { |
| // get the next list item |
| java.lang.Object aItem = aValue.get(i); |
| if (!(aItem instanceof java.lang.String)) |
| throw new java.lang.Exception("Current implementation supports string-list only!"); |
| |
| java.lang.String sValue = (java.lang.String)aItem; |
| |
| sValue = encodeHTMLSigns(sValue); |
| |
| // append item with default separator, which isn a valid separator at all |
| // But supress adding of the separator if last element is reached. |
| sValBuff.append(sValue); |
| if (i<(c-1)) |
| sValBuff.append("\n"); |
| |
| // check for delim clash |
| // Attention: An empty (means default) element forbid using |
| // of a whitespace character as separator! |
| while(true) |
| { |
| if (d >= DELIMS.length) |
| throw new java.lang.Exception("No valid separator found for a string list item."); |
| if (sValue.length() < 1 && DELIMS[d].equals(" ")) |
| { |
| ++d; |
| continue; |
| } |
| if (sValue.indexOf(DELIMS[d]) != -1) |
| { |
| ++d; |
| continue; |
| } |
| break; |
| } |
| } |
| |
| // replace default separator with right one |
| System.out.println("TODO: must be adapted to java 1.3 :-("); |
| System.exit(-1); |
| //TODO_JAVA java.lang.String sListVal = sValBuff.toString().replaceAll("\n", DELIMS[d]); |
| java.lang.String sListVal = null; |
| |
| sXML.append("<prop "+XMLATTRIB_OOR_NAME+"=\""+sName+"\">"); |
| if (d == DEFAULT_SEPARATOR) |
| sXML.append("<value>"); |
| else |
| sXML.append("<value "+XMLATTRIB_OOR_SEPARATOR+"=\""+DELIMS[d]+"\">"); |
| sXML.append(sListVal); |
| sXML.append("</value>"); |
| sXML.append("</prop>\n"); |
| |
| return sXML.toString(); |
| } |
| |
| //___________________________________________ |
| |
| /** return a xml representation of a localized property. |
| * |
| * @param sName |
| * the name of the property. |
| |
| * @param aValue |
| * the value of the property. |
| * |
| * @param nPrettyTabs |
| * count of tab signs for pretty format the xml code :-) |
| * |
| * @return [java.lang.String] |
| * the xml string representation. |
| * |
| * @throws [java.lang.Exception] |
| * if anything during convertion fill fail. |
| */ |
| private static java.lang.String convertLocalizedValueToXML(java.lang.String sName , |
| java.util.HashMap aValue , |
| int nPrettyTabs) |
| throws java.lang.Exception |
| { |
| java.lang.StringBuffer sXML = new java.lang.StringBuffer(256); |
| |
| int c = aValue.size(); |
| if (c < 1) |
| throw new java.lang.Exception("Cant detect type of localized values. Because the given list is empty."); |
| |
| for (int t=0; t<nPrettyTabs; ++t) |
| sXML.append("\t"); |
| // !Our localized values must be formated at a deeper coloum |
| // then its property name! |
| ++nPrettyTabs; |
| |
| sXML.append("<prop "+XMLATTRIB_OOR_NAME+"=\""+sName+"\">\n"); |
| java.util.Iterator it = aValue.keySet().iterator(); |
| // boolean bTypeKnown = false; |
| while(it.hasNext()) |
| { |
| java.lang.String sLocale = (java.lang.String)it.next(); |
| java.lang.Object aLocalizedValue = aValue.get(sLocale); |
| /* |
| if (!bTypeKnown) |
| { |
| bTypeKnown = true; |
| if (aLocalizedValue instanceof java.lang.Integer) |
| sXML.append(" "+XMLATTRIB_OOR_TYPE+"=\""+XMLTYPE_INTEGER+"\">\n"); |
| else |
| if (aLocalizedValue instanceof java.lang.Boolean) |
| sXML.append(" "+XMLATTRIB_OOR_TYPE+"=\""+XMLTYPE_BOOLEAN+"\">\n"); |
| else |
| if (aLocalizedValue instanceof java.lang.String) |
| sXML.append(" "+XMLATTRIB_OOR_TYPE+"=\""+XMLTYPE_STRING+"\">\n"); |
| else |
| throw new java.lang.Exception("Unsupported type for localized value detected."); |
| } |
| */ |
| java.lang.String sLocValue = aLocalizedValue.toString(); |
| java.lang.String sValue = encodeHTMLSigns(sLocValue); |
| |
| for (int t=0; t<nPrettyTabs; ++t) |
| sXML.append("\t"); |
| sXML.append("<value "+XMLATTRIB_XML_LANG+"=\""+sLocale+"\">"+sValue+"</value>\n"); |
| } |
| --nPrettyTabs; |
| for (int t=0; t<nPrettyTabs; ++t) |
| sXML.append("\t"); |
| sXML.append("</prop>\n"); |
| |
| return sXML.toString(); |
| } |
| |
| //___________________________________________ |
| |
| /** returns the value of an attribute of the given node. |
| * |
| * If the given node represent an lement node, may it supports some attributes. |
| * Then this method search for an attribute with the specified name and return it's value. |
| * If nothing could be found ... or the given node isn't a suitable node ... it returns null. |
| * |
| * @param aNode |
| * the node, which should be analyzed. |
| * |
| * @param sAttrib |
| * name of the attribute, which should be searched. |
| * |
| * @return The value of the specified attribute if it could be found at the given node. |
| * Can be null if node doesn't support attributes or the searched one does not exist there. |
| */ |
| public static java.lang.String extractNodeAttribByName(org.w3c.dom.Node aNode , |
| java.lang.String sAttrib) |
| throws java.lang.Exception |
| { |
| // We can get valid attributes for element nodes only! |
| if (aNode.getNodeType() != org.w3c.dom.Node.ELEMENT_NODE) |
| { |
| // System.err.println("not an element node"); |
| return null; |
| } |
| |
| // may it supports attributes in general ... but doesn't have anyone realy. |
| org.w3c.dom.NamedNodeMap lAttribs = aNode.getAttributes(); |
| if (lAttribs==null) |
| { |
| // System.err.println("no attributes at all"); |
| return null; |
| } |
| |
| // step over the attribute list and search for the requested one |
| for (int i=0; i<lAttribs.getLength(); ++i) |
| { |
| org.w3c.dom.Attr aAttrib = (org.w3c.dom.Attr)lAttribs.item(i); |
| if (aAttrib.getName().equals(sAttrib)) |
| { |
| java.lang.String sValue = aAttrib.getValue(); |
| return sValue; |
| } |
| } |
| |
| // the searched attribute was not found! |
| // System.err.println("required attribute \""+sAttrib+"\" does not exist for node ["+aNode.toString()+"]"); |
| return null; |
| } |
| |
| //___________________________________________ |
| |
| /** returns a list of childs, which are ELEMENT_NODES and have the right tag name. |
| * |
| * It analyze the list of all possible child nodes. Only ELEMENT_NODES are candidates. |
| * All other ones will be ignored. Further these element nodes are compared by it's tag |
| * names. If it match with the specified value it's added to the return list. |
| * So the return list includes references to the DOM tree nodes only, which are child |
| * element nodes with the right tag name. |
| * |
| * @param aNode |
| * provides access to the child nodes, which should be analyzed |
| * |
| * @param sTag |
| * the searched tag name. |
| * |
| * @return A list of child nodes, which are element nodes and have the right tag name. |
| */ |
| public static java.util.Vector extractChildNodesByTagName(org.w3c.dom.Node aNode, |
| java.lang.String sTag ) |
| { |
| // extract first all ELEMENT_NODES of he given parent |
| // Such nodes only provide tag names. |
| java.util.Vector lChilds = XMLHelper.extractChildNodesByType(aNode,org.w3c.dom.Node.ELEMENT_NODE); |
| java.util.Vector lExtractedChilds = new java.util.Vector(lChilds.size()); |
| |
| // step over the list and search for the right tags using the specified name |
| java.util.Enumeration en = lChilds.elements(); |
| while (en.hasMoreElements()) |
| { |
| org.w3c.dom.Node aChild = (org.w3c.dom.Node)en.nextElement(); |
| if (aChild.getNodeName().equals(sTag)) |
| lExtractedChilds.add(aChild); |
| } |
| |
| // pack(!) and return the list |
| lExtractedChilds.trimToSize(); |
| return lExtractedChilds; |
| } |
| |
| //___________________________________________ |
| |
| /** returns a list of childs, which supports the right node type. |
| * |
| * It analyze the list of all possible child nodes. If a node represent the right node type |
| * it is added to the return list. Otherwhise it will be ignored. |
| * |
| * @param aNode |
| * provides access to the list of possible children nodes. |
| * |
| * @param nType |
| * represent the searched node type. |
| * Possible values are constant fields of a org.w3c.dom.Node - e.g. org.w3c.dom.Node.ELEMENT_NODE. |
| * |
| * @return A list of child nodes, which provides the right node type. |
| */ |
| public static java.util.Vector extractChildNodesByType(org.w3c.dom.Node aNode, |
| short nType) |
| { |
| // get list of all possibe childs and reserve enough space for our return list |
| // Attention: A null pointer is not allowed for return! (means lExtractedChilds) |
| org.w3c.dom.NodeList lChilds = aNode.getChildNodes(); |
| int c = lChilds.getLength(); |
| java.util.Vector lExtractedChilds = new java.util.Vector(c); |
| |
| // step of these childs and select only needed ones |
| for (int i=0; i<c; ++i) |
| { |
| org.w3c.dom.Node aChild = lChilds.item(i); |
| if (aChild.getNodeType() == nType) |
| lExtractedChilds.add(aChild); |
| } |
| |
| // pack(!) and return the list |
| lExtractedChilds.trimToSize(); |
| return lExtractedChilds; |
| } |
| |
| //___________________________________________ |
| |
| /** generates an xml header, using parameters. |
| * |
| * @param sVersion |
| * number of the xml version. |
| * |
| * @param sEncoding |
| * used file encoding. |
| * |
| * @param sPath |
| * name of the configuration root. |
| * |
| * @param sPackage |
| * name of the configuration package. |
| * |
| * @param bLanguagepack |
| * force creation of a special header, |
| * which is needed for language packs only. |
| * |
| * @return [java.lang.String] |
| * the generated xml header. |
| |
| */ |
| public static java.lang.String generateHeader(java.lang.String sVersion , |
| java.lang.String sEncoding , |
| java.lang.String sPath , |
| java.lang.String sPackage , |
| boolean bLanguagePack) |
| { |
| java.lang.StringBuffer sHeader = new java.lang.StringBuffer(256); |
| |
| if (bLanguagePack) |
| { |
| sHeader.append("<?xml version=\""); |
| sHeader.append(sVersion); |
| sHeader.append("\" encoding=\""); |
| sHeader.append(sEncoding); |
| sHeader.append("\"?>\n"); |
| sHeader.append("<oor:component-data oor:package=\""); |
| sHeader.append(sPath); |
| sHeader.append("\" oor:name=\""); |
| sHeader.append(sPackage); |
| sHeader.append("\" xmlns:install=\"http://openoffice.org/2004/installation\""); |
| sHeader.append(" xmlns:oor=\"http://openoffice.org/2001/registry\""); |
| sHeader.append(" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\""); |
| sHeader.append(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"); |
| } |
| else |
| { |
| sHeader.append("<?xml version=\""); |
| sHeader.append(sVersion); |
| sHeader.append("\" encoding=\""); |
| sHeader.append(sEncoding); |
| sHeader.append("\"?>\n"); |
| sHeader.append("<oor:component-data xmlns:oor=\"http://openoffice.org/2001/registry\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" oor:package=\""); |
| sHeader.append(sPath); |
| sHeader.append("\" oor:name=\""); |
| sHeader.append(sPackage); |
| sHeader.append("\">\n"); |
| } |
| |
| return sHeader.toString(); |
| } |
| |
| public static java.lang.String generateFooter() |
| { |
| return "</oor:component-data>\n"; |
| } |
| } |