/************************************************************** * * 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 implements a container for all possible entries which are part of the type * and filter mechanism of an office - means all items of the configuration file * "TypeDetection". How these entries will be readed or written can be switch * in different modes. That would make it possible to edit an xml directly or * to contact a running office instance. * * */ public class Cache { //___________________________________________ // public const /** identifies a file type item of this cache. */ public static final int E_TYPE = 0; /** identifies a filter item of this cache. */ public static final int E_FILTER = 1; /** identifies a detect service item of this cache. */ public static final int E_DETECTSERVICE = 2; /** identifies a frame loader item of this cache. */ public static final int E_FRAMELOADER = 3; /** identifies a content handler item of this cache. */ public static final int E_CONTENTHANDLER = 4; /** indicates an unsupported xml format => error! */ public static final int FORMAT_UNSUPPORTED = -1; /** identify the configuration format of an office 6.0. * The own formated data string is used. */ public static final int FORMAT_60 = 0; /** identify the configuration format of an office 6.y. * Properties are realy xml tags again. */ public static final int FORMAT_6Y = 1; /** identify the configuration format which is used inside * this tooling project. */ public static final int FORMAT_INTERNAL = 2; /** right value for a command line parameter to define a 6.0 version. */ public static final java.lang.String CMDVAL_FORMAT_60 = "6.0"; /** right value for a command line parameter to define a 6.Y version. */ public static final java.lang.String CMDVAL_FORMAT_6Y = "6.Y"; /** right value for a command line parameter to define an internal xml version! */ public static final java.lang.String CMDVAL_FORMAT_INTERNAL = "internal"; // general public static final java.lang.String PROPNAME_DATA = "Data"; public static final java.lang.String PROPNAME_NAME = "Name"; public static final java.lang.String PROPNAME_UINAME = "UIName"; public static final java.lang.String PROPNAME_UINAMES = "UINames"; // type 6.0 ... public static final java.lang.String PROPNAME_MEDIATYPE = "MediaType"; public static final java.lang.String PROPNAME_PREFERRED = "Preferred"; public static final java.lang.String PROPNAME_CLIPBOARDFORMAT = "ClipboardFormat"; public static final java.lang.String PROPNAME_DOCUMENTICONID = "DocumentIconID"; public static final java.lang.String PROPNAME_URLPATTERN = "URLPattern"; public static final java.lang.String PROPNAME_EXTENSIONS = "Extensions"; // ... +6.y public static final java.lang.String PROPNAME_UIORDER = "UIOrder"; public static final java.lang.String PROPNAME_PREFERREDFILTER = "PreferredFilter"; public static final java.lang.String PROPNAME_DETECTSERVICE = "DetectService"; public static final java.lang.String PROPNAME_FRAMELOADER = "FrameLoader"; public static final java.lang.String PROPNAME_CONTENTHANDLER = "ContentHandler"; // filter public static final java.lang.String PROPNAME_DOCUMENTSERVICE = "DocumentService"; public static final java.lang.String PROPNAME_FILEFORMATVERSION = "FileFormatVersion"; public static final java.lang.String PROPNAME_FILTERSERVICE = "FilterService"; public static final java.lang.String PROPNAME_FLAGS = "Flags"; public static final java.lang.String PROPNAME_ORDER = "Order"; // -6.y public static final java.lang.String PROPNAME_TEMPLATENAME = "TemplateName"; public static final java.lang.String PROPNAME_TYPE = "Type"; public static final java.lang.String PROPNAME_UICOMPONENT = "UIComponent"; public static final java.lang.String PROPNAME_USERDATA = "UserData"; // frame loader / detect services / content handler public static final java.lang.String PROPNAME_TYPES = "Types"; //___________________________________________ // private const private static final java.lang.String FILTERSERVICE_NATIVEWARPPER = "com.sun.star.filter.NativeFilterWrapper"; private static final java.lang.String GENERIC_DETECTSERVICE = "com.sun.star.comp.office.FrameLoader"; /** its the name of the cfg set, which contains all types. */ private static final java.lang.String CFGNODE_TYPES = "Types"; /** its the name of the cfg set, which contains all filters. */ private static final java.lang.String CFGNODE_FILTERS = "Filters"; /** its the name of the cfg set, which contains all detect services. */ private static final java.lang.String CFGNODE_DETECTSERVICES = "DetectServices"; /** its the name of the cfg set, which contains all frame loaders. */ private static final java.lang.String CFGNODE_FRAMELOADERS = "FrameLoaders"; /** its the name of the cfg set, which contains all content handlers. */ private static final java.lang.String CFGNODE_CONTENTHANDLERS = "ContentHandlers"; // names for filter flags private static final java.lang.String FLAGNAME_3RDPARTYFILTER = "3RDPARTYFILTER"; private static final java.lang.String FLAGNAME_ALIEN = "ALIEN"; private static final java.lang.String FLAGNAME_ASYNCHRON = "ASYNCHRON"; private static final java.lang.String FLAGNAME_BROWSERPREFERRED = "BROWSERPREFERRED"; private static final java.lang.String FLAGNAME_CONSULTSERVICE = "CONSULTSERVICE"; private static final java.lang.String FLAGNAME_DEFAULT = "DEFAULT"; private static final java.lang.String FLAGNAME_EXPORT = "EXPORT"; private static final java.lang.String FLAGNAME_IMPORT = "IMPORT"; private static final java.lang.String FLAGNAME_INTERNAL = "INTERNAL"; private static final java.lang.String FLAGNAME_NOTINCHOOSER = "NOTINCHOOSER"; private static final java.lang.String FLAGNAME_NOTINFILEDIALOG = "NOTINFILEDIALOG"; private static final java.lang.String FLAGNAME_NOTINSTALLED = "NOTINSTALLED"; private static final java.lang.String FLAGNAME_OWN = "OWN"; private static final java.lang.String FLAGNAME_PACKED = "PACKED"; private static final java.lang.String FLAGNAME_PREFERRED = "PREFERRED"; private static final java.lang.String FLAGNAME_READONLY = "READONLY"; private static final java.lang.String FLAGNAME_TEMPLATE = "TEMPLATE"; private static final java.lang.String FLAGNAME_TEMPLATEPATH = "TEMPLATEPATH"; private static final java.lang.String FLAGNAME_USESOPTIONS = "USESOPTIONS"; private static final java.lang.String FLAGNAME_COMBINED = "COMBINED"; private static final java.lang.String FLAGNAME_SUPPORTSSELECTION= "SUPPORTSSELECTION"; // values for filter flags private static final int FLAGVAL_3RDPARTYFILTER = 0x00080000; // 524288 private static final int FLAGVAL_ALIEN = 0x00000040; // 64 private static final int FLAGVAL_ALL = 0xffffffff; // 4294967295 private static final int FLAGVAL_ASYNCHRON = 0x00004000; // 16384 private static final int FLAGVAL_BROWSERPREFERRED = 0x00400000; // 4194304 private static final int FLAGVAL_CONSULTSERVICE = 0x00040000; // 262144 private static final int FLAGVAL_DEFAULT = 0x00000100; // 256 private static final int FLAGVAL_EXPORT = 0x00000002; // 2 private static final int FLAGVAL_IMPORT = 0x00000001; // 1 private static final int FLAGVAL_INTERNAL = 0x00000008; // 8 private static final int FLAGVAL_NOTINCHOOSER = 0x00002000; // 8192 private static final int FLAGVAL_NOTINFILEDIALOG = 0x00001000; // 4096 private static final int FLAGVAL_NOTINSTALLED = 0x00020000; // 131072 private static final int FLAGVAL_OWN = 0x00000020; // 32 private static final int FLAGVAL_PACKED = 0x00100000; // 1048576 private static final int FLAGVAL_PREFERRED = 0x10000000; // 268435456 private static final int FLAGVAL_READONLY = 0x00010000; // 65536 private static final int FLAGVAL_TEMPLATE = 0x00000004; // 4 private static final int FLAGVAL_TEMPLATEPATH = 0x00000010; // 16 private static final int FLAGVAL_USESOPTIONS = 0x00000080; // 128 private static final int FLAGVAL_COMBINED = 0x00800000; // ... private static final int FLAGVAL_SUPPORTSSELECTION = 0x00000400; // 1024 //___________________________________________ // member /** list of all located types. * Format: [string,HashMap] */ private java.util.HashMap m_lTypes; /** list of all located filters. * Format: [string,HashMap] */ private java.util.HashMap m_lFilters; /** list of all located detect services. * Format: [string,HashMap] */ private java.util.HashMap m_lDetectServices; /** list of all located frame loader. * Format: [string,HashMap] */ private java.util.HashMap m_lFrameLoaders; /** list of all located content handler. * Format: [string,HashMap] */ private java.util.HashMap m_lContentHandlers; /** contains all analyzed relations between * filters and types. The key is an internal * type name (can be used as reference into the * list m_lTypes) and the value is a Vector of all * internal filter names, which are registered for * this type. * Format: [string, Vector] */ private java.util.HashMap m_lFilterToTypeRegistrations; private int m_nDoubleRegisteredFilters; private int m_nTypesForFilters; private int m_nTypesForDetectServices; private int m_nTypesForFrameLoaders; private int m_nTypesForContentHandlers; /** can be used to log different informations. */ private Logger m_aDebug; //___________________________________________ // interface /** standard ctor. * * Initialize an empty cache instance. You have to use * on of the fromXXX() methods to fill it from different * sources with content. */ public Cache(Logger aDebug) { reset(); m_aDebug = aDebug; } //___________________________________________ /** free memory and set default values on all members. */ public synchronized void reset() { m_lTypes = new java.util.HashMap(); m_lFilters = new java.util.HashMap(); m_lFrameLoaders = new java.util.HashMap(); m_lDetectServices = new java.util.HashMap(); m_lContentHandlers = new java.util.HashMap(); m_lFilterToTypeRegistrations = new java.util.HashMap(); m_aDebug = new Logger(); m_nDoubleRegisteredFilters = 0; m_nTypesForFilters = 0; m_nTypesForDetectServices = 0; m_nTypesForFrameLoaders = 0; m_nTypesForContentHandlers = 0; } //___________________________________________ /** converts a string representation of an xml format * to its int value, which must be used at some interface * methods of this cache. * * If the given string does not match to any well known format, * the return value will be FORMAT_UNSUPPORTED. The calli have to * check that. Otherwhise a called interface method at this cache * instance will be rejected by an exception! * * @param sFormat * the string representation * Must be one of our public const values from type CMDVAL_FORMAT_xxx. * * @return [int] * the int representation. * Will be one of our public const values from type FORMAT_xxx. */ public static int mapFormatString2Format(java.lang.String sFormat) { int nFormat = FORMAT_UNSUPPORTED; if (sFormat.equalsIgnoreCase(CMDVAL_FORMAT_60)) nFormat = FORMAT_60; else if (sFormat.equalsIgnoreCase(CMDVAL_FORMAT_6Y)) nFormat = FORMAT_6Y; else if (sFormat.equalsIgnoreCase(CMDVAL_FORMAT_INTERNAL)) nFormat = FORMAT_INTERNAL; return nFormat; } //___________________________________________ /** return some statistic values. * * Such values can be: - count of container items, * - ... * * @return [java.lang.String] * a formated string, which contains al statistic data. */ public synchronized java.lang.String getStatistics() { java.lang.StringBuffer sBuffer = new java.lang.StringBuffer(256); sBuffer.append("types = "+m_lTypes.size() +"\n"); sBuffer.append("filters = "+m_lFilters.size() +"\n"); sBuffer.append("detect services = "+m_lDetectServices.size() +"\n"); sBuffer.append("frame loaders = "+m_lFrameLoaders.size() +"\n"); sBuffer.append("content handler = "+m_lContentHandlers.size() +"\n"); sBuffer.append("double registered filters = "+m_nDoubleRegisteredFilters+"\n"); sBuffer.append("types used by filters = "+m_nTypesForFilters +"\n"); sBuffer.append("types used by detect services = "+m_nTypesForDetectServices +"\n"); sBuffer.append("types used by frame loaders = "+m_nTypesForFrameLoaders +"\n"); sBuffer.append("types used by content handlers = "+m_nTypesForContentHandlers+"\n"); return sBuffer.toString(); } //___________________________________________ /** reset this cache and fill it with new values using the given XML file. * * @param aXML * must be a system file of a suitable XML file, which * include all neccessary type/filter items. * * @param nFormat * identifies the format of the specified xml file, * which must be interpreted. */ public synchronized void fromXML(java.io.File aXML , int nFormat) throws java.lang.Exception { // clear this cache reset(); // parse it javax.xml.parsers.DocumentBuilderFactory aFactory = javax.xml.parsers.DocumentBuilderFactory.newInstance(); /* Attention: * This call is important. It force right handling of entities during parsing and(!) * writing. It let all possible signs for entities or it's quoted representations * untouched. So this class don't change the original signs of the original file. * Means: * */ System.out.println("TODO: must be adapted to java 1.3 :-("); System.exit(-1); //TODO_JAVA aFactory.setExpandEntityReferences(false); javax.xml.parsers.DocumentBuilder aBuilder = aFactory.newDocumentBuilder(); org.w3c.dom.Document aDOM = aBuilder.parse(aXML); org.w3c.dom.Element aRoot = aDOM.getDocumentElement(); // step over all sets java.util.Vector lSetNodes = XMLHelper.extractChildNodesByTagName(aRoot, XMLHelper.XMLTAG_NODE); java.util.Enumeration it1 = lSetNodes.elements(); while (it1.hasMoreElements()) { // try to find out, which set should be read org.w3c.dom.Node aSetNode = (org.w3c.dom.Node)it1.nextElement(); java.lang.String sSetName = XMLHelper.extractNodeAttribByName(aSetNode, XMLHelper.XMLATTRIB_OOR_NAME); if (sSetName == null) throw new java.io.IOException("unsupported format: could not extract set name on node ...\n"+aSetNode); // map some generic interfaces to the right members! int eType = -1 ; java.util.HashMap rMap = null; if (sSetName.equals(CFGNODE_TYPES)) { eType = E_TYPE; rMap = m_lTypes; } else if (sSetName.equals(CFGNODE_FILTERS)) { eType = E_FILTER; rMap = m_lFilters; } else if (sSetName.equals(CFGNODE_FRAMELOADERS)) { eType = E_FRAMELOADER; rMap = m_lFrameLoaders; } else if (sSetName.equals(CFGNODE_DETECTSERVICES)) { eType = E_DETECTSERVICE; rMap = m_lDetectServices; } else if (sSetName.equals(CFGNODE_CONTENTHANDLERS)) { eType = E_CONTENTHANDLER; rMap = m_lContentHandlers; } else throw new java.io.IOException("unsupported format: unknown set name [\""+sSetName+"\"] detected on node ...\n"+aSetNode); // load all set entries java.util.Vector lChildNodes = XMLHelper.extractChildNodesByTagName(aSetNode, XMLHelper.XMLTAG_NODE); java.util.Enumeration it2 = lChildNodes.elements(); while (it2.hasMoreElements()) { org.w3c.dom.Node aChildNode = (org.w3c.dom.Node)it2.nextElement(); java.lang.String sChildName = XMLHelper.extractNodeAttribByName(aChildNode, XMLHelper.XMLATTRIB_OOR_NAME); if (sChildName == null) throw new java.io.IOException("unsupported format: could not extract child node name on node ...\n"+aChildNode); java.util.HashMap aPropSet = null; // Note: Our internal format is different from the source format! java.util.HashMap aTempSet = XMLHelper.convertNodeToPropSet(aChildNode); switch(eType) { case E_TYPE : { aPropSet = Cache.convertTypePropsToInternal(aTempSet, nFormat); m_aDebug.setDetailedInfo("type [\""+sChildName+"\"] converted to internal format"); } break; case E_FILTER : { aPropSet = Cache.convertFilterPropsToInternal(aTempSet, nFormat); m_aDebug.setDetailedInfo("filter [\""+sChildName+"\"] converted to internal format"); } break; case E_DETECTSERVICE : { aPropSet = Cache.convertDetectServicePropsToInternal(aTempSet, nFormat); m_aDebug.setDetailedInfo("detect service [\""+sChildName+"\"] converted to internal format"); } break; case E_FRAMELOADER : { aPropSet = Cache.convertFrameLoaderPropsToInternal(aTempSet, nFormat); m_aDebug.setDetailedInfo("frame loader [\""+sChildName+"\"] converted to internal format"); } break; case E_CONTENTHANDLER : { aPropSet = Cache.convertContentHandlerPropsToInternal(aTempSet, nFormat); m_aDebug.setDetailedInfo("content handler [\""+sChildName+"\"] converted to internal format"); } break; } m_aDebug.setDetailedInfo("props = "+aTempSet); rMap.put(sChildName, aPropSet); } } } //___________________________________________ /** create some hml views of the current content of this cache. * * The given directory is used to create different html files * there. Every of them show another aspect of this cache. * E.g.: - all type/filter properties * - relation ships between types/filters/loaders etc. * * @param aDirectory * points to a system directory, which * can be used completely(!) to generate * the results there. * * @param nFormat * specify in which context the cache items should be * interpreted. */ public synchronized void toHTML(java.io.File aDirectory, int nFormat , java.lang.String sEncoding ) throws java.lang.Exception { if (nFormat != FORMAT_6Y) throw new java.lang.Exception("HTML views are supported for the new 6.y format only yet."); java.lang.StringBuffer sRelationView = new java.lang.StringBuffer(1000); sRelationView.append("
Relation View
"); sRelationView.append(""); sRelationView.append(""); java.util.Iterator aIt = m_lTypes.keySet().iterator(); while (aIt.hasNext()) { java.lang.String sType = (java.lang.String)aIt.next(); java.util.HashMap aType = (java.util.HashMap)m_lTypes.get(sType); sRelationView.append(""); sRelationView.append(""); java.lang.String sVal = (java.lang.String)aType.get(PROPNAME_DETECTSERVICE); if (sVal == null || sVal.length()<1) sRelationView.append(""); else sRelationView.append(""); sVal = (java.lang.String)aType.get(PROPNAME_PREFERREDFILTER); if (sVal == null || sVal.length()<1) sRelationView.append(""); else sRelationView.append(""); sVal = (java.lang.String)aType.get(PROPNAME_FRAMELOADER); if (sVal == null || sVal.length()<1) sRelationView.append(""); else sRelationView.append(""); sVal = (java.lang.String)aType.get(PROPNAME_CONTENTHANDLER); if (sVal == null || sVal.length()<1) sRelationView.append(""); else sRelationView.append(""); sRelationView.append(""); } sRelationView.append("
typedetect servicepreferred filterframe loadercontent handler
"+sType+" - "+sVal+" - "+sVal+" - "+sVal+" - "+sVal+"
"); sRelationView.append(""); FileHelper.writeEncodedBufferToFile(new java.io.File(aDirectory, "relation_view.html"), sEncoding, false, sRelationView); java.util.HashMap lFilters2TypeRegistration = new java.util.HashMap(); aIt = m_lFilters.keySet().iterator(); while (aIt.hasNext()) { java.lang.String sFilter = (java.lang.String)aIt.next(); java.util.HashMap aFilter = (java.util.HashMap)m_lFilters.get(sFilter); java.lang.String sType = (java.lang.String)aFilter.get(PROPNAME_TYPE); java.util.Vector lFilters = (java.util.Vector)lFilters2TypeRegistration.get(sType); if (lFilters == null) lFilters = new java.util.Vector(); lFilters.add(sFilter); lFilters2TypeRegistration.put(sType, lFilters); } java.lang.StringBuffer sType2FiltersView = new java.lang.StringBuffer(1000); sType2FiltersView.append("
Type2Filters View
"); sType2FiltersView.append(""); sType2FiltersView.append(""); aIt = lFilters2TypeRegistration.keySet().iterator(); while (aIt.hasNext()) { java.lang.String sType = (java.lang.String)aIt.next(); java.util.Vector lFilters = (java.util.Vector)lFilters2TypeRegistration.get(sType); sType2FiltersView.append(""); } sType2FiltersView.append("
typefilters
"+sType+""); java.util.Enumeration aEn = lFilters.elements(); while(aEn.hasMoreElements()) sType2FiltersView.append(aEn.nextElement()+"
"); sType2FiltersView.append("
"); sType2FiltersView.append(""); FileHelper.writeEncodedBufferToFile(new java.io.File(aDirectory, "type2filters_view.html"), sEncoding, false, sType2FiltersView); } //___________________________________________ /** converts all items of this cache to its xml representation * and write it to the given file. * * @param aXML * the target file for output. * * @param nFormat * the requested xml format. * see const values FORMAT_xxx too. * * @param sEncoding * specify the file encoding for the generated xml file. * * @throws [java.lang.Exception] * if something fail during convertion. */ public synchronized void toXML(java.io.File aXML , int nFormat , java.lang.String sEncoding) throws java.lang.Exception { java.lang.StringBuffer sXML = new java.lang.StringBuffer(500000); for (int i=0; i<5; ++i) { // define right sub container java.lang.String sSetName = null; java.util.HashMap rMap = null; int eType = -1; switch(i) { case 0 : { sSetName = CFGNODE_TYPES; rMap = m_lTypes; eType = E_TYPE; } break; case 1 : { sSetName = CFGNODE_FILTERS; rMap = m_lFilters; eType = E_FILTER; } break; case 2 : { sSetName = CFGNODE_DETECTSERVICES; rMap = m_lDetectServices; eType = E_DETECTSERVICE; } break; case 3 : { sSetName = CFGNODE_FRAMELOADERS; rMap = m_lFrameLoaders; eType = E_FRAMELOADER; } break; case 4 : { sSetName = CFGNODE_CONTENTHANDLERS; rMap = m_lContentHandlers; eType = E_CONTENTHANDLER; } break; } // generate set sXML.append("\n"); java.util.Iterator it = rMap.keySet().iterator(); while(it.hasNext()) { java.lang.String sItem = (java.lang.String)it.next(); sXML.append("\n"); sXML.append(getItemAsXML(eType, sItem, nFormat)); sXML.append("\n"); } sXML.append("\n"); } java.io.FileOutputStream aStream = new java.io.FileOutputStream(aXML.getAbsolutePath(), false); java.io.OutputStreamWriter aWriter = new java.io.OutputStreamWriter(aStream, sEncoding); java.lang.String sOut = sXML.toString(); aWriter.write(sOut, 0, sOut.length()); aWriter.flush(); aWriter.close(); } //___________________________________________ /** converts a type property set from internal format * to an external one. * * @param aMap * points to the item, which should be converted. * * @param nFormat * specify the requested output format. * * @return [java.util.HashMap] * contains the properties in the requested format. * * @throws [java.lang.Exception * if something fail during convertion. */ private static java.util.HashMap convertTypePropsToExternal(java.util.HashMap aMap , int nFormat) throws java.lang.Exception { java.util.HashMap aResultMap = new java.util.HashMap(); // copy Name property ... if it exists! if (aMap.containsKey(PROPNAME_NAME)) aResultMap.put(PROPNAME_NAME, aMap.get(PROPNAME_NAME)); switch(nFormat) { //----------------------------------- case FORMAT_60 : { // copy UIName property unchanged aResultMap.put(PROPNAME_UINAME, aMap.get(PROPNAME_UINAME)); // ignore properties "UIOrder", "PreferredFilter", "DetectService" // They are not supported for 6.0 types. // pack all other properties to one "Data" string value java.lang.StringBuffer sData = new java.lang.StringBuffer(256); sData.append(aMap.get(PROPNAME_PREFERRED)); sData.append(","); sData.append(aMap.get(PROPNAME_MEDIATYPE)); sData.append(","); sData.append(aMap.get(PROPNAME_CLIPBOARDFORMAT)); sData.append(","); java.util.Vector lList = (java.util.Vector)aMap.get(PROPNAME_URLPATTERN); int c = lList.size(); int i = 0; for (i=0; i aExpandedMap["UIName"] * aMap["Data" ] => aExpandedMap["Preferred" ], aExpandedMap["MediaType"] etc. ... * * @param aMap * points to the item, which should be converted. * @param nFormat * specify the external format. * * @return [java.util.HashMap] * The new map in internal format. */ private static java.util.HashMap convertTypePropsToInternal(java.util.HashMap aMap , int nFormat) throws java.lang.Exception { java.util.HashMap aResultMap = new java.util.HashMap(); // copy Name property ... if it exists! if (aMap.containsKey(PROPNAME_NAME)) aResultMap.put(PROPNAME_NAME, aMap.get(PROPNAME_NAME)); switch(nFormat) { //----------------------------------- case FORMAT_60 : { // copy UIName property unchanged! aResultMap.put(PROPNAME_UINAME, aMap.get(PROPNAME_UINAME)); // generate new property "UIOrder" // Its the moved property "Order" of filters for versions >= 6.y! aResultMap.put(PROPNAME_UIORDER, new java.lang.Integer(0)); // generate new property "PreferredFilter" // Its a the moved filter flag "Preferred" for versions >= 6.y! aResultMap.put(PROPNAME_PREFERREDFILTER, new java.lang.String()); // generate new property "DetectService" // Every type know its detector diretcly from now. No search // will be neccessary any longer. aResultMap.put(PROPNAME_DETECTSERVICE, new java.lang.String()); // analyze the Data property of the original map // and copy its results (means all expanded properties) // to the result map. java.lang.String sDataVal = (java.lang.String)aMap.get(PROPNAME_DATA); java.util.Vector lTokens = Cache.splitTokenString(sDataVal, ","); int t = 0; java.util.Enumeration it = lTokens.elements(); while (it.hasMoreElements()) { java.lang.String sToken = (java.lang.String)it.nextElement(); switch(t) { case 0 : aResultMap.put(PROPNAME_PREFERRED, new java.lang.Boolean(sToken)); break; case 1 : aResultMap.put(PROPNAME_MEDIATYPE, sToken); break; case 2 : { /*HACK ersetze %20 mit " " ...*/ int ni = sToken.indexOf("%20"); if (ni!=-1) { java.lang.String sPatch = sToken.substring(0,ni) + " " + sToken.substring(ni+3); sToken = sPatch; } aResultMap.put(PROPNAME_CLIPBOARDFORMAT, sToken); } break; case 3 : aResultMap.put(PROPNAME_URLPATTERN, Cache.splitTokenString(sToken, ";")); break; case 4 : aResultMap.put(PROPNAME_EXTENSIONS, Cache.splitTokenString(sToken, ";")); break; case 5 : aResultMap.put(PROPNAME_DOCUMENTICONID, new java.lang.Integer(sToken)); break; default : throw new java.lang.Exception("unsupported format for data value of a type \""+aMap.get(PROPNAME_NAME)+"\" detected."); } ++t; } } break; //----------------------------------- case FORMAT_6Y : { // copy all supported properties directly aResultMap.put(PROPNAME_PREFERRED , aMap.get(PROPNAME_PREFERRED )); aResultMap.put(PROPNAME_MEDIATYPE , aMap.get(PROPNAME_MEDIATYPE )); aResultMap.put(PROPNAME_CLIPBOARDFORMAT, aMap.get(PROPNAME_CLIPBOARDFORMAT)); aResultMap.put(PROPNAME_URLPATTERN , aMap.get(PROPNAME_URLPATTERN )); aResultMap.put(PROPNAME_EXTENSIONS , aMap.get(PROPNAME_EXTENSIONS )); aResultMap.put(PROPNAME_DOCUMENTICONID , aMap.get(PROPNAME_DOCUMENTICONID )); aResultMap.put(PROPNAME_UINAME , aMap.get(PROPNAME_UINAME )); aResultMap.put(PROPNAME_UIORDER , aMap.get(PROPNAME_UIORDER )); aResultMap.put(PROPNAME_PREFERREDFILTER, aMap.get(PROPNAME_PREFERREDFILTER)); aResultMap.put(PROPNAME_DETECTSERVICE , aMap.get(PROPNAME_DETECTSERVICE )); } break; //----------------------------------- default : throw new java.lang.Exception("unknown format"); } return aResultMap; } //___________________________________________ /** converts a filter property set (using an external format) to * our internal cache format. * * Especialy the data format string will be expanded * to its real properties. * * Schema: * aMap["UIName"] => aExpandedMap["UIName"] * aMap["Data" ] => aExpandedMap["Order" ], aExpandedMap["Flags"] etc. ... * * @param aMap * points to the item, which should be converted. * * @param nFormat * specify the external format. * * @return [java.util.HashMap] * The new map in internal format. */ private static java.util.HashMap convertFilterPropsToInternal(java.util.HashMap aMap , int nFormat) throws java.lang.Exception { java.util.HashMap aResultMap = new java.util.HashMap(); // copy Name property ... if it exists! if (aMap.containsKey(PROPNAME_NAME)) aResultMap.put(PROPNAME_NAME, aMap.get(PROPNAME_NAME)); switch(nFormat) { //----------------------------------- case FORMAT_60 : { // copy UIName property aResultMap.put(PROPNAME_UINAME, aMap.get(PROPNAME_UINAME)); // analyze the Data property of the original map // and copy its results (means all expanded properties) // to the result map. java.lang.String sDataVal = (java.lang.String)aMap.get(PROPNAME_DATA); java.util.Vector lTokens = Cache.splitTokenString(sDataVal, ","); int t = 0; java.util.Enumeration it = lTokens.elements(); while (it.hasMoreElements()) { java.lang.String sToken = (java.lang.String)it.nextElement(); switch(t) { case 0 : aResultMap.put(PROPNAME_ORDER, new java.lang.Integer(sToken)); break; case 1 : aResultMap.put(PROPNAME_TYPE, sToken); break; case 2 : aResultMap.put(PROPNAME_DOCUMENTSERVICE, sToken); break; case 3 : aResultMap.put(PROPNAME_FILTERSERVICE, sToken); break; case 4 : aResultMap.put(PROPNAME_FLAGS, new java.lang.Integer(sToken)); break; case 5 : aResultMap.put(PROPNAME_USERDATA, Cache.splitTokenString(sToken, ";")); break; case 6 : aResultMap.put(PROPNAME_FILEFORMATVERSION, new java.lang.Integer(sToken)); break; case 7 : aResultMap.put(PROPNAME_TEMPLATENAME, sToken); break; case 8 : aResultMap.put(PROPNAME_UICOMPONENT, sToken); break; default : throw new java.lang.Exception("unsupported format for data value of a filter detected."); } ++t; } // its an optional property :-) if (!aResultMap.containsKey(PROPNAME_TEMPLATENAME)) aResultMap.put(PROPNAME_TEMPLATENAME, new java.lang.String("")); // its an optional property :-) if (!aResultMap.containsKey(PROPNAME_UICOMPONENT)) aResultMap.put(PROPNAME_UICOMPONENT, new java.lang.String("")); } break; //----------------------------------- case FORMAT_6Y : { // "Order" does not exist for 6.y versions! Use default. aResultMap.put(PROPNAME_ORDER, new java.lang.Integer(0)); // "UIName" property does not exist for 6.y versions! use default. /* TODO make it configurable :-) */ aResultMap.put(PROPNAME_UINAME, aMap.get(PROPNAME_UINAME)); //aResultMap.put(PROPNAME_UINAME, new java.util.HashMap()); // "Flags" must be converted from names to its values java.util.Vector lFlags = (java.util.Vector)aMap.get(PROPNAME_FLAGS); java.lang.Integer nFlags = Cache.convertFilterFlagNames2Values(lFlags); aResultMap.put(PROPNAME_FLAGS, nFlags); // copy all direct supported properties aResultMap.put(PROPNAME_TYPE , aMap.get(PROPNAME_TYPE )); aResultMap.put(PROPNAME_DOCUMENTSERVICE , aMap.get(PROPNAME_DOCUMENTSERVICE )); aResultMap.put(PROPNAME_FILTERSERVICE , aMap.get(PROPNAME_ORDER )); aResultMap.put(PROPNAME_USERDATA , aMap.get(PROPNAME_USERDATA )); aResultMap.put(PROPNAME_FILEFORMATVERSION, aMap.get(PROPNAME_FILEFORMATVERSION)); aResultMap.put(PROPNAME_TEMPLATENAME , aMap.get(PROPNAME_TEMPLATENAME )); aResultMap.put(PROPNAME_UICOMPONENT , aMap.get(PROPNAME_UICOMPONENT )); } break; //----------------------------------- default : throw new java.lang.Exception("unknown format"); } return aResultMap; } private static java.util.HashMap convertDetectServicePropsToInternal(java.util.HashMap aMap , int nFormat) throws java.lang.Exception { /*FIXME*/ java.util.HashMap aResultMap = aMap; return aResultMap; } private static java.util.HashMap convertFrameLoaderPropsToInternal(java.util.HashMap aMap , int nFormat) throws java.lang.Exception { /*FIXME*/ java.util.HashMap aResultMap = aMap; return aResultMap; } private static java.util.HashMap convertContentHandlerPropsToInternal(java.util.HashMap aMap , int nFormat) throws java.lang.Exception { /*FIXME*/ java.util.HashMap aResultMap = aMap; return aResultMap; } //___________________________________________ /** converts filter flag names to its int representation. * * @param lFlags * a list of flag names. * * @return [java.lang.Integer] * an integer field of all set flags. * * @throws [java.lang.Exception] * for unsupported flags or empty flag fields! */ private static java.lang.Integer convertFilterFlagNames2Values(java.util.Vector lFlags) throws java.lang.Exception { int nFlags = 0; java.util.Enumeration it = lFlags.elements(); while(it.hasMoreElements()) { java.lang.String sFlagName = (java.lang.String)it.nextElement(); if (sFlagName.equals(FLAGNAME_3RDPARTYFILTER)) nFlags |= FLAGVAL_3RDPARTYFILTER; else if (sFlagName.equals(FLAGNAME_ALIEN)) nFlags |= FLAGVAL_ALIEN; else if (sFlagName.equals(FLAGNAME_ASYNCHRON)) nFlags |= FLAGVAL_ASYNCHRON; else if (sFlagName.equals(FLAGNAME_BROWSERPREFERRED)) nFlags |= FLAGVAL_BROWSERPREFERRED; else if (sFlagName.equals(FLAGNAME_CONSULTSERVICE)) nFlags |= FLAGVAL_CONSULTSERVICE; else if (sFlagName.equals(FLAGNAME_DEFAULT)) nFlags |= FLAGVAL_DEFAULT; else if (sFlagName.equals(FLAGNAME_EXPORT)) nFlags |= FLAGVAL_EXPORT; else if (sFlagName.equals(FLAGNAME_IMPORT)) nFlags |= FLAGVAL_IMPORT; else if (sFlagName.equals(FLAGNAME_INTERNAL)) nFlags |= FLAGVAL_INTERNAL; else if (sFlagName.equals(FLAGNAME_NOTINCHOOSER)) nFlags |= FLAGVAL_NOTINCHOOSER; else if (sFlagName.equals(FLAGNAME_NOTINFILEDIALOG)) nFlags |= FLAGVAL_NOTINFILEDIALOG; else if (sFlagName.equals(FLAGNAME_NOTINSTALLED)) nFlags |= FLAGVAL_NOTINSTALLED; else if (sFlagName.equals(FLAGNAME_OWN)) nFlags |= FLAGVAL_OWN; else if (sFlagName.equals(FLAGNAME_PACKED)) nFlags |= FLAGVAL_PACKED; else if (sFlagName.equals(FLAGNAME_PREFERRED)) nFlags |= FLAGVAL_PREFERRED; else if (sFlagName.equals(FLAGNAME_READONLY)) nFlags |= FLAGVAL_READONLY; else if (sFlagName.equals(FLAGNAME_TEMPLATE)) nFlags |= FLAGVAL_TEMPLATE; else if (sFlagName.equals(FLAGNAME_TEMPLATEPATH)) nFlags |= FLAGVAL_TEMPLATEPATH; else if (sFlagName.equals(FLAGNAME_USESOPTIONS)) nFlags |= FLAGVAL_USESOPTIONS; else if (sFlagName.equals(FLAGNAME_COMBINED)) nFlags |= FLAGVAL_COMBINED; else throw new java.lang.Exception("unsupported filter flag detected: \""+sFlagName+"\""); } if (nFlags == 0) throw new java.lang.Exception("no filter flags?"); return new java.lang.Integer(nFlags); } //___________________________________________ /** converts filter flag values to its string representation. * * @param nFlags * the flag field as int value. * * @return [java.util.Vector] * a list of flag names. * * @throws [java.lang.Exception] * for unsupported flags or empty flag fields! */ private static java.util.Vector convertFilterFlagValues2Names(java.lang.Integer nFlags) throws java.lang.Exception { java.util.Vector lFlags = new java.util.Vector(); int field = nFlags.intValue(); if (field == 0) throw new java.lang.Exception("no filter flags?"); if((field & FLAGVAL_IMPORT) == FLAGVAL_IMPORT) lFlags.add(FLAGNAME_IMPORT); if((field & FLAGVAL_EXPORT) == FLAGVAL_EXPORT) lFlags.add(FLAGNAME_EXPORT); if((field & FLAGVAL_TEMPLATE) == FLAGVAL_TEMPLATE) lFlags.add(FLAGNAME_TEMPLATE); if((field & FLAGVAL_INTERNAL) == FLAGVAL_INTERNAL) lFlags.add(FLAGNAME_INTERNAL); if((field & FLAGVAL_TEMPLATEPATH) == FLAGVAL_TEMPLATEPATH) lFlags.add(FLAGNAME_TEMPLATEPATH); if((field & FLAGVAL_OWN) == FLAGVAL_OWN) lFlags.add(FLAGNAME_OWN); if((field & FLAGVAL_ALIEN) == FLAGVAL_ALIEN) lFlags.add(FLAGNAME_ALIEN); if((field & FLAGVAL_USESOPTIONS) == FLAGVAL_USESOPTIONS) lFlags.add(FLAGNAME_USESOPTIONS); if((field & FLAGVAL_DEFAULT) == FLAGVAL_DEFAULT) lFlags.add(FLAGNAME_DEFAULT); if((field & FLAGVAL_NOTINFILEDIALOG) == FLAGVAL_NOTINFILEDIALOG) lFlags.add(FLAGNAME_NOTINFILEDIALOG); if((field & FLAGVAL_NOTINCHOOSER) == FLAGVAL_NOTINCHOOSER) lFlags.add(FLAGNAME_NOTINCHOOSER); if((field & FLAGVAL_ASYNCHRON) == FLAGVAL_ASYNCHRON) lFlags.add(FLAGNAME_ASYNCHRON); if((field & FLAGVAL_READONLY) == FLAGVAL_READONLY) lFlags.add(FLAGNAME_READONLY); if((field & FLAGVAL_NOTINSTALLED) == FLAGVAL_NOTINSTALLED) lFlags.add(FLAGNAME_NOTINSTALLED); if((field & FLAGVAL_CONSULTSERVICE) == FLAGVAL_CONSULTSERVICE) lFlags.add(FLAGNAME_CONSULTSERVICE); if((field & FLAGVAL_3RDPARTYFILTER) == FLAGVAL_3RDPARTYFILTER) lFlags.add(FLAGNAME_3RDPARTYFILTER); if((field & FLAGVAL_PACKED) == FLAGVAL_PACKED) lFlags.add(FLAGNAME_PACKED); if((field & FLAGVAL_BROWSERPREFERRED) == FLAGVAL_BROWSERPREFERRED) lFlags.add(FLAGNAME_BROWSERPREFERRED); if((field & FLAGVAL_PREFERRED) == FLAGVAL_PREFERRED) lFlags.add(FLAGNAME_PREFERRED); if((field & FLAGVAL_COMBINED) == FLAGVAL_COMBINED) lFlags.add(FLAGNAME_COMBINED); if((field & FLAGVAL_COMBINED) == FLAGVAL_SUPPORTSSELECTION) lFlags.add(FLAGNAME_SUPPORTSSELECTION); return lFlags; } //___________________________________________ /** return a reference to one of our member * lists for types/filters etc ... * * @param eItemType * specify, which item map is required. * * @return [java.util.HashMap] * a reference(!) to the right member. * * @throws [java.lang.Exception] * if the specified map does not exist. */ private java.util.HashMap getItemMap(int eItemType) throws java.lang.Exception { java.util.HashMap rMap = null; switch(eItemType) { case E_TYPE : rMap = m_lTypes; break; case E_FILTER : rMap = m_lFilters; break; case E_DETECTSERVICE : rMap = m_lDetectServices; break; case E_FRAMELOADER : rMap = m_lFrameLoaders; break; case E_CONTENTHANDLER : rMap = m_lContentHandlers; break; default: throw new java.lang.Exception("Invalid item map specified."); } return rMap; } //___________________________________________ /** return the count of items inside a sub container * of this cache. * * @param eItemType * specify, which item map is required. * * @throws [java.lang.Exception] * if the specified map does not exist. */ public synchronized int getItemCount(int eItemType) throws java.lang.Exception { java.util.HashMap rMap = getItemMap(eItemType); return rMap.size(); } //___________________________________________ /** get a list of all item names of the specified * sub container. * * @param eItemType * specify, which item map is required. * * @throws [java.lang.Exception] * if the specified map does not exist. */ public synchronized java.util.Vector getItemNames(int eItemType) throws java.lang.Exception { java.util.Vector lNames = new java.util.Vector(); java.util.HashMap rMap = getItemMap(eItemType); java.util.Iterator it = rMap.keySet().iterator(); while(it.hasNext()) lNames.add(it.next()); return lNames; } //___________________________________________ /** get a list of all item names of the specified * sub coontainer, where items match to given property set. * * Note: The given property set must exist at all * returned items as minimum and every checked property * value must be equals! Using of reg expressions or * similar mechanism will not be supported here. * * @param eItemType * specify, which item map is required. * * @param aPropSet * the set of properties, which must * exist at the returned item as minimum. * * @throws [java.lang.Exception] * if the specified map does not exist. */ public synchronized java.util.Vector getMatchedItemNames(int eItemType, java.util.HashMap aPropSet ) throws java.lang.Exception { java.util.Vector lNames = new java.util.Vector(); java.util.HashMap rMap = getItemMap(eItemType); java.util.Iterator it = rMap.keySet().iterator(); while(it.hasNext()) { java.lang.String sItemName = (java.lang.String)it.next(); java.util.HashMap rItemProps = (java.util.HashMap)rMap.get(sItemName); boolean bMatch = Cache.matchPropSet(rItemProps, aPropSet); if (bMatch) lNames.add(sItemName); else { java.lang.StringBuffer sBuffer = new java.lang.StringBuffer(1000); sBuffer.append("entry ["+eItemType+"] \""+sItemName+"\" does not match.\n"); sBuffer.append("\torg items = {"+rItemProps+"}\n"); sBuffer.append("\treq items = {"+aPropSet+"}\n"); m_aDebug.setDetailedInfo(sBuffer.toString()); } } return lNames; } //___________________________________________ /** check if two property sets are equals in its * shared properties. * * Note: Only set properties of the match set will be searched * inside the original set. And its values must be equals. * Using of reg expressions or similar mechanism will not * be supported here. * * @param rOrgProps * the original property set, which should be checked. * * @param rMatchProps * contains the properties, which must be searched * inside rOrgProps. * * @return TRUE if all properties of rMatchProps could be located * inside rOrgProps. */ private static boolean matchPropSet(java.util.HashMap rOrgProps , java.util.HashMap rMatchProps) { java.util.Iterator it = rMatchProps.keySet().iterator(); while(it.hasNext()) { java.lang.String sMatchName = (java.lang.String)it.next(); java.lang.Object aMatchValue = rMatchProps.get(sMatchName); if ( (!rOrgProps.containsKey(sMatchName) ) || (!rOrgProps.get(sMatchName).equals(aMatchValue)) ) { return false; } } return true; } //___________________________________________ /** return a property set for the queried container item. * * @param eItemType * specify, which item map is required. * * @param sItemName * must be a valid item name of the specified item map. * * @return [java.util.HashMap] * the property set of the queried item. * Always different from null! * * @throws [java.lang.Exception] * if the specified item does not exists or * seems to be invalid in general (means null!). */ public synchronized java.util.HashMap getItem(int eItemType, java.lang.String sItemName) throws java.lang.Exception { java.util.HashMap rMap = getItemMap(eItemType); java.util.HashMap rItem = (java.util.HashMap)rMap.get(sItemName); if (rItem == null) throw new java.lang.Exception("Queried item \""+sItemName+"\" does not exist inside this cache."); return rItem; } //___________________________________________ /** return a requested item in XML format. * * @param eItemType * identify the right sub set of this cache * inside which the requested item should exist. * e.g. E_TYPE, E_FILTER, ... * * @param sItemName * the name of the request item * * @param nXMLFormat * means the format of the generated xml source. * * @return [java.lang.String] * a xml formated string, which contains all properties * for this container item. */ public synchronized java.lang.String getItemAsXML(int eItemType , java.lang.String sItemName , int nXMLFormat) throws java.lang.Exception { // Note: Our internal format must be converted to the target format! java.util.HashMap rItem = getItem(eItemType, sItemName); java.util.HashMap rFormatedItem = null; switch(eItemType) { case E_TYPE : { rFormatedItem = Cache.convertTypePropsToExternal(rItem, nXMLFormat); m_aDebug.setGlobalInfo("type to external \""+sItemName+"\""); } break; case E_FILTER : { rFormatedItem = Cache.convertFilterPropsToExternal(rItem, nXMLFormat); m_aDebug.setGlobalInfo("filter to external \""+sItemName+"\""); } break; case E_DETECTSERVICE : { rFormatedItem = Cache.convertDetectServicePropsToExternal(rItem, nXMLFormat); m_aDebug.setGlobalInfo("detect service to external \""+sItemName+"\""); } break; case E_FRAMELOADER : { rFormatedItem = Cache.convertFrameLoaderPropsToExternal(rItem, nXMLFormat); m_aDebug.setGlobalInfo("frame loader to external \""+sItemName+"\""); } break; case E_CONTENTHANDLER : { rFormatedItem = Cache.convertContentHandlerPropsToExternal(rItem, nXMLFormat); m_aDebug.setGlobalInfo("content handler to external \""+sItemName+"\""); } break; } java.lang.StringBuffer sXML = new java.lang.StringBuffer(1000); int nPrettyTabs = 1; for (int t=0; t\n"); sXML.append(XMLHelper.convertPropSetToXML(rFormatedItem, nPrettyTabs+1)); for (int t=0; t\n"); return sXML.toString(); } //___________________________________________ /** split the given string (using the specified delimiter) * and return alist of found string tokens. * * Note: Against the normal behaviour of the StringTokenizer class * this method returns empty tokens too. * E.g: "0,,1" will return "0" - "" - "1" * * @param sTokenString * the string value, which should be analyzed. * * @param sDelim * the delimiter, which will be used to differe between tokens. * * @return [java.util.Vector] * a list of string tokens. Can be empty - but not null! */ private static java.util.Vector splitTokenString(java.lang.String sTokenString, java.lang.String sDelim ) { java.util.Vector lTokens = new java.util.Vector(); java.util.StringTokenizer aTokenizer = new java.util.StringTokenizer(sTokenString, sDelim, true); boolean bLastWasDelim = false; while (aTokenizer.hasMoreTokens()) { java.lang.String sToken = aTokenizer.nextToken(); if (sToken.equals(sDelim)) { if (bLastWasDelim) { // last token was a delimiter - new one too // => an empty token must be placed between these // two delimiters! Add this empty value to the return list. lTokens.add(""); } else { // last token was not a delimiter - new one is such delim // => ignore this delimiter - but save the information, that // it occured bLastWasDelim = true; } } else { // new token is no delim // => Add it to the return list. lTokens.add(sToken); // Dont forget to reset this information - so next loop // will do the right things! bLastWasDelim = false; } } return lTokens; } //___________________________________________ /** */ public synchronized void analyze() { m_nDoubleRegisteredFilters = 0; m_nTypesForFilters = 0; m_nTypesForDetectServices = 0; m_nTypesForFrameLoaders = 0; m_nTypesForContentHandlers = 0; // create table of types and all registered filters for such types // By the way: count all double registrations, where a filter // uses the same type then another filter. m_lFilterToTypeRegistrations = new java.util.HashMap(); java.util.Iterator aIt1 = m_lFilters.keySet().iterator(); while (aIt1.hasNext()) { java.lang.String sFilter = (java.lang.String)aIt1.next(); java.util.HashMap aFilter = (java.util.HashMap)m_lFilters.get(sFilter); java.lang.String sType = (java.lang.String)aFilter.get(PROPNAME_TYPE); java.util.Vector lFilters = (java.util.Vector)m_lFilterToTypeRegistrations.get(sType); if (lFilters == null) lFilters = new java.util.Vector(); else ++m_nDoubleRegisteredFilters; lFilters.add(sFilter); m_lFilterToTypeRegistrations.put(sType, lFilters); } // count, how many types are used by filters, frame loaders or content handlers aIt1 = m_lTypes.keySet().iterator(); while (aIt1.hasNext()) { java.lang.String sType = (java.lang.String)aIt1.next(); java.util.Iterator aIt2 = m_lFilters.keySet().iterator(); while (aIt2.hasNext()) { java.lang.String sItem = (java.lang.String)aIt2.next(); java.util.HashMap aItem = (java.util.HashMap)m_lFilters.get(sItem); java.lang.String sTypeReg = (java.lang.String)aItem.get(PROPNAME_TYPE); if (sTypeReg.equals(sType)) { ++m_nTypesForFilters; break; } } aIt2 = m_lDetectServices.keySet().iterator(); while (aIt2.hasNext()) { java.lang.String sItem = (java.lang.String)aIt2.next(); java.util.HashMap aItem = (java.util.HashMap)m_lDetectServices.get(sItem); java.util.Vector lTypeReg = (java.util.Vector)aItem.get(PROPNAME_TYPES); if (lTypeReg.contains(sType)) { ++m_nTypesForDetectServices; break; } } aIt2 = m_lFrameLoaders.keySet().iterator(); while (aIt2.hasNext()) { java.lang.String sItem = (java.lang.String)aIt2.next(); java.util.HashMap aItem = (java.util.HashMap)m_lFrameLoaders.get(sItem); java.util.Vector lTypeReg = (java.util.Vector)aItem.get(PROPNAME_TYPES); if (lTypeReg.contains(sType)) { ++m_nTypesForFrameLoaders; break; } } aIt2 = m_lContentHandlers.keySet().iterator(); while (aIt2.hasNext()) { java.lang.String sItem = (java.lang.String)aIt2.next(); java.util.HashMap aItem = (java.util.HashMap)m_lContentHandlers.get(sItem); java.util.Vector lTypeReg = (java.util.Vector)aItem.get(PROPNAME_TYPES); if (lTypeReg.contains(sType)) { ++m_nTypesForContentHandlers; break; } } } } //___________________________________________ /** validate all cache entries. * * It checks if all made registrations are valid; * try to repair some simple problems; * create missing informations on demand ... * * @param nFormat * specify, which configuration format * must be checked. * * @throws [java.lang.Exception] * if an unrecoverable problem occure. */ public synchronized void validate(int nFormat) throws java.lang.Exception { validateTypes(nFormat); validateFilters(nFormat); } //___________________________________________ /** validate all type entries of this cache. * * @param nFormat * specify, which configuration format * must be checked. * * @throws [java.lang.Exception] * if an unrecoverable problem occure. */ private void validateTypes(int nFormat) throws java.lang.Exception { java.util.Iterator aIt1 = m_lTypes.keySet().iterator(); while(aIt1.hasNext()) { java.lang.String sType = (java.lang.String)aIt1.next(); java.util.HashMap aType = (java.util.HashMap)m_lTypes.get(sType); if (aType == null) throw new java.lang.Exception("type ["+sType+"] dos not exist realy?!"); if ( (!aType.containsKey(PROPNAME_MEDIATYPE )) || (!aType.containsKey(PROPNAME_PREFERRED )) || (!aType.containsKey(PROPNAME_CLIPBOARDFORMAT)) || (!aType.containsKey(PROPNAME_DOCUMENTICONID )) || (!aType.containsKey(PROPNAME_URLPATTERN )) || (!aType.containsKey(PROPNAME_EXTENSIONS )) || (!aType.containsKey(PROPNAME_UINAME )) ) { throw new java.lang.Exception("Type \""+sType+"\" does not contain all neccessary properties for a 6.0/6.Y format."); } if ( (((java.util.Vector)aType.get(PROPNAME_EXTENSIONS)).isEmpty()) && (((java.util.Vector)aType.get(PROPNAME_URLPATTERN)).isEmpty()) ) { throw new java.lang.Exception("Type \""+sType+"\" does not contain any extension nor an url pattern."); } if (((java.util.HashMap)aType.get(PROPNAME_UINAME)).isEmpty()) throw new java.lang.Exception("Type \""+sType+"\" is not localized."); if (nFormat == FORMAT_6Y) { if ( (!aType.containsKey(PROPNAME_UIORDER )) || (!aType.containsKey(PROPNAME_PREFERREDFILTER)) || (!aType.containsKey(PROPNAME_DETECTSERVICE )) ) { throw new java.lang.Exception("Type \""+sType+"\" does not contain all neccessary properties for a 6.Y format."); } if (((java.lang.Integer)aType.get(PROPNAME_UIORDER)).intValue() < 0) throw new java.lang.Exception("Type \""+sType+"\" has invalid value for prop UIOrder."); if (((java.lang.String)aType.get(PROPNAME_DETECTSERVICE)).length() < 1) m_aDebug.setWarning("Type \""+sType+"\" has no detect service registered."); java.lang.String sPreferredReg = (java.lang.String)aType.get(PROPNAME_PREFERREDFILTER); if ( (sPreferredReg == null) || (sPreferredReg.length() < 1 ) ) { m_aDebug.setWarning("Type \""+sType+"\" has no preferred filter ..."); /*FIXME * OK - not every type has a filter registered .. but the * a frame loader MUST(!) exist! Check it. */ } else { if (!m_lFilters.containsKey(sPreferredReg)) throw new java.lang.Exception("Type \""+sType+"\" has no valid preferred filter registration [\""+sPreferredReg+"\"]."); } } } } //___________________________________________ /** validate all filter entries of this cache. * * @param nFormat * specify, which configuration format * must be checked. * * @throws [java.lang.Exception] * if an unrecoverable problem occure. */ public synchronized void validateFilters(int nFormat) throws java.lang.Exception { java.util.Iterator aIt1 = m_lFilters.keySet().iterator(); while(aIt1.hasNext()) { java.lang.String sFilter = (java.lang.String)aIt1.next(); java.util.HashMap aFilter = (java.util.HashMap)m_lFilters.get(sFilter); if (aFilter == null) throw new java.lang.Exception("filter ["+sFilter+"] dos not exist realy?!"); if ( (!aFilter.containsKey(PROPNAME_DOCUMENTSERVICE )) || (!aFilter.containsKey(PROPNAME_FILEFORMATVERSION)) || (!aFilter.containsKey(PROPNAME_FILTERSERVICE )) || (!aFilter.containsKey(PROPNAME_FLAGS )) || (!aFilter.containsKey(PROPNAME_TEMPLATENAME )) || (!aFilter.containsKey(PROPNAME_TYPE )) || (!aFilter.containsKey(PROPNAME_UICOMPONENT )) || (!aFilter.containsKey(PROPNAME_USERDATA )) ) { throw new java.lang.Exception("Filter \""+sFilter+"\" does not contain all neccessary properties for a 6.0/6.Y format."); } if (((java.lang.Integer)aFilter.get(PROPNAME_FLAGS)).intValue() < 1) throw new java.lang.Exception("Filter \""+sFilter+"\" does not have a valid flag field."); if (!m_lTypes.containsKey(aFilter.get(PROPNAME_TYPE))) throw new java.lang.Exception("Filter \""+sFilter+"\" is not registered for a well known type."); if (nFormat == FORMAT_60) { if ( (!aFilter.containsKey(PROPNAME_ORDER )) || (!aFilter.containsKey(PROPNAME_UINAME)) ) { throw new java.lang.Exception("Filter \""+sFilter+"\" does not contain all neccessary properties for a 6.0 format."); } if (((java.lang.Integer)aFilter.get(PROPNAME_ORDER)).intValue() < 0) throw new java.lang.Exception("Filter \""+sFilter+"\" does not have a valid Order value."); if (((java.util.HashMap)aFilter.get(PROPNAME_UINAME)).isEmpty()) throw new java.lang.Exception("Filter \""+sFilter+"\" is not localized."); } /*TODO depends from the configuration item "remove_filter_flag_preferred" ... if (nFormat == FORMAT_6Y) { int flags = ((java.lang.Integer)aFilter.get(PROPNAME_FLAGS)).intValue(); if ((flags & FLAGVAL_PREFERRED) == FLAGVAL_PREFERRED) throw new java.lang.Exception("Filter \""+sFilter+"\" has superflous Preferred flag set. Please remove this flag. ["+flags+"]"); } */ } } /*TODO * - remove graphic filters! * - move detect services to types */ public synchronized void transform60to6Y(boolean bCreateCombineFilterFlag , boolean bRemoveFilterFlagBrowserPreferred, boolean bRemoveFilterFlagPreferred , boolean bRemoveFilterFlag3rdparty , boolean bRemoveFilterUINames , boolean bRemoveGraphicFilters , boolean bSetDefaultDetector ) throws java.lang.Exception { // remove some superflous cache entries ... // everything related to "load macros" // Macros should be dispatched instead of loaded! if (m_lTypes.containsKey("macro")) { m_lTypes.remove("macro"); m_aDebug.setDetailedInfo("superflous type \"macro\" was removed"); } if (m_lFrameLoaders.containsKey("com.sun.star.comp.sfx2.SfxMacroLoader")) { m_lFrameLoaders.remove("com.sun.star.comp.sfx2.SfxMacroLoader"); m_aDebug.setDetailedInfo("superflous frame loader \"com.sun.star.comp.sfx2.SfxMacroLoader\" was removed"); } // step over all filters and check her properties and references java.util.Vector lPreferredFilters = new java.util.Vector(); java.util.Vector lNoRealFilters = new java.util.Vector(); java.util.Iterator aIt1 = m_lFilters.keySet().iterator(); while(aIt1.hasNext()) { java.lang.String sFilter = (java.lang.String)aIt1.next(); java.util.HashMap aFilter = (java.util.HashMap)m_lFilters.get(sFilter); // remove the "graphic helper filters" used by draw and impress // They dont have any valid document service name set and cant be handled // by our generic FrameLoader! // They must be moved to her own configuration ... if ( (bRemoveGraphicFilters ) && (((java.lang.String)aFilter.get(PROPNAME_DOCUMENTSERVICE)).length() < 1) ) { lNoRealFilters.add(sFilter); continue; } java.lang.String sTypeReg = (java.lang.String)aFilter.get(PROPNAME_TYPE); java.util.HashMap aType = (java.util.HashMap)m_lTypes.get(sTypeReg); // move UINames of filters to types java.util.HashMap lFilterUINames = (java.util.HashMap)aFilter.get(PROPNAME_UINAME); java.util.HashMap lTypeUINames = (java.util.HashMap)aType.get(PROPNAME_UINAME); java.util.HashMap lPatchUINames = new java.util.HashMap(); java.util.Iterator pUINames = lTypeUINames.keySet().iterator(); while(pUINames.hasNext()) { java.lang.String sLocale = (java.lang.String)pUINames.next(); java.lang.String sValue = (java.lang.String)lTypeUINames.get(sLocale); lPatchUINames.put(sLocale, sValue); } pUINames = lFilterUINames.keySet().iterator(); while(pUINames.hasNext()) { java.lang.String sLocale = (java.lang.String)pUINames.next(); java.lang.String sValue = (java.lang.String)lFilterUINames.get(sLocale); lPatchUINames.put(sFilter+":"+sLocale, sValue); } aType.put(PROPNAME_UINAME, lPatchUINames); // set generic filter service wrapper for our own native filters! // By the way: The format types of such filters can be detected by our // generic detector too. if ( (bSetDefaultDetector ) && (((java.lang.String)aFilter.get(PROPNAME_FILTERSERVICE)).length() < 1) ) { /*ME_THINKING aFilter.put(PROPNAME_FILTERSERVICE, FILTERSERVICE_NATIVEWARPPER);*/ aType.put(PROPNAME_DETECTSERVICE, GENERIC_DETECTSERVICE); } // move the preferred filter information to any type // Set the filter name to the type for which the filter is registered. // If this type already have a set PreferredFilter value, check if the current filter // has the preferred flag set. If not ignore it - otherwhise overwrite the // current information at the type. But look for multiple preferred filter relations ... // means: look if more the one filter has set the preferred flag for the same type! /* Attention! * * Dont remove the preferred flag from any filter! ... not here. * Otherwhise next loop can't detect ambigous preferred registrations! * Add filter to a temp. list, which can be used later to remove the preferred * flag ... */ int flags1 = ((java.lang.Integer)aFilter.get(PROPNAME_FLAGS)).intValue(); java.lang.String sDocSrv = (java.lang.String)aFilter.get(PROPNAME_DOCUMENTSERVICE); if (sDocSrv.length()>0)// without a doc service its not a real filter - its a graphic filter! { boolean preferred1 = ((flags1 & FLAGVAL_PREFERRED) == FLAGVAL_PREFERRED); if (preferred1) lPreferredFilters.add(aFilter); java.lang.String sAlreadyRegisteredFilter = (java.lang.String)aType.get(PROPNAME_PREFERREDFILTER); // no registration => set this filter as "any possible one"! if (sAlreadyRegisteredFilter.length() < 1) aType.put(PROPNAME_PREFERREDFILTER, sFilter); else { java.util.HashMap aAlreadyRegisteredFilter = (java.util.HashMap)m_lFilters.get(sAlreadyRegisteredFilter); int flags2 = ((java.lang.Integer)aAlreadyRegisteredFilter.get(PROPNAME_FLAGS)).intValue(); boolean preferred2 = ((flags2 & FLAGVAL_PREFERRED) == FLAGVAL_PREFERRED); // two preferred filters for the same type! => error if (preferred1 && preferred2) { java.lang.StringBuffer sMsg = new java.lang.StringBuffer(256); sMsg.append("More the one preferred filter detected for the same type.\n"); sMsg.append("\ttype = \""+sTypeReg+"\"\n"); sMsg.append("\tfilter[1] = \""+sAlreadyRegisteredFilter+"\"\n"); sMsg.append("\tfilter[2] = \""+sFilter+"\"\n"); throw new java.lang.Exception(sMsg.toString()); } else // overwrite the "any possible" filter with a real preferred one if (preferred1 && !preferred2) aType.put(PROPNAME_PREFERREDFILTER, sFilter); } } // create the new combined filter flag if required if (bCreateCombineFilterFlag) { if ( ((flags1 & FLAGVAL_IMPORT) == FLAGVAL_IMPORT) && ((flags1 & FLAGVAL_EXPORT) == FLAGVAL_EXPORT) ) { flags1 |= FLAGVAL_COMBINED; flags1 &= ~FLAGVAL_IMPORT ; flags1 &= ~FLAGVAL_EXPORT ; aFilter.put(PROPNAME_FLAGS, new java.lang.Integer(flags1)); } } // remove some obsolete filter flags if (bRemoveFilterFlagBrowserPreferred) { flags1 &= ~FLAGVAL_BROWSERPREFERRED; aFilter.put(PROPNAME_FLAGS, new java.lang.Integer(flags1)); } if (bRemoveFilterFlag3rdparty) { flags1 &= ~FLAGVAL_3RDPARTYFILTER; aFilter.put(PROPNAME_FLAGS, new java.lang.Integer(flags1)); } // if its a filter with an UI order ... // move this information to the registered type. // Note: Because more then one filter can be registered for the same type. // Handle it as an error ... till we find a better transformation! java.lang.Integer nOrder = (java.lang.Integer)aFilter.get(PROPNAME_ORDER); java.lang.Integer nUIOrder = (java.lang.Integer)aType.get(PROPNAME_UIORDER); int order = nOrder.intValue(); int uiorder = nUIOrder.intValue(); if (order > 0) { if ( (uiorder < 1 ) || (uiorder > order) ) { aType.put(PROPNAME_UIORDER, nOrder); m_aDebug.setDetailedInfo("moved order value "+nOrder+" from filter \""+sFilter+"\" to type \""+sTypeReg+"\""); } else m_aDebug.setDetailedInfo("ignore order value [order="+nOrder+",uiorder="+nUIOrder+"] for filter \""+sFilter+"\" and type \""+sTypeReg+"\""); } } // NOW ... remove the preferred flags from every filter, which it has set. java.util.Enumeration aIt2 = null; if (bRemoveFilterFlagPreferred) { aIt2 = lPreferredFilters.elements(); while (aIt2.hasMoreElements()) { java.util.HashMap aFilter = (java.util.HashMap)aIt2.nextElement(); int flags = ((java.lang.Integer)aFilter.get(PROPNAME_FLAGS)).intValue(); flags &= ~FLAGVAL_PREFERRED; aFilter.put(PROPNAME_FLAGS, new java.lang.Integer(flags)); } } // NOW ... remove all "no real filters" like the graphich helper filters of // draw and impress! aIt2 = lNoRealFilters.elements(); while (aIt2.hasMoreElements()) m_lFilters.remove(aIt2.nextElement()); // step over all detect services and move this information directly to // the corresponding types // Overwrite possibel default registrations with a real existing one! aIt1 = m_lDetectServices.keySet().iterator(); while(aIt1.hasNext()) { java.lang.String sDetector = (java.lang.String)aIt1.next(); java.util.HashMap aDetector = (java.util.HashMap)m_lDetectServices.get(sDetector); java.util.Vector lTypeReg = (java.util.Vector)aDetector.get(PROPNAME_TYPES); aIt2 = lTypeReg.elements(); while(aIt2.hasMoreElements()) { java.lang.String sTypeReg = (java.lang.String)aIt2.nextElement(); java.util.HashMap aType = (java.util.HashMap)m_lTypes.get(sTypeReg); if (aType == null) { m_aDebug.setWarning("Detector \""+sDetector+"\" seem to be registered for unknown type \""+sTypeReg+"\""); continue; } java.lang.Object aAlreadyRegisteredDetector = aType.get(PROPNAME_DETECTSERVICE); if (aAlreadyRegisteredDetector != null && ((java.lang.String)aAlreadyRegisteredDetector).length() > 0) { java.lang.StringBuffer sMsg = new java.lang.StringBuffer(256); sMsg.append("type \""+sTypeReg+"\" has ambigous registrations of a detect service\n"); sMsg.append("\tdetect service[1] = \""+(java.lang.String)aAlreadyRegisteredDetector+"\"\n"); sMsg.append("\tdetect service[2] = \""+sDetector+"\"\n"); m_aDebug.setWarning(sMsg.toString()); } aType.put(PROPNAME_DETECTSERVICE, sDetector); m_aDebug.setGlobalInfo("move detector \""+sDetector+"\" to type \""+sTypeReg+"\""); } } // because all detect service was registered as type properties directly ... // remove all detect service objects of this cache! m_lDetectServices.clear(); // step over all frame loader and move this information directly to // the corresponding types // Overwrite possibel default registrations with a real existing one! aIt1 = m_lFrameLoaders.keySet().iterator(); while(aIt1.hasNext()) { java.lang.String sLoader = (java.lang.String)aIt1.next(); java.util.HashMap aLoader = (java.util.HashMap)m_lFrameLoaders.get(sLoader); java.util.Vector lTypeReg = (java.util.Vector)aLoader.get(PROPNAME_TYPES); aIt2 = lTypeReg.elements(); while(aIt2.hasMoreElements()) { java.lang.String sTypeReg = (java.lang.String)aIt2.nextElement(); java.util.HashMap aType = (java.util.HashMap)m_lTypes.get(sTypeReg); java.lang.String sAlreadyRegisteredLoader = (java.lang.String)aType.get(PROPNAME_FRAMELOADER); if (sAlreadyRegisteredLoader != null && sAlreadyRegisteredLoader.length() > 0) { java.lang.StringBuffer sMsg = new java.lang.StringBuffer(256); sMsg.append("type \""+sTypeReg+"\" has ambigous registrations of a frame loader\n"); sMsg.append("\tframe loader[1] = \""+sAlreadyRegisteredLoader+"\"\n"); sMsg.append("\tframe loader[2] = \""+sLoader+"\"\n"); m_aDebug.setWarning(sMsg.toString()); } aType.put(PROPNAME_FRAMELOADER, sLoader); System.out.println("move loader \""+sLoader+"\" to type \""+sTypeReg+"\""); } } m_lFrameLoaders.clear(); // step over all content handler and move this information directly to // the corresponding types // Overwrite possibel default registrations with a real existing one! aIt1 = m_lContentHandlers.keySet().iterator(); while(aIt1.hasNext()) { java.lang.String sHandler = (java.lang.String)aIt1.next(); java.util.HashMap aHandler = (java.util.HashMap)m_lContentHandlers.get(sHandler); java.util.Vector lTypeReg = (java.util.Vector)aHandler.get(PROPNAME_TYPES); aIt2 = lTypeReg.elements(); while(aIt2.hasMoreElements()) { java.lang.String sTypeReg = (java.lang.String)aIt2.nextElement(); java.util.HashMap aType = (java.util.HashMap)m_lTypes.get(sTypeReg); java.lang.String sAlreadyRegisteredHandler = (java.lang.String)aType.get(PROPNAME_CONTENTHANDLER); if (sAlreadyRegisteredHandler != null && sAlreadyRegisteredHandler.length() > 0) { java.lang.StringBuffer sMsg = new java.lang.StringBuffer(256); sMsg.append("type \""+sTypeReg+"\" has ambigous registrations of a content handler\n"); sMsg.append("\tcontent handler[1] = \""+sAlreadyRegisteredHandler+"\"\n"); sMsg.append("\tcontent handler[2] = \""+sHandler+"\"\n"); m_aDebug.setWarning(sMsg.toString()); } aType.put(PROPNAME_CONTENTHANDLER, sHandler); System.out.println("move handler \""+sHandler+"\" to type \""+sTypeReg+"\""); } } m_lContentHandlers.clear(); /* int c = m_lTypes.size(); java.lang.String[] lT1 = new java.lang.String[c]; java.lang.String[] lT2 = new java.lang.String[c]; long nUPS = 0; int i = 0; aIt1 = m_lTypes.keySet().iterator(); while(aIt1.hasNext()) { lT1[i] = (java.lang.String)aIt1.next(); lT2[i] = lT1[i]; ++i; } for (int i1=0; i1