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("&");
+ 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