X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=xmltooling%2Futil%2FParserPool.h;h=c3067ac6b12621977ce2494e5bde3c809dacfb91;hb=81b488b2790e7bdeb2f43560b1d4a7d22c3dfdf5;hp=196665640914877e7b5408909d410ef92eb84354;hpb=e39828c168f8f0135373daf46989d6b28257b39f;p=shibboleth%2Fcpp-xmltooling.git diff --git a/xmltooling/util/ParserPool.h b/xmltooling/util/ParserPool.h index 1966656..c3067ac 100644 --- a/xmltooling/util/ParserPool.h +++ b/xmltooling/util/ParserPool.h @@ -1,184 +1,278 @@ -/* - * Copyright 2001-2006 Internet2 - * - * 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. - */ - -/** - * @file ParserPool.h - * - * XML parsing - */ - -#if !defined(__xmltooling_pool_h__) -#define __xmltooling_pool_h__ - -#include - -#include -#include -#include -#include -#include -#include - -using namespace xercesc; - -#if defined (_MSC_VER) - #pragma warning( push ) - #pragma warning( disable : 4250 4251 ) -#endif - -namespace xmltooling { - - /** - * A thread-safe pool of DOMBuilders that share characteristics - */ - class XMLTOOL_API ParserPool : public DOMEntityResolver, DOMErrorHandler - { - MAKE_NONCOPYABLE(ParserPool); - public: - /** - * Constructs a new pool - * - * @param namespaceAware indicates whether parsers should be namespace-aware or not - * @param schemaAware indicates whether parsers should be schema-validating or not - */ - ParserPool(bool namespaceAware=true, bool schemaAware=false); - ~ParserPool(); - - /** - * Creates a new document using a parser from this pool. - * - * @return new XML document - * - */ - DOMDocument* newDocument(); - - /** - * Parses a document using a pooled parser with the proper settings - * - * @param domsrc A DOM source containing the content to be parsed - * @return The DOM document resulting from the parse - * @throws XMLParserException thrown if there was a problem reading, parsing, or validating the XML - */ - DOMDocument* parse(DOMInputSource& domsrc); - - /** - * Parses a document using a pooled parser with the proper settings - * - * @param is An input stream containing the content to be parsed - * @return The DOM document resulting from the parse - * @throws XMLParserException thrown if there was a problem reading, parsing, or validating the XML - */ - DOMDocument* parse(std::istream& is); - - /** - * Load an OASIS catalog file to map schema namespace URIs to filenames. - * - * This does not provide real catalog support; only the <uri> element - * is supported to map from a namespace URI to a relative path or file:// URI. - * - * @param pathname path to a catalog file - * @return true iff the catalog was successfully processed - */ - bool loadCatalog(const XMLCh* pathname); - - /** - * Load a schema explicitly from a local file. - * - * Note that "successful processing" does not imply that the schema is valid, - * only that a reference to it was successfully registered with the pool. - * - * @param nsURI XML namespace to load - * @param pathname path to schema file - * @return true iff the schema was successfully processed - */ - bool loadSchema(const XMLCh* nsURI, const XMLCh* pathname); - - /** - * Supplies all external entities (primarily schemas) to the parser - */ - DOMInputSource* resolveEntity(const XMLCh* const publicId, const XMLCh* const systemId, const XMLCh* const baseURI); - - /** - * Handles parsing errors - */ - bool handleError(const DOMError& e); - - private: - DOMBuilder* createBuilder(); - DOMBuilder* checkoutBuilder(); - void checkinBuilder(DOMBuilder* builder); - -#ifdef HAVE_GOOD_STL - xstring m_schemaLocations; - std::map m_schemaLocMap; -#else - std::string m_schemaLocations; - std::map m_schemaLocMap; -#endif - bool m_namespaceAware,m_schemaAware; - std::stack m_pool; - void* m_lock; - }; - - /** - * A parser source that wraps a C++ input stream - */ - class XMLTOOL_API StreamInputSource : public InputSource - { - MAKE_NONCOPYABLE(StreamInputSource); - public: - /** - * Constructs an input source around an input stream reference. - * - * @param is reference to an input stream - * @param systemId optional system identifier to attach to the stream - */ - StreamInputSource(std::istream& is, const char* systemId=NULL) : InputSource(systemId), m_is(is) {} - /// @cond off - virtual BinInputStream* makeStream() const { return new StreamBinInputStream(m_is); } - /// @endcond - - /** - * A Xerces input stream that wraps a C++ input stream - */ - class XMLTOOL_API StreamBinInputStream : public BinInputStream - { - public: - /** - * Constructs a Xerces input stream around a C++ input stream reference. - * - * @param is reference to an input stream - */ - StreamBinInputStream(std::istream& is) : m_is(is), m_pos(0) {} - /// @cond off - virtual unsigned int curPos() const { return m_pos; } - virtual unsigned int readBytes(XMLByte* const toFill, const unsigned int maxToRead); - /// @endcond - private: - std::istream& m_is; - unsigned int m_pos; - }; - - private: - std::istream& m_is; - }; -}; - -#if defined (_MSC_VER) - #pragma warning( pop ) -#endif - -#endif /* __xmltooling_pool_h__ */ +/** + * Licensed to the University Corporation for Advanced Internet + * Development, Inc. (UCAID) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for + * additional information regarding copyright ownership. + * + * UCAID 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. + */ + +/** + * @file xmltooling/util/ParserPool.h + * + * A thread-safe pool of parsers that share characteristics. + */ + +#ifndef __xmltooling_pool_h__ +#define __xmltooling_pool_h__ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef XMLTOOLING_NO_XMLSEC +# include +#endif + +#if defined (_MSC_VER) + #pragma warning( push ) + #pragma warning( disable : 4250 4251 ) +#endif + +namespace xmltooling { + + class XMLTOOL_API Mutex; + + /** + * A thread-safe pool of DOMBuilders that share characteristics. + */ + class XMLTOOL_API ParserPool : +#ifdef XMLTOOLING_XERCESC_COMPLIANT_DOMLS + public xercesc::DOMLSResourceResolver +#else + public xercesc::DOMEntityResolver +#endif + { + MAKE_NONCOPYABLE(ParserPool); + public: + /** + * Constructs a new pool + * + * @param namespaceAware indicates whether parsers should be namespace-aware or not + * @param schemaAware indicates whether parsers should be schema-validating or not + */ + ParserPool(bool namespaceAware=true, bool schemaAware=false); + ~ParserPool(); + + /** + * Creates a new document using a parser from this pool. + * + * @return new XML document + * + */ + xercesc::DOMDocument* newDocument(); + + /** + * Parses a document using a pooled parser with the proper settings + * + * @param domsrc An input source containing the content to be parsed + * @return The DOM document resulting from the parse + * @throws XMLParserException thrown if there was a problem reading, parsing, or validating the XML + */ + xercesc::DOMDocument* parse( +#ifdef XMLTOOLING_XERCESC_COMPLIANT_DOMLS + xercesc::DOMLSInput& domsrc +#else + xercesc::DOMInputSource& domsrc +#endif + ); + + /** + * Parses a document using a pooled parser with the proper settings + * + * @param is An input stream containing the content to be parsed + * @return The DOM document resulting from the parse + * @throws XMLParserException thrown if there was a problem reading, parsing, or validating the XML + */ + xercesc::DOMDocument* parse(std::istream& is); + + /** + * Load an OASIS catalog file to map schema namespace URIs to filenames. + * + * This does not provide real catalog support; only the <uri> element + * is supported to map from a namespace URI to a relative path or file:// URI. + * + * @param pathname path to a catalog file + * @return true iff the catalog was successfully processed + */ + bool loadCatalog(const XMLCh* pathname); + + /** + * Load a schema explicitly from a local file. + * + * Note that "successful processing" does not imply that the schema is valid, + * only that a reference to it was successfully registered with the pool. + * + * @param nsURI XML namespace to load + * @param pathname path to schema file + * @return true iff the schema was successfully processed + */ + bool loadSchema(const XMLCh* nsURI, const XMLCh* pathname); + + /** + * Supplies all external entities (primarily schemas) to the parser + */ +#ifdef XMLTOOLING_XERCESC_COMPLIANT_DOMLS + xercesc::DOMLSInput* resolveResource( + const XMLCh *const resourceType, + const XMLCh *const namespaceUri, + const XMLCh *const publicId, + const XMLCh *const systemId, + const XMLCh *const baseURI + ); +#else + xercesc::DOMInputSource* resolveEntity( + const XMLCh* const publicId, const XMLCh* const systemId, const XMLCh* const baseURI + ); +#endif + + private: +#ifdef XMLTOOLING_XERCESC_COMPLIANT_DOMLS + xercesc::DOMLSParser* createBuilder(); + xercesc::DOMLSParser* checkoutBuilder(); + void checkinBuilder(xercesc::DOMLSParser* builder); +#else + xercesc::DOMBuilder* createBuilder(); + xercesc::DOMBuilder* checkoutBuilder(); + void checkinBuilder(xercesc::DOMBuilder* builder); +#endif + + xstring m_schemaLocations; + std::map m_schemaLocMap; + + bool m_namespaceAware,m_schemaAware; +#ifdef XMLTOOLING_XERCESC_COMPLIANT_DOMLS + std::stack m_pool; +#else + std::stack m_pool; +#endif + Mutex* m_lock; + xercesc::SecurityManager* m_security; + }; + + /** + * A parser source that wraps a C++ input stream + */ + class XMLTOOL_API StreamInputSource : public xercesc::InputSource + { + MAKE_NONCOPYABLE(StreamInputSource); + public: + /** + * Constructs an input source around an input stream reference. + * + * @param is reference to an input stream + * @param systemId optional system identifier to attach to the stream + */ + StreamInputSource(std::istream& is, const char* systemId=nullptr); + /// @cond off + xercesc::BinInputStream* makeStream() const; + /// @endcond + + /** + * A Xerces input stream that wraps a C++ input stream + */ + class XMLTOOL_API StreamBinInputStream : public xercesc::BinInputStream + { + public: + /** + * Constructs a Xerces input stream around a C++ input stream reference. + * + * @param is reference to an input stream + */ + StreamBinInputStream(std::istream& is); + /// @cond off +#ifdef XMLTOOLING_XERCESC_64BITSAFE + XMLFilePos curPos() const; + const XMLCh* getContentType() const; +#else + unsigned int curPos() const; +#endif + xsecsize_t readBytes(XMLByte* const toFill, const xsecsize_t maxToRead); + /// @endcond + private: + std::istream& m_is; + xsecsize_t m_pos; + }; + + private: + std::istream& m_is; + }; + + /** + * A URL-based parser source that supports a more advanced input stream. + */ + class XMLTOOL_API URLInputSource : public xercesc::InputSource + { + MAKE_NONCOPYABLE(URLInputSource); + public: + /** + * Constructor. + * + * @param url source of input + * @param systemId optional system identifier to attach to the source + * @param cacheTag optional pointer to string used for cache management + */ + URLInputSource(const XMLCh* url, const char* systemId=nullptr, std::string* cacheTag=nullptr); + + /** + * Constructor taking a DOM element supporting the following content: + * + *
+ *
uri | url
+ *
identifies the remote resource
+ *
verifyHost
+ *
true iff name of host should be matched against TLS/SSL certificate
+ *
TransportOption elements, like so:
+ *
<TransportOption provider="CURL" option="150">0</TransportOption>
+ *
+ * + * @param e DOM to supply configuration + * @param systemId optional system identifier to attach to the source + * @param cacheTag optional pointer to string used for cache management + */ + URLInputSource(const xercesc::DOMElement* e, const char* systemId=nullptr, std::string* cacheTag=nullptr); + + /// @cond off + virtual xercesc::BinInputStream* makeStream() const; + /// @endcond + + /** Element name used to signal a non-successful response when fetching a remote document. */ + static const char asciiStatusCodeElementName[]; + + /** Element name used to signal a non-successful response when fetching a remote document. */ + static const XMLCh utf16StatusCodeElementName[]; + private: +#ifdef XMLTOOLING_LITE + xercesc::XMLURL m_url; +#else + std::string* m_cacheTag; + xmltooling::auto_ptr_char m_url; + const xercesc::DOMElement* m_root; +#endif + }; +}; + +#if defined (_MSC_VER) + #pragma warning( pop ) +#endif + +#endif /* __xmltooling_pool_h__ */