diff options
Diffstat (limited to 'filter/source/config/tools/split/Splitter.java')
-rw-r--r-- | filter/source/config/tools/split/Splitter.java | 310 |
1 files changed, 310 insertions, 0 deletions
diff --git a/filter/source/config/tools/split/Splitter.java b/filter/source/config/tools/split/Splitter.java new file mode 100644 index 000000000000..d9c171382596 --- /dev/null +++ b/filter/source/config/tools/split/Splitter.java @@ -0,0 +1,310 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +package com.sun.star.filter.config.tools.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 realy. + 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."); + } + } +} |