blob: e2023d261cd57bc603e5469646c88023ba1f9c68 [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.
*/
#if !defined(XALANCRPROCESSOR_HEADER_GUARD_1357924680)
#define XALANCRPROCESSOR_HEADER_GUARD_1357924680
// Base header file. Must be first.
#include <xalanc/Include/PlatformDefinitions.hpp>
#include <sstream>
#include <xercesc/dom/DOMDocument.hpp>
#include <xalanc/Include/XalanMap.hpp>
#include <xalanc/PlatformSupport/DOMStringHelper.hpp>
#include <xalanc/XMLSupport/FormatterToNull.hpp>
#include <xalanc/XalanSourceTree/FormatterToSourceTree.hpp>
#include <xalanc/XalanSourceTree/XalanSourceTreeDocument.hpp>
#include <xalanc/XercesParserLiaison/XercesParserLiaison.hpp>
#include <xalanc/XercesParserLiaison/FormatterToXercesDOM.hpp>
#include <xalanc/XalanTransformer/XalanTransformer.hpp>
#include <xalanc/XalanDOM/XalanDOMString.hpp>
using xercesc::DOMDocument;;
using namespace xalanc;
/**
* Implementation of the test interface for XalanC 1.x
*
*/
class XalanCProcessor
{
public:
XalanDOMString m_name;
typedef const XalanCompiledStylesheet* CompiledStylesheetType;
typedef const XalanParsedSource* ParsedInputSourceType;
struct ResultTarget {
virtual
~ ResultTarget(){}
XSLTResultTarget resultTarget;
virtual ResultTarget* clone(const XalanDOMString&) = 0;
virtual void reset() = 0;
};
typedef ResultTarget* ResultTargetType;
typedef XSLTInputSource::StreamType StreamType;
XalanCProcessor();
~XalanCProcessor();
/**
* Initializes the processor interface.
* Assumes static processor initialization functions are already completed.
*/
void
init();
/**
* Terminates the processor interface.
*/
void
terminate();
/**
* Returns the name of the processor implementation.
* @returns name of the processor
*/
XalanDOMString& getName() { return m_name;}
/**
* Compiles the specified stylesheet.
* Xalan interface does not support any options.
* @param fileName stylesheet to compile
* @param compileOptions (none for this interface)
* @returns compiled stylesheet
*/
CompiledStylesheetType
compileStylesheet(
const XalanDOMString& fileName,
const XalanNode* compileOptions = 0);
/**
* Compiles the specified stylesheet.
* Xalan interface does not support any options.
* @param stream stylesheet to compile
* @param compileOptions (none for this interface)
* @returns compiled stylesheet
*/
CompiledStylesheetType
compileStylesheet(
StreamType& stream,
const XalanNode* compileOptions = 0);
/**
* Release stylesheet object
* @param stylesheet object to release
*/
void
releaseStylesheet(CompiledStylesheetType stylesheet);
/**
* Parses an input document.
* Parse options, a text node containing:<ul>
* <li><b>xst</b>: parse to XalanSourceTree (default)
* <li><b>xerces-dom</b>: parse to XercesDOM</ul>
* @param fileName input document to parse.
* @param parseOptions options to the parser.
* @returns parsed document
*/
ParsedInputSourceType
parseInputSource(
const XalanDOMString& fileName,
const XalanNode* parseOptions = 0);
/**
* Parses an input document.
* Parse options, a text node containing:<ul>
* <li><b>xst</b>: parse to XalanSourceTree (default)
* <li><b>xerces-dom</b>: parse to XercesDOM</ul>
* @param stream input document to parse.
* @param parseOptions options to the parser.
* @returns parsed document
*/
ParsedInputSourceType
parseInputSource(
StreamType& stream,
const XalanNode* parseOptions = 0);
/**
* Releases and parsed input source
* @param inputSource source to release
*/
void
releaseInputSource(ParsedInputSourceType inputSource);
/**
* Creates a result target.
* Result target options, a text node containing:<ul>
* <li><b>file</b>: result to a file (default)</li>
* <li><b>xst</b>: result to a XalanSourceTree</li>
* <li><b>xerces-dom</b>: result to XercesDOM</li>
* <li><b>null</b>: generate no result</li>
* <li><b>stream</b>: result to a stream (string)</li></ul>
* @param resultFileName file to write result to, if any
* @param resultOptions options to create result
* @return result target
*/
ResultTargetType
createResultTarget(
const XalanDOMString& resultFileName,
const XalanNode* resultOptions = 0);
/**
* Releases result target
* @param resultTarget target to release
*/
void
releaseResultTarget(ResultTargetType resultTarget);
/**
* Executes a transform
* @param compileStyle stylesheet
* @param parsedInputSourceType parsed document
* @param resultTargetType result target
* @param transformOptions (none for this interface)
*/
void transform(
const CompiledStylesheetType& compiledStylesheet,
const ParsedInputSourceType& parsedInputSourceType,
const ResultTargetType& resultTargetType,
const XalanNode* transformOptions = 0);
typedef enum {eInvalid, eXalanSourceTree, eXercesDOM} ParseOptionType;
protected:
ParseOptionType getParseOption(const XalanNode* option);
typedef XalanMap<XalanDOMString, ResultTarget*> ResultsMapType;
ResultTarget* getResultOption(
const XalanDOMString& fileName,
const XalanNode* option);
ResultsMapType m_resultOptionsMap;
XalanTransformer *m_transformer;
struct NullResult : public ResultTarget
{
NullResult()
{
resultTarget.setFormatterListener(&formatterToNull);
}
ResultTarget *
clone(const XalanDOMString&) { return new NullResult;}
void reset() {}
FormatterToNull formatterToNull;
};
NullResult m_nullResult;
struct XalanSourceTreeResult : public ResultTarget
{
XalanSourceTreeResult() :
document(XalanMemMgrs::getDefaultXercesMemMgr())
{
formatterToSourceTree.setDocument(&document);
resultTarget.setFormatterListener(&formatterToSourceTree);
}
ResultTarget *
clone(const XalanDOMString&) { return new XalanSourceTreeResult;}
void reset() { formatterToSourceTree.resetDocument();}
FormatterToSourceTree formatterToSourceTree;
XalanSourceTreeDocument document;
};
XalanSourceTreeResult m_xalanSourceTreeResult;
struct XercesDOMResult : public ResultTarget
{
XercesDOMResult() :
parserLiaison(),
document(parserLiaison.createDOMFactory()),
formatterToXercesDOM(document, 0)
{
}
ResultTarget *
clone(const XalanDOMString&) { return new XercesDOMResult;}
void reset() { formatterToXercesDOM.resetDocument();}
XercesParserLiaison parserLiaison;
DOMDocument* document;
FormatterToXercesDOM formatterToXercesDOM;
};
XercesDOMResult m_xercesDOMResult;
struct FileResult : public ResultTarget
{
FileResult(const XalanDOMString & fileName = XalanDOMString(""))
{
resultTarget.setFileName(fileName);
}
ResultTarget *
clone(const XalanDOMString& fileName) { return new FileResult(fileName);}
void reset() {}
};
FileResult m_fileResult;
struct StreamResult : public XalanCProcessor::ResultTarget
{
StreamResult()
{
resultTarget.setByteStream(&stringstream);
}
ResultTarget *
clone(const XalanDOMString&) { return new StreamResult;}
void reset() { stringstream.flush();}
std::ostringstream stringstream;
};
StreamResult m_streamResult;
};
#endif // XALANCRPROCESSOR_HEADER_GUARD_1357924680