summaryrefslogtreecommitdiff
path: root/l10ntools/source/filter
diff options
context:
space:
mode:
Diffstat (limited to 'l10ntools/source/filter')
-rw-r--r--l10ntools/source/filter/merge/FCFGMerge.cfg125
-rw-r--r--l10ntools/source/filter/merge/FCFGMerge.java131
-rw-r--r--l10ntools/source/filter/merge/Manifest.mf1
-rw-r--r--l10ntools/source/filter/merge/Merger.java364
-rw-r--r--l10ntools/source/filter/merge/makefile.mk96
-rw-r--r--l10ntools/source/filter/utils/AnalyzeStartupLog.java328
-rw-r--r--l10ntools/source/filter/utils/Cache.java2449
-rw-r--r--l10ntools/source/filter/utils/ConfigHelper.java303
-rw-r--r--l10ntools/source/filter/utils/FileHelper.java766
-rw-r--r--l10ntools/source/filter/utils/Logger.java177
-rw-r--r--l10ntools/source/filter/utils/MalformedCommandLineException.java50
-rw-r--r--l10ntools/source/filter/utils/XMLHelper.java825
-rw-r--r--l10ntools/source/filter/utils/makefile.mk57
13 files changed, 5672 insertions, 0 deletions
diff --git a/l10ntools/source/filter/merge/FCFGMerge.cfg b/l10ntools/source/filter/merge/FCFGMerge.cfg
new file mode 100644
index 000000000000..46fcccafe7e4
--- /dev/null
+++ b/l10ntools/source/filter/merge/FCFGMerge.cfg
@@ -0,0 +1,125 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: FCFGMerge.cfg,v $
+#
+# $Revision: 1.5 $
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+#************************************************
+# Specify the verbose mode of this tool.
+# 1 = show errors only
+# 2 = show errors/warnings (default)
+# 3 = show errors/warnings and some generic infos
+# 4 = show anything (including detailed infos)
+#
+# [OPTIONAL]
+#************************************************
+
+loglevel = 2
+
+#************************************************
+# This extension is used for all XML files. It doesnt
+# matter if its used for reading fragments or writing
+# XML packages.
+# Must be given without any additional signes like "."
+# or "*."!
+#
+# [REQUIRED]
+#************************************************
+
+extension_xcu=xcu
+
+#************************************************
+# This extension is used for all Package files. It doesnt
+# matter if its used for reading such files or writing
+# it.
+# Must be given without any additional signes like "."
+# or "*."!
+#
+# [REQUIRED]
+#************************************************
+
+extension_pkg=pkg
+
+#************************************************
+# These values are used to generate a correct XML
+# header.
+# Note: The property "xmlpackage" must be specified
+# via command line. There exists more then one
+# possible value.
+#
+# [REQUIRED]
+#************************************************
+
+xmlversion = 1.0
+xmlencoding = UTF-8
+xmlpath = org.openoffice.TypeDetection
+#xmlpackage =
+
+#************************************************
+# These values are used to name the configuration
+# sets inside the generated XCM file for different
+# item groups like e.g. types, filters etcpp.
+#
+# [REQUIRED]
+#************************************************
+
+setname_types = Types
+setname_filters = Filters
+setname_frameloaders = FrameLoaders
+setname_contenthandlers = ContentHandlers
+
+subdir_types = types
+subdir_filters = filters
+subdir_frameloaders = frameloaders
+subdir_contenthandlers = contenthandlers
+
+#************************************************
+# This delimiter is used to split every
+# item list of the package configuration files
+# (which are temp. created by the make proccess)
+# into its tokens.
+#
+# [REQUIRED]
+#************************************************
+delimiter=,
+
+#************************************************
+# Enable/disable removing of leading/trailing withespaces
+# during splitting stringlists.
+#
+# [REQUIRED]
+#************************************************
+trim=true
+
+#************************************************
+# Enable/disable removing of leading/trailing "-signs
+# during splitting stringlists.
+#
+# [REQUIRED]
+#************************************************
+decode=false
diff --git a/l10ntools/source/filter/merge/FCFGMerge.java b/l10ntools/source/filter/merge/FCFGMerge.java
new file mode 100644
index 000000000000..7fbfa8a0c986
--- /dev/null
+++ b/l10ntools/source/filter/merge/FCFGMerge.java
@@ -0,0 +1,131 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: FCFGMerge.java,v $
+ * $Revision: 1.5 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package com.sun.star.filter.config.tools.merge;
+
+//_______________________________________________
+
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import com.sun.star.filter.config.tools.utils.*;
+
+//_______________________________________________
+
+/**
+ * Its a simple command line tool, which can merge different XML fragments
+ * together. Such fragments must exist as files on disk, will be moved into
+ * one file together on disk.
+ *
+ *
+ */
+public class FCFGMerge
+{
+ //___________________________________________
+ // const
+
+ private static final java.lang.String CFGFILE = "com/sun/star/filter/config/tools/merge/FCFGMerge.cfg";
+ private static final java.lang.String PROP_LOGLEVEL = "loglevel";
+
+ //___________________________________________
+ // main
+
+ public static void main(java.lang.String[] sCmdLine)
+ {
+ FCFGMerge.printCopyright();
+
+ // create log object in default mode "WARNINGS"
+ // If a command line parameter indicates another
+ // level - change it!
+ Logger aLog = new Logger();
+
+ try
+ {
+ // merge config file and overwrite properties
+ // via command line
+ ConfigHelper aCfg = null;
+ aCfg = new ConfigHelper(CFGFILE, sCmdLine);
+
+ // update log level
+ int nLogLevel = aCfg.getInt(PROP_LOGLEVEL, Logger.LEVEL_WARNINGS);
+ aLog = new Logger(nLogLevel);
+
+ // help requested?
+ if (aCfg.isHelp())
+ {
+ FCFGMerge.printHelp();
+ System.exit(-1);
+ }
+
+ // create new merge object and start operation
+ Merger aMerger = new Merger(aCfg, aLog);
+ aMerger.merge();
+ }
+ catch(java.lang.Throwable ex)
+ {
+ aLog.setException(ex);
+ System.exit(-1);
+ }
+
+ System.exit(0);
+ }
+
+ //___________________________________________
+
+ /** prints out a copyright message on stdout.
+ */
+ private static void printCopyright()
+ {
+ java.lang.StringBuffer sOut = new java.lang.StringBuffer(256);
+ sOut.append("FCFGMerge\n");
+ sOut.append("Copyright: 2003 by Sun Microsystems, Inc.\n");
+ sOut.append("All Rights Reserved.\n");
+ System.out.println(sOut.toString());
+ }
+
+ //___________________________________________
+
+ /** prints out a help message on stdout.
+ */
+ private static void printHelp()
+ {
+ java.lang.StringBuffer sOut = new java.lang.StringBuffer(256);
+ sOut.append("____________________________________________________________\n");
+ sOut.append("usage: FCFGMerge cfg=<file name>\n" );
+ sOut.append("parameters:\n" );
+ sOut.append("\tcfg=<file name>\n" );
+ sOut.append("\t\tmust point to a system file, which contains\n" );
+ sOut.append("\t\tall neccessary configuration data for the merge process.\n");
+ sOut.append("\n\tFurther cou can specify every parameter allowed in the\n" );
+ sOut.append("\n\tconfig file as command line parameter too, to overwrite\n" );
+ sOut.append("\n\tthe value from the file.\n" );
+ System.out.println(sOut.toString());
+ }
+}
diff --git a/l10ntools/source/filter/merge/Manifest.mf b/l10ntools/source/filter/merge/Manifest.mf
new file mode 100644
index 000000000000..1337eaf4d39a
--- /dev/null
+++ b/l10ntools/source/filter/merge/Manifest.mf
@@ -0,0 +1 @@
+Main-Class: com.sun.star.filter.config.tools.merge.FCFGMerge
diff --git a/l10ntools/source/filter/merge/Merger.java b/l10ntools/source/filter/merge/Merger.java
new file mode 100644
index 000000000000..0bf11fc42fbf
--- /dev/null
+++ b/l10ntools/source/filter/merge/Merger.java
@@ -0,0 +1,364 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: Merger.java,v $
+ * $Revision: 1.8 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+package com.sun.star.filter.config.tools.merge;
+
+//_______________________________________________
+
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import com.sun.star.filter.config.tools.utils.*;
+
+//_______________________________________________
+
+/** can merge different xml fragments together.
+ *
+ *
+ */
+public class Merger
+{
+ //___________________________________________
+ // const
+
+ private static final java.lang.String PROP_XMLVERSION = "xmlversion" ; // <= global cfg file
+ private static final java.lang.String PROP_XMLENCODING = "xmlencoding" ; // <= global cfg file
+ private static final java.lang.String PROP_XMLPATH = "xmlpath" ; // <= global cfg file
+ private static final java.lang.String PROP_XMLPACKAGE = "xmlpackage" ; // <= global cfg file
+
+ private static final java.lang.String PROP_SETNAME_TYPES = "setname_types" ; // <= global cfg file
+ private static final java.lang.String PROP_SETNAME_FILTERS = "setname_filters" ; // <= global cfg file
+ private static final java.lang.String PROP_SETNAME_LOADERS = "setname_frameloaders" ; // <= global cfg file
+ private static final java.lang.String PROP_SETNAME_HANDLERS = "setname_contenthandlers" ; // <= global cfg file
+
+ private static final java.lang.String PROP_SUBDIR_TYPES = "subdir_types" ; // <= global cfg file
+ private static final java.lang.String PROP_SUBDIR_FILTERS = "subdir_filters" ; // <= global cfg file
+ private static final java.lang.String PROP_SUBDIR_LOADERS = "subdir_frameloaders" ; // <= global cfg file
+ private static final java.lang.String PROP_SUBDIR_HANDLERS = "subdir_contenthandlers" ; // <= global cfg file
+
+ private static final java.lang.String PROP_EXTENSION_XCU = "extension_xcu" ; // <= global cfg file
+ private static final java.lang.String PROP_EXTENSION_PKG = "extension_pkg" ; // <= global cfg file
+
+ private static final java.lang.String PROP_DELIMITER = "delimiter" ; // <= global cfg file
+ private static final java.lang.String PROP_TRIM = "trim" ; // <= global cfg file
+ private static final java.lang.String PROP_DECODE = "decode" ; // <= global cfg file
+
+ private static final java.lang.String PROP_FRAGMENTSDIR = "fragmentsdir" ; // <= cmdline
+ private static final java.lang.String PROP_TEMPDIR = "tempdir" ; // <= cmdline
+ private static final java.lang.String PROP_OUTDIR = "outdir" ; // <= cmdline
+ private static final java.lang.String PROP_PKG = "pkg" ; // <= cmdline
+ private static final java.lang.String PROP_DEBUG = "debug" ; // <= cmdline
+
+ private static final java.lang.String PROP_TCFG = "tcfg" ; // <= cmdline
+ private static final java.lang.String PROP_FCFG = "fcfg" ; // <= cmdline
+ private static final java.lang.String PROP_LCFG = "lcfg" ; // <= cmdline
+ private static final java.lang.String PROP_CCFG = "ccfg" ; // <= cmdline
+ private static final java.lang.String PROP_LANGUAGEPACK = "languagepack" ; // <= cmdline
+
+ private static final java.lang.String PROP_ITEMS = "items" ; // <= pkg cfg files!
+
+ //___________________________________________
+ // member
+
+ //-------------------------------------------
+ /** TODO */
+ private ConfigHelper m_aCfg;
+
+ //-------------------------------------------
+ /** TODO */
+ private Logger m_aLog;
+
+ //-------------------------------------------
+ /** TODO */
+ private java.io.File m_aFragmentsDir;
+
+ //-------------------------------------------
+ /** TODO */
+ private java.io.File m_aTempDir;
+
+ //-------------------------------------------
+ /** TODO */
+ private java.io.File m_aOutDir;
+
+ //-------------------------------------------
+ /** TODO */
+ private java.util.Vector m_lTypes;
+ private java.util.Vector m_lFilters;
+ private java.util.Vector m_lLoaders;
+ private java.util.Vector m_lHandlers;
+
+ //___________________________________________
+ // interface
+
+ //-------------------------------------------
+ /** initialize a new instance of this class and
+ * try to get all needed resources from the config module.
+ *
+ * @param aCfg
+ * provides access to all values of the global
+ * config file and to the command line.
+ *
+ * @param aLog
+ * can be used to print out log informations.
+ */
+ public Merger(ConfigHelper aCfg,
+ Logger aLog)
+ throws java.lang.Exception
+ {
+ m_aCfg = aCfg;
+ m_aLog = aLog;
+
+ m_aFragmentsDir = new java.io.File(m_aCfg.getString(PROP_FRAGMENTSDIR));
+ m_aTempDir = new java.io.File(m_aCfg.getString(PROP_TEMPDIR ));
+// m_aOutDir = new java.io.File(m_aCfg.getString(PROP_OUTDIR ));
+
+ java.lang.String sDelimiter = m_aCfg.getString(PROP_DELIMITER);
+ boolean bTrim = m_aCfg.getBoolean(PROP_TRIM);
+ boolean bDecode = m_aCfg.getBoolean(PROP_DECODE);
+
+ try
+ {
+ ConfigHelper aFcfg = new ConfigHelper(m_aCfg.getString(PROP_TCFG), null);
+ m_lTypes = aFcfg.getStringList(PROP_ITEMS, sDelimiter, bTrim, bDecode);
+ }
+ catch(java.util.NoSuchElementException ex1)
+ {
+ m_lTypes = new java.util.Vector();
+ //m_aLog.setWarning("Fragment list of types is missing. Parameter \"items\" seems to be invalid.");
+ }
+
+ try
+ {
+ ConfigHelper aFcfg = new ConfigHelper(m_aCfg.getString(PROP_FCFG), null);
+ m_lFilters = aFcfg.getStringList(PROP_ITEMS, sDelimiter, bTrim, bDecode);
+ }
+ catch(java.util.NoSuchElementException ex1)
+ {
+ m_lFilters = new java.util.Vector();
+ //m_aLog.setWarning("Fragment list of filters is missing. Parameter \"items\" seems to be invalid.");
+ }
+
+ try
+ {
+ ConfigHelper aFcfg = new ConfigHelper(m_aCfg.getString(PROP_LCFG), null);
+ m_lLoaders = aFcfg.getStringList(PROP_ITEMS, sDelimiter, bTrim, bDecode);
+ }
+ catch(java.util.NoSuchElementException ex1)
+ {
+ m_lLoaders = new java.util.Vector();
+ //m_aLog.setWarning("Fragment list of frame loader objects is missing. Parameter \"items\" seems to be invalid.");
+ }
+
+ try
+ {
+ ConfigHelper aFcfg = new ConfigHelper(m_aCfg.getString(PROP_CCFG), null);
+ m_lHandlers = aFcfg.getStringList(PROP_ITEMS, sDelimiter, bTrim, bDecode);
+ }
+ catch(java.util.NoSuchElementException ex1)
+ {
+ m_lHandlers = new java.util.Vector();
+ //m_aLog.setWarning("Fragment list of content handler objects is missing. Parameter \"items\" seems to be invalid.");
+ }
+ }
+
+ //-------------------------------------------
+ /** TODO */
+ public synchronized void merge()
+ throws java.lang.Exception
+ {
+ java.lang.StringBuffer sBuffer = new java.lang.StringBuffer(1000000);
+ java.lang.String sPackage = m_aCfg.getString(PROP_PKG);
+
+ m_aLog.setGlobalInfo("create package \""+sPackage+"\" ...");
+ m_aLog.setDetailedInfo("generate package header ... ");
+
+ sBuffer.append(
+ XMLHelper.generateHeader(
+ m_aCfg.getString (PROP_XMLVERSION ),
+ m_aCfg.getString (PROP_XMLENCODING ),
+ m_aCfg.getString (PROP_XMLPATH ),
+ m_aCfg.getString (PROP_XMLPACKAGE ),
+ m_aCfg.getBoolean(PROP_LANGUAGEPACK, false)));
+
+ // counts all transfered fragments
+ // Can be used later to decide, if a generated package file
+ // contains "nothing"!
+ int nItemCount = 0;
+
+ for (int i=0; i<4; ++i)
+ {
+ java.lang.String sSetName = null;
+ java.lang.String sSubDir = null;
+ java.util.Vector lFragments = null;
+
+ try
+ {
+ switch(i)
+ {
+ case 0: // types
+ {
+ m_aLog.setDetailedInfo("generate set for types ... ");
+ sSetName = m_aCfg.getString(PROP_SETNAME_TYPES);
+ sSubDir = m_aCfg.getString(PROP_SUBDIR_TYPES );
+ lFragments = m_lTypes;
+ }
+ break;
+
+ case 1: // filters
+ {
+ m_aLog.setDetailedInfo("generate set for filter ... ");
+ sSetName = m_aCfg.getString(PROP_SETNAME_FILTERS);
+ sSubDir = m_aCfg.getString(PROP_SUBDIR_FILTERS );
+ lFragments = m_lFilters;
+ }
+ break;
+
+ case 2: // loaders
+ {
+ m_aLog.setDetailedInfo("generate set for frame loader ... ");
+ sSetName = m_aCfg.getString(PROP_SETNAME_LOADERS);
+ sSubDir = m_aCfg.getString(PROP_SUBDIR_LOADERS );
+ lFragments = m_lLoaders;
+ }
+ break;
+
+ case 3: // handlers
+ {
+ m_aLog.setDetailedInfo("generate set for content handler ... ");
+ sSetName = m_aCfg.getString(PROP_SETNAME_HANDLERS);
+ sSubDir = m_aCfg.getString(PROP_SUBDIR_HANDLERS );
+ lFragments = m_lHandlers;
+ }
+ break;
+ }
+
+ nItemCount += lFragments.size();
+
+ getFragments(
+ new java.io.File(m_aFragmentsDir, sSubDir),
+ sSetName,
+ lFragments,
+ 1,
+ sBuffer);
+ }
+ catch(java.util.NoSuchElementException exIgnore)
+ { continue; }
+ }
+
+ m_aLog.setDetailedInfo("generate package footer ... ");
+ sBuffer.append(XMLHelper.generateFooter());
+
+ // Attention!
+ // If the package seem to be empty, it make no sense to generate a corresponding
+ // xml file. We should suppress writing of this file on disk completly ...
+ if (nItemCount < 1)
+ {
+ m_aLog.setWarning("Package is empty and will not result into a xml file on disk!? Please check configuration file.");
+ return;
+ }
+ m_aLog.setGlobalInfo("package contains "+nItemCount+" items");
+
+ java.io.File aPackage = new File(sPackage);
+ m_aLog.setGlobalInfo("write temp package \""+aPackage.getPath()); // TODO encoding must be readed from the configuration
+ FileHelper.writeEncodedBufferToFile(aPackage, "UTF-8", false, sBuffer); // check for success is done inside this method!
+ }
+
+ //-------------------------------------------
+ /** TODO */
+ private void getFragments(java.io.File aDir ,
+ java.lang.String sSetName ,
+ java.util.Vector lFragments ,
+ int nPrettyTabs,
+ java.lang.StringBuffer sBuffer )
+ throws java.lang.Exception
+ {
+ if (lFragments.size()<1)
+ {
+ m_aLog.setWarning("List of fragments is empty!? Will be ignored ...");
+ return;
+ }
+
+ java.util.Enumeration pFragments = lFragments.elements();
+ java.lang.String sExtXcu = m_aCfg.getString(PROP_EXTENSION_XCU);
+
+ for (int tabs=0; tabs<nPrettyTabs; ++tabs)
+ sBuffer.append("\t");
+ sBuffer.append("<node oor:name=\""+sSetName+"\">\n");
+ ++nPrettyTabs;
+
+ // special mode for generating language packs.
+ // In such case we must live with some missing fragment files.
+ // Reason behind; Not all filters are realy localized.
+ // But we dont use a different fragment list. We try to locate
+ // any fragment file in its language-pack version ...
+ boolean bHandleLanguagePacks = m_aCfg.getBoolean(PROP_LANGUAGEPACK, false);
+ boolean bDebug = m_aCfg.getBoolean(PROP_DEBUG , false);
+ java.lang.String sEncoding = "UTF-8";
+ if (bDebug)
+ sEncoding = "UTF-8Special";
+
+ while(pFragments.hasMoreElements())
+ {
+ java.lang.String sFragment = (java.lang.String)pFragments.nextElement();
+ java.io.File aFragment = new java.io.File(aDir, sFragment+"."+sExtXcu);
+
+ // handle simple files only and check for existence!
+ if (!aFragment.exists())
+ {
+ if (bHandleLanguagePacks)
+ {
+ m_aLog.setWarning("language fragment \""+aFragment.getPath()+"\" does not exist. Will be ignored.");
+ continue;
+ }
+ else
+ throw new java.io.IOException("fragment \""+aFragment.getPath()+"\" does not exists.");
+ }
+
+ if (!aFragment.isFile())
+ {
+ m_aLog.setWarning("fragment \""+aFragment.getPath()+"\" seem to be not a valid file.");
+ continue;
+ }
+
+ // copy file content of original fragment
+ // Note: A FileNotFoundException will be thrown automaticly by the
+ // used reader objects. Let it break this method too. Our calli is interested
+ // on such errors :-)
+ m_aLog.setDetailedInfo("merge fragment \""+aFragment.getPath()+"\" ...");
+ FileHelper.readEncodedBufferFromFile(aFragment, sEncoding, sBuffer);
+
+ sBuffer.append("\n");
+ }
+
+ --nPrettyTabs;
+ for (int tabs=0; tabs<nPrettyTabs; ++tabs)
+ sBuffer.append("\t");
+ sBuffer.append("</node>\n");
+ }
+}
diff --git a/l10ntools/source/filter/merge/makefile.mk b/l10ntools/source/filter/merge/makefile.mk
new file mode 100644
index 000000000000..510ec3202bb4
--- /dev/null
+++ b/l10ntools/source/filter/merge/makefile.mk
@@ -0,0 +1,96 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.9.102.1 $
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ = ..$/..$/..
+TARGET = FCFGMerge
+PRJNAME = l10ntools
+PACKAGE = com$/sun$/star$/filter$/config$/tools$/merge
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE: settings.mk
+
+#----- compile .java files -----------------------------------------
+#.IF "$(L10N_framework)"==""
+
+OWNCOPY = \
+ $(MISC)$/$(TARGET)_copied.done
+
+#JARFILES = \
+# ridl.jar \
+# unoil.jar \
+# jurt.jar \
+# juh.jar \
+# java_uno.jar
+
+CFGFILES = \
+ FCFGMerge.cfg
+
+JAVACLASSFILES = \
+ $(CLASSDIR)$/$(PACKAGE)$/Merger.class \
+ $(CLASSDIR)$/$(PACKAGE)$/FCFGMerge.class
+
+CUSTOMMANIFESTFILE = \
+ Manifest.mf
+
+MAXLINELENGTH = 100000
+
+#----- make a jar from compiled files ------------------------------
+
+JARCLASSDIRS = \
+ com$/sun$/star$/filter$/config$/tools$/utils \
+ com$/sun$/star$/filter$/config$/tools$/merge
+
+JARTARGET = $(TARGET).jar
+
+JARCOMPRESS = TRUE
+
+# --- targets -----------------------------------------------------
+
+.INCLUDE : target.mk
+
+.IF "$(SOLAR_JAVA)" != "" || "$(GUI)"=="OS2"
+ALLTAR : $(OWNCOPY)
+
+.IF "$(JARTARGETN)" != ""
+$(JARTARGETN) : $(OWNCOPY)
+.ENDIF
+
+$(OWNCOPY) : $(CFGFILES)
+ -$(MKDIRHIER) $(CLASSDIR)$/$(PACKAGE)
+ $(COPY) $? $(CLASSDIR)$/$(PACKAGE) && $(TOUCH) $@
+
+.ENDIF # "$(SOLAR_JAVA)" != ""
+
+#.ELSE
+#pseudo:
+
+#.ENDIF
diff --git a/l10ntools/source/filter/utils/AnalyzeStartupLog.java b/l10ntools/source/filter/utils/AnalyzeStartupLog.java
new file mode 100644
index 000000000000..498528850697
--- /dev/null
+++ b/l10ntools/source/filter/utils/AnalyzeStartupLog.java
@@ -0,0 +1,328 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: AnalyzeStartupLog.java,v $
+ * $Revision: 1.4 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package com.sun.star.filter.config.tools.utils;
+
+//_______________________________________________
+// imports
+import java.util.*;
+import java.lang.*;
+
+//_______________________________________________
+// implementation
+public class AnalyzeStartupLog
+{
+ private class OperationTime
+ {
+ /** name the measured operation. */
+ public java.lang.String sOperation;
+
+ /** contains the time value, when this operation was started. */
+ public long nStartTime;
+
+ /** contains the time value, when this operation was finished. */
+ public long nEndTime;
+
+ /** text inside log file, which identifies the start time value. */
+ public java.lang.String sStartMsg;
+
+ /** text inside log file, which identifies the end time value. */
+ public java.lang.String sEndMsg;
+ }
+
+ //_________________________________
+ // main
+
+ public static void main(java.lang.String[] lCmdLine)
+ {
+ int nExit = 0;
+ try
+ {
+ // analyze command line
+ ConfigHelper aCmdLine = new ConfigHelper("", lCmdLine);
+ java.lang.String sLogDir = aCmdLine.getString("logdir" );
+ java.lang.String sDataFile = aCmdLine.getString("datafile");
+
+ if (sLogDir == null || sDataFile == null)
+ {
+ System.err.println("AnalyzeStartupLog lodir=<dir> datafile=<file>");
+ System.err.println("E.g.: AnalyzeStartupLog lodir=c:\\temp\\logs datafile=c:\\temp\\data.csv");
+ System.exit(--nExit);
+ }
+
+ // get list of all log files
+ boolean bRecursive = true;
+ java.util.Vector lLogs = FileHelper.getSystemFilesFromDir(new java.io.File(sLogDir), bRecursive);
+ if (lLogs == null || lLogs.isEmpty())
+ {
+ System.err.println("log dir is empty");
+ System.exit(--nExit);
+ }
+
+ // analyze it
+ java.lang.StringBuffer sOut = new java.lang.StringBuffer(1000);
+ sOut.append("log;t_cfg_start;t_cfg_end;t_fwk_start;t_fwk_end;t_sfx_start;t_sfx_end;t_types_start;t_types_end;t_filters_start;t_filters_end;");
+ sOut.append("t_filters_swriter_start;t_filters_swriter_end;t_filters_sweb_start;t_filters_sweb_end;t_filters_sglobal_start;t_filters_sglobal_end;t_filters_scalc_start;t_filters_scalc_end;t_filters_sdraw_start;t_filters_sdraw_end;t_filters_simpress_start;t_filters_simpress_end;t_filters_schart_start;t_filters_schart_end;t_filters_smath_start;t_filters_smath_end;");
+ sOut.append("t_others_start;t_others_end;d_cfg;d_fwk;d_sfx;d_types;d_filters;d_others;d_complete\n");
+
+ java.util.Enumeration aIt = lLogs.elements();
+ while (aIt.hasMoreElements())
+ {
+ java.io.File aLog = (java.io.File)aIt.nextElement();
+ java.io.FileReader aReader = new java.io.FileReader(aLog);
+ java.io.BufferedReader aBuffer = new java.io.BufferedReader(aReader);
+
+ long t_cfg_start = 0;
+ long t_cfg_end = 0;
+
+ long t_fwk_start = 0;
+ long t_fwk_end = 0;
+
+ long t_sfx_start = 0;
+ long t_sfx_end = 0;
+
+ long t_types_start = 0;
+ long t_types_end = 0;
+
+ long t_filters_start = 0;
+ long t_filters_end = 0;
+
+ long t_filters_swriter_start = 0;
+ long t_filters_swriter_end = 0;
+
+ long t_filters_sweb_start = 0;
+ long t_filters_sweb_end = 0;
+
+ long t_filters_sglobal_start = 0;
+ long t_filters_sglobal_end = 0;
+
+ long t_filters_scalc_start = 0;
+ long t_filters_scalc_end = 0;
+
+ long t_filters_sdraw_start = 0;
+ long t_filters_sdraw_end = 0;
+
+ long t_filters_simpress_start = 0;
+ long t_filters_simpress_end = 0;
+
+ long t_filters_schart_start = 0;
+ long t_filters_schart_end = 0;
+
+ long t_filters_smath_start = 0;
+ long t_filters_smath_end = 0;
+
+ long t_others_start = 0;
+ long t_others_end = 0;
+
+ while (true)
+ {
+ java.lang.String sLine = aBuffer.readLine();
+ if (sLine == null)
+ break;
+
+ if (sLine.endsWith("| framework (as96863) ::FilterCache::FilterCache : { creation ConfigItem [file=standard, version=6, mode=3]"))
+ t_cfg_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("| framework (as96863) ::FilterCache::FilterCache : } creation ConfigItem"))
+ t_cfg_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("| framework (as96863) ::FilterCache::FilterCache : { reading TypeDetection.xml"))
+ t_fwk_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("| framework (as96863) ::FilterCache::FilterCache : } reading TypeDetection.xml"))
+ t_fwk_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("{ framework (as96863) ::FilterCFGAccess::impl_loadTypes"))
+ t_types_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} framework (as96863) ::FilterCFGAccess::impl_loadTypes"))
+ t_types_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("{ framework (as96863) ::FilterCFGAccess::impl_loadFilters"))
+ t_filters_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} framework (as96863) ::FilterCFGAccess::impl_loadFilters"))
+ t_filters_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("{ reading FilterGroup [swriter]"))
+ t_filters_swriter_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} reading FilterGroup [swriter]"))
+ t_filters_swriter_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("{ reading FilterGroup [sweb]"))
+ t_filters_sweb_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} reading FilterGroup [sweb]"))
+ t_filters_sweb_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("{ reading FilterGroup [sglobal]"))
+ t_filters_sglobal_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} reading FilterGroup [sglobal]"))
+ t_filters_sglobal_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("{ reading FilterGroup [scalc]"))
+ t_filters_scalc_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} reading FilterGroup [scalc]"))
+ t_filters_scalc_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("{ reading FilterGroup [sdraw]"))
+ t_filters_sdraw_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} reading FilterGroup [sdraw]"))
+ t_filters_sdraw_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("{ reading FilterGroup [simpress]"))
+ t_filters_simpress_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} reading FilterGroup [simpress]"))
+ t_filters_simpress_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("{ reading FilterGroup [schart]"))
+ t_filters_schart_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} reading FilterGroup [schart]"))
+ t_filters_schart_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("{ reading FilterGroup [smath]"))
+ t_filters_smath_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} reading FilterGroup [smath]"))
+ t_filters_smath_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("{ framework (as96863) ::FilterCFGAccess::impl_loadDetectors"))
+ t_others_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} framework (as96863) ::FilterCFGAccess::impl_loadContentHandlers"))
+ t_others_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} framework (as96863) ::FilterCache::FilterCache"))
+ t_sfx_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} desktop (lo119109) OfficeWrapper::OfficeWrapper"))
+ t_sfx_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ }
+
+ sOut.append(aLog.getName() );
+ sOut.append(";" );
+ sOut.append(t_cfg_start );
+ sOut.append(";" );
+ sOut.append(t_cfg_end );
+ sOut.append(";" );
+ sOut.append(t_fwk_start );
+ sOut.append(";" );
+ sOut.append(t_fwk_end );
+ sOut.append(";" );
+ sOut.append(t_sfx_start );
+ sOut.append(";" );
+ sOut.append(t_sfx_end );
+ sOut.append(";" );
+ sOut.append(t_types_start );
+ sOut.append(";" );
+ sOut.append(t_types_end );
+ sOut.append(";" );
+ sOut.append(t_filters_start );
+ sOut.append(";" );
+ sOut.append(t_filters_end );
+ sOut.append(";" );
+
+ sOut.append(t_filters_swriter_start );
+ sOut.append(";" );
+ sOut.append(t_filters_swriter_end );
+ sOut.append(";" );
+ sOut.append(t_filters_sweb_start );
+ sOut.append(";" );
+ sOut.append(t_filters_sweb_end );
+ sOut.append(";" );
+ sOut.append(t_filters_sglobal_start );
+ sOut.append(";" );
+ sOut.append(t_filters_sglobal_end );
+ sOut.append(";" );
+ sOut.append(t_filters_scalc_start );
+ sOut.append(";" );
+ sOut.append(t_filters_scalc_end );
+ sOut.append(";" );
+ sOut.append(t_filters_sdraw_start );
+ sOut.append(";" );
+ sOut.append(t_filters_sdraw_end );
+ sOut.append(";" );
+ sOut.append(t_filters_simpress_start );
+ sOut.append(";" );
+ sOut.append(t_filters_simpress_end );
+ sOut.append(";" );
+ sOut.append(t_filters_schart_start );
+ sOut.append(";" );
+ sOut.append(t_filters_schart_end );
+ sOut.append(";" );
+ sOut.append(t_filters_smath_start );
+ sOut.append(";" );
+ sOut.append(t_filters_smath_end );
+ sOut.append(";" );
+
+ sOut.append(t_others_start );
+ sOut.append(";" );
+ sOut.append(t_others_end );
+ sOut.append(";" );
+ sOut.append(t_cfg_end -t_cfg_start );
+ sOut.append(";" );
+ sOut.append(t_fwk_end -t_fwk_start );
+ sOut.append(";" );
+ sOut.append(t_sfx_end -t_sfx_start );
+ sOut.append(";" );
+ sOut.append(t_types_end -t_types_start );
+ sOut.append(";" );
+ sOut.append(t_filters_end-t_filters_start);
+ sOut.append(";" );
+ sOut.append(t_others_end -t_others_start );
+ sOut.append(";" );
+ sOut.append(t_others_end -t_cfg_start );
+ sOut.append("\n" );
+
+ aBuffer.close();
+ }
+
+ java.io.FileWriter aCSV = new java.io.FileWriter(sDataFile);
+ java.lang.String sData = sOut.toString();
+ aCSV.write(sData, 0, sData.length());
+ aCSV.flush();
+ aCSV.close();
+ }
+ catch(java.lang.Throwable exAny)
+ {
+ System.err.println(exAny.getMessage());
+ exAny.printStackTrace();
+ System.exit(--nExit);
+ }
+
+ System.exit(0);
+ }
+}
diff --git a/l10ntools/source/filter/utils/Cache.java b/l10ntools/source/filter/utils/Cache.java
new file mode 100644
index 000000000000..94c26008ed13
--- /dev/null
+++ b/l10ntools/source/filter/utils/Cache.java
@@ -0,0 +1,2449 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: Cache.java,v $
+ * $Revision: 1.7 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 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_SILENTEXPORT = "SILENTEXPORT";
+ 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_SILENTEXPORT = 0x00200000; // 2097152
+ 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>(>) => (&gt;)</li>
+ * <li>(<) => (&lt;)</li>
+ * <li>(&gt;) => (&gt;)</li>
+ * <li>(&amp;) => (&amp;)</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_SILENTEXPORT))
+ nFlags |= FLAGVAL_SILENTEXPORT;
+ 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_SILENTEXPORT) == FLAGVAL_SILENTEXPORT)
+ lFlags.add(FLAGNAME_SILENTEXPORT);
+
+ 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);
+*/
+ }
+}
diff --git a/l10ntools/source/filter/utils/ConfigHelper.java b/l10ntools/source/filter/utils/ConfigHelper.java
new file mode 100644
index 000000000000..78cc71cf65b2
--- /dev/null
+++ b/l10ntools/source/filter/utils/ConfigHelper.java
@@ -0,0 +1,303 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: ConfigHelper.java,v $
+ * $Revision: 1.7 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ **********************************************************************_*/
+
+package com.sun.star.filter.config.tools.utils;
+
+//_______________________________________________
+// imports
+
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+
+//_______________________________________________
+// definition
+
+/** can be used to analyze command line parameters
+ * and merge it together with might existing config
+ * files. That provides the possibility to overwrite
+ * config values via command line parameter.
+ *
+ *
+ */
+public class ConfigHelper extends java.util.Properties
+{
+ //___________________________________________
+ // member
+
+ /** indicates an empty command line. */
+ private boolean m_bEmpty = true;
+
+ //___________________________________________
+ // ctor
+
+ //-------------------------------------------
+ /** initialize a new helper with the list of
+ * command line parameters and bind this new instance
+ * to a property file on disk.
+ *
+ * @param sPropFile
+ * name of the property file.
+ * If its set to null or an empty value
+ * it will be ignored.
+ *
+ * @param lCommandLineArgs
+ * the list of original command line arguments.
+ *
+ * @throws [Exception]
+ * in case the command line contains an unknown
+ * schema for specifiying parameters or the
+ * specified property file does not exists
+ * or seem to be corrupted.
+ */
+ public ConfigHelper(java.lang.String sPropFile ,
+ java.lang.String[] lCommandLineArgs)
+ throws java.lang.Exception
+ {
+ // first load prop file, so its values can be overwritten
+ // by command line args later
+ // Do it only, if a valid file name was given.
+ // But in case this file name is wrong, throw an exception.
+ // So the outside code can react!
+ if (
+ (sPropFile != null) &&
+ (sPropFile.length() > 0 )
+ )
+ {
+ java.lang.ClassLoader aLoader = getClass().getClassLoader();
+ java.io.InputStream aStream = aLoader.getResourceAsStream(sPropFile);
+ if (aStream == null)
+ aStream = new java.io.FileInputStream(sPropFile);
+ load(aStream);
+ }
+
+ int count = 0;
+ if (lCommandLineArgs != null)
+ count = lCommandLineArgs.length;
+ m_bEmpty = (count < 1);
+
+ for (int arg=0; arg<count; ++arg)
+ {
+ // is it a named-value argument?
+ // Note: We ignores double "=" signs! => search from left to right
+ int len = lCommandLineArgs[arg].length();
+ int pos = lCommandLineArgs[arg].indexOf('=');
+ if (pos != -1)
+ {
+ java.lang.String sArg = lCommandLineArgs[arg].substring(0,pos);
+ java.lang.String sValue = lCommandLineArgs[arg].substring(pos+1);
+ setProperty(sArg, sValue);
+ continue;
+ }
+
+ // is it a boolean argument?
+ // Note: Because "--" and "-" will be interpreted as the same
+ // we search from right to left!
+ pos = lCommandLineArgs[arg].lastIndexOf('-');
+ if (pos == -1)
+ pos = lCommandLineArgs[arg].lastIndexOf('/');
+ if (pos != -1)
+ {
+ java.lang.String sArg = lCommandLineArgs[arg].substring(pos+1);
+ setProperty(sArg, java.lang.String.valueOf(true));
+ continue;
+ }
+
+ // There is an unknown format used by this argument ...
+ throw new MalformedCommandLineException("Invalid command line detected. The argument \""+lCommandLineArgs[arg]+"\" use an unsupported format.");
+ }
+ }
+
+ //-------------------------------------------
+ /** indicates if the given command line includes
+ * a help request.
+ *
+ * @return True if there was an explicit help request.
+ */
+ public synchronized boolean isHelp()
+ {
+ return (
+ (containsKey("help")) ||
+ (containsKey("?") ) ||
+ (containsKey("h") )
+ );
+ }
+
+ //-------------------------------------------
+ /** indicates if the gioven command line was empty.
+ *
+ * @return True if there was an empty command line.
+ */
+ public synchronized boolean isEmpty()
+ {
+ return m_bEmpty;
+ }
+
+ //-------------------------------------------
+ /** returns the value of sProp as boolean value.
+ *
+ * @param sProp
+ * the name of the parameter.
+ *
+ * @return The boolean value of the requested property.
+ *
+ * @throw [NoSuchElementException]
+ * if the requested property does not exists.
+ */
+ public synchronized boolean getBoolean(java.lang.String sProp)
+ throws java.util.NoSuchElementException
+ {
+ java.lang.String sValue = getProperty(sProp);
+ if (sValue == null)
+ throw new java.util.NoSuchElementException("The requested config value \""+sProp+"\" does not exists!");
+ return new java.lang.Boolean(sValue).booleanValue();
+ }
+
+ public synchronized boolean getBoolean(java.lang.String sProp ,
+ boolean bDefault)
+ {
+ java.lang.String sDefault = java.lang.String.valueOf(bDefault);
+ java.lang.String sValue = getProperty(sProp, sDefault);
+ return new java.lang.Boolean(sValue).booleanValue();
+ }
+
+ //-------------------------------------------
+ /** returns the value of sProp as int value.
+ *
+ * @param sProp
+ * the name of the parameter.
+ *
+ * @return The int value of the requested property.
+ *
+ * @throw [NoSuchElementException]
+ * if the requested property does not exists.
+ */
+ public synchronized int getInt(java.lang.String sProp)
+ throws java.util.NoSuchElementException
+ {
+ java.lang.String sValue = getProperty(sProp);
+ if (sValue == null)
+ throw new java.util.NoSuchElementException("The requested config value \""+sProp+"\" does not exists!");
+ return new java.lang.Integer(sValue).intValue();
+ }
+
+ public synchronized int getInt(java.lang.String sProp ,
+ int nDefault)
+ {
+ java.lang.String sDefault = java.lang.String.valueOf(nDefault);
+ java.lang.String sValue = getProperty(sProp, sDefault);
+ return new java.lang.Integer(sValue).intValue();
+ }
+
+ //-------------------------------------------
+ /** returns the value of sProp as string value.
+ *
+ * @param sProp
+ * the name of the parameter.
+ *
+ * @return The string value of the requested property.
+ *
+ * @throw [NoSuchElementException]
+ * if the requested property does not exists.
+ */
+ public synchronized java.lang.String getString(java.lang.String sProp)
+ throws java.util.NoSuchElementException
+ {
+ java.lang.String sValue = getProperty(sProp);
+ if (sValue == null)
+ throw new java.util.NoSuchElementException("The requested config value \""+sProp+"\" does not exists!");
+ return sValue;
+ }
+
+ //-------------------------------------------
+ /** returns the value of sProp as string list value!
+ *
+ * @descr The delimiter must be well known and
+ * it must be clear if trailing/leading
+ * whitespaces must be ignored or not.
+ *
+ * @param sProp
+ * the name of the parameter.
+ *
+ * @param sDelim
+ * the delimiter, which must be used to split
+ * the config string value into an array.
+ *
+ * @param bTrim
+ * if its set to true, trailing and leading whitespace
+ * characters will be ommited.
+ *
+ * @param bDecode
+ * if its set to TRUE all liste items will be
+ * interpreted as "<xxx>" and converted to <xxx>!
+ *
+ * @return The string list value of the requested property.
+ *
+ * @throw [NoSuchElementException]
+ * if the requested property does not exists.
+ */
+ public synchronized java.util.Vector getStringList(java.lang.String sProp ,
+ java.lang.String sDelimiter,
+ boolean bTrim ,
+ boolean bDecode )
+ throws java.util.NoSuchElementException
+ {
+ java.lang.String sValue = getProperty(sProp);
+ if (sValue == null)
+ throw new java.util.NoSuchElementException("The requested config value \""+sProp+"\" does not exists!");
+
+ java.util.Vector lValue = new java.util.Vector();
+ try
+ {
+ java.util.StringTokenizer lTokens = new java.util.StringTokenizer(sValue, sDelimiter);
+ while(lTokens.hasMoreTokens())
+ {
+ java.lang.String sToken = lTokens.nextToken();
+ // remove trailing/leading whitespaces
+ if (bTrim)
+ sToken = sToken.trim();
+ // remove ""
+ if (
+ (bDecode ) &&
+ (sToken.indexOf("\"") == 0 ) &&
+ (sToken.lastIndexOf("\"") == sToken.length()-1)
+ )
+ {
+ sToken = sToken.substring(1, sToken.length()-1);
+ }
+ lValue.add(sToken);
+ }
+ }
+ catch(java.lang.Throwable ex)
+ { lValue.clear(); }
+
+ return lValue;
+ }
+}
diff --git a/l10ntools/source/filter/utils/FileHelper.java b/l10ntools/source/filter/utils/FileHelper.java
new file mode 100644
index 000000000000..71f51cf36bf6
--- /dev/null
+++ b/l10ntools/source/filter/utils/FileHelper.java
@@ -0,0 +1,766 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: FileHelper.java,v $
+ * $Revision: 1.13 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package com.sun.star.filter.config.tools.utils;
+
+// __________ Imports __________
+
+import java.io.*;
+import java.lang.*;
+import java.net.*;
+import java.util.*;
+
+// __________ Implementation __________
+
+/**
+ * It collects some static helper functons to handle file system specific problems.
+ * Sometimes it's neccessary to convert URL from/to system pathes;
+ * or from string notation to structural versions (e.g. com.sun.star.util.URL).
+ * And sometimes java had another notation then the office it has.
+ * Further it provides functionality to work easiear with the java.io.File class of java.
+ *
+ *
+ */
+public class FileHelper
+{
+ // ____________________
+
+ /**
+ * Because the office need URLs for loading/saving documents
+ * we must convert used system pathes.
+ * And java use another notation for file URLs ... correct it.
+ *
+ * @param aSystemPath
+ * represent the file in system notation
+ *
+ * @return [String]
+ * a file url which represent the given system path
+ */
+ public static java.lang.String getFileURLFromSystemPath(java.io.File aSystemPath)
+ {
+ System.out.println("TODO: must be adapted to java 1.3 :-(");
+ System.exit(-1);
+/*TODO_JAVA
+ try
+ {
+ sFileURL = aSystemPath.toURI().toURL().toString();
+ }
+ catch( MalformedURLException exWrong )
+ {
+ sFileURL = null;
+ }
+*/
+ java.lang.String sFileURL = null;
+
+ // problem of java: file URL's are coded with 1 slash instead of 2 or 3 ones!
+ // => correct this problem first, otherwise office can't use these URL's
+ if(
+ (sFileURL != null ) &&
+ (sFileURL.startsWith("file:/") == true ) &&
+ (sFileURL.startsWith("file://") == false)
+ )
+ {
+ java.lang.StringBuffer sWorkBuffer = new java.lang.StringBuffer(sFileURL);
+ sWorkBuffer.insert(6,"//");
+ sFileURL = sWorkBuffer.toString();
+ }
+
+ return sFileURL;
+ }
+
+ // ____________________
+
+ /**
+ * The same as getFileURLFromSystemPath() before but uses string parameter instead
+ * of a java.io.File type. It exist to supress converting of neccessary parameters in the
+ * outside code. But of course getFileURLFromSystemPath(File) will be a little bit faster
+ * then this method ...
+ *
+ * @param sSystemPath
+ * represent the file in system notation
+ *
+ * @return [String]
+ * a file url which represent the given system path
+ */
+ public static java.lang.String getFileURLFromSystemPath(java.lang.String sSystemPath)
+ {
+ return getFileURLFromSystemPath(new java.io.File(sSystemPath));
+ }
+
+ // ____________________
+
+ /**
+ * Does the same as getFileURLFromSystemPath() before ... but uses
+ * the given protocol string (e.g."http://") insted of "file:///".
+ *
+ * @param aSystemPath
+ * represent the file in system notation
+ *
+ * @param aBasePath
+ * define the base path of the aSystemPath value,
+ * which must be replaced with the value of "sServerPath".
+ *
+ * @param sServerURL
+ * Will be used to replace sBasePath.
+ *
+ * @example
+ * System Path = "d:\test\file.txt"
+ * Base Path = "d:\test"
+ * Server Path = "http://alaska:8000"
+ * => "http://alaska:8000/file.txt"
+ *
+ * @return [String]
+ * an url which represent the given system path
+ * and uses the given protocol
+ */
+ public static java.lang.String getURLWithProtocolFromSystemPath(java.io.File aSystemPath,
+ java.io.File aBasePath ,
+ java.lang.String sServerURL )
+ {
+ System.out.println("TODO: must be adapted to java 1.3 :-(");
+ System.exit(-1);
+
+ java.lang.String sFileURL = FileHelper.getFileURLFromSystemPath(aSystemPath);
+ java.lang.String sBaseURL = FileHelper.getFileURLFromSystemPath(aBasePath );
+
+ // cut last '/'!
+ if (sBaseURL.lastIndexOf('/')==(sBaseURL.length()-1))
+ sBaseURL = sBaseURL.substring(0,sBaseURL.length()-1);
+
+ // cut last '/'!
+ if (sServerURL.lastIndexOf('/')==(sServerURL.length()-1))
+ sServerURL = sServerURL.substring(0,sServerURL.length()-1);
+
+//TODO_JAVA java.lang.String sURL = sFileURL.replaceFirst(sBaseURL,sServerURL);
+ java.lang.String sURL = null;
+ return sURL;
+ }
+
+ // ____________________
+
+ /**
+ * The same as getURLWithProtocolFromSystemPath() before but uses string parameter instead
+ * of a java.io.File types. It exist to supress converting of neccessary parameters in the
+ * outside code. But of course getURLWithProtocolFromSystemPath(File,File,String) will be
+ * a little bit faster then this method ...
+ *
+ * @param sSystemPath
+ * represent the file in system notation
+ *
+ * @param sBasePath
+ * define the base path of the aSystemPath value,
+ * which must be replaced with the value of "sServerPath".
+ *
+ * @param sServerPath
+ * Will be used to replace sBasePath.
+ *
+ * @example
+ * System Path = "d:\test\file.txt"
+ * Base Path = "d:\test"
+ * Server Path = "http://alaska:8000"
+ * => "http://alaska:8000/file.txt"
+ *
+ * @return [String]
+ * an url which represent the given system path
+ * and uses the given protocol
+ */
+ public static java.lang.String getURLWithProtocolFromSystemPath(java.lang.String sSystemPath,
+ java.lang.String sBasePath ,
+ java.lang.String sServerPath)
+ {
+ return getURLWithProtocolFromSystemPath(new java.io.File(sSystemPath), new java.io.File(sBasePath), sServerPath);
+ }
+
+ //_________________________________
+
+ /**
+ * Return a list of all available files of a directory.
+ * We filter sub directories. All other files
+ * are returned. So they can be used for further purposes.
+ * One parameter define the start directory,
+ * another one enable/disable recursive search into sub directories.
+ *
+ * @param aRoot
+ * the start directory, which should be analyzed.
+ *
+ * @param bRecursive
+ * enable/disable search in sub directories.
+ *
+ * @return [Vector]
+ * a filtered list of java java.io.File objects of all available files
+ * of the start dir (and may of its sub directories).
+ */
+ public static java.util.Vector getSystemFilesFromDir(java.io.File aRoot ,
+ boolean bRecursive)
+ {
+ java.io.File[] lAllFiles = aRoot.listFiles();
+ if (lAllFiles == null)
+ return null;
+
+ int c = lAllFiles.length;
+ java.util.Vector lFilteredFiles = new java.util.Vector(c);
+ for (int i=0; i<c; ++i)
+ {
+ // simple files!
+ if (lAllFiles[i].isFile())
+ lFilteredFiles.add(lAllFiles[i]);
+ else
+ // recursion?
+ if (bRecursive && lAllFiles[i].isDirectory())
+ {
+ java.util.Vector lSubFiles = FileHelper.getSystemFilesFromDir(lAllFiles[i],bRecursive);
+ if (lSubFiles != null)
+ {
+ java.util.Enumeration aSnapshot = lSubFiles.elements();
+ while (aSnapshot.hasMoreElements())
+ lFilteredFiles.add(aSnapshot.nextElement());
+ }
+ }
+ }
+
+ return lFilteredFiles;
+ }
+
+ //_________________________________
+ /** it converts the given name (e.g. an internal type name) to
+ * an usable system file name.
+ *
+ * Do so some special characters (e.g. "/") must be replaced with other ones.
+ *
+ * @param sName
+ * the name, which should be analyzed and converted.
+ *
+ * @return A valid system file name, which should be similar to the
+ * given name, but does not contain special characters any longer.
+ */
+ public static java.lang.String convertName2FileName(String sName)
+ {
+ int i = 0;
+ int nLength = sName.length();
+ char[] lBuffer = sName.toCharArray();
+
+ java.lang.StringBuffer sNewName = new java.lang.StringBuffer(nLength);
+ for (i=0; i<nLength; ++i)
+ {
+ char c = lBuffer[i];
+ if (
+ c>=48 && c<=57 // 0-9
+ &&
+ c>=97 && c<=122 // a-z
+ &&
+ c>=65 && c<=90 // A-Z
+ )
+ {
+ sNewName.append(c);
+ }
+ else
+ {
+ sNewName.append("_");
+ }
+ }
+
+ return sNewName.toString();
+ }
+
+ //___________________________________________
+
+ /** it removes all child nodes of a file system directory.
+ *
+ * @param aDirectory
+ * points to the directory, which should be made empty.
+ *
+ * @param bFilesOnly
+ * force deletion of files only. If its set to TRUE,
+ * no subdirectory will be removed.
+ *
+ * @throw [java.io.IOException]
+ * if some of the child nodes couldn't be removed.
+ */
+ public static void makeDirectoryEmpty(java.io.File aDirectory,
+ boolean bFilesOnly)
+ throws java.io.IOException
+ {
+ if (!aDirectory.isDirectory())
+ throw new java.io.FileNotFoundException("\""+aDirectory.toString()+"\" is not a directory.");
+
+ java.io.File[] lChilds = aDirectory.listFiles();
+ for (int f=0; f<lChilds.length; ++f)
+ {
+ if (lChilds[f].isDirectory())
+ {
+ FileHelper.makeDirectoryEmpty(lChilds[f], bFilesOnly);
+ if (!bFilesOnly)
+ {
+ if (!lChilds[f].delete())
+ throw new java.io.IOException("\""+lChilds[f].toString()+"\" could not be deleted.");
+ }
+ }
+ else
+ {
+ if (!lChilds[f].delete())
+ throw new java.io.IOException("\""+lChilds[f].toString()+"\" could not be deleted.");
+ }
+ }
+ }
+
+ //___________________________________________
+
+ /** it try to generate a new file with a unique ID
+ * inside given directory.
+ *
+ * Call this method with a directory and a base name for
+ * a file. It will be used to generate a new files inside
+ * the directory. Existing files will be checked and new file
+ * name will be tested till a non existing file name would be found.
+ *
+ * @param aBaseDir
+ * must be a system path
+ * e.g.: "c:\temp"
+ *
+ * @param sBaseName
+ * must be a system file name without extensions.
+ * e.g.: "myfile_"
+ *
+ * @param sExtension
+ * the whished extension.
+ * e.g.: "dat"
+ *
+ * @return A valid file object, if an unique file could be created -
+ * Null otherwhise.
+ * e.g.: "c:\temp\myfile_1.dat"
+ */
+ public static java.io.File createUniqueFile(java.io.File aBaseDir ,
+ java.lang.String sBaseName ,
+ java.lang.String sExtension)
+ {
+ java.io.File aBaseFile = new java.io.File(aBaseDir, sBaseName);
+ java.io.File aFile = null;
+ long nr = 0;
+ while (aFile == null && nr < java.lang.Long.MAX_VALUE)
+ {
+ java.lang.String sFileName = aBaseFile.getPath() + java.lang.String.valueOf(nr) + "." + sExtension;
+ aFile = new java.io.File(sFileName);
+ if (aFile.exists())
+ aFile=null;
+ ++nr;
+ }
+ return aFile;
+ }
+
+ //___________________________________________
+
+ /** reads the complete file, using the right encoding,
+ * into the given string buffer.
+ *
+ * @param aFile
+ * must point to a system file, which must exist.
+ * e.g.: "c:\temp\test.txt"
+ * "/tmp/test.txt"
+ *
+ * @param sEncoding
+ * will be used to encode the string content
+ * inside the file.
+ * e.g.: "UTF8"
+ *
+ * @param sBuffer
+ * used to return the file content.
+ *
+ * @throw [IOException]
+ * - if the file couldnt be opened
+ * - if the file does not use the right encoding
+ */
+ public static void readEncodedBufferFromFile(java.io.File aFile ,
+ java.lang.String sEncoding,
+ java.lang.StringBuffer sBuffer )
+ throws java.io.IOException
+ {
+ if (sEncoding.equals("UTF-8Special"))
+ {
+ FileHelper.readAndCheckUTF8File(aFile,sBuffer);
+ return;
+ }
+
+ java.io.FileInputStream aByteStream = new java.io.FileInputStream(aFile.getAbsolutePath());
+ java.io.InputStreamReader aEncodedReader = new java.io.InputStreamReader(aByteStream, sEncoding);
+ char[] aEncodedBuffer = new char[4096];
+ int nReadCount = 0;
+
+ while((nReadCount=aEncodedReader.read(aEncodedBuffer))>0)
+ sBuffer.append(aEncodedBuffer, 0, nReadCount);
+
+ aEncodedReader.close();
+ }
+
+ //___________________________________________
+ private static void logEncodingData(java.lang.StringBuffer sLog ,
+ int nUTF8 ,
+ int nByteOrg1 ,
+ int nByteOrg2 ,
+ int nByteOrg3 ,
+ int nByteOrg4 ,
+ int nByte1 ,
+ int nByte2 ,
+ int nByte3 ,
+ int nByte4 ,
+ int nEncodingType)
+ {
+ sLog.append("["+nEncodingType+"]\t");
+ sLog.append((int)nUTF8+"\t=");
+ sLog.append("\t"+nByteOrg1+"/"+nByte1);
+ sLog.append("\t"+nByteOrg2+"/"+nByte2);
+ sLog.append("\t"+nByteOrg3+"/"+nByte3);
+ sLog.append("\t"+nByteOrg4+"/"+nByte4);
+ sLog.append("\n");
+ }
+
+ //___________________________________________
+ private static char impl_convertBytesToChar(int nByte1, int nByte2, int nByte3, int nByte4)
+ {
+ return (char)((nByte1*0x40000)+(nByte2*0x1000)+(nByte3*0x40)+nByte4);
+ }
+
+ //___________________________________________
+ private static int impl_readAndCheckNextByte(byte[] aBuffer ,
+ int nBufPos ,
+ int nBufLength ,
+ int nMinRange ,
+ int nMaxRange )
+ throws java.lang.Exception
+ {
+ if (nBufPos>=nBufLength)
+ throw new java.lang.Exception("impl_readAndCheckNextByte()\nEnd of buffer reached.");
+
+ int nByte = aBuffer[nBufPos] & 0xFF;
+ if (
+ (nByte < nMinRange) ||
+ (nByte > nMaxRange)
+ )
+ {
+ throw new java.lang.Exception("impl_readAndCheckNextByte()\nByte does not fit the specified range.");
+ }
+
+ return nByte;
+ }
+
+ //___________________________________________
+ public static void readAndCheckUTF8File(java.io.File aFile ,
+ java.lang.StringBuffer sBuffer)
+ throws java.io.IOException
+ {
+ java.io.FileInputStream aByteStream = new java.io.FileInputStream(aFile.getAbsolutePath());
+ byte[] aBuffer = new byte[4096];
+ int nReadCount = 0;
+ int nByteOrg_1 = 0;
+ int nByteOrg_2 = 0;
+ int nByteOrg_3 = 0;
+ int nByteOrg_4 = 0;
+ int nByte_1 = 0;
+ int nByte_2 = 0;
+ int nByte_3 = 0;
+ int nByte_4 = 0;
+ char nUTF8 = 0;
+ int i = 0;
+ int nEncodingType = 0;
+ java.lang.StringBuffer sLog = new java.lang.StringBuffer();
+
+ try
+ {
+
+ while((nReadCount=aByteStream.read(aBuffer))>0)
+ {
+ i=0;
+ while (i<nReadCount)
+ {
+ nByteOrg_1 = 0;
+ nByteOrg_2 = 0;
+ nByteOrg_3 = 0;
+ nByteOrg_4 = 0;
+ nByte_1 = 0;
+ nByte_2 = 0;
+ nByte_3 = 0;
+ nByte_4 = 0;
+ nUTF8 = 0;
+ nEncodingType = 0;
+
+ nByteOrg_1 = aBuffer[i++] & 0xFF;
+ nByte_1 = nByteOrg_1;
+ /*
+ Table 3-6. Well-Formed UTF-8 Byte Sequences
+
+ ============================================================================
+ Nr. Code Points 1st Byte 2nd Byte 3rd Byte 4th Byte
+ ============================================================================
+ 01 U+ 0..U+ 7F 00..7F
+ 02 U+ 80..U+ 7FF C2..DF 80..BF
+ 03 U+ 800..U+ FFF E0 A0..BF 80..BF
+ 04 U+ 1000..U+ CFFF E1..EC 80..BF 80..BF
+ 05 U+ D000..U+ D7FF ED 80..9F 80..BF
+ 06 U+ E000..U+ FFFF EE..EF 80..BF 80..BF
+ 07 U+ 10000..U+ 3FFFF F0 90..BF 80..BF 80..BF
+ 08 U+ 40000..U+ FFFFF F1..F3 80..BF 80..BF 80..BF
+ 09 U+100000..U+10FFFF F4 80..8F 80..BF 80..BF
+ */
+ // ------------------------------------------------------------
+ // 01
+ // 1 byte: 0xxxxxxx
+ // ------------------------------------------------------------
+ if (
+ (nByteOrg_1 >= 0x00) &&
+ (nByteOrg_1 <= 0x7F)
+ )
+ {
+ nEncodingType = 1;
+ nUTF8 = (char)nByte_1;
+ }
+ // ------------------------------------------------------------
+ // 02
+ // 1 byte: 110xxxxx
+ // 2 byte: 101xxxxx
+ // ------------------------------------------------------------
+ else
+ if (
+ (nByteOrg_1 >= 0xC2) &&
+ (nByteOrg_1 <= 0xDF)
+ )
+ {
+ nEncodingType = 2;
+ nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByte_1 = nByteOrg_1-0xC2;
+ nByte_2 = nByteOrg_2-0x80;
+ nUTF8 = FileHelper.impl_convertBytesToChar(0,0,nByte_1, nByte_2);
+ }
+ // ------------------------------------------------------------
+ // 03
+ // 1 byte: 11100000
+ // 2 byte: 101xxxxx
+ // 3 byte: 10xxxxxx
+ // ------------------------------------------------------------
+ else
+ if (nByteOrg_1 == 0xE0)
+ {
+ nEncodingType = 3;
+ nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0xA0, 0xBF);
+ nByteOrg_3 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByte_2 = nByteOrg_2-0xA0;
+ nByte_3 = nByteOrg_3-0x80;
+ nUTF8 = FileHelper.impl_convertBytesToChar(0,0,nByte_2, nByte_3);
+ }
+ // ------------------------------------------------------------
+ // 04
+ // 1 byte: 111xxxxx
+ // 2 byte: 10xxxxxx
+ // 3 byte: 10xxxxxx
+ // ------------------------------------------------------------
+ else
+ if (
+ (nByteOrg_1 >= 0xE1) &&
+ (nByteOrg_1 <= 0xEC)
+ )
+ {
+ nEncodingType = 4;
+ nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByteOrg_3 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByte_1 = nByteOrg_1-0xE1;
+ nByte_2 = nByteOrg_2-0x80;
+ nByte_3 = nByteOrg_3-0x80;
+ nUTF8 = FileHelper.impl_convertBytesToChar(0,nByte_1, nByte_2, nByte_3);
+ }
+ // ------------------------------------------------------------
+ // 05
+ // 1 byte: 11101101
+ // 2 byte: 10xxxxxx
+ // 3 byte: 10xxxxxx
+ // ------------------------------------------------------------
+ else
+ if (nByteOrg_1 == 0xED)
+ {
+ nEncodingType = 5;
+ nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0x9F);
+ nByteOrg_3 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByte_2 = nByteOrg_2-0x80;
+ nByte_3 = nByteOrg_3-0x80;
+ nUTF8 = FileHelper.impl_convertBytesToChar(0,0, nByte_2, nByte_3);
+ }
+ // ------------------------------------------------------------
+ // 06
+ // 1 byte: 1110111x
+ // 2 byte: 10xxxxxx
+ // 3 byte: 10xxxxxx
+ // ------------------------------------------------------------
+ else
+ if (
+ (nByteOrg_1 >= 0xEE) &&
+ (nByteOrg_1 <= 0xEF)
+ )
+ {
+ nEncodingType = 6;
+ nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByteOrg_3 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByte_1 = nByteOrg_1-0xEE;
+ nByte_2 = nByteOrg_2-0x80;
+ nByte_3 = nByteOrg_3-0x80;
+ nUTF8 = FileHelper.impl_convertBytesToChar(0,nByte_1, nByte_2, nByte_3);
+ }
+ // ------------------------------------------------------------
+ // 07
+ // 1 byte: 11110000
+ // 2 byte: 1001xxxx
+ // 3 byte: 10xxxxxx
+ // 4 byte: 10xxxxxx
+ // ------------------------------------------------------------
+ else
+ if (nByteOrg_1 == 0xF0)
+ {
+ nEncodingType = 7;
+ nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x90, 0xBF);
+ nByteOrg_3 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByteOrg_4 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByte_2 = nByteOrg_2-0x90;
+ nByte_3 = nByteOrg_3-0x80;
+ nByte_4 = nByteOrg_4-0x80;
+ nUTF8 = FileHelper.impl_convertBytesToChar(0, nByte_2, nByte_3, nByte_4);
+ }
+ // ------------------------------------------------------------
+ // 08
+ // 1 byte: 111100xx
+ // 2 byte: 10xxxxxx
+ // 3 byte: 10xxxxxx
+ // 3 byte: 10xxxxxx
+ // ------------------------------------------------------------
+ else
+ if (
+ (nByteOrg_1 >= 0xF1) &&
+ (nByteOrg_1 <= 0xF3)
+ )
+ {
+ nEncodingType = 8;
+ nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByteOrg_3 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByteOrg_4 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByte_1 = nByteOrg_1-0xF1;
+ nByte_2 = nByteOrg_2-0x80;
+ nByte_3 = nByteOrg_3-0x80;
+ nByte_4 = nByteOrg_4-0x80;
+ nUTF8 = FileHelper.impl_convertBytesToChar(nByte_1, nByte_2, nByte_3, nByte_4);
+ }
+ // ------------------------------------------------------------
+ // 09
+ // 1 byte: 11110100
+ // 2 byte: 10xxxxxx
+ // 3 byte: 10xxxxxx
+ // 4 byte: 10xxxxxx
+ // ------------------------------------------------------------
+ else
+ if (nByteOrg_1 == 0xF0)
+ {
+ nEncodingType = 9;
+ nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByteOrg_3 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByteOrg_4 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByte_2 = nByteOrg_2-0x80;
+ nByte_3 = nByteOrg_3-0x80;
+ nByte_4 = nByteOrg_4-0x80;
+ nUTF8 = FileHelper.impl_convertBytesToChar(0, nByte_2, nByte_3, nByte_4);
+ }
+ // wrong encoding ?
+ else
+ {
+ throw new java.lang.Exception("Non well formed UTF-8 encoding.");
+ }
+
+ sBuffer.append(nUTF8);
+ // -> DEBUG !
+ FileHelper.logEncodingData(sLog, nUTF8, nByteOrg_1, nByteOrg_2, nByteOrg_3, nByteOrg_4, nByte_1, nByte_2, nByte_3, nByte_4, nEncodingType);
+ // <- DEBUG !
+ }
+ }
+
+ }
+ catch(java.lang.Throwable ex)
+ {
+ // -> DEBUG !
+ FileHelper.logEncodingData(sLog, nUTF8, nByteOrg_1, nByteOrg_2, nByteOrg_3, nByteOrg_4, nByte_1, nByte_2, nByte_3, nByte_4, nEncodingType);
+
+ java.io.File aDir = new java.io.File(aFile.getParent());
+ java.lang.String sDump = aFile.getName();
+ java.io.File aDump = FileHelper.createUniqueFile(aDir, sDump, "dump");
+ FileHelper.writeEncodedBufferToFile(aDump, "UTF-8", false, sLog);
+ // <- DEBUG !
+
+ java.lang.String sMsg = "File '"+aFile.getPath()+"' is not encoded right as UTF-8.";
+ throw new java.io.IOException(sMsg);
+ }
+
+ aByteStream.close();
+ }
+
+ //___________________________________________
+
+ /** writes the given string buffer into the specified file
+ * using the specified encoding.
+ *
+ * Further it can be set, if the file should be expanded
+ * or replaced by this new string buffer.
+ *
+ * @param aFile
+ * must point to a system file. It can already exist!
+ * e.g.: "c:\temp\test.txt"
+ * "/tmp/test.txt"
+ *
+ * @param sEncoding
+ * will be used to encode the string content inside the file.
+ * e.g.: "UTF8"
+ *
+ * @param bAppend
+ * specify if an already existing file will be
+ * expanded or replaced.
+ *
+ * @param sBuffer
+ * the new string content for this file.
+ */
+ public static void writeEncodedBufferToFile(java.io.File aFile ,
+ java.lang.String sEncoding,
+ boolean bAppend ,
+ java.lang.StringBuffer sBuffer )
+ throws java.io.IOException
+ {
+ java.io.FileOutputStream aByteStream = new java.io.FileOutputStream(aFile.getAbsolutePath(), bAppend);
+ java.io.OutputStreamWriter aEncodedWriter = new java.io.OutputStreamWriter(aByteStream, sEncoding);
+
+ java.lang.String sTemp = sBuffer.toString();
+ aEncodedWriter.write(sTemp, 0, sTemp.length());
+
+ aEncodedWriter.flush();
+ aEncodedWriter.close();
+
+ if (!aFile.exists())
+ throw new java.io.IOException("File \""+aFile.getAbsolutePath()+"\" not written correctly.");
+ }
+}
diff --git a/l10ntools/source/filter/utils/Logger.java b/l10ntools/source/filter/utils/Logger.java
new file mode 100644
index 000000000000..7657eba5f426
--- /dev/null
+++ b/l10ntools/source/filter/utils/Logger.java
@@ -0,0 +1,177 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: Logger.java,v $
+ * $Revision: 1.8 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package com.sun.star.filter.config.tools.utils;
+
+//_______________________________________________
+// imports
+
+import java.lang.*;
+import java.util.*;
+
+//_______________________________________________
+// definition
+
+/** can be used to print out some debug messages
+ * and group it into warnings/errors or info statements.
+ *
+ *
+ */
+public class Logger
+{
+ //___________________________________________
+ // const
+
+ /** only error message will be shown. */
+ public static final int LEVEL_ERRORS = 1;
+
+ /** only errors and warnings will be shown. */
+ public static final int LEVEL_WARNINGS = 2;
+
+ /** enable errors/warnings and some global info
+ * message. */
+ public static final int LEVEL_GLOBALINFOS = 3;
+
+ /** enable anything! */
+ public static final int LEVEL_DETAILEDINFOS = 4;
+
+ //___________________________________________
+ // member
+
+ /** enable/disable different output level.
+ * e.g. warnings/errors/infos */
+ private int m_nLevel;
+
+ //___________________________________________
+ // ctor
+
+ /** initialize new debug object with the specified
+ * debug level.
+ *
+ * @param nLevel
+ * the new debug level.
+ * See const values LEVEL_xxx too.
+ */
+ public Logger(int nLevel)
+ {
+ m_nLevel = nLevel;
+ }
+
+ //___________________________________________
+ // interface
+
+ /** initialize new debug object with a default
+ * debug level.
+ */
+ public Logger()
+ {
+ m_nLevel = LEVEL_DETAILEDINFOS;
+ }
+
+ //___________________________________________
+ // interface
+
+ /** prints out an exception ... if the right level is set.
+ *
+ * @param ex
+ * the exception object
+ */
+ public synchronized void setException(java.lang.Throwable ex)
+ {
+ if (m_nLevel >= LEVEL_ERRORS)
+ {
+ System.err.println("Exception:\n");
+ ex.printStackTrace();
+ }
+ }
+
+ //___________________________________________
+ // interface
+
+ /** prints out an error ... if the right level is set.
+ *
+ * @param sError
+ * the error message.
+ */
+ public synchronized void setError(java.lang.String sError)
+ {
+ if (m_nLevel >= LEVEL_ERRORS)
+ System.err.println("Error :\t\""+sError+"\"");
+ }
+
+ //___________________________________________
+ // interface
+
+ /** prints out a warning ... if the right level is set.
+ *
+ * @param sWarning
+ * the warning message.
+ */
+ public synchronized void setWarning(java.lang.String sWarning)
+ {
+ if (m_nLevel >= LEVEL_WARNINGS)
+ System.err.println("Warning :\t\""+sWarning+"\"");
+ }
+
+ //___________________________________________
+ // interface
+
+ /** prints out a global info message ... if the right level is set.
+ *
+ * Global infos should be used to describe a complex operation.
+ * E.g.: loading of a document.
+ * But not for every sub operation like e.g. analyzing lines
+ * during loading the document!
+ *
+ * @param sInfo
+ * the info message.
+ */
+ public synchronized void setGlobalInfo(java.lang.String sInfo)
+ {
+ if (m_nLevel >= LEVEL_GLOBALINFOS)
+ System.out.println("Info :\t\""+sInfo+"\"");
+ }
+
+ //___________________________________________
+ // interface
+
+ /** prints out a mode detailed info message ... if the right level is set.
+ *
+ * Such detailed message are e.g. "analyze line [n] of file ...".
+ *
+ * @param sInfo
+ * the info message.
+ */
+ public synchronized void setDetailedInfo(java.lang.String sInfo)
+ {
+ if (m_nLevel >= LEVEL_DETAILEDINFOS)
+ System.out.println("Detail :\t\""+sInfo+"\"");
+ }
+}
diff --git a/l10ntools/source/filter/utils/MalformedCommandLineException.java b/l10ntools/source/filter/utils/MalformedCommandLineException.java
new file mode 100644
index 000000000000..e073dcb9adcc
--- /dev/null
+++ b/l10ntools/source/filter/utils/MalformedCommandLineException.java
@@ -0,0 +1,50 @@
+/*_***********************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: MalformedCommandLineException.java,v $
+ * $Revision: 1.4 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ **********************************************************************_*/
+
+package com.sun.star.filter.config.tools.utils;
+
+//_______________________________________________
+// imports
+
+import java.lang.*;
+
+//___________________________________________
+// types
+
+/** indicates a malformed command line.
+ *
+ * E.g. it must be thrown if the command line contains one item more then once,
+ * or use unsupported format.
+ */
+public class MalformedCommandLineException extends java.lang.Exception
+{
+ public MalformedCommandLineException() {}
+ public MalformedCommandLineException(java.lang.String sMsg) { super(sMsg); }
+}
diff --git a/l10ntools/source/filter/utils/XMLHelper.java b/l10ntools/source/filter/utils/XMLHelper.java
new file mode 100644
index 000000000000..0f912cac8e25
--- /dev/null
+++ b/l10ntools/source/filter/utils/XMLHelper.java
@@ -0,0 +1,825 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: XMLHelper.java,v $
+ * $Revision: 1.7 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package com.sun.star.filter.config.tools.utils;
+
+//_______________________________________________
+
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+
+//_______________________________________________
+
+/**
+ * It provides some constant values and some static helper routines
+ * which are neccessary to work with a xml file - especialy
+ * the filter configuration.
+ *
+ *
+ */
+public class XMLHelper
+{
+ //___________________________________________
+ // public const
+
+ /** its a possible value of the xml attribute "oor:type" and identify an integer type. */
+ public static final java.lang.String XMLTYPE_INTEGER = "xs:int";
+
+ /** its a possible value of the xml attribute "oor:type" and identify an boolean type. */
+ public static final java.lang.String XMLTYPE_BOOLEAN = "xs:boolean";
+
+ /** its a possible value of the xml attribute "oor:type" and identify an string type. */
+ public static final java.lang.String XMLTYPE_STRING = "xs:string";
+
+ /** its a possible value of the xml attribute "oor:type" and identify an string list type. */
+ public static final java.lang.String XMLTYPE_STRINGLIST = "oor:string-list";
+
+ /** its a xml attribute, which specify a property name. */
+ public static final java.lang.String XMLATTRIB_OOR_NAME = "oor:name";
+
+ /** its a xml attribute, which specify a property type. */
+ public static final java.lang.String XMLATTRIB_OOR_TYPE = "oor:type";
+
+ /** its a xml attribute, which specify a list separator. */
+ public static final java.lang.String XMLATTRIB_OOR_SEPARATOR = "oor:separator";
+
+ /** its a xml attribute, which specify a localized value. */
+ public static final java.lang.String XMLATTRIB_OOR_LOCALIZED = "oor:localized";
+
+ /** its a xml attribute, which specify a merge operation for cfg layering. */
+ public static final java.lang.String XMLATTRIB_OOR_OP = "oor:op";
+
+ /** can be used as value for XMLATTRIB_OOR_OP. */
+ public static final java.lang.String XMLATTRIB_OP_REPLACE = "replace";
+
+ /** its a xml attribute, which specify a locale value. */
+ public static final java.lang.String XMLATTRIB_XML_LANG = "xml:lang";
+
+ /** its the tag name of a <value ...> entry. */
+ public static final java.lang.String XMLTAG_VALUE = "value";
+
+ /** its the tag name of a <prop ...> entry. */
+ public static final java.lang.String XMLTAG_PROP = "prop";
+
+ /** its the tag name of a <node ...> entry. */
+ public static final java.lang.String XMLTAG_NODE = "node";
+
+ //___________________________________________
+ // private const
+
+ /** a static list of all possible separators, which can be used for configuration type string-list. */
+ private static final java.lang.String[] DELIMS = {" ", ",", ";", ".", ":", "-", "_", "#", "'", "+", "*", "~", "=", "?"};
+
+ /** index of the default separator inside list DELIMS.
+ * Its neccessary to know such default separator; because it can
+ * be supressed as xml attribute of the corresponding value tag. */
+ private static final int DEFAULT_SEPARATOR = 0;
+
+ //___________________________________________
+
+ /** analyze the structures of the given XML node and
+ * return a property set of all found sub nodes.
+ *
+ * Such properties are organized as [name, value] pairs.
+ * The type of a xml node will be detected automaticly.
+ * Following types are supported:
+ * xs:int => java.lang.Integer
+ * xs:bool => java.lang.Boolean
+ * xs:string => java.lang.String
+ * oor:string-list => java.util.LinkedList[java.lang.String]
+ * oor:set => java.util.Vector[java.lang.Object]
+ * oor:localized => java.util.HashMap[java.lang.Object]
+ *
+ * @param aNode
+ * points directly to the xml node, where we should analyze
+ * the children nodes.
+ *
+ * @return [java.util.HashMap]
+ * contains every node name as key and its string(!) as value.
+ */
+ public static java.util.HashMap convertNodeToPropSet(org.w3c.dom.Node aNode)
+ throws java.lang.Exception
+ {
+ java.util.HashMap aPropSet = new java.util.HashMap();
+
+ // get all child nodes, which seems to be properties
+ java.util.Vector lChildNodes = XMLHelper.extractChildNodesByTagName(aNode, XMLTAG_PROP);
+ java.util.Enumeration en1 = lChildNodes.elements();
+ while(en1.hasMoreElements())
+ {
+ org.w3c.dom.Node aChildNode = (org.w3c.dom.Node)en1.nextElement();
+
+ // read its name
+ java.lang.String sChildName = XMLHelper.extractNodeAttribByName(aChildNode, XMLATTRIB_OOR_NAME);
+ if (sChildName == null)
+ throw new java.io.IOException("unsupported format: could not extract child node name");
+
+ // read its type info
+ java.lang.String sChildType = XMLHelper.extractNodeAttribByName(aChildNode, XMLATTRIB_OOR_TYPE);
+ if (sChildType == null)
+ {
+ /** Special patch:
+ * If an xml tag has no type information set ... we can restore it
+ * by analyzing the already readed tag name :-)
+ * Not very nice - but it can help to read stripped xml files too. */
+ sChildType = XMLHelper.getTypeForTag(sChildName);
+ if (sChildType == null)
+ throw new java.io.IOException("unsupported format: could not extract child node type");
+ }
+
+ // read its value(s?)
+ java.util.Vector lChildValues = XMLHelper.extractChildNodesByTagName(aChildNode, XMLTAG_VALUE);
+ java.util.Enumeration en2 = lChildValues.elements();
+ int nValue = 0;
+ java.lang.Object aValue = null;
+ while(en2.hasMoreElements())
+ {
+ org.w3c.dom.Node aValueNode = (org.w3c.dom.Node)en2.nextElement();
+ java.lang.String sChildLocale = XMLHelper.extractNodeAttribByName(aValueNode, XMLATTRIB_XML_LANG);
+ boolean bLocalized = (sChildLocale != null);
+
+ ++nValue;
+
+ if (sChildType.equals(XMLTYPE_INTEGER))
+ {
+ if (!bLocalized && nValue > 1)
+ throw new java.io.IOException("unsupported format: more then one value for non localized but atomic type detected");
+ java.lang.String sData = ((org.w3c.dom.CharacterData)aValueNode.getFirstChild()).getData();
+ aValue = new java.lang.Integer(sData);
+ }
+ else
+ if (sChildType.equals(XMLTYPE_BOOLEAN))
+ {
+ if (!bLocalized && nValue > 1)
+ throw new java.io.IOException("unsupported format: more then one value for non localized but atomic type detected");
+ java.lang.String sData = ((org.w3c.dom.CharacterData)aValueNode.getFirstChild()).getData();
+ aValue = new java.lang.Boolean(sData);
+ }
+ else
+ if (sChildType.equals(XMLTYPE_STRING))
+ {
+ if (!bLocalized && nValue > 1)
+ throw new java.io.IOException("unsupported format: more then one value for non localized but atomic type detected");
+
+ java.lang.String sData = ((org.w3c.dom.CharacterData)aValueNode.getFirstChild()).getData();
+
+ java.util.HashMap lLocalized = null;
+ if (bLocalized)
+ {
+ if (aValue == null)
+ aValue = new java.util.HashMap();
+ lLocalized = (java.util.HashMap)aValue;
+ lLocalized.put(sChildLocale, sData);
+ }
+ else
+ aValue = sData;
+ }
+ else
+ if (sChildType.equals(XMLTYPE_STRINGLIST))
+ {
+ if (!bLocalized && nValue > 1)
+ throw new java.io.IOException("unsupported format: more then one value for non localized but atomic type detected");
+
+ java.lang.String sSeparator = XMLHelper.extractNodeAttribByName(aChildNode, XMLATTRIB_OOR_SEPARATOR);
+ if (sSeparator == null)
+ sSeparator = " ";
+
+ java.lang.String sData = ((org.w3c.dom.CharacterData)aValueNode.getFirstChild()).getData();
+ sData = sData.replace('\t', ' ');
+ sData = sData.replace('\n', ' ');
+ java.util.StringTokenizer aTokenizer = new java.util.StringTokenizer(sData, sSeparator);
+ java.util.Vector lList = new java.util.Vector();
+ while(aTokenizer.hasMoreTokens())
+ {
+ java.lang.String sToken = (java.lang.String)aTokenizer.nextToken();
+ sToken.trim();
+ if (sToken.length() < 1)
+ continue;
+ lList.add(sToken);
+ }
+ aValue = lList;
+ }
+
+ aPropSet.put(sChildName, aValue);
+ }
+ }
+
+ return aPropSet;
+ }
+
+ //___________________________________________
+
+ private static java.lang.String getTypeForTag(java.lang.String sTag)
+ {
+ java.lang.String sType = null;
+
+ if (
+ (sTag.equals(Cache.PROPNAME_DATA )) ||
+ (sTag.equals(Cache.PROPNAME_NAME )) ||
+ (sTag.equals(Cache.PROPNAME_UINAME )) ||
+ (sTag.equals(Cache.PROPNAME_MEDIATYPE )) ||
+ (sTag.equals(Cache.PROPNAME_CLIPBOARDFORMAT )) ||
+ (sTag.equals(Cache.PROPNAME_PREFERREDFILTER )) ||
+ (sTag.equals(Cache.PROPNAME_DETECTSERVICE )) ||
+ (sTag.equals(Cache.PROPNAME_FRAMELOADER )) ||
+ (sTag.equals(Cache.PROPNAME_CONTENTHANDLER )) ||
+ (sTag.equals(Cache.PROPNAME_DOCUMENTSERVICE )) ||
+ (sTag.equals(Cache.PROPNAME_FILTERSERVICE )) ||
+ (sTag.equals(Cache.PROPNAME_TEMPLATENAME )) ||
+ (sTag.equals(Cache.PROPNAME_TYPE )) ||
+ (sTag.equals(Cache.PROPNAME_UICOMPONENT ))
+ )
+ sType = XMLTYPE_STRING;
+ else
+ if (
+ (sTag.equals(Cache.PROPNAME_PREFERRED )) ||
+ (sTag.equals("Installed" ))
+ )
+ sType = XMLTYPE_BOOLEAN;
+ else
+ if (
+ (sTag.equals(Cache.PROPNAME_UIORDER )) ||
+ (sTag.equals(Cache.PROPNAME_DOCUMENTICONID )) ||
+ (sTag.equals(Cache.PROPNAME_FILEFORMATVERSION))
+ )
+ sType = XMLTYPE_INTEGER;
+ else
+ if (
+ (sTag.equals(Cache.PROPNAME_URLPATTERN )) ||
+ (sTag.equals(Cache.PROPNAME_EXTENSIONS )) ||
+ (sTag.equals(Cache.PROPNAME_USERDATA )) ||
+ (sTag.equals(Cache.PROPNAME_FLAGS )) ||
+ (sTag.equals(Cache.PROPNAME_TYPES ))
+ )
+ sType = XMLTYPE_STRINGLIST;
+
+ if (sType == null)
+ System.err.println("getTypeForTag("+sTag+") = "+sType);
+
+ return sType;
+ }
+
+ //___________________________________________
+
+ /** return a xml representation of the given property set.
+ *
+ * @param aPropSet
+ * a set of <name,value> pairs, which should be translated to xml
+ *
+ * @return [java.lang.String]
+ * the xml string representation.
+ *
+ * @throws [java.lang.Exception]
+ * if anything during convertion fill fail.
+ */
+ public static java.lang.String convertPropSetToXML(java.util.HashMap aPropSet ,
+ int nPrettyTabs)
+ throws java.lang.Exception
+ {
+ java.lang.StringBuffer sXML = new java.lang.StringBuffer(256);
+
+ java.util.Iterator it1 = aPropSet.keySet().iterator();
+ while(it1.hasNext())
+ {
+ java.lang.String sProp = (java.lang.String)it1.next();
+ java.lang.Object aVal = aPropSet.get(sProp);
+
+ sProp = encodeHTMLSigns(sProp);
+
+ // is it a simple type?
+ if (
+ (aVal instanceof java.lang.Integer) ||
+ (aVal instanceof java.lang.Boolean) ||
+ (aVal instanceof java.lang.String )
+ )
+ {
+ sXML.append(XMLHelper.convertSimpleObjectToXML(sProp, aVal, nPrettyTabs));
+ continue;
+ }
+
+ // no!
+ // is it a list value?
+ if (aVal instanceof java.util.Vector)
+ {
+ java.util.Vector lVal = (java.util.Vector)aVal;
+ sXML.append(XMLHelper.convertListToXML(sProp, lVal, nPrettyTabs));
+ continue;
+ }
+
+ // its a localized value?
+ if (aVal instanceof java.util.HashMap)
+ {
+ java.util.HashMap lVal = (java.util.HashMap)aVal;
+ sXML.append(XMLHelper.convertLocalizedValueToXML(sProp, lVal, nPrettyTabs));
+ continue;
+ }
+
+ // unknown type!
+ java.lang.StringBuffer sMsg = new java.lang.StringBuffer(256);
+ sMsg.append("unsupported object type detected.");
+ sMsg.append("\ttype ? : \""+sProp+"\" = "+aVal);
+ sMsg.append("\tprop set: \""+aPropSet );
+ throw new java.lang.Exception(sMsg.toString());
+ }
+
+ return sXML.toString();
+ }
+
+ public static java.lang.String encodeHTMLSigns(java.lang.String sValue)
+ {
+ java.lang.StringBuffer sSource = new java.lang.StringBuffer(sValue);
+ java.lang.StringBuffer sDestination = new java.lang.StringBuffer(1000 );
+
+ for (int i=0; i<sSource.length(); ++i)
+ {
+ char c = sSource.charAt(i);
+ if (c == '&')
+ sDestination.append("&amp;");
+ else
+ sDestination.append(c);
+ }
+
+ java.lang.String sReturn = sDestination.toString();
+ if (!sReturn.equals(sValue))
+ System.out.println("encode \""+sValue+"\" => \""+sReturn+"\"");
+
+ return sReturn;
+ }
+
+ //___________________________________________
+
+ /** return a xml representation of an atomic property.
+ *
+ * Atomic property types are e.g. Integer, Boolean, String.
+ *
+ * @param sName
+ * the name of the property.
+
+ * @param aValue
+ * the value of the property.
+ *
+ * @param nPrettyTabs
+ * count of tab signs for pretty format the xml code :-)
+ *
+ * @return [java.lang.String]
+ * the xml string representation.
+ *
+ * @throws [java.lang.Exception]
+ * if anything during convertion fill fail.
+ */
+ private static java.lang.String convertSimpleObjectToXML(java.lang.String sName ,
+ java.lang.Object aValue ,
+ int nPrettyTabs)
+ throws java.lang.Exception
+ {
+ java.lang.StringBuffer sXML = new java.lang.StringBuffer(256);
+ for (int t=0; t<nPrettyTabs; ++t)
+ sXML.append("\t");
+
+ if (aValue instanceof java.lang.Integer)
+ {
+ sXML.append("<prop "+XMLATTRIB_OOR_NAME+"=\""+sName+"\">");
+ sXML.append("<value>"+aValue.toString()+"</value>");
+ sXML.append("</prop>\n");
+ }
+ else
+ if (aValue instanceof java.lang.Boolean)
+ {
+ sXML.append("<prop "+XMLATTRIB_OOR_NAME+"=\""+sName+"\">");
+ sXML.append("<value>"+aValue.toString()+"</value>");
+ sXML.append("</prop>\n");
+ }
+ else
+ if (aValue instanceof java.lang.String)
+ {
+ sXML.append("<prop "+XMLATTRIB_OOR_NAME+"=\""+sName+"\"");
+ java.lang.String sValue = (java.lang.String)aValue;
+
+ sValue = encodeHTMLSigns(sValue);
+
+ if (sValue.length() < 1)
+ sXML.append("/>\n");
+ else
+ {
+ sXML.append("><value>"+sValue+"</value>");
+ sXML.append("</prop>\n");
+ }
+ }
+ else
+ {
+ System.err.println("name = "+sName);
+ System.err.println("value = "+aValue);
+ // ! can be used outside to detect - that it was not a simple type :-)
+ throw new java.lang.Exception("not an atomic type.");
+ }
+
+ return sXML.toString();
+ }
+
+ //___________________________________________
+
+ /** return a xml representation of a string-list property.
+ *
+ * @param sName
+ * the name of the property.
+
+ * @param aValue
+ * the value of the property.
+ *
+ * @param nPrettyTabs
+ * count of tab signs for pretty format the xml code :-)
+ *
+ * @return [java.lang.String]
+ * the xml string representation.
+ *
+ * @throws [java.lang.Exception]
+ * if anything during convertion fill fail.
+ */
+ private static java.lang.String convertListToXML(java.lang.String sName ,
+ java.util.Vector aValue ,
+ int nPrettyTabs)
+ throws java.lang.Exception
+ {
+ java.lang.StringBuffer sXML = new java.lang.StringBuffer(256);
+
+ for (int t=0; t<nPrettyTabs; ++t)
+ sXML.append("\t");
+
+ int c = aValue.size();
+ if (c < 1)
+ {
+ sXML.append("<prop "+XMLATTRIB_OOR_NAME+"=\""+sName+"\"/>\n");
+ return sXML.toString();
+ }
+
+ // step over all list items and add it to a string buffer
+ // Every item will be separated by a default separator "\n" first.
+ // Because "\n" is not a valid separator at all and can`t occure inside
+ // our list items. During we step over all items, we check if our current separator
+ // (we use a list of possible ones!) clash with an item.
+ // If it clash - we step to the next possible separator.
+ // If our list of possible separator values runs out of range we throw
+ // an exception :-) Its better then generating of wrong values
+ // If we found a valid seperator - we use it to replace our "\n" place holder
+ // at the end of the following loop ...
+
+ int d = 0;
+ java.lang.StringBuffer sValBuff = new java.lang.StringBuffer(256);
+ for (int i=0; i<c; ++i)
+ {
+ // get the next list item
+ java.lang.Object aItem = aValue.get(i);
+ if (!(aItem instanceof java.lang.String))
+ throw new java.lang.Exception("Current implementation supports string-list only!");
+
+ java.lang.String sValue = (java.lang.String)aItem;
+
+ sValue = encodeHTMLSigns(sValue);
+
+ // append item with default separator, which isn a valid separator at all
+ // But supress adding of the separator if last element is reached.
+ sValBuff.append(sValue);
+ if (i<(c-1))
+ sValBuff.append("\n");
+
+ // check for delim clash
+ // Attention: An empty (means default) element forbid using
+ // of a whitespace character as separator!
+ while(true)
+ {
+ if (d >= DELIMS.length)
+ throw new java.lang.Exception("No valid separator found for a string list item.");
+ if (sValue.length() < 1 && DELIMS[d].equals(" "))
+ {
+ ++d;
+ continue;
+ }
+ if (sValue.indexOf(DELIMS[d]) != -1)
+ {
+ ++d;
+ continue;
+ }
+ break;
+ }
+ }
+
+ // replace default separator with right one
+ System.out.println("TODO: must be adapted to java 1.3 :-(");
+ System.exit(-1);
+//TODO_JAVA java.lang.String sListVal = sValBuff.toString().replaceAll("\n", DELIMS[d]);
+ java.lang.String sListVal = null;
+
+ sXML.append("<prop "+XMLATTRIB_OOR_NAME+"=\""+sName+"\">");
+ if (d == DEFAULT_SEPARATOR)
+ sXML.append("<value>");
+ else
+ sXML.append("<value "+XMLATTRIB_OOR_SEPARATOR+"=\""+DELIMS[d]+"\">");
+ sXML.append(sListVal);
+ sXML.append("</value>");
+ sXML.append("</prop>\n");
+
+ return sXML.toString();
+ }
+
+ //___________________________________________
+
+ /** return a xml representation of a localized property.
+ *
+ * @param sName
+ * the name of the property.
+
+ * @param aValue
+ * the value of the property.
+ *
+ * @param nPrettyTabs
+ * count of tab signs for pretty format the xml code :-)
+ *
+ * @return [java.lang.String]
+ * the xml string representation.
+ *
+ * @throws [java.lang.Exception]
+ * if anything during convertion fill fail.
+ */
+ private static java.lang.String convertLocalizedValueToXML(java.lang.String sName ,
+ java.util.HashMap aValue ,
+ int nPrettyTabs)
+ throws java.lang.Exception
+ {
+ java.lang.StringBuffer sXML = new java.lang.StringBuffer(256);
+
+ int c = aValue.size();
+ if (c < 1)
+ throw new java.lang.Exception("Cant detect type of localized values. Because the given list is empty.");
+
+ for (int t=0; t<nPrettyTabs; ++t)
+ sXML.append("\t");
+ // !Our localized values must be formated at a deeper coloum
+ // then its property name!
+ ++nPrettyTabs;
+
+ sXML.append("<prop "+XMLATTRIB_OOR_NAME+"=\""+sName+"\">\n");
+ java.util.Iterator it = aValue.keySet().iterator();
+// boolean bTypeKnown = false;
+ while(it.hasNext())
+ {
+ java.lang.String sLocale = (java.lang.String)it.next();
+ java.lang.Object aLocalizedValue = aValue.get(sLocale);
+/*
+ if (!bTypeKnown)
+ {
+ bTypeKnown = true;
+ if (aLocalizedValue instanceof java.lang.Integer)
+ sXML.append(" "+XMLATTRIB_OOR_TYPE+"=\""+XMLTYPE_INTEGER+"\">\n");
+ else
+ if (aLocalizedValue instanceof java.lang.Boolean)
+ sXML.append(" "+XMLATTRIB_OOR_TYPE+"=\""+XMLTYPE_BOOLEAN+"\">\n");
+ else
+ if (aLocalizedValue instanceof java.lang.String)
+ sXML.append(" "+XMLATTRIB_OOR_TYPE+"=\""+XMLTYPE_STRING+"\">\n");
+ else
+ throw new java.lang.Exception("Unsupported type for localized value detected.");
+ }
+*/
+ java.lang.String sLocValue = aLocalizedValue.toString();
+ java.lang.String sValue = encodeHTMLSigns(sLocValue);
+
+ for (int t=0; t<nPrettyTabs; ++t)
+ sXML.append("\t");
+ sXML.append("<value "+XMLATTRIB_XML_LANG+"=\""+sLocale+"\">"+sValue+"</value>\n");
+ }
+ --nPrettyTabs;
+ for (int t=0; t<nPrettyTabs; ++t)
+ sXML.append("\t");
+ sXML.append("</prop>\n");
+
+ return sXML.toString();
+ }
+
+ //___________________________________________
+
+ /** returns the value of an attribute of the given node.
+ *
+ * If the given node represent an lement node, may it supports some attributes.
+ * Then this method search for an attribute with the specified name and return it's value.
+ * If nothing could be found ... or the given node isn't a suitable node ... it returns null.
+ *
+ * @param aNode
+ * the node, which should be analyzed.
+ *
+ * @param sAttrib
+ * name of the attribute, which should be searched.
+ *
+ * @return The value of the specified attribute if it could be found at the given node.
+ * Can be null if node doesn't support attributes or the searched one does not exist there.
+ */
+ public static java.lang.String extractNodeAttribByName(org.w3c.dom.Node aNode ,
+ java.lang.String sAttrib)
+ throws java.lang.Exception
+ {
+ // We can get valid attributes for element nodes only!
+ if (aNode.getNodeType() != org.w3c.dom.Node.ELEMENT_NODE)
+ {
+// System.err.println("not an element node");
+ return null;
+ }
+
+ // may it supports attributes in general ... but doesn't have anyone realy.
+ org.w3c.dom.NamedNodeMap lAttribs = aNode.getAttributes();
+ if (lAttribs==null)
+ {
+// System.err.println("no attributes at all");
+ return null;
+ }
+
+ // step over the attribute list and search for the requested one
+ for (int i=0; i<lAttribs.getLength(); ++i)
+ {
+ org.w3c.dom.Attr aAttrib = (org.w3c.dom.Attr)lAttribs.item(i);
+ if (aAttrib.getName().equals(sAttrib))
+ {
+ java.lang.String sValue = aAttrib.getValue();
+ return sValue;
+ }
+ }
+
+ // the searched attribute was not found!
+// System.err.println("required attribute \""+sAttrib+"\" does not exist for node ["+aNode.toString()+"]");
+ return null;
+ }
+
+ //___________________________________________
+
+ /** returns a list of childs, which are ELEMENT_NODES and have the right tag name.
+ *
+ * It analyze the list of all possible child nodes. Only ELEMENT_NODES are candidates.
+ * All other ones will be ignored. Further these element nodes are compared by it's tag
+ * names. If it match with the specified value it's added to the return list.
+ * So the return list includes references to the DOM tree nodes only, which are child
+ * element nodes with the right tag name.
+ *
+ * @param aNode
+ * provides access to the child nodes, which should be analyzed
+ *
+ * @param sTag
+ * the searched tag name.
+ *
+ * @return A list of child nodes, which are element nodes and have the right tag name.
+ */
+ public static java.util.Vector extractChildNodesByTagName(org.w3c.dom.Node aNode,
+ java.lang.String sTag )
+ {
+ // extract first all ELEMENT_NODES of he given parent
+ // Such nodes only provide tag names.
+ java.util.Vector lChilds = XMLHelper.extractChildNodesByType(aNode,org.w3c.dom.Node.ELEMENT_NODE);
+ java.util.Vector lExtractedChilds = new java.util.Vector(lChilds.size());
+
+ // step over the list and search for the right tags using the specified name
+ java.util.Enumeration en = lChilds.elements();
+ while (en.hasMoreElements())
+ {
+ org.w3c.dom.Node aChild = (org.w3c.dom.Node)en.nextElement();
+ if (aChild.getNodeName().equals(sTag))
+ lExtractedChilds.add(aChild);
+ }
+
+ // pack(!) and return the list
+ lExtractedChilds.trimToSize();
+ return lExtractedChilds;
+ }
+
+ //___________________________________________
+
+ /** returns a list of childs, which supports the right node type.
+ *
+ * It analyze the list of all possible child nodes. If a node represent the right node type
+ * it is added to the return list. Otherwhise it will be ignored.
+ *
+ * @param aNode
+ * provides access to the list of possible children nodes.
+ *
+ * @param nType
+ * represent the searched node type.
+ * Possible values are constant fields of a org.w3c.dom.Node - e.g. org.w3c.dom.Node.ELEMENT_NODE.
+ *
+ * @return A list of child nodes, which provides the right node type.
+ */
+ public static java.util.Vector extractChildNodesByType(org.w3c.dom.Node aNode,
+ short nType)
+ {
+ // get list of all possibe childs and reserve enough space for our return list
+ // Attention: A null pointer is not allowed for return! (means lExtractedChilds)
+ org.w3c.dom.NodeList lChilds = aNode.getChildNodes();
+ int c = lChilds.getLength();
+ java.util.Vector lExtractedChilds = new java.util.Vector(c);
+
+ // step of these childs and select only needed ones
+ for (int i=0; i<c; ++i)
+ {
+ org.w3c.dom.Node aChild = lChilds.item(i);
+ if (aChild.getNodeType() == nType)
+ lExtractedChilds.add(aChild);
+ }
+
+ // pack(!) and return the list
+ lExtractedChilds.trimToSize();
+ return lExtractedChilds;
+ }
+
+ //___________________________________________
+
+ /** generates an xml header, using parameters.
+ *
+ * @param sVersion
+ * number of the xml version.
+ *
+ * @param sEncoding
+ * used file encoding.
+ *
+ * @param sPath
+ * name of the configuration root.
+ *
+ * @param sPackage
+ * name of the configuration package.
+ *
+ * @param bLanguagepack
+ * force creation of a special header,
+ * which is needed for language packs only.
+ *
+ * @return [java.lang.String]
+ * the generated xml header.
+
+*/
+ public static java.lang.String generateHeader(java.lang.String sVersion ,
+ java.lang.String sEncoding ,
+ java.lang.String sPath ,
+ java.lang.String sPackage ,
+ boolean bLanguagePack)
+ {
+ java.lang.StringBuffer sHeader = new java.lang.StringBuffer(256);
+
+ if (bLanguagePack)
+ {
+ sHeader.append("<?xml version=\"");
+ sHeader.append(sVersion);
+ sHeader.append("\" encoding=\"");
+ sHeader.append(sEncoding);
+ sHeader.append("\"?>\n");
+ sHeader.append("<oor:component-data oor:package=\"");
+ sHeader.append(sPath);
+ sHeader.append("\" oor:name=\"");
+ sHeader.append(sPackage);
+ sHeader.append("\" xmlns:install=\"http://openoffice.org/2004/installation\"");
+ sHeader.append(" xmlns:oor=\"http://openoffice.org/2001/registry\"");
+ sHeader.append(" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"");
+ sHeader.append(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n");
+ }
+ else
+ {
+ sHeader.append("<?xml version=\"");
+ sHeader.append(sVersion);
+ sHeader.append("\" encoding=\"");
+ sHeader.append(sEncoding);
+ sHeader.append("\"?>\n<!DOCTYPE oor:component-data SYSTEM \"../../../../component-update.dtd\">\n");
+ sHeader.append("<oor:component-data xmlns:oor=\"http://openoffice.org/2001/registry\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" oor:package=\"");
+ sHeader.append(sPath);
+ sHeader.append("\" oor:name=\"");
+ sHeader.append(sPackage);
+ sHeader.append("\">\n");
+ }
+
+ return sHeader.toString();
+ }
+
+ public static java.lang.String generateFooter()
+ {
+ return "</oor:component-data>\n";
+ }
+}
diff --git a/l10ntools/source/filter/utils/makefile.mk b/l10ntools/source/filter/utils/makefile.mk
new file mode 100644
index 000000000000..4025c54b2c38
--- /dev/null
+++ b/l10ntools/source/filter/utils/makefile.mk
@@ -0,0 +1,57 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.9.98.2 $
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ = ..$/..$/..
+TARGET = FCFGUtils
+PRJNAME = l10ntools
+PACKAGE = com$/sun$/star$/filter$/config$/tools$/utils
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE: settings.mk
+
+#----- compile .java files -----------------------------------------
+
+
+JAVACLASSFILES = \
+ $(CLASSDIR)$/$(PACKAGE)$/AnalyzeStartupLog.class \
+ $(CLASSDIR)$/$(PACKAGE)$/ConfigHelper.class \
+ $(CLASSDIR)$/$(PACKAGE)$/Logger.class \
+ $(CLASSDIR)$/$(PACKAGE)$/FileHelper.class \
+ $(CLASSDIR)$/$(PACKAGE)$/MalformedCommandLineException.class \
+ $(CLASSDIR)$/$(PACKAGE)$/Cache.class \
+ $(CLASSDIR)$/$(PACKAGE)$/XMLHelper.class
+
+MAXLINELENGTH = 100000
+
+# --- targets -----------------------------------------------------
+
+.INCLUDE : target.mk