CMS 3D CMS Logo

List of all members | Public Types | Public Member Functions | Private Member Functions | Private Attributes
DDLParser Class Reference

DDLParser is the main class of Detector Description Language Parser. More...

#include <DDLParser.h>

Public Types

typedef std::map< int, std::pair< std::string, std::string > > FileNameHolder
 
typedef XERCES_CPP_NAMESPACE::SAX2XMLReader SAX2XMLReader
 

Public Member Functions

void clearFiles ()
 Clear the file list - see Warning! More...
 
 DDLParser (DDCompactView &cpv)
 Constructor MUST associate a DDCompactView storage. More...
 
 DDLParser ()=delete
 
DDLSAX2FileHandlergetDDLSAX2FileHandler ()
 To get the parent this class allows access to the handler. More...
 
SAX2XMLReadergetXMLParser ()
 Get the SAX2Parser from the DDLParser. USE WITH CAUTION. Set your own handler, etc. More...
 
int parse (const DDLDocumentProvider &dp)
 Parse all files. Return is meaningless. More...
 
void parse (const std::vector< unsigned char > &ablob, unsigned int bsize)
 
bool parseOneFile (const std::string &filename)
 Process a single files. More...
 
 ~DDLParser ()
 Destructor terminates the XMLPlatformUtils (as required by Xerces) More...
 

Private Member Functions

std::string const extractFileName (const std::string &fullname)
 
std::string const getNameSpace (const std::string &fname)
 
size_t isFound (const std::string &filename)
 Is the file already known by the DDLParser? Returns 0 if not found, and index if found. More...
 
bool isParsed (const std::string &filename)
 Is the file already parsed? More...
 
void parseFile (const int &numtoproc)
 Parse File. Just to hold some common looking code. More...
 

Private Attributes

DDCompactViewcpv_
 reference to storage More...
 
std::string currFileName_
 Which file is currently being processed. More...
 
DDLElementRegistryelementRegistry_
 
DDLSAX2HandlererrHandler_
 
DDLSAX2ExpressionHandlerexpHandler_
 
DDLSAX2FileHandlerfileHandler_
 
FileNameHolder fileNames_
 List of files to be processed, obtained from the DDLDocumentProvider. More...
 
size_t nFiles_
 Number of files + 1. More...
 
std::map< int, bool > parsed_
 Parse status of a given file. More...
 
SAX2XMLReaderSAX2Parser_
 SAX2XMLReader is one way of parsing. More...
 

Detailed Description

DDLParser is the main class of Detector Description Language Parser.

Author
Michael Case

DDLParser.h - description

begin: Mon Oct 22 2001 email: case@.nosp@m.ucdh.nosp@m.ep.uc.nosp@m.davi.nosp@m.s.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

Definition at line 63 of file DDLParser.h.

Member Typedef Documentation

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

Definition at line 68 of file DDLParser.h.

typedef XERCES_CPP_NAMESPACE::SAX2XMLReader DDLParser::SAX2XMLReader

Definition at line 66 of file DDLParser.h.

Constructor & Destructor Documentation

DDLParser::DDLParser ( DDCompactView cpv)

Constructor MUST associate a DDCompactView storage.

Definition at line 22 of file DDLParser.cc.

References elementRegistry_, errHandler_, expHandler_, fileHandler_, SAX2Parser_, and cms::concurrency::xercesInitialize().

23  : cpv_( cpv ),
24  nFiles_( 0 )
25 {
27  SAX2Parser_ = XMLReaderFactory::createXMLReader();
28 
29  SAX2Parser_->setFeature(XMLUni::fgSAX2CoreValidation, false); // optional
30  SAX2Parser_->setFeature(XMLUni::fgSAX2CoreNameSpaces, false); // optional
31 
36  SAX2Parser_->setErrorHandler(errHandler_);
37  SAX2Parser_->setContentHandler(fileHandler_);
38 }
DDLSAX2FileHandler * fileHandler_
Definition: DDLParser.h:155
SAX2XMLReader * SAX2Parser_
SAX2XMLReader is one way of parsing.
Definition: DDLParser.h:152
void xercesInitialize()
Definition: Xerces.cc:18
DDLSAX2FileHandler is the SAX2 Handler for XML files found in the configuration file.
DDLSAX2ExpressionHandler is the first pass SAX2 Handler for XML files found in the configuration file...
DDLSAX2ExpressionHandler * expHandler_
Definition: DDLParser.h:156
DDLSAX2Handler * errHandler_
Definition: DDLParser.h:157
DDLElementRegistry * elementRegistry_
Definition: DDLParser.h:154
size_t nFiles_
Number of files + 1.
Definition: DDLParser.h:146
DDLSAX2Handler inherits from Xerces C++ DefaultHandler.
The main class for processing parsed elements.
DDCompactView & cpv_
reference to storage
Definition: DDLParser.h:137
DDLParser::DDLParser ( )
delete
DDLParser::~DDLParser ( void  )

Destructor terminates the XMLPlatformUtils (as required by Xerces)

Definition at line 41 of file DDLParser.cc.

References elementRegistry_, errHandler_, expHandler_, fileHandler_, and cms::concurrency::xercesTerminate().

42 {
43  // clean up and leave
44  delete expHandler_;
45  delete fileHandler_;
46  delete errHandler_;
47  delete elementRegistry_;
49 }
void xercesTerminate()
Definition: Xerces.cc:23
DDLSAX2FileHandler * fileHandler_
Definition: DDLParser.h:155
DDLSAX2ExpressionHandler * expHandler_
Definition: DDLParser.h:156
DDLSAX2Handler * errHandler_
Definition: DDLParser.h:157
DDLElementRegistry * elementRegistry_
Definition: DDLParser.h:154

Member Function Documentation

void DDLParser::clearFiles ( void  )

Clear the file list - see Warning!

This could result in mangled geometry if the Core has not been cleared.

Definition at line 245 of file DDLParser.cc.

References fileNames_, parsed_, and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by XMLIdealMagneticFieldGeometryESProducer::produce().

246 {
247  fileNames_.clear();
248  parsed_.clear();
249 }
std::map< int, bool > parsed_
Parse status of a given file.
Definition: DDLParser.h:143
FileNameHolder fileNames_
List of files to be processed, obtained from the DDLDocumentProvider.
Definition: DDLParser.h:140
std::string const DDLParser::extractFileName ( const std::string &  fullname)
private

Definition at line 252 of file DDLParser.cc.

References AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by parse(), and parseOneFile().

253 {
254  return( fullname.substr( fullname.rfind( '/' ) + 1 ));
255 }
DDLSAX2FileHandler * DDLParser::getDDLSAX2FileHandler ( void  )

To get the parent this class allows access to the handler.

In order to retrieve the name of the parent element from DDLSAX2Handlers.

Definition at line 62 of file DDLParser.cc.

References fileHandler_.

Referenced by XMLIdealGeometryESSource::produce(), and XMLIdealMagneticFieldGeometryESProducer::produce().

63 {
64  return fileHandler_;
65 }
DDLSAX2FileHandler * fileHandler_
Definition: DDLParser.h:155
std::string const DDLParser::getNameSpace ( const std::string &  fname)
private

Definition at line 258 of file DDLParser.cc.

References AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by parse(), and parseOneFile().

259 {
260  size_t j = 0;
261  std::string ret="";
262  while (j < fname.size() && fname[j] != '.')
263  ++j;
264  if (j < fname.size() && fname[j] == '.')
265  ret = fname.substr(0, j);
266  return ret;
267 }
string fname
main script
SAX2XMLReader * DDLParser::getXMLParser ( void  )

Get the SAX2Parser from the DDLParser. USE WITH CAUTION. Set your own handler, etc.

This method allows external "users" to use the current DDLParser on their own. by giving them access to the SAX2XMLReader. This may not be a good idea! The reason that I

Definition at line 56 of file DDLParser.cc.

References SAX2Parser_.

Referenced by FIPConfiguration::readConfig().

57 {
58  return SAX2Parser_;
59 }
SAX2XMLReader * SAX2Parser_
SAX2XMLReader is one way of parsing.
Definition: DDLParser.h:152
size_t DDLParser::isFound ( const std::string &  filename)
private

Is the file already known by the DDLParser? Returns 0 if not found, and index if found.

Definition at line 68 of file DDLParser.cc.

References fileNames_, and mps_fire::i.

Referenced by isParsed(), parse(), and parseOneFile().

69 {
70  FileNameHolder::const_iterator it = fileNames_.begin();
71  size_t i = 1;
72  bool foundFile = false;
73  while( it != fileNames_.end() && !foundFile )
74  {
75  if( it->second.first == filename )
76  {
77  foundFile = true;
78  }
79  else ++i;
80  ++it;
81  }
82  if( foundFile )
83  return i;
84  return 0;
85 }
FileNameHolder fileNames_
List of files to be processed, obtained from the DDLDocumentProvider.
Definition: DDLParser.h:140
bool DDLParser::isParsed ( const std::string &  filename)
private

Is the file already parsed?

Definition at line 88 of file DDLParser.cc.

References runEdmFileComparison::found, isFound(), and parsed_.

89 {
90  size_t found = isFound(filename);
91  if (found)
92  return parsed_[found];
93  return false;
94 }
std::map< int, bool > parsed_
Parse status of a given file.
Definition: DDLParser.h:143
size_t isFound(const std::string &filename)
Is the file already known by the DDLParser? Returns 0 if not found, and index if found.
Definition: DDLParser.cc:68
int DDLParser::parse ( const DDLDocumentProvider dp)

Parse all files. Return is meaningless.

Definition at line 149 of file DDLParser.cc.

References DDLSAX2FileHandler::createDDConstants(), currFileName_, expHandler_, extractFileName(), fileHandler_, fileNames_, DDLDocumentProvider::getFileList(), getNameSpace(), DDLDocumentProvider::getURLList(), mps_fire::i, isFound(), LogDebug, nFiles_, parsed_, parseFile(), SAX2Parser_, DDLSAX2Handler::setNameSpace(), and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by output(), XMLIdealGeometryESSource::produce(), XMLIdealMagneticFieldGeometryESProducer::produce(), and testParser().

150 {
151  edm::LogInfo ("DDLParser") << "Start Parsing. Validation is set off for the time being." << std::endl;
152  // prep for pass 1 through DDD XML
153  SAX2Parser_->setFeature( XMLUni::fgSAX2CoreValidation, false );
154  SAX2Parser_->setFeature( XMLUni::fgSAX2CoreNameSpaces, false );
155 
156  // This need be only done once, so might as well to it here.
157  size_t fileIndex = 0;
158  std::vector<std::string> fullFileName;
159  const std::vector < std::string >& fileList = dp.getFileList();
160  const std::vector < std::string >& urlList = dp.getURLList();
161 
162  for(; fileIndex < fileList.size(); ++fileIndex )
163  {
164  std::string ts = urlList[fileIndex];
165  std::string tf = fileList[fileIndex];
166  if ( !ts.empty() ) {
167  if ( ts[ts.size() - 1] == '/') {
168  fullFileName.emplace_back( ts + tf );
169  } else {
170  fullFileName.emplace_back( ts + "/" + tf );
171  }
172  } else {
173  fullFileName.emplace_back( tf );
174  }
175  }
176 
177  for( const auto& fnit : fullFileName )
178  {
179  size_t foundFile = isFound( extractFileName( fnit ));
180 
181  if( !foundFile )
182  {
183  pair <std::string, std::string> pss;
184  pss.first = extractFileName( fnit );
185  pss.second = fnit;
186  fileNames_[nFiles_++] = pss;
187  parsed_[nFiles_ - 1] = false;
188  }
189  }
190 
191  // Start processing the files found in the config file.
192  assert( fileNames_.size() == nFiles_ );
193 
194  // PASS 1: This was added later (historically) to implement the DDD
195  // requirement for Expressions.
196 
197  SAX2Parser_->setContentHandler(expHandler_);
198  for( size_t i = 0; i < nFiles_; ++i )
199  {
200  if( !parsed_[i])
201  {
202  currFileName_ = fileNames_[i].second;
204  parseFile(i);
205  }
206  }
208 
209  // PASS 2:
210 
211  SAX2Parser_->setContentHandler(fileHandler_);
212 
213  // No need to validate (regardless of user's doValidation
214  // because the files have already been validated on the first pass.
215  // This optimization suggested by Martin Liendl.
216 
217  // Process files again.
218  for( size_t i = 0; i < nFiles_; ++i )
219  {
220  if( !parsed_[i]) {
221  currFileName_ = fileNames_[i].second;
223  parseFile(i);
224  parsed_[i] = true;
225  pair<std::string, std::string> namePair = fileNames_[i];
226  LogDebug ("DDLParser") << "Completed parsing file " << namePair.second << std::endl;
227  }
228  }
229  return 0;
230 }
#define LogDebug(id)
std::map< int, bool > parsed_
Parse status of a given file.
Definition: DDLParser.h:143
std::pair< ALIstring, ALIstring > pss
Definition: Fit.h:27
DDLSAX2FileHandler * fileHandler_
Definition: DDLParser.h:155
SAX2XMLReader * SAX2Parser_
SAX2XMLReader is one way of parsing.
Definition: DDLParser.h:152
std::string currFileName_
Which file is currently being processed.
Definition: DDLParser.h:149
FileNameHolder fileNames_
List of files to be processed, obtained from the DDLDocumentProvider.
Definition: DDLParser.h:140
std::string const extractFileName(const std::string &fullname)
Definition: DDLParser.cc:252
size_t isFound(const std::string &filename)
Is the file already known by the DDLParser? Returns 0 if not found, and index if found.
Definition: DDLParser.cc:68
virtual const std::vector< std::string > & getURLList(void) const =0
Return a list of urls as a vector of strings.
DDLSAX2ExpressionHandler * expHandler_
Definition: DDLParser.h:156
void parseFile(const int &numtoproc)
Parse File. Just to hold some common looking code.
Definition: DDLParser.cc:233
virtual const std::vector< std::string > & getFileList(void) const =0
Return a list of files as a vector of strings.
size_t nFiles_
Number of files + 1.
Definition: DDLParser.h:146
virtual void setNameSpace(const std::string &nms)
std::string const getNameSpace(const std::string &fname)
Definition: DDLParser.cc:258
void createDDConstants() const
creates all DDConstant from the evaluator which has been already &#39;filled&#39; in the first scan of the do...
void DDLParser::parse ( const std::vector< unsigned char > &  ablob,
unsigned int  bsize 
)

Definition at line 139 of file DDLParser.cc.

References DDLSAX2FileHandler::createDDConstants(), expHandler_, and SAX2Parser_.

140 {
141  char* dummy(nullptr);
142  MemBufInputSource mbis( &*ablob.begin(), bsize, dummy );
143  SAX2Parser_->parse(mbis);
145 
146 }
SAX2XMLReader * SAX2Parser_
SAX2XMLReader is one way of parsing.
Definition: DDLParser.h:152
DDLSAX2ExpressionHandler * expHandler_
Definition: DDLParser.h:156
void createDDConstants() const
creates all DDConstant from the evaluator which has been already &#39;filled&#39; in the first scan of the do...
void DDLParser::parseFile ( const int &  numtoproc)
private

Parse File. Just to hold some common looking code.

Definition at line 233 of file DDLParser.cc.

References currFileName_, fileNames_, alignmentValidation::fname, parsed_, SAX2Parser_, and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by parse(), and parseOneFile().

234 {
235  if (!parsed_[numtoproc])
236  {
237  const std::string & fname = fileNames_[numtoproc].second;
238 
240  SAX2Parser_->parse(currFileName_.c_str());
241  }
242 }
std::map< int, bool > parsed_
Parse status of a given file.
Definition: DDLParser.h:143
SAX2XMLReader * SAX2Parser_
SAX2XMLReader is one way of parsing.
Definition: DDLParser.h:152
std::string currFileName_
Which file is currently being processed.
Definition: DDLParser.h:149
FileNameHolder fileNames_
List of files to be processed, obtained from the DDLDocumentProvider.
Definition: DDLParser.h:140
string fname
main script
bool DDLParser::parseOneFile ( const std::string &  filename)

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.

Definition at line 99 of file DDLParser.cc.

References DDLSAX2FileHandler::createDDConstants(), currFileName_, expHandler_, extractFileName(), fileHandler_, corrVsCorr::filename, fileNames_, edm::FileInPath::fullPath(), getNameSpace(), isFound(), LogDebug, nFiles_, parsed_, parseFile(), SAX2Parser_, DDLSAX2Handler::setNameSpace(), and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by CompareDDCompactViews::beginRun().

100 {
101  std::string filename = extractFileName( fullname );
102  edm::FileInPath fp( fullname );
103  std::string absoluteFileName = fp.fullPath();
104  size_t foundFile = isFound( filename );
105  if( !foundFile )
106  {
107  pair< std::string, std::string > pss;
108  pss.first = filename;
109  pss.second = absoluteFileName; //url+filename;
110  int fIndex = nFiles_;
112  ++nFiles_;
113  parsed_[fIndex] = false;
114 
115  currFileName_ = fileNames_[fIndex].second;
116 
117  SAX2Parser_->setContentHandler( expHandler_ );
118  expHandler_->setNameSpace( getNameSpace( filename ));
119 
120  LogDebug ("DDLParser") << "ParseOneFile() Parsing: " << fileNames_[fIndex].second << std::endl;
121  parseFile( fIndex );
123  // PASS 2:
124 
125  SAX2Parser_->setContentHandler(fileHandler_);
127  parseFile ( fIndex );
128  parsed_[fIndex] = true;
129  }
130  else // was found and is parsed...
131  {
132  return true;
133  }
134  return false;
135 }
#define LogDebug(id)
std::map< int, bool > parsed_
Parse status of a given file.
Definition: DDLParser.h:143
std::pair< ALIstring, ALIstring > pss
Definition: Fit.h:27
DDLSAX2FileHandler * fileHandler_
Definition: DDLParser.h:155
SAX2XMLReader * SAX2Parser_
SAX2XMLReader is one way of parsing.
Definition: DDLParser.h:152
std::string currFileName_
Which file is currently being processed.
Definition: DDLParser.h:149
FileNameHolder fileNames_
List of files to be processed, obtained from the DDLDocumentProvider.
Definition: DDLParser.h:140
std::string const extractFileName(const std::string &fullname)
Definition: DDLParser.cc:252
size_t isFound(const std::string &filename)
Is the file already known by the DDLParser? Returns 0 if not found, and index if found.
Definition: DDLParser.cc:68
DDLSAX2ExpressionHandler * expHandler_
Definition: DDLParser.h:156
void parseFile(const int &numtoproc)
Parse File. Just to hold some common looking code.
Definition: DDLParser.cc:233
size_t nFiles_
Number of files + 1.
Definition: DDLParser.h:146
virtual void setNameSpace(const std::string &nms)
std::string const getNameSpace(const std::string &fname)
Definition: DDLParser.cc:258
void createDDConstants() const
creates all DDConstant from the evaluator which has been already &#39;filled&#39; in the first scan of the do...

Member Data Documentation

DDCompactView& DDLParser::cpv_
private

reference to storage

Definition at line 137 of file DDLParser.h.

std::string DDLParser::currFileName_
private

Which file is currently being processed.

Definition at line 149 of file DDLParser.h.

Referenced by parse(), parseFile(), and parseOneFile().

DDLElementRegistry* DDLParser::elementRegistry_
private

Definition at line 154 of file DDLParser.h.

Referenced by DDLParser(), and ~DDLParser().

DDLSAX2Handler* DDLParser::errHandler_
private

Definition at line 157 of file DDLParser.h.

Referenced by DDLParser(), and ~DDLParser().

DDLSAX2ExpressionHandler* DDLParser::expHandler_
private

Definition at line 156 of file DDLParser.h.

Referenced by DDLParser(), parse(), parseOneFile(), and ~DDLParser().

DDLSAX2FileHandler* DDLParser::fileHandler_
private

Definition at line 155 of file DDLParser.h.

Referenced by DDLParser(), getDDLSAX2FileHandler(), parse(), parseOneFile(), and ~DDLParser().

FileNameHolder DDLParser::fileNames_
private

List of files to be processed, obtained from the DDLDocumentProvider.

Definition at line 140 of file DDLParser.h.

Referenced by clearFiles(), isFound(), parse(), parseFile(), and parseOneFile().

size_t DDLParser::nFiles_
private

Number of files + 1.

Definition at line 146 of file DDLParser.h.

Referenced by parse(), and parseOneFile().

std::map<int, bool> DDLParser::parsed_
private

Parse status of a given file.

Definition at line 143 of file DDLParser.h.

Referenced by clearFiles(), isParsed(), parse(), parseFile(), and parseOneFile().

SAX2XMLReader* DDLParser::SAX2Parser_
private

SAX2XMLReader is one way of parsing.

Definition at line 152 of file DDLParser.h.

Referenced by DDLParser(), getXMLParser(), parse(), parseFile(), and parseOneFile().