blob: 543168e06ea3005de6a3243689955cfcb156fe00 [file] [log] [blame]
/**************************************************************
*
* 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 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.");
}
}
}