DDLParser

Macros

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
#ifndef DETECTOR_DESCRIPTION_PARSER_DDL_PARSER_H
#define DETECTOR_DESCRIPTION_PARSER_DDL_PARSER_H

#include "DetectorDescription/Parser/interface/DDLSAX2ExpressionHandler.h"
#include "DetectorDescription/Parser/interface/DDLSAX2FileHandler.h"
#include "DetectorDescription/Parser/interface/DDLSAX2Handler.h"
#include "Utilities/Xerces/interface/Xerces.h"
#include <xercesc/sax/SAXException.hpp>
#include <xercesc/sax2/SAX2XMLReader.hpp>
#include <xercesc/sax2/XMLReaderFactory.hpp>
#include <xercesc/util/XercesDefs.hpp>
#include <xercesc/util/XercesVersion.hpp>
#include <iosfwd>
#include <map>
#include <string>
#include <utility>
#include <vector>
#include <cstddef>

class DDCompactView;
class DDLDocumentProvider;
class DDLElementRegistry;

/// DDLParser is the main class of Detector Description Language Parser.
/** @class DDLParser
 * @author Michael Case
 *
 *  DDLParser.h  -  description
 *  -------------------
 *  begin: Mon Oct 22 2001
 *  email: case@ucdhep.ucdavis.edu
 *
 *  Singleton which controls the parsing of XML files (DDL).  It guarantees
 *  that a given filename will only be parsed once regardless of its path.
 *  It now relies on a DDLDocumentProvider class which provides a list of
 *  file names and URLs to be parsed.
 *
 *  It uses the Xerces C++ Parser from the Apache Group straight-forwardly.
 *  One main thing to note is that only one DDLParser can ever be made.  This
 *  allows for sub-components of the parser to easily find out information from
 *  the parser during run-time.
 *
 *  There is an interface to parse just one file.  If one uses this method
 *  and does not use the default DDLDocumentProvider 
 *  user is responsible for also setting the DDRootDef.
 *  
 *  Modification:
 *    2003-02-13: Michael Case, Stepan Wynhoff and Martin Liendl
 *    2003-02-24: same.
 *         DDLParser will use DDLDocumentProvider (abstract).  One of these
 *         and will be defaulted to DDLConfiguration.  This will read
 *         the "configuration.xml" file provided and will be used by the Parser
 *         to "get" the files.
 *   2005-11-13:  Michael Case
 *         removed some of the un-necessary methods that were deprecated.
 *   2010-01 to 2010-04 sometime: Michael Case
 *         removed singleton-ness.  MUST have a DDCompactView to refer to
 *         and no more default constructor at the moment.
 *   2010-07-29:  removed DDLConfiguration; use FIPConfiguration, it is easier.
 *         for CMSSW Framework example see XMLIdealGeometryESSource (different
 *         DDLDocumentProvider completely
 */
class DDLParser {
public:
  typedef XERCES_CPP_NAMESPACE::SAX2XMLReader SAX2XMLReader;

  typedef std::map<int, std::pair<std::string, std::string> > FileNameHolder;

  DDLParser(DDCompactView& cpv);

  DDLParser() = delete;

  ~DDLParser();

  /// Parse all files. Return is meaningless.
  int parse(const DDLDocumentProvider& dp);

  /// Process a single files.
  /** 
   *  This method allows a user to add to an existing DDD by
   *  parsing a new XML file.  Ideally, these would be in addition
   *  to an existing DDD configuration which was processed using
   *  Parse(...).  
   *
   *  The idea is based on whether users decide that the configuration
   *  will only hold "standard geometry files" and that any ancillary 
   *  parameter files, filters and so forth will be unknown to the main
   *  configuration file.  For me, this seems to go against the principle
   *  of knowing what files are relevant because now, there is no central
   *  way to find out (externally) what XML files generate the DDD in memory.
   *
   *  On the other hand, if on any run, a dumpFileList is run, then 
   *  the user will at least know what files were used from where in 
   *  a given run.
   *
   *  2007-04-06:  filename is now relative to src directory of checkout
   *               (or share).  edm:FileInPath used internally.
   **/
  bool parseOneFile(const std::string& filename);

  // I ASSUME I take ownership of this blob
  //  void parse( std::vector<unsigned char>* ablob, unsigned int bsize ) ;
  //old way  void parse( const std::vector<unsigned char>& ablob, unsigned int bsize ) ;
  void parse(const std::vector<unsigned char>& ablob, unsigned int bsize);

  /// Get the SAX2Parser from the DDLParser.  USE WITH CAUTION.  Set your own handler, etc.
  SAX2XMLReader* getXMLParser();

  /// To get the parent this class allows access to the handler.
  /**
   *  In order to retrieve the name of the parent element from DDLSAX2Handlers.
   */
  DDLSAX2FileHandler* getDDLSAX2FileHandler();

  /// Clear the file list - see Warning!
  /**
   *  This could result in mangled geometry if the Core has not been cleared.
   **/
  void clearFiles();

private:
  /// Parse File.  Just to hold some common looking code.
  void parseFile(const int& numtoproc);

  /// Is the file already known by the DDLParser?  Returns 0 if not found, and index if found.
  size_t isFound(const std::string& filename);

  /// Is the file already parsed?
  bool isParsed(const std::string& filename);

  std::string const extractFileName(const std::string& fullname);

  std::string const getNameSpace(const std::string& fname);

  /// reference to storage
  DDCompactView& cpv_;

  /// List of files to be processed, obtained from the DDLDocumentProvider.
  FileNameHolder fileNames_;

  /// Parse status of a given file.
  std::map<int, bool> parsed_;

  /// Number of files + 1.
  size_t nFiles_;

  /// Which file is currently being processed.
  std::string currFileName_;

  /// SAX2XMLReader is one way of parsing.
  SAX2XMLReader* SAX2Parser_;

  DDLElementRegistry* elementRegistry_;
  DDLSAX2FileHandler* fileHandler_;
  DDLSAX2ExpressionHandler* expHandler_;
  DDLSAX2Handler* errHandler_;
};

#endif