| /************************************************************** |
| * |
| * 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: |
| * <ul> |
| * <li>(') => (')</li> |
| * <li>(") => (")</li> |
| * <li>(>) => (>)</li> |
| * <li>(<) => (<)</li> |
| * <li>(>) => (>)</li> |
| * <li>(&) => (&)</li> |
| * <li>...</li> |
| * </ul> |
| */ |
| |
| 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("<html><header><title>Relation View</title></header><body>"); |
| sRelationView.append("<table border=1>"); |
| sRelationView.append("<tr><td><b>type</b></td><td><b>detect service</b></td><td><b>preferred filter</b></td><td><b>frame loader</b></td><td><b>content handler</b></td></tr>"); |
| |
| 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("<tr>"); |
| sRelationView.append("<td>"+sType+"</td>"); |
| |
| java.lang.String sVal = (java.lang.String)aType.get(PROPNAME_DETECTSERVICE); |
| if (sVal == null || sVal.length()<1) |
| sRelationView.append("<td> - </td>"); |
| else |
| sRelationView.append("<td>"+sVal+"</td>"); |
| |
| sVal = (java.lang.String)aType.get(PROPNAME_PREFERREDFILTER); |
| if (sVal == null || sVal.length()<1) |
| sRelationView.append("<td> - </td>"); |
| else |
| sRelationView.append("<td>"+sVal+"</td>"); |
| |
| sVal = (java.lang.String)aType.get(PROPNAME_FRAMELOADER); |
| if (sVal == null || sVal.length()<1) |
| sRelationView.append("<td> - </td>"); |
| else |
| sRelationView.append("<td>"+sVal+"</td>"); |
| |
| sVal = (java.lang.String)aType.get(PROPNAME_CONTENTHANDLER); |
| if (sVal == null || sVal.length()<1) |
| sRelationView.append("<td> - </td>"); |
| else |
| sRelationView.append("<td>"+sVal+"</td>"); |
| |
| sRelationView.append("</tr>"); |
| } |
| |
| sRelationView.append("</table>"); |
| sRelationView.append("</body>"); |
| |
| 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("<html><header><title>Type2Filters View</title></header><body>"); |
| sType2FiltersView.append("<table border=1>"); |
| sType2FiltersView.append("<tr><td><b>type</b></td><td><b>filters</b></td></tr>"); |
| |
| 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("<tr><td>"+sType+"</td><td>"); |
| java.util.Enumeration aEn = lFilters.elements(); |
| while(aEn.hasMoreElements()) |
| sType2FiltersView.append(aEn.nextElement()+"<br>"); |
| sType2FiltersView.append("</td></tr>"); |
| } |
| |
| sType2FiltersView.append("</table>"); |
| sType2FiltersView.append("</body>"); |
| |
| 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("<node oor:name=\""+sSetName+"\" oor:op=\"replace\">\n"); |
| java.util.Iterator it = rMap.keySet().iterator(); |
| while(it.hasNext()) |
| { |
| java.lang.String sItem = (java.lang.String)it.next(); |
| sXML.append("<node oor:name=\""+sItem+"\" oor:op=\"replace\">\n"); |
| sXML.append(getItemAsXML(eType, sItem, nFormat)); |
| sXML.append("</node>\n"); |
| } |
| sXML.append("</node>\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<c; ++i) |
| { |
| sData.append(lList.elementAt(i)); |
| if (i<(c-1)) |
| sData.append(";"); |
| } |
| |
| lList = (java.util.Vector)aMap.get(PROPNAME_EXTENSIONS); |
| c = lList.size(); |
| for (i=0; i<c; ++i) |
| { |
| sData.append(lList.elementAt(i)); |
| if (i<(c-1)) |
| sData.append(";"); |
| } |
| |
| sData.append(","); |
| sData.append(aMap.get(PROPNAME_DOCUMENTICONID)); |
| sData.append(","); |
| |
| aResultMap.put(PROPNAME_DATA, sData.toString()); |
| } |
| 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_URLPATTERN , aMap.get(PROPNAME_URLPATTERN )); |
| aResultMap.put(PROPNAME_EXTENSIONS , aMap.get(PROPNAME_EXTENSIONS )); |
| aResultMap.put(PROPNAME_UINAME , aMap.get(PROPNAME_UINAME )); |
| aResultMap.put(PROPNAME_PREFERREDFILTER, aMap.get(PROPNAME_PREFERREDFILTER)); |
| aResultMap.put(PROPNAME_DETECTSERVICE , aMap.get(PROPNAME_DETECTSERVICE )); |
| aResultMap.put(PROPNAME_CLIPBOARDFORMAT, aMap.get(PROPNAME_CLIPBOARDFORMAT)); |
| aResultMap.put(PROPNAME_UIORDER , aMap.get(PROPNAME_UIORDER )); |
| /* REMOVED! |
| aResultMap.put(PROPNAME_DOCUMENTICONID , aMap.get(PROPNAME_DOCUMENTICONID )); |
| */ |
| } |
| break; |
| |
| //----------------------------------- |
| default : |
| throw new java.lang.Exception("unknown format"); |
| } |
| |
| return aResultMap; |
| } |
| |
| //___________________________________________ |
| |
| /** converts a filter 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 convertFilterPropsToExternal(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)); |
| |
| // but pack all other properties |
| java.lang.StringBuffer sData = new java.lang.StringBuffer(256); |
| |
| sData.append(aMap.get(PROPNAME_ORDER)); |
| sData.append(","); |
| sData.append(aMap.get(PROPNAME_TYPE)); |
| sData.append(","); |
| sData.append(aMap.get(PROPNAME_DOCUMENTSERVICE)); |
| sData.append(","); |
| sData.append(aMap.get(PROPNAME_FILTERSERVICE)); |
| sData.append(","); |
| sData.append(aMap.get(PROPNAME_FLAGS)); |
| sData.append(","); |
| java.util.Vector lList = (java.util.Vector)aMap.get(PROPNAME_USERDATA); |
| int c = lList.size(); |
| int i = 0; |
| for (i=0; i<c; ++i) |
| { |
| sData.append(lList.elementAt(i)); |
| if (i<(c-1)) |
| sData.append(";"); |
| } |
| sData.append(","); |
| sData.append(aMap.get(PROPNAME_FILEFORMATVERSION)); |
| sData.append(","); |
| sData.append(aMap.get(PROPNAME_TEMPLATENAME)); |
| sData.append(","); |
| sData.append(aMap.get(PROPNAME_UICOMPONENT)); |
| sData.append(","); |
| |
| aResultMap.put(PROPNAME_DATA, sData.toString()); |
| } |
| break; |
| |
| //----------------------------------- |
| case FORMAT_6Y : |
| { |
| // supress "Order" property. |
| // Will be moved to type entries in 6.y version! |
| |
| // supress "UIName" property. |
| // Only type entries will be localized in 6.y version! |
| /* TODO make it configurable :-) */ |
| aResultMap.put(PROPNAME_UINAME , aMap.get(PROPNAME_UINAME )); |
| |
| // copy all supported properties directly |
| aResultMap.put(PROPNAME_TYPE , aMap.get(PROPNAME_TYPE )); |
| aResultMap.put(PROPNAME_DOCUMENTSERVICE , aMap.get(PROPNAME_DOCUMENTSERVICE )); |
| aResultMap.put(PROPNAME_FILTERSERVICE , aMap.get(PROPNAME_FILTERSERVICE )); |
| 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 )); |
| |
| // "Flags" will be converted from internal format [int] to |
| // the 6.y format [string-list]! |
| java.lang.Integer nFlags = (java.lang.Integer)aMap.get(PROPNAME_FLAGS); |
| java.util.Vector lFlags = Cache.convertFilterFlagValues2Names(nFlags); |
| aResultMap.put(PROPNAME_FLAGS, lFlags); |
| } |
| break; |
| |
| //----------------------------------- |
| default : |
| throw new java.lang.Exception("unknown format"); |
| } |
| |
| return aResultMap; |
| } |
| |
| //___________________________________________ |
| |
| /** converts a detect service 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 convertDetectServicePropsToExternal(java.util.HashMap aMap , |
| int nFormat) |
| throws java.lang.Exception |
| { |
| java.util.HashMap aResultMap = null; |
| |
| switch(nFormat) |
| { |
| //----------------------------------- |
| case FORMAT_60 : |
| { |
| // no changes! |
| aResultMap = aMap; |
| } |
| break; |
| |
| //----------------------------------- |
| case FORMAT_6Y : |
| { |
| // remove localized name |
| aResultMap = aMap; |
| aResultMap.remove(PROPNAME_UINAME); |
| } |
| break; |
| |
| //----------------------------------- |
| default : |
| throw new java.lang.Exception("unknown format"); |
| } |
| |
| return aResultMap; |
| } |
| |
| private static java.util.HashMap convertFrameLoaderPropsToExternal(java.util.HashMap aMap , |
| int nFormat) |
| throws java.lang.Exception |
| { |
| java.util.HashMap aResultMap = null; |
| |
| switch(nFormat) |
| { |
| //----------------------------------- |
| case FORMAT_60 : |
| { |
| // no changes! |
| aResultMap = aMap; |
| } |
| break; |
| |
| //----------------------------------- |
| case FORMAT_6Y : |
| { |
| // remove localized name |
| aResultMap = aMap; |
| aResultMap.remove(PROPNAME_UINAME); |
| } |
| break; |
| |
| //----------------------------------- |
| default : |
| throw new java.lang.Exception("unknown format"); |
| } |
| |
| return aResultMap; |
| } |
| |
| private static java.util.HashMap convertContentHandlerPropsToExternal(java.util.HashMap aMap , |
| int nFormat) |
| throws java.lang.Exception |
| { |
| java.util.HashMap aResultMap = null; |
| |
| switch(nFormat) |
| { |
| //----------------------------------- |
| case FORMAT_60 : |
| { |
| // no changes! |
| aResultMap = aMap; |
| } |
| break; |
| |
| //----------------------------------- |
| case FORMAT_6Y : |
| { |
| // remove localized name |
| aResultMap = aMap; |
| aResultMap.remove(PROPNAME_UINAME); |
| } |
| break; |
| |
| //----------------------------------- |
| default : |
| throw new java.lang.Exception("unknown format"); |
| } |
| |
| return aResultMap; |
| } |
| |
| //___________________________________________ |
| |
| /** converts a type 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["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<nPrettyTabs; ++t) |
| sXML.append("\t"); |
| sXML.append("<"+XMLHelper.XMLTAG_NODE+" "+XMLHelper.XMLATTRIB_OOR_NAME+"=\""+XMLHelper.encodeHTMLSigns(sItemName)+"\" "+XMLHelper.XMLATTRIB_OOR_OP+"=\""+XMLHelper.XMLATTRIB_OP_REPLACE+"\">\n"); |
| sXML.append(XMLHelper.convertPropSetToXML(rFormatedItem, nPrettyTabs+1)); |
| for (int t=0; t<nPrettyTabs; ++t) |
| sXML.append("\t"); |
| sXML.append("</"+XMLHelper.XMLTAG_NODE+">\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<c; ++i1) |
| { |
| java.lang.String sT1 = lT1[i1]; |
| java.util.HashMap aT1 = (java.util.HashMap)m_lTypes.get(sT1); |
| |
| for (int i2=i1; i2<c; ++i2) |
| { |
| java.lang.String sT2 = lT1[i2]; |
| java.util.HashMap aT2 = (java.util.HashMap)m_lTypes.get(sT2); |
| |
| if (!sT1.equals(sT2)) |
| { |
| if ( |
| aT1.get(PROPNAME_MEDIATYPE).equals(aT2.get(PROPNAME_MEDIATYPE)) && |
| aT1.get(PROPNAME_CLIPBOARDFORMAT).equals(aT2.get(PROPNAME_CLIPBOARDFORMAT)) && |
| aT1.get(PROPNAME_URLPATTERN).equals(aT2.get(PROPNAME_URLPATTERN)) && |
| aT1.get(PROPNAME_EXTENSIONS).equals(aT2.get(PROPNAME_EXTENSIONS)) |
| ) |
| { |
| System.err.println("UUPPSS----------------------------------------------------------------------------"); |
| System.err.println("[1]\""+sT1+"\" equals [2]\""+sT2+"\""); |
| System.err.println("\tprops 1: "+aT1); |
| System.err.println("\tprops 2: "+aT2); |
| System.err.println("----------------------------------------------------------------------------------\n"); |
| ++nUPS; |
| // throw new java.lang.Exception("UUPPS :-)"); |
| } |
| } |
| } |
| } |
| System.err.println("count of UPS = "+nUPS); |
| */ |
| } |
| } |