CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Types | Public Member Functions | Protected 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...
 
void dumpFileList ()
 Print out the list of files. More...
 
void dumpFileList (std::ostream &co)
 
std::string extractFileName (std::string fullname)
 
std::string getCurrFileName ()
 Report which file currently being processed (or last processed). More...
 
DDLSAX2FileHandlergetDDLSAX2FileHandler ()
 To get the parent this class allows access to the handler. More...
 
std::vector< std::string > getFileList ()
 Return list of files. More...
 
std::string getNameSpace (const std::string &fname)
 
SAX2XMLReadergetXMLParser ()
 Get the SAX2Parser from the DDLParser. USE WITH CAUTION. Set your own handler, etc. More...
 
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...
 
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...
 

Protected Member Functions

 DDLParser ()
 
void parseFile (const int &numtoproc)
 Parse File. Just to hold some common looking code. More...
 

Private Attributes

std::string configFileName_
 Configuration file name. Only necessary until deprecated methods removed. More...
 
DDCompactViewcpv_
 reference to storage More...
 
std::string currFileName_
 Which file is currently being processed. More...
 
DDLSAX2HandlererrHandler_
 
DDLSAX2ExpressionHandlerexpHandler_
 
DDLSAX2FileHandlerfileHandler_
 
FileNameHolder fileNames_
 List of files to be processed, obtained from the DDLDocumentProvider. More...
 
int 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 64 of file DDLParser.h.

Member Typedef Documentation

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

Definition at line 70 of file DDLParser.h.

typedef XERCES_CPP_NAMESPACE::SAX2XMLReader DDLParser::SAX2XMLReader

Definition at line 68 of file DDLParser.h.

Constructor & Destructor Documentation

DDLParser::DDLParser ( DDCompactView cpv)

Constructor MUST associate a DDCompactView storage.

Definition at line 30 of file DDLParser.cc.

References AlgoInit(), DCOUT_V, errHandler_, expHandler_, fileHandler_, and SAX2Parser_.

31  : cpv_( cpv ),
32  nFiles_( 0 )
33 {
34  XMLPlatformUtils::Initialize();
35  AlgoInit();
36  SAX2Parser_ = XMLReaderFactory::createXMLReader();
37 
38  SAX2Parser_->setFeature(XMLUni::fgSAX2CoreValidation, false); // optional
39  SAX2Parser_->setFeature(XMLUni::fgSAX2CoreNameSpaces, false); // optional
40  // Specify other parser features, e.g.
41  // SAX2Parser_->setFeature(XMLUni::fgXercesSchemaFullChecking, false);
42 
46  SAX2Parser_->setErrorHandler(errHandler_);
47  SAX2Parser_->setContentHandler(fileHandler_);
48 
49  DCOUT_V('P', "DDLParser::DDLParser(): new (and only) DDLParser");
50 }
DDLSAX2FileHandler * fileHandler_
Definition: DDLParser.h:175
SAX2XMLReader * SAX2Parser_
SAX2XMLReader is one way of parsing.
Definition: DDLParser.h:173
DDLSAX2FileHandler is the SAX2 Handler for XML files found in the configuration file.
void AlgoInit()
Definition: AlgoInit.cc:13
DDLSAX2ExpressionHandler is the first pass SAX2 Handler for XML files found in the configuration file...
DDLSAX2ExpressionHandler * expHandler_
Definition: DDLParser.h:176
DDLSAX2Handler * errHandler_
Definition: DDLParser.h:177
#define DCOUT_V(M_v_Y, M_v_S)
Definition: DDdebug.h:54
DDLSAX2Handler inherits from Xerces C++ DefaultHandler.
DDCompactView & cpv_
reference to storage
Definition: DDLParser.h:155
int nFiles_
Number of files + 1.
Definition: DDLParser.h:164
DDLParser::DDLParser ( )
protected
DDLParser::~DDLParser ( void  )

Destructor terminates the XMLPlatformUtils (as required by Xerces)

Definition at line 53 of file DDLParser.cc.

References DCOUT_V, errHandler_, expHandler_, and fileHandler_.

54 {
55  // clean up and leave
56  delete expHandler_;
57  delete fileHandler_;
58  delete errHandler_;
59  XMLPlatformUtils::Terminate();
60  DCOUT_V('P', "DDLParser::~DDLParser(): destruct DDLParser");
61 }
DDLSAX2FileHandler * fileHandler_
Definition: DDLParser.h:175
DDLSAX2ExpressionHandler * expHandler_
Definition: DDLParser.h:176
DDLSAX2Handler * errHandler_
Definition: DDLParser.h:177
#define DCOUT_V(M_v_Y, M_v_S)
Definition: DDdebug.h:54

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 398 of file DDLParser.cc.

References fileNames_, and parsed_.

Referenced by XMLIdealGeometryESProducer::produce().

399 {
400  fileNames_.clear();
401  parsed_.clear();
402 }
std::map< int, bool > parsed_
Parse status of a given file.
Definition: DDLParser.h:161
FileNameHolder fileNames_
List of files to be processed, obtained from the DDLDocumentProvider.
Definition: DDLParser.h:158
void DDLParser::dumpFileList ( void  )

Print out the list of files.

Definition at line 205 of file DDLParser.cc.

References fileNames_.

206 {
207  edm::LogInfo ("DDLParser") << "File List:" << std::endl;
208  for (FileNameHolder::const_iterator it = fileNames_.begin(); it != fileNames_.end(); ++it)
209  edm::LogInfo ("DDLParser") << it->second.second << std::endl;
210 }
FileNameHolder fileNames_
List of files to be processed, obtained from the DDLDocumentProvider.
Definition: DDLParser.h:158
void DDLParser::dumpFileList ( std::ostream &  co)

Definition at line 213 of file DDLParser.cc.

References fileNames_.

214 {
215  co << "File List:" << std::endl;
216  for (FileNameHolder::const_iterator it = fileNames_.begin(); it != fileNames_.end(); ++it)
217  co << it->second.second << std::endl;
218 }
FileNameHolder fileNames_
List of files to be processed, obtained from the DDLDocumentProvider.
Definition: DDLParser.h:158
std::string DDLParser::extractFileName ( std::string  fullname)

Definition at line 405 of file DDLParser.cc.

References run_regression::ret, and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by parse(), and parseOneFile().

406 {
407  std::string ret = "";
408  size_t bit = fullname.rfind('/');
409  if ( bit < fullname.size() - 2 ) {
410  ret=fullname.substr(bit+1);
411  }
412  return ret;
413 }
std::string DDLParser::getCurrFileName ( void  )

Report which file currently being processed (or last processed).

Definition at line 392 of file DDLParser.cc.

References currFileName_.

393 {
394  return currFileName_;
395 }
std::string currFileName_
Which file is currently being processed.
Definition: DDLParser.h:170
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 74 of file DDLParser.cc.

References fileHandler_.

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

75 {
76  return fileHandler_;
77 }
DDLSAX2FileHandler * fileHandler_
Definition: DDLParser.h:175
std::vector< std::string > DDLParser::getFileList ( void  )

Return list of files.

Definition at line 194 of file DDLParser.cc.

References fileNames_.

195 {
196  std::vector<std::string> flist;
197  for (FileNameHolder::const_iterator fit = fileNames_.begin(); fit != fileNames_.end(); ++fit)
198  {
199  flist.push_back(fit->second.first); // was .second (mec: 2003:02:19
200  }
201  return flist;
202 }
FileNameHolder fileNames_
List of files to be processed, obtained from the DDLDocumentProvider.
Definition: DDLParser.h:158
std::string DDLParser::getNameSpace ( const std::string &  fname)

Definition at line 416 of file DDLParser.cc.

References j, run_regression::ret, and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by parse(), and parseOneFile().

417 {
418  size_t j = 0;
419  std::string ret="";
420  while (j < fname.size() && fname[j] != '.')
421  ++j;
422  if (j < fname.size() && fname[j] == '.')
423  ret = fname.substr(0, j);
424  return ret;
425 }
int j
Definition: DBlmapReader.cc:9
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 68 of file DDLParser.cc.

References SAX2Parser_.

Referenced by FIPConfiguration::readConfig().

69 {
70  return SAX2Parser_;
71 }
SAX2XMLReader * SAX2Parser_
SAX2XMLReader is one way of parsing.
Definition: DDLParser.h:173
size_t DDLParser::isFound ( const std::string &  filename)

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

Definition at line 80 of file DDLParser.cc.

References fileNames_, and i.

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

81 {
82  FileNameHolder::const_iterator it = fileNames_.begin();
83  size_t i = 1;
84  bool foundFile = false;
85  while( it != fileNames_.end() && !foundFile )
86  {
87  if( it->second.first == filename )
88  {
89  foundFile = true;
90  }
91  else ++i;
92  ++it;
93  }
94  if( foundFile )
95  return i;
96  return 0;
97 }
int i
Definition: DBlmapReader.cc:9
FileNameHolder fileNames_
List of files to be processed, obtained from the DDLDocumentProvider.
Definition: DDLParser.h:158
tuple filename
Definition: lut2db_cfg.py:20
bool DDLParser::isParsed ( const std::string &  filename)

Is the file already parsed?

Definition at line 100 of file DDLParser.cc.

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

101 {
102  size_t found = isFound(filename);
103  if (found)
104  return parsed_[found];
105  return false;
106 }
std::map< int, bool > parsed_
Parse status of a given file.
Definition: DDLParser.h:161
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:80
tuple filename
Definition: lut2db_cfg.py:20
int DDLParser::parse ( const DDLDocumentProvider dp)

Parse all files. Return is meaningless.

Definition at line 221 of file DDLParser.cc.

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

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

222 {
223  // edm::LogInfo ("DDLParser") << "Start Parsing. Validation is set to " << dp.doValidation() << "." << std::endl;
224  edm::LogInfo ("DDLParser") << "Start Parsing. Validation is set off for the time being." << std::endl;
225  // prep for pass 1 through DDD XML
226  // // Since this block does nothing for CMSSW right now, I have taken it all out
227  // This clean-up involves interface changes such as the removal of doValidation() everywhere (OR NOT
228  // if I decide to keep it for other testing reasons.)
229  // if (dp.doValidation())
230  // {
231  // // DCOUT_V('P', "WARNING: PARSER VALIDATION IS TURNED OFF REGARDLESS OF <Schema... ELEMENT");
232  // SAX2Parser_->setFeature(XMLUni::fgSAX2CoreValidation, true);
233  // SAX2Parser_->setFeature(XMLUni::fgSAX2CoreNameSpaces, true);
234  // // // SAX2Parser_->setFeature(XMLUni::fgXercesSchemaFullChecking, true);
235  // }
236  // else
237  // {
238  SAX2Parser_->setFeature(XMLUni::fgSAX2CoreValidation, false);
239  SAX2Parser_->setFeature(XMLUni::fgSAX2CoreNameSpaces, false);
240  // // SAX2Parser_->setFeature(XMLUni::fgXercesSchemaFullChecking, false);
241 
242  // }
243 
244  // This need be only done once, so might as well to it here.
245  size_t fileIndex = 0;
246  std::vector<std::string> fullFileName;
247 
248  for (; fileIndex < (dp.getFileList()).size(); ++fileIndex)
249  {
250  std::string ts = dp.getURLList()[fileIndex];
251  std::string tf = dp.getFileList()[fileIndex];
252  if ( ts.size() > 0 ) {
253  if ( ts[ts.size() - 1] == '/') {
254  fullFileName.push_back( ts + tf );
255  } else {
256  fullFileName.push_back( ts + "/" + tf );
257  }
258  } else {
259  fullFileName.push_back( tf );
260  }
261  }
262 
263  for (std::vector<std::string>::const_iterator fnit = fullFileName.begin();
264  fnit != fullFileName.end();
265  ++fnit)
266  {
267  size_t foundFile = isFound(extractFileName( *fnit ));
268 
269  if (!foundFile)
270  {
271  pair <std::string, std::string> pss;
272  pss.first = extractFileName( *fnit );
273  pss.second = *fnit;
274  fileNames_[nFiles_++] = pss;
275  parsed_[nFiles_ - 1]=false;
276  }
277  }
278 
279  // Start processing the files found in the config file.
280 
281  // PASS 1: This was added later (historically) to implement the DDD
282  // requirement for Expressions.
283  DCOUT('P', "DDLParser::parse(): PASS1: Just before setting Xerces content and error handlers... ");
284 
285 
286  // in cleaning up try-catch blocks 2007-06-26 I decided to remove
287  // this because of CMSSW rules. but keep the commented way I used to
288  // do it...
289  // DO NOT UNCOMMENT FOR ANY RELEASE; ONLY FOR DEBUGGING! try
290  // {
291  SAX2Parser_->setContentHandler(expHandler_);
292  for (size_t i = 0; i < fileNames_.size(); ++i)
293  {
294  // seal::SealTimer t("DDLParser: parsing expressions of file " +fileNames_[i].first);
295  if (!parsed_[i])
296  {
297  currFileName_ = fileNames_[i].second;
298  // std::cout << "currFileName = " << currFileName_ << std::endl;
300  // std::cout << "2) namespace = " << getNameSpace(extractFileName(currFileName_)) << std::endl;
301  parseFile(i);
302  }
303  }
305  // }
306  // DO NOT UNCOMMENT FOR ANY RELEASE; ONLY FOR DEBUGGING! catch (const XMLException& toCatch) {
307  // edm::LogInfo ("DDLParser") << "\nPASS1: XMLException while processing files... \n"
308  // << "Exception message is: \n"
309  // << StrX(toCatch.getMessage()) << "\n" ;
310  // XMLPlatformUtils::Terminate();
311  // // FIX use this after DEPRECATED stuff removed: throw(DDException("See XML Exception above"));
312  // return -1;
313  // }
314  // PASS 2:
315 
316  DCOUT('P', "DDLParser::parse(): PASS2: Just before setting Xerces content and error handlers... ");
317 
318  // in cleaning up try-catch blocks 2007-06-26 I decided to remove
319  // this because of CMSSW rules. but keep the commented way I used to
320  // do it...
321  // DO NOT UNCOMMENT FOR ANY RELEASE; ONLY FOR DEBUGGING! try
322  // {
323  SAX2Parser_->setContentHandler(fileHandler_);
324 
325  // No need to validate (regardless of user's doValidation
326  // because the files have already been validated on the first pass.
327  // This optimization suggested by Martin Liendl.
328  // SAX2Parser_->setFeature(StrX("http://xml.org/sax/features/validation"), false); // optional
329  // SAX2Parser_->setFeature(StrX("http://xml.org/sax/features/namespaces"), false); // optional
330  // SAX2Parser_->setFeature(StrX("http://apache.org/xml/features/validation/dynamic"), false);
331 
332 
333  // Process files again.
334  for (size_t i = 0; i < fileNames_.size(); ++i)
335  {
336  // seal::SealTimer t("DDLParser: parsing all elements of file " +fileNames_[i].first);
337  if (!parsed_[i]) {
338  currFileName_ = fileNames_[i].second;
339  // std::cout << "currFileName = " << currFileName_ << std::endl;
341  // std::cout << "3) namespace = " << getNameSpace(extractFileName(currFileName_)) << std::endl;
342  parseFile(i);
343  parsed_[i] = true;
344  pair<std::string, std::string> namePair = fileNames_[i];
345  LogDebug ("DDLParser") << "Completed parsing file " << namePair.second << std::endl;
346  }
347  }
348  // }
349  // DO NOT UNCOMMENT FOR ANY RELEASE; ONLY FOR DEBUGGING! catch (const XMLException& toCatch) {
350  // edm::LogError ("DDLParser") << "\nPASS2: XMLException while processing files... \n"
351  // << "Exception message is: \n"
352  // << StrX(toCatch.getMessage()) << "\n" ;
353  // XMLPlatformUtils::Terminate();
354  // return -1;
355  // }
356  return 0;
357 }
#define LogDebug(id)
int i
Definition: DBlmapReader.cc:9
std::map< int, bool > parsed_
Parse status of a given file.
Definition: DDLParser.h:161
std::pair< ALIstring, ALIstring > pss
Definition: Fit.h:27
std::string getNameSpace(const std::string &fname)
Definition: DDLParser.cc:416
std::string extractFileName(std::string fullname)
Definition: DDLParser.cc:405
DDLSAX2FileHandler * fileHandler_
Definition: DDLParser.h:175
SAX2XMLReader * SAX2Parser_
SAX2XMLReader is one way of parsing.
Definition: DDLParser.h:173
std::string currFileName_
Which file is currently being processed.
Definition: DDLParser.h:170
FileNameHolder fileNames_
List of files to be processed, obtained from the DDLDocumentProvider.
Definition: DDLParser.h:158
virtual const std::vector< std::string > & getFileList(void) const =0
Return a list of files as a vector of strings.
void dumpElementTypeCounter()
This dumps some statistics on elements encountered in the file.
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:80
DDLSAX2ExpressionHandler * expHandler_
Definition: DDLParser.h:176
virtual const std::vector< std::string > & getURLList(void) const =0
Return a list of urls as a vector of strings.
void parseFile(const int &numtoproc)
Parse File. Just to hold some common looking code.
Definition: DDLParser.cc:360
virtual void setNameSpace(const std::string &nms)
#define DCOUT(M_v_Y, M_v_S)
Definition: DDdebug.h:53
tuple size
Write out results.
int nFiles_
Number of files + 1.
Definition: DDLParser.h:164
void DDLParser::parse ( const std::vector< unsigned char > &  ablob,
unsigned int  bsize 
)

Definition at line 186 of file DDLParser.cc.

References SAX2Parser_.

187 {
188  char* dummy(0);
189  MemBufInputSource mbis( &*ablob.begin(), bsize, dummy );
190  SAX2Parser_->parse(mbis);
191 }
SAX2XMLReader * SAX2Parser_
SAX2XMLReader is one way of parsing.
Definition: DDLParser.h:173
void DDLParser::parseFile ( const int &  numtoproc)
protected

Parse File. Just to hold some common looking code.

Definition at line 360 of file DDLParser.cc.

References currFileName_, DCOUT, fileNames_, first, alignmentValidation::fname, parsed_, SAX2Parser_, edm::second(), and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by parse(), and parseOneFile().

361 {
362  if (!parsed_[numtoproc])
363  {
364  const std::string & fname = fileNames_[numtoproc].second;
365 
366  // in cleaning up try-catch blocks 2007-06-26 I decided to remove
367  // this because of CMSSW rules. but keep the commented way I used to
368  // do it...
369  // DO NOT UNCOMMENT FOR ANY RELEASE; ONLY FOR DEBUGGING! try
370  // {
372  SAX2Parser_->parse(currFileName_.c_str());
373  // }
374  // DO NOT UNCOMMENT FOR ANY RELEASE; ONLY FOR DEBUGGING! catch (const XMLException& toCatch)
375  // {
376  // std::string e("\nWARNING: DDLParser::parseFile, File: '");
377  // e += currFileName_ + "'\n"
378  // + "Exception message is: \n"
379  // + std::string(StrX(toCatch.getMessage()).localForm()) + "\n";
380  // throw(DDException(e));
381  // }
382  }
383  else
384  {
385  DCOUT('P', "\nWARNING: File " + fileNames_[numtoproc].first
386  + " has already been processed as " + fileNames_[numtoproc].second);
387  }
388 }
std::map< int, bool > parsed_
Parse status of a given file.
Definition: DDLParser.h:161
SAX2XMLReader * SAX2Parser_
SAX2XMLReader is one way of parsing.
Definition: DDLParser.h:173
std::string currFileName_
Which file is currently being processed.
Definition: DDLParser.h:170
FileNameHolder fileNames_
List of files to be processed, obtained from the DDLDocumentProvider.
Definition: DDLParser.h:158
U second(std::pair< T, U > const &p)
bool first
Definition: L1TdeRCT.cc:94
string fname
main script
#define DCOUT(M_v_Y, M_v_S)
Definition: DDdebug.h:53
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 111 of file DDLParser.cc.

References currFileName_, DCOUT, DCOUT_V, expHandler_, extractFileName(), fileHandler_, lut2db_cfg::filename, fileNames_, edm::FileInPath::fullPath(), getNameSpace(), isFound(), LogDebug, nFiles_, parsed_, parseFile(), SAX2Parser_, edm::second(), DDLSAX2Handler::setNameSpace(), and AlCaHLTBitMon_QueryRunRegistry::string.

112 {
113  // std::string filename = expHandler_->extractFileName(fullname);
115  // std::cout << "parseOneFile - fullname = " << fullname << std::endl;
116  // std::cout << "parseOneFile - filename = " << filename << std::endl;
117  edm::FileInPath fp(fullname);
118  std::string absoluteFileName = fp.fullPath();
119  size_t foundFile = isFound(filename);
120  if (!foundFile)
121  {
122  pair <std::string, std::string> pss;
123  pss.first = filename;
124  pss.second = absoluteFileName; //url+filename;
125  int fIndex = nFiles_;
127  ++nFiles_;
128  parsed_[fIndex]=false;
129 
130  currFileName_ = fileNames_[fIndex].second;
131 
132  // in cleaning up try-catch blocks 2007-06-26 I decided to remove
133  // this because of CMSSW rules. but keep the commented way I used to
134  // do it...
135  // DO NOT UNCOMMENT FOR ANY RELEASE; ONLY FOR DEBUGGING! try
136  // {
137  SAX2Parser_->setContentHandler(expHandler_);
138  expHandler_->setNameSpace( getNameSpace(filename) );
139  // std::cout << "0) namespace = " << getNameSpace(filename) << std::endl;
140  LogDebug ("DDLParser") << "ParseOneFile() Parsing: " << fileNames_[fIndex].second << std::endl;
141  parseFile ( fIndex );
142 
143  // }
144  // DO NOT UNCOMMENT FOR ANY RELEASE; ONLY FOR DEBUGGING! catch (const XMLException& toCatch) {
145  // edm::LogError ("DDLParser") << "\nDDLParser::ParseOneFile, PASS1: XMLException while processing files... \n"
146  // << "Exception message is: \n"
147  // << StrX(toCatch.getMessage()) << "\n" ;
148  // XMLPlatformUtils::Terminate();
149  // throw (DDException(" See XMLException above. "));
150  // }
151 
152  // PASS 2:
153 
154  DCOUT_V('P', "DDLParser::ParseOneFile(): PASS2: Just before setting Xerces content and error handlers... ");
155 
156  // DO NOT UNCOMMENT FOR ANY RELEASE; ONLY FOR DEBUGGING! try
157  // {
158 
159  SAX2Parser_->setContentHandler(fileHandler_);
160  // std::cout << "currFileName = " << currFileName_ << std::endl;
162  // std::cout << "1) namespace = " << getNameSpace(currFileName_) << std::endl;
163  parseFile ( fIndex );
164  parsed_[fIndex] = true;
165 
166  // }
167  // DO NOT UNCOMMENT FOR ANY RELEASE; ONLY FOR DEBUGGING! catch (const XMLException& toCatch) {
168  // edm::LogError ("DDLParser") << "\nDDLParser::ParseOneFile, PASS2: XMLException while processing files... \n"
169  // << "Exception message is: \n"
170  // << StrX(toCatch.getMessage()) << "\n" ;
171  // XMLPlatformUtils::Terminate();
172  // throw (DDException(" See XMLException above."));
173  // }
174  }
175  else // was found and is parsed...
176  {
177  DCOUT('P', " WARNING: DDLParser::ParseOneFile() file " + filename
178  + " was already parsed as " + fileNames_[foundFile].second);
179  return true;
180  }
181  return false;
182 }
#define LogDebug(id)
std::map< int, bool > parsed_
Parse status of a given file.
Definition: DDLParser.h:161
std::pair< ALIstring, ALIstring > pss
Definition: Fit.h:27
std::string getNameSpace(const std::string &fname)
Definition: DDLParser.cc:416
std::string extractFileName(std::string fullname)
Definition: DDLParser.cc:405
DDLSAX2FileHandler * fileHandler_
Definition: DDLParser.h:175
SAX2XMLReader * SAX2Parser_
SAX2XMLReader is one way of parsing.
Definition: DDLParser.h:173
std::string currFileName_
Which file is currently being processed.
Definition: DDLParser.h:170
FileNameHolder fileNames_
List of files to be processed, obtained from the DDLDocumentProvider.
Definition: DDLParser.h:158
U second(std::pair< T, U > const &p)
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:80
DDLSAX2ExpressionHandler * expHandler_
Definition: DDLParser.h:176
void parseFile(const int &numtoproc)
Parse File. Just to hold some common looking code.
Definition: DDLParser.cc:360
#define DCOUT_V(M_v_Y, M_v_S)
Definition: DDdebug.h:54
virtual void setNameSpace(const std::string &nms)
tuple filename
Definition: lut2db_cfg.py:20
#define DCOUT(M_v_Y, M_v_S)
Definition: DDdebug.h:53
int nFiles_
Number of files + 1.
Definition: DDLParser.h:164

Member Data Documentation

std::string DDLParser::configFileName_
private

Configuration file name. Only necessary until deprecated methods removed.

Definition at line 167 of file DDLParser.h.

DDCompactView& DDLParser::cpv_
private

reference to storage

Definition at line 155 of file DDLParser.h.

std::string DDLParser::currFileName_
private

Which file is currently being processed.

Definition at line 170 of file DDLParser.h.

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

DDLSAX2Handler* DDLParser::errHandler_
private

Definition at line 177 of file DDLParser.h.

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

DDLSAX2ExpressionHandler* DDLParser::expHandler_
private

Definition at line 176 of file DDLParser.h.

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

DDLSAX2FileHandler* DDLParser::fileHandler_
private

Definition at line 175 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 158 of file DDLParser.h.

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

int DDLParser::nFiles_
private

Number of files + 1.

Definition at line 164 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 161 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 173 of file DDLParser.h.

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