/************************************************************** * * 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.split; //_______________________________________________ import java.lang.*; import java.util.*; import java.io.*; import com.sun.star.filter.config.tools.utils.*; //_______________________________________________ /** * Can split one xml file into its different xml fragments. * * */ public class Splitter { //___________________________________________ // const //___________________________________________ // member /** contains all real member of this instance. * That make it easy to initialize an instance * of this class inside a multi-threaded environment. */ private SplitterData m_aDataSet; //___________________________________________ // interface /** initialize a new instance of this class with all * needed resources. * * @param aDataSet * contains all needed parameters for this instance * as a complete set, which can be filled outside. */ public Splitter(SplitterData aDataSet) { m_aDataSet = aDataSet; } //___________________________________________ // interface /** generate xml fragments for all cache items. * * @throw [java.lang.Exception] * if anything will fail inside during * this operation runs. */ public synchronized void split() throws java.lang.Exception { createDirectoryStructures(); // use some statistic values to check if all cache items // will be transformed really. int nTypes = m_aDataSet.m_aCache.getItemCount(Cache.E_TYPE ); int nFilters = m_aDataSet.m_aCache.getItemCount(Cache.E_FILTER ); int nDetectServices = m_aDataSet.m_aCache.getItemCount(Cache.E_DETECTSERVICE ); int nFrameLoaders = m_aDataSet.m_aCache.getItemCount(Cache.E_FRAMELOADER ); int nContentHandlers = m_aDataSet.m_aCache.getItemCount(Cache.E_CONTENTHANDLER); // generate all type fragments m_aDataSet.m_aDebug.setGlobalInfo("generate type fragments ..."); java.util.Vector lNames = m_aDataSet.m_aCache.getItemNames(Cache.E_TYPE); java.util.Enumeration it = lNames.elements(); while(it.hasMoreElements()) generateXMLFragment(Cache.E_TYPE, (java.lang.String)it.nextElement(), m_aDataSet.m_aFragmentDirTypes); nTypes -= lNames.size(); // generate filter fragments for the writer module m_aDataSet.m_aDebug.setGlobalInfo("generate filter fragments ..."); m_aDataSet.m_aDebug.setGlobalInfo("\tfor module writer ..."); java.util.HashMap rRequestedProps = new java.util.HashMap(); rRequestedProps.put(Cache.PROPNAME_DOCUMENTSERVICE, "com.sun.star.text.TextDocument"); lNames = m_aDataSet.m_aCache.getMatchedItemNames(Cache.E_FILTER, rRequestedProps); it = lNames.elements(); while(it.hasMoreElements()) generateXMLFragment(Cache.E_FILTER, (java.lang.String)it.nextElement(), m_aDataSet.m_aFragmentDirModuleSWriter); nFilters -= lNames.size(); // generate filter fragments for the writer/web module m_aDataSet.m_aDebug.setGlobalInfo("\tfor module writer/web ..."); rRequestedProps.put(Cache.PROPNAME_DOCUMENTSERVICE, "com.sun.star.text.WebDocument"); lNames = m_aDataSet.m_aCache.getMatchedItemNames(Cache.E_FILTER, rRequestedProps); it = lNames.elements(); while(it.hasMoreElements()) generateXMLFragment(Cache.E_FILTER, (java.lang.String)it.nextElement(), m_aDataSet.m_aFragmentDirModuleSWeb); nFilters -= lNames.size(); // generate filter fragments for the writer/global module m_aDataSet.m_aDebug.setGlobalInfo("\tfor module writer/global ..."); rRequestedProps.put(Cache.PROPNAME_DOCUMENTSERVICE, "com.sun.star.text.GlobalDocument"); lNames = m_aDataSet.m_aCache.getMatchedItemNames(Cache.E_FILTER, rRequestedProps); it = lNames.elements(); while(it.hasMoreElements()) generateXMLFragment(Cache.E_FILTER, (java.lang.String)it.nextElement(), m_aDataSet.m_aFragmentDirModuleSGlobal); nFilters -= lNames.size(); // generate filter fragments for the calc module m_aDataSet.m_aDebug.setGlobalInfo("\tfor module calc ..."); rRequestedProps.put(Cache.PROPNAME_DOCUMENTSERVICE, "com.sun.star.sheet.SpreadsheetDocument"); lNames = m_aDataSet.m_aCache.getMatchedItemNames(Cache.E_FILTER, rRequestedProps); it = lNames.elements(); while(it.hasMoreElements()) generateXMLFragment(Cache.E_FILTER, (java.lang.String)it.nextElement(), m_aDataSet.m_aFragmentDirModuleSCalc); nFilters -= lNames.size(); // generate filter fragments for the draw module m_aDataSet.m_aDebug.setGlobalInfo("\tfor module draw ..."); rRequestedProps.put(Cache.PROPNAME_DOCUMENTSERVICE, "com.sun.star.drawing.DrawingDocument"); lNames = m_aDataSet.m_aCache.getMatchedItemNames(Cache.E_FILTER, rRequestedProps); it = lNames.elements(); while(it.hasMoreElements()) generateXMLFragment(Cache.E_FILTER, (java.lang.String)it.nextElement(), m_aDataSet.m_aFragmentDirModuleSDraw); nFilters -= lNames.size(); // generate filter fragments for the impress module m_aDataSet.m_aDebug.setGlobalInfo("\tfor module impress ..."); rRequestedProps.put(Cache.PROPNAME_DOCUMENTSERVICE, "com.sun.star.presentation.PresentationDocument"); lNames = m_aDataSet.m_aCache.getMatchedItemNames(Cache.E_FILTER, rRequestedProps); it = lNames.elements(); while(it.hasMoreElements()) generateXMLFragment(Cache.E_FILTER, (java.lang.String)it.nextElement(), m_aDataSet.m_aFragmentDirModuleSImpress); nFilters -= lNames.size(); // generate filter fragments for the chart module m_aDataSet.m_aDebug.setGlobalInfo("\tfor module chart ..."); rRequestedProps.put(Cache.PROPNAME_DOCUMENTSERVICE, "com.sun.star.chart2.ChartDocument"); lNames = m_aDataSet.m_aCache.getMatchedItemNames(Cache.E_FILTER, rRequestedProps); it = lNames.elements(); while(it.hasMoreElements()) generateXMLFragment(Cache.E_FILTER, (java.lang.String)it.nextElement(), m_aDataSet.m_aFragmentDirModuleSChart); nFilters -= lNames.size(); // generate filter fragments for the math module m_aDataSet.m_aDebug.setGlobalInfo("\tfor module math ..."); rRequestedProps.put(Cache.PROPNAME_DOCUMENTSERVICE, "com.sun.star.formula.FormulaProperties"); lNames = m_aDataSet.m_aCache.getMatchedItemNames(Cache.E_FILTER, rRequestedProps); it = lNames.elements(); while(it.hasMoreElements()) generateXMLFragment(Cache.E_FILTER, (java.lang.String)it.nextElement(), m_aDataSet.m_aFragmentDirModuleSMath); nFilters -= lNames.size(); // generate fragments for 3rdParty or unspecified (may graphics) filters! m_aDataSet.m_aDebug.setGlobalInfo("\tfor unknown modules ..."); rRequestedProps.put(Cache.PROPNAME_DOCUMENTSERVICE, ""); lNames = m_aDataSet.m_aCache.getMatchedItemNames(Cache.E_FILTER, rRequestedProps); it = lNames.elements(); while(it.hasMoreElements()) generateXMLFragment(Cache.E_FILTER, (java.lang.String)it.nextElement(), m_aDataSet.m_aFragmentDirModuleOthers); nFilters -= lNames.size(); // generate all detect service fragments m_aDataSet.m_aDebug.setGlobalInfo("generate detect service fragments ..."); lNames = m_aDataSet.m_aCache.getItemNames(Cache.E_DETECTSERVICE); it = lNames.elements(); while(it.hasMoreElements()) generateXMLFragment(Cache.E_DETECTSERVICE, (java.lang.String)it.nextElement(), m_aDataSet.m_aFragmentDirDetectServices); nDetectServices -= lNames.size(); // generate all frame loader fragments m_aDataSet.m_aDebug.setGlobalInfo("generate frame loader fragments ..."); lNames = m_aDataSet.m_aCache.getItemNames(Cache.E_FRAMELOADER); it = lNames.elements(); while(it.hasMoreElements()) generateXMLFragment(Cache.E_FRAMELOADER, (java.lang.String)it.nextElement(), m_aDataSet.m_aFragmentDirFrameLoaders); nFrameLoaders -= lNames.size(); // generate all content handler fragments m_aDataSet.m_aDebug.setGlobalInfo("generate content handler fragments ..."); lNames = m_aDataSet.m_aCache.getItemNames(Cache.E_CONTENTHANDLER); it = lNames.elements(); while(it.hasMoreElements()) generateXMLFragment(Cache.E_CONTENTHANDLER, (java.lang.String)it.nextElement(), m_aDataSet.m_aFragmentDirContentHandlers); nContentHandlers -= lNames.size(); // check if all cache items was handled if ( (nTypes != 0) || (nFilters != 0) || (nDetectServices != 0) || (nFrameLoaders != 0) || (nContentHandlers != 0) ) { java.lang.StringBuffer sStatistic = new java.lang.StringBuffer(256); sStatistic.append("some cache items seems to be not transformed:\n"); sStatistic.append(nTypes +" unhandled types\n" ); sStatistic.append(nFilters +" unhandled filters\n" ); sStatistic.append(nDetectServices +" unhandled detect services\n"); sStatistic.append(nFrameLoaders +" unhandled frame loader\n" ); sStatistic.append(nContentHandlers+" unhandled content handler\n"); throw new java.lang.Exception(sStatistic.toString()); } } //___________________________________________ /** generate a xml fragment file from the specified cache item. * * @param eItemType * specify, which sub container of the cache must be used * to locate the right item. * * @param sItemName * the name of the cache item inside the specified sub container. * * @param aOutDir * output directory. * * @throw [java.lang.Exception] * if the fragment file already exists or could not be created * successfully. */ private void generateXMLFragment(int eItemType, java.lang.String sItemName, java.io.File aOutDir ) throws java.lang.Exception { java.lang.String sFileName = FileHelper.convertName2FileName(sItemName); java.lang.String sXML = m_aDataSet.m_aCache.getItemAsXML(eItemType, sItemName, m_aDataSet.m_nFormat); java.io.File aFile = new java.io.File(aOutDir, sFileName+m_aDataSet.m_sFragmentExtension); if (aFile.exists()) throw new java.lang.Exception("fragment["+eItemType+", \""+sItemName+"\"] file named \""+aFile.getPath()+"\" already exists."); java.io.FileOutputStream aStream = new java.io.FileOutputStream(aFile); java.io.OutputStreamWriter aWriter = new java.io.OutputStreamWriter(aStream, m_aDataSet.m_sEncoding); aWriter.write(sXML, 0, sXML.length()); aWriter.flush(); aWriter.close(); m_aDataSet.m_aDebug.setDetailedInfo("fragment["+eItemType+", \""+sItemName+"\"] => \""+aFile.getPath()+"\" ... OK"); } //___________________________________________ /** create all needed directory structures. * * First it try to clear old structures and * create new ones afterwards. * * @throw [java.lang.Exception] * if some of the needed structures * could not be created successfully. */ private void createDirectoryStructures() throws java.lang.Exception { m_aDataSet.m_aDebug.setGlobalInfo("create needed directory structures ..."); // delete simple files only; no directories! // Because this tool may run inside // a cvs environment its not a godd idea to do so. boolean bFilesOnly = false; FileHelper.makeDirectoryEmpty(m_aDataSet.m_aOutDir, bFilesOnly); if ( (!m_aDataSet.m_aFragmentDirTypes.exists() && !m_aDataSet.m_aFragmentDirTypes.mkdir() ) || (!m_aDataSet.m_aFragmentDirFilters.exists() && !m_aDataSet.m_aFragmentDirFilters.mkdir() ) || (!m_aDataSet.m_aFragmentDirDetectServices.exists() && !m_aDataSet.m_aFragmentDirDetectServices.mkdir() ) || (!m_aDataSet.m_aFragmentDirFrameLoaders.exists() && !m_aDataSet.m_aFragmentDirFrameLoaders.mkdir() ) || (!m_aDataSet.m_aFragmentDirContentHandlers.exists() && !m_aDataSet.m_aFragmentDirContentHandlers.mkdir()) || (!m_aDataSet.m_aFragmentDirModuleSWriter.exists() && !m_aDataSet.m_aFragmentDirModuleSWriter.mkdir() ) || (!m_aDataSet.m_aFragmentDirModuleSWeb.exists() && !m_aDataSet.m_aFragmentDirModuleSWeb.mkdir() ) || (!m_aDataSet.m_aFragmentDirModuleSGlobal.exists() && !m_aDataSet.m_aFragmentDirModuleSGlobal.mkdir() ) || (!m_aDataSet.m_aFragmentDirModuleSCalc.exists() && !m_aDataSet.m_aFragmentDirModuleSCalc.mkdir() ) || (!m_aDataSet.m_aFragmentDirModuleSDraw.exists() && !m_aDataSet.m_aFragmentDirModuleSDraw.mkdir() ) || (!m_aDataSet.m_aFragmentDirModuleSImpress.exists() && !m_aDataSet.m_aFragmentDirModuleSImpress.mkdir() ) || (!m_aDataSet.m_aFragmentDirModuleSMath.exists() && !m_aDataSet.m_aFragmentDirModuleSMath.mkdir() ) || (!m_aDataSet.m_aFragmentDirModuleSChart.exists() && !m_aDataSet.m_aFragmentDirModuleSChart.mkdir() ) || (!m_aDataSet.m_aFragmentDirModuleOthers.exists() && !m_aDataSet.m_aFragmentDirModuleOthers.mkdir() ) ) { throw new java.lang.Exception("some directory structures does not exists and could not be created successfully."); } } }