blob: d1aa0c770428bf3c013099cc608f50f25a2cfb80 [file] [log] [blame]
/*
* Copyright 2002-2005 The Apache Software Foundation.
*
* Licensed 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.
*/
/*
* XSEC
*
* TXFMParser := A transformer used to transform a byte stream to DOM Nodes
*
* Author(s): Berin Lautenbach
*
* $Id$
*
*/
#include <xsec/transformers/TXFMParser.hpp>
#include <xsec/transformers/TXFMChain.hpp>
#include <xsec/utils/XSECPlatformUtils.hpp>
#include <xsec/framework/XSECError.hpp>
#include <xsec/utils/XSECTXFMInputSource.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/framework/MemBufInputSource.hpp>
#include <xercesc/util/Janitor.hpp>
XERCES_CPP_NAMESPACE_USE
TXFMParser::TXFMParser(DOMDocument * doc) :
TXFMBase(doc),
mp_parsedDoc(NULL) {
};
TXFMParser::~TXFMParser() {
if (mp_parsedDoc != NULL) {
if (mp_nse != NULL) {
delete mp_nse; // Don't bother collapsing
mp_nse = NULL;
}
mp_parsedDoc->release();
}
mp_parsedDoc = NULL;
};
// -----------------------------------------------------------------------
// For expanding name spaces when necessary
// -----------------------------------------------------------------------
bool TXFMParser::nameSpacesExpanded(void) {
// NOTE : Do not check inputs as this has its own document
return (mp_nse != NULL);
}
void TXFMParser::expandNameSpaces(void) {
if (mp_nse != NULL)
return; // Already done
if (mp_parsedDoc != NULL) {
XSECnew(mp_nse, XSECNameSpaceExpander(mp_parsedDoc));
mp_nse->expandNameSpaces();
}
}
// -----------------------------------------------------------------------
// Worker function
// -----------------------------------------------------------------------
void TXFMParser::setInput(TXFMBase *newInput) {
// This transformer terminates all previous inputs and deletes
// the chain.
input = newInput;
// Create a InputStream
TXFMChain * chain;
XSECnew(chain, TXFMChain(newInput, false));
Janitor<TXFMChain> j_chain(chain);
XSECTXFMInputSource is(chain, false);
// Create a XercesParser and parse!
XercesDOMParser parser;
parser.setDoNamespaces(true);
parser.setCreateEntityReferenceNodes(true);
parser.setDoSchema(true);
int errorCount = 0;
parser.parse(is);
errorCount = parser.getErrorCount();
if (errorCount > 0)
throw XSECException(XSECException::XSLError, "Errors occured parsing BYTE STREAM");
mp_parsedDoc = parser.adoptDocument();
// Clean up
keepComments = newInput->getCommentsStatus();
}
// Methods to get tranform output type and input requirement
TXFMBase::ioType TXFMParser::getInputType(void) {
return TXFMBase::BYTE_STREAM;
}
TXFMBase::ioType TXFMParser::getOutputType(void) {
return TXFMBase::DOM_NODES;
}
TXFMBase::nodeType TXFMParser::getNodeType(void) {
return TXFMBase::DOM_NODE_DOCUMENT;
}
// Methods to get output data
unsigned int TXFMParser::readBytes(XMLByte * const toFill, unsigned int maxToFill) {
return 0;
}
DOMDocument *TXFMParser::getDocument() {
return mp_parsedDoc;
}
DOMNode * TXFMParser::getFragmentNode() {
return NULL; // Return a null node
}
const XMLCh * TXFMParser::getFragmentId() {
return NULL; // Empty string
}