Redirect.cpp
上传用户:huihehuasu
上传日期:2007-01-10
资源大小:6948k
文件大小:8k
源码类别:

xml/soap/webservice

开发平台:

C/C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 1999-2000 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  *
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  *
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  *
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  *
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written
  29.  *    permission, please contact apache@apache.org.
  30.  *
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  *
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 1999, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56. /**
  57.  *
  58.  * This simplistic sample illustrates how an XML application can use
  59.  * the SAX entityResolver handler to provide customized handling for
  60.  * external entities.
  61.  *
  62.  * It registers an entity resolver with the parser. When ever the parser
  63.  * comes across an external entity, like a reference to an external DTD
  64.  * file, it calls the 'resolveEntity()' callback. This callback in this
  65.  * sample checks to see if the external entity to be resolved is the file
  66.  * 'personal.dtd'.
  67.  *
  68.  * If it is then, it redirects the input stream to the file 'redirect.dtd',
  69.  * which is then read instead of 'personal.dtd'.
  70.  *
  71.  * If the external entity to be resolved was not the file 'personal.dtd', the
  72.  * callback returns NULL indicating that do the default behaviour which is
  73.  * to read the contents of 'personal.dtd'.
  74.  *
  75.  * $Log: Redirect.cpp,v $
  76.  * Revision 1.6  2001/10/25 15:18:33  tng
  77.  * delete the parser before XMLPlatformUtils::Terminate.
  78.  *
  79.  * Revision 1.5  2001/10/19 19:02:42  tng
  80.  * [Bug 3909] return non-zero an exit code when error was encounted.
  81.  * And other modification for consistent help display and return code across samples.
  82.  *
  83.  * Revision 1.4  2000/05/31 18:53:15  rahulj
  84.  * Removed extraneous command line arguments.
  85.  *
  86.  * Revision 1.3  2000/02/11 02:38:28  abagchi
  87.  * Removed StrX::transcode
  88.  *
  89.  * Revision 1.2  2000/02/06 07:47:21  rahulj
  90.  * Year 2K copyright swat.
  91.  *
  92.  * Revision 1.1.1.1  1999/11/09 01:09:37  twl
  93.  * Initial checkin
  94.  *
  95.  * Revision 1.6  1999/11/08 20:43:39  rahul
  96.  * Swat for adding in Product name and CVS comment log variable.
  97.  *
  98.  */
  99. // ---------------------------------------------------------------------------
  100. //  Includes
  101. // ---------------------------------------------------------------------------
  102. #include <parsers/SAXParser.hpp>
  103. #include "Redirect.hpp"
  104. // ---------------------------------------------------------------------------
  105. //  Local helper methods
  106. // ---------------------------------------------------------------------------
  107. void usage()
  108. {
  109.     cout << "nUsage:n"
  110.             "    Redirect <XML file>nn"
  111.             "This program installs an entity resolver, traps the call ton"
  112.             "the external DTD file and redirects it to another applicationn"
  113.             "specific file which contains the actual dtd.nn"
  114.             "The program then counts and reports the number of elements andn"
  115.             "attributes in the given XML file.n"
  116.          << endl;
  117. }
  118. // ---------------------------------------------------------------------------
  119. //  Program entry point
  120. // ---------------------------------------------------------------------------
  121. int main(int argc, char* args[])
  122. {
  123.     // Initialize the XML4C system
  124.     try
  125.     {
  126.          XMLPlatformUtils::Initialize();
  127.     }
  128.     catch (const XMLException& toCatch)
  129.     {
  130.         cerr << "Error during initialization! Message:n"
  131.              << StrX(toCatch.getMessage()) << endl;
  132.         return 1;
  133.     }
  134.     // We only have one parameter, which is the file to process
  135.     // We only have one required parameter, which is the file to process
  136.     if ((argc != 2) || (*(args[1]) == '-'))
  137.     {
  138.         usage();
  139.         XMLPlatformUtils::Terminate();
  140.         return 1;
  141.     }
  142.     const char*              xmlFile = args[1];
  143.     //
  144.     //  Create a SAX parser object. Then, according to what we were told on
  145.     //  the command line, set it to validate or not.
  146.     //
  147.     SAXParser* parser = new SAXParser;
  148.     //
  149.     //  Create our SAX handler object and install it on the parser, as the
  150.     //  document, entity and error handlers.
  151.     //
  152.     RedirectHandlers handler;
  153.     parser->setDocumentHandler(&handler);
  154.     parser->setErrorHandler(&handler);
  155.     parser->setEntityResolver(&handler);
  156.     //
  157.     //  Get the starting time and kick off the parse of the indicated file.
  158.     //  Catch any exceptions that might propogate out of it.
  159.     //
  160.     unsigned long duration;
  161.     int errorCount = 0;
  162.     try
  163.     {
  164.         const unsigned long startMillis = XMLPlatformUtils::getCurrentMillis();
  165.         parser->parse(xmlFile);
  166.         const unsigned long endMillis = XMLPlatformUtils::getCurrentMillis();
  167.         duration = endMillis - startMillis;
  168.         errorCount = parser->getErrorCount();
  169.     }
  170.     catch (const XMLException& e)
  171.     {
  172.         cerr << "nError during parsing: '" << xmlFile << "'n"
  173.                 << "Exception message is:  n"
  174.                 << StrX(e.getMessage()) << "n" << endl;
  175.         XMLPlatformUtils::Terminate();
  176.         return 4;
  177.     }
  178.     // Print out the stats that we collected and time taken.
  179.     if (!errorCount) {
  180.         cout << xmlFile << ": " << duration << " ms ("
  181.              << handler.getElementCount() << " elems, "
  182.              << handler.getAttrCount() << " attrs, "
  183.              << handler.getSpaceCount() << " spaces, "
  184.              << handler.getCharacterCount() << " chars)" << endl;
  185.     }
  186.     //
  187.     //  Delete the parser itself.  Must be done prior to calling Terminate, below.
  188.     //
  189.     delete parser;
  190.     XMLPlatformUtils::Terminate();
  191.     if (errorCount > 0)
  192.         return 4;
  193.     else
  194.         return 0;
  195. }