You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by ja...@apache.org on 2013/01/24 13:21:39 UTC

svn commit: r1437973 [5/11] - in /openoffice/branches/l10n/main/l10ntools/source: ./ filter/ filter/merge/ filter/utils/ help/

Propchange: openoffice/branches/l10n/main/l10ntools/source/filter/utils/Cache.java
------------------------------------------------------------------------------
    svn:executable = *

Added: openoffice/branches/l10n/main/l10ntools/source/filter/utils/ConfigHelper.java
URL: http://svn.apache.org/viewvc/openoffice/branches/l10n/main/l10ntools/source/filter/utils/ConfigHelper.java?rev=1437973&view=auto
==============================================================================
--- openoffice/branches/l10n/main/l10ntools/source/filter/utils/ConfigHelper.java (added)
+++ openoffice/branches/l10n/main/l10ntools/source/filter/utils/ConfigHelper.java Thu Jan 24 12:21:38 2013
@@ -0,0 +1,296 @@
+/**************************************************************
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ *************************************************************/
+
+
+
+package com.sun.star.filter.config.tools.utils;
+
+//_______________________________________________
+// 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;
+    }
+}

Propchange: openoffice/branches/l10n/main/l10ntools/source/filter/utils/ConfigHelper.java
------------------------------------------------------------------------------
    svn:executable = *

Added: openoffice/branches/l10n/main/l10ntools/source/filter/utils/FileHelper.java
URL: http://svn.apache.org/viewvc/openoffice/branches/l10n/main/l10ntools/source/filter/utils/FileHelper.java?rev=1437973&view=auto
==============================================================================
--- openoffice/branches/l10n/main/l10ntools/source/filter/utils/FileHelper.java (added)
+++ openoffice/branches/l10n/main/l10ntools/source/filter/utils/FileHelper.java Thu Jan 24 12:21:38 2013
@@ -0,0 +1,759 @@
+/**************************************************************
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ *************************************************************/
+
+
+
+package com.sun.star.filter.config.tools.utils;
+
+// __________ 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.");
+    }
+}

Propchange: openoffice/branches/l10n/main/l10ntools/source/filter/utils/FileHelper.java
------------------------------------------------------------------------------
    svn:executable = *

Added: openoffice/branches/l10n/main/l10ntools/source/filter/utils/Logger.java
URL: http://svn.apache.org/viewvc/openoffice/branches/l10n/main/l10ntools/source/filter/utils/Logger.java?rev=1437973&view=auto
==============================================================================
--- openoffice/branches/l10n/main/l10ntools/source/filter/utils/Logger.java (added)
+++ openoffice/branches/l10n/main/l10ntools/source/filter/utils/Logger.java Thu Jan 24 12:21:38 2013
@@ -0,0 +1,170 @@
+/**************************************************************
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ *************************************************************/
+
+
+
+package com.sun.star.filter.config.tools.utils;
+
+//_______________________________________________
+// 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+"\"");
+    }
+}

Propchange: openoffice/branches/l10n/main/l10ntools/source/filter/utils/Logger.java
------------------------------------------------------------------------------
    svn:executable = *

Added: openoffice/branches/l10n/main/l10ntools/source/filter/utils/MalformedCommandLineException.java
URL: http://svn.apache.org/viewvc/openoffice/branches/l10n/main/l10ntools/source/filter/utils/MalformedCommandLineException.java?rev=1437973&view=auto
==============================================================================
--- openoffice/branches/l10n/main/l10ntools/source/filter/utils/MalformedCommandLineException.java (added)
+++ openoffice/branches/l10n/main/l10ntools/source/filter/utils/MalformedCommandLineException.java Thu Jan 24 12:21:38 2013
@@ -0,0 +1,43 @@
+/**************************************************************
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ *************************************************************/
+
+
+
+package com.sun.star.filter.config.tools.utils;
+
+//_______________________________________________
+// 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); }
+}

Propchange: openoffice/branches/l10n/main/l10ntools/source/filter/utils/MalformedCommandLineException.java
------------------------------------------------------------------------------
    svn:executable = *

Added: openoffice/branches/l10n/main/l10ntools/source/filter/utils/XMLHelper.java
URL: http://svn.apache.org/viewvc/openoffice/branches/l10n/main/l10ntools/source/filter/utils/XMLHelper.java?rev=1437973&view=auto
==============================================================================
--- openoffice/branches/l10n/main/l10ntools/source/filter/utils/XMLHelper.java (added)
+++ openoffice/branches/l10n/main/l10ntools/source/filter/utils/XMLHelper.java Thu Jan 24 12:21:38 2013
@@ -0,0 +1,818 @@
+/**************************************************************
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ *************************************************************/
+
+
+
+package com.sun.star.filter.config.tools.utils;
+
+//_______________________________________________
+
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+
+//_______________________________________________
+
+/**
+ *  It provides some constant values and some static helper routines
+ *  which are neccessary to work with a xml file - especialy
+ *  the filter configuration.
+ *
+ *
+ */
+public class XMLHelper
+{
+    //___________________________________________
+    // public const
+
+    /** its a possible value of the xml attribute "oor:type" and identify an integer type. */
+    public static final java.lang.String XMLTYPE_INTEGER = "xs:int";
+
+    /** its a possible value of the xml attribute "oor:type" and identify an boolean type. */
+    public static final java.lang.String XMLTYPE_BOOLEAN = "xs:boolean";
+
+    /** its a possible value of the xml attribute "oor:type" and identify an string type. */
+    public static final java.lang.String XMLTYPE_STRING = "xs:string";
+
+    /** its a possible value of the xml attribute "oor:type" and identify an string list type. */
+    public static final java.lang.String XMLTYPE_STRINGLIST = "oor:string-list";
+
+    /** its a xml attribute, which specify a property name. */
+    public static final java.lang.String XMLATTRIB_OOR_NAME = "oor:name";
+
+    /** its a xml attribute, which specify a property type. */
+    public static final java.lang.String XMLATTRIB_OOR_TYPE = "oor:type";
+
+    /** its a xml attribute, which specify a list separator. */
+    public static final java.lang.String XMLATTRIB_OOR_SEPARATOR = "oor:separator";
+
+    /** its a xml attribute, which specify a localized value. */
+    public static final java.lang.String XMLATTRIB_OOR_LOCALIZED = "oor:localized";
+
+    /** its a xml attribute, which specify a merge operation for cfg layering. */
+    public static final java.lang.String XMLATTRIB_OOR_OP = "oor:op";
+
+    /** can be used as value for XMLATTRIB_OOR_OP. */
+    public static final java.lang.String XMLATTRIB_OP_REPLACE = "replace";
+
+    /** its a xml attribute, which specify a locale value. */
+    public static final java.lang.String XMLATTRIB_XML_LANG = "xml:lang";
+
+    /** its the tag name of a <value ...> entry. */
+    public static final java.lang.String XMLTAG_VALUE = "value";
+
+    /** its the tag name of a <prop ...> entry. */
+    public static final java.lang.String XMLTAG_PROP = "prop";
+
+    /** its the tag name of a <node ...> entry. */
+    public static final java.lang.String XMLTAG_NODE = "node";
+
+    //___________________________________________
+    // private const
+
+    /** a static list of all possible separators, which can be used for configuration type string-list. */
+    private static final java.lang.String[] DELIMS = {" ", ",", ";", ".", ":", "-", "_", "#", "'", "+", "*", "~", "=", "?"};
+
+    /** index of the default separator inside list DELIMS.
+     *  Its neccessary to know such default separator; because it can
+     *  be supressed as xml attribute of the corresponding value tag. */
+    private static final int DEFAULT_SEPARATOR = 0;
+
+    //___________________________________________
+
+    /** analyze the structures of the given XML node and
+     *  return a property set of all found sub nodes.
+     *
+     *  Such properties are organized as [name, value] pairs.
+     *  The type of a xml node will be detected automaticly.
+     *  Following types are supported:
+     *      xs:int          => java.lang.Integer
+     *      xs:bool         => java.lang.Boolean
+     *      xs:string       => java.lang.String
+     *      oor:string-list => java.util.LinkedList[java.lang.String]
+     *      oor:set         => java.util.Vector[java.lang.Object]
+     *      oor:localized   => java.util.HashMap[java.lang.Object]
+     *
+     *  @param  aNode
+     *          points directly to the xml node, where we should analyze
+     *          the children nodes.
+     *
+     *  @return [java.util.HashMap]
+     *          contains every node name as key and its string(!) as value.
+     */
+    public static java.util.HashMap convertNodeToPropSet(org.w3c.dom.Node aNode)
+        throws java.lang.Exception
+    {
+        java.util.HashMap aPropSet = new java.util.HashMap();
+
+        // get all child nodes, which seems to be properties
+        java.util.Vector      lChildNodes = XMLHelper.extractChildNodesByTagName(aNode, XMLTAG_PROP);
+        java.util.Enumeration en1         = lChildNodes.elements();
+        while(en1.hasMoreElements())
+        {
+            org.w3c.dom.Node aChildNode = (org.w3c.dom.Node)en1.nextElement();
+
+            // read its name
+            java.lang.String sChildName = XMLHelper.extractNodeAttribByName(aChildNode, XMLATTRIB_OOR_NAME);
+            if (sChildName == null)
+                throw new java.io.IOException("unsupported format: could not extract child node name");
+
+            // read its type info
+            java.lang.String sChildType = XMLHelper.extractNodeAttribByName(aChildNode, XMLATTRIB_OOR_TYPE);
+            if (sChildType == null)
+            {
+                /** Special patch:
+                 *      If an xml tag has no type information set ... we can restore it
+                 *      by analyzing the already readed tag name :-)
+                 *      Not very nice - but it can help to read stripped xml files too. */
+                sChildType = XMLHelper.getTypeForTag(sChildName);
+                if (sChildType == null)
+                    throw new java.io.IOException("unsupported format: could not extract child node type");
+            }
+
+            // read its value(s?)
+            java.util.Vector      lChildValues = XMLHelper.extractChildNodesByTagName(aChildNode, XMLTAG_VALUE);
+            java.util.Enumeration en2          = lChildValues.elements();
+            int                   nValue       = 0;
+            java.lang.Object      aValue       = null;
+            while(en2.hasMoreElements())
+            {
+                org.w3c.dom.Node aValueNode   = (org.w3c.dom.Node)en2.nextElement();
+                java.lang.String sChildLocale = XMLHelper.extractNodeAttribByName(aValueNode, XMLATTRIB_XML_LANG);
+                boolean          bLocalized   = (sChildLocale != null);
+
+                ++nValue;
+
+                if (sChildType.equals(XMLTYPE_INTEGER))
+                {
+                    if (!bLocalized && nValue > 1)
+                        throw new java.io.IOException("unsupported format: more then one value for non localized but atomic type detected");
+                    java.lang.String sData = ((org.w3c.dom.CharacterData)aValueNode.getFirstChild()).getData();
+                    aValue = new java.lang.Integer(sData);
+                }
+                else
+                if (sChildType.equals(XMLTYPE_BOOLEAN))
+                {
+                    if (!bLocalized && nValue > 1)
+                        throw new java.io.IOException("unsupported format: more then one value for non localized but atomic type detected");
+                    java.lang.String sData = ((org.w3c.dom.CharacterData)aValueNode.getFirstChild()).getData();
+                    aValue = new java.lang.Boolean(sData);
+                }
+                else
+                if (sChildType.equals(XMLTYPE_STRING))
+                {
+                    if (!bLocalized && nValue > 1)
+                        throw new java.io.IOException("unsupported format: more then one value for non localized but atomic type detected");
+
+                    java.lang.String sData = ((org.w3c.dom.CharacterData)aValueNode.getFirstChild()).getData();
+
+                    java.util.HashMap lLocalized = null;
+                    if (bLocalized)
+                    {
+                        if (aValue == null)
+                            aValue = new java.util.HashMap();
+                        lLocalized = (java.util.HashMap)aValue;
+                        lLocalized.put(sChildLocale, sData);
+                    }
+                    else
+                        aValue = sData;
+                }
+                else
+                if (sChildType.equals(XMLTYPE_STRINGLIST))
+                {
+                    if (!bLocalized && nValue > 1)
+                        throw new java.io.IOException("unsupported format: more then one value for non localized but atomic type detected");
+
+                    java.lang.String sSeparator = XMLHelper.extractNodeAttribByName(aChildNode, XMLATTRIB_OOR_SEPARATOR);
+                    if (sSeparator == null)
+                        sSeparator = " ";
+
+                    java.lang.String          sData      = ((org.w3c.dom.CharacterData)aValueNode.getFirstChild()).getData();
+                    sData = sData.replace('\t', ' ');
+                    sData = sData.replace('\n', ' ');
+                    java.util.StringTokenizer aTokenizer = new java.util.StringTokenizer(sData, sSeparator);
+                    java.util.Vector          lList      = new java.util.Vector();
+                    while(aTokenizer.hasMoreTokens())
+                    {
+                        java.lang.String sToken = (java.lang.String)aTokenizer.nextToken();
+                        sToken.trim();
+                        if (sToken.length() < 1)
+                            continue;
+                        lList.add(sToken);
+                    }
+                    aValue = lList;
+                }
+
+                aPropSet.put(sChildName, aValue);
+            }
+        }
+
+        return aPropSet;
+    }
+
+    //___________________________________________
+
+    private static java.lang.String getTypeForTag(java.lang.String sTag)
+    {
+        java.lang.String sType = null;
+
+        if (
+            (sTag.equals(Cache.PROPNAME_DATA            )) ||
+            (sTag.equals(Cache.PROPNAME_NAME            )) ||
+            (sTag.equals(Cache.PROPNAME_UINAME          )) ||
+            (sTag.equals(Cache.PROPNAME_MEDIATYPE       )) ||
+            (sTag.equals(Cache.PROPNAME_CLIPBOARDFORMAT )) ||
+            (sTag.equals(Cache.PROPNAME_PREFERREDFILTER )) ||
+            (sTag.equals(Cache.PROPNAME_DETECTSERVICE   )) ||
+            (sTag.equals(Cache.PROPNAME_FRAMELOADER     )) ||
+            (sTag.equals(Cache.PROPNAME_CONTENTHANDLER  )) ||
+            (sTag.equals(Cache.PROPNAME_DOCUMENTSERVICE )) ||
+            (sTag.equals(Cache.PROPNAME_FILTERSERVICE   )) ||
+            (sTag.equals(Cache.PROPNAME_TEMPLATENAME    )) ||
+            (sTag.equals(Cache.PROPNAME_TYPE            )) ||
+            (sTag.equals(Cache.PROPNAME_UICOMPONENT     ))
+           )
+            sType = XMLTYPE_STRING;
+        else
+        if (
+            (sTag.equals(Cache.PROPNAME_PREFERRED   )) ||
+            (sTag.equals("Installed"                ))
+           )
+            sType = XMLTYPE_BOOLEAN;
+        else
+        if (
+            (sTag.equals(Cache.PROPNAME_UIORDER          )) ||
+            (sTag.equals(Cache.PROPNAME_DOCUMENTICONID   )) ||
+            (sTag.equals(Cache.PROPNAME_FILEFORMATVERSION))
+           )
+            sType = XMLTYPE_INTEGER;
+        else
+        if (
+            (sTag.equals(Cache.PROPNAME_URLPATTERN  )) ||
+            (sTag.equals(Cache.PROPNAME_EXTENSIONS  )) ||
+            (sTag.equals(Cache.PROPNAME_USERDATA    )) ||
+            (sTag.equals(Cache.PROPNAME_FLAGS       )) ||
+            (sTag.equals(Cache.PROPNAME_TYPES       ))
+           )
+            sType = XMLTYPE_STRINGLIST;
+
+        if (sType == null)
+            System.err.println("getTypeForTag("+sTag+") = "+sType);
+
+        return sType;
+    }
+
+    //___________________________________________
+
+    /** return a xml representation of the given property set.
+     *
+     *  @param  aPropSet
+     *          a set of <name,value> pairs, which should be translated to xml
+     *
+     *  @return [java.lang.String]
+     *          the xml string representation.
+     *
+     *  @throws [java.lang.Exception]
+     *          if anything during convertion fill fail.
+     */
+    public static java.lang.String convertPropSetToXML(java.util.HashMap aPropSet   ,
+                                                       int               nPrettyTabs)
+        throws java.lang.Exception
+    {
+        java.lang.StringBuffer sXML = new java.lang.StringBuffer(256);
+
+        java.util.Iterator it1 = aPropSet.keySet().iterator();
+        while(it1.hasNext())
+        {
+            java.lang.String sProp = (java.lang.String)it1.next();
+            java.lang.Object aVal  = aPropSet.get(sProp);
+
+            sProp = encodeHTMLSigns(sProp);
+
+            // is it a simple type?
+            if (
+                (aVal instanceof java.lang.Integer) ||
+                (aVal instanceof java.lang.Boolean) ||
+                (aVal instanceof java.lang.String )
+               )
+            {
+                sXML.append(XMLHelper.convertSimpleObjectToXML(sProp, aVal, nPrettyTabs));
+                continue;
+            }
+
+            // no!
+            // is it a list value?
+            if (aVal instanceof java.util.Vector)
+            {
+                java.util.Vector lVal = (java.util.Vector)aVal;
+                sXML.append(XMLHelper.convertListToXML(sProp, lVal, nPrettyTabs));
+                continue;
+            }
+
+            // its a localized value?
+            if (aVal instanceof java.util.HashMap)
+            {
+                java.util.HashMap lVal = (java.util.HashMap)aVal;
+                sXML.append(XMLHelper.convertLocalizedValueToXML(sProp, lVal, nPrettyTabs));
+                continue;
+            }
+
+            // unknown type!
+            java.lang.StringBuffer sMsg = new java.lang.StringBuffer(256);
+            sMsg.append("unsupported object type detected.");
+            sMsg.append("\ttype ?  : \""+sProp+"\" = "+aVal);
+            sMsg.append("\tprop set: \""+aPropSet          );
+            throw new java.lang.Exception(sMsg.toString());
+        }
+
+        return sXML.toString();
+    }
+
+    public static java.lang.String encodeHTMLSigns(java.lang.String sValue)
+    {
+        java.lang.StringBuffer sSource      = new java.lang.StringBuffer(sValue);
+        java.lang.StringBuffer sDestination = new java.lang.StringBuffer(1000  );
+
+        for (int i=0; i<sSource.length(); ++i)
+        {
+            char c = sSource.charAt(i);
+            if (c == '&')
+                sDestination.append("&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");
+            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";
+    }
+}

Propchange: openoffice/branches/l10n/main/l10ntools/source/filter/utils/XMLHelper.java
------------------------------------------------------------------------------
    svn:executable = *

Added: openoffice/branches/l10n/main/l10ntools/source/filter/utils/makefile.mk
URL: http://svn.apache.org/viewvc/openoffice/branches/l10n/main/l10ntools/source/filter/utils/makefile.mk?rev=1437973&view=auto
==============================================================================
--- openoffice/branches/l10n/main/l10ntools/source/filter/utils/makefile.mk (added)
+++ openoffice/branches/l10n/main/l10ntools/source/filter/utils/makefile.mk Thu Jan 24 12:21:38 2013
@@ -0,0 +1,49 @@
+#**************************************************************
+#  
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#  
+#    http://www.apache.org/licenses/LICENSE-2.0
+#  
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+#  
+#**************************************************************
+
+
+
+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