/************************************************************** * * 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=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; f0) 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= 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."); } }