CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DDLParser.cc
Go to the documentation of this file.
1 /***************************************************************************
2  DDLParser.cc - description
3  -------------------
4  begin : Mon Oct 22 2001
5  email : case@ucdhep.ucdavis.edu
6 ***************************************************************************/
7 
8 /***************************************************************************
9  * *
10  * DDDParser sub-component of DDD *
11  * *
12  ***************************************************************************/
13 
16 
19 
20 #include <xercesc/framework/MemBufInputSource.hpp>
22 
23 #include <iostream>
24 
25 using namespace std;
26 
27 using namespace XERCES_CPP_NAMESPACE;
28 
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 }
51 
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 }
62 
67 SAX2XMLReader*
69 {
70  return SAX2Parser_;
71 }
72 
75 {
76  return fileHandler_;
77 }
78 
79 size_t
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 }
98 
99 bool
101 {
102  size_t found = isFound(filename);
103  if (found)
104  return parsed_[found];
105  return false;
106 }
107 
108 // Must receive a filename and path relative to the src directory of a CMSSW release
109 // e.g. DetectorDescription/test/myfile.xml
110 bool
111 DDLParser::parseOneFile( const std::string& fullname ) //, const std::string& url)
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 }
183 
184 // This is for parsing the content of a blob stored in the conditions system of CMS.
185 void
186 DDLParser::parse( const std::vector<unsigned char>& ablob, unsigned int bsize )
187 {
188  char* dummy(0);
189  MemBufInputSource mbis( &*ablob.begin(), bsize, dummy );
190  SAX2Parser_->parse(mbis);
191 }
192 
193 std::vector < std::string >
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 }
203 
204 void
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 }
211 
212 void
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 }
219 
220 int
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 }
358 
359 void
360 DDLParser::parseFile( const int& numtoproc )
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 }
389 
390 // Return the name of the Current file being processed by the parser.
393 {
394  return currFileName_;
395 }
396 
397 void
399 {
400  fileNames_.clear();
401  parsed_.clear();
402 }
403 
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 }
414 
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 }
#define LogDebug(id)
int i
Definition: DBlmapReader.cc:9
int parse(const DDLDocumentProvider &dp)
Parse all files. Return is meaningless.
Definition: DDLParser.cc:221
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 getCurrFileName()
Report which file currently being processed (or last processed).
Definition: DDLParser.cc:392
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
type of data representation of DDCompactView
Definition: DDCompactView.h:77
~DDLParser()
Destructor terminates the XMLPlatformUtils (as required by Xerces)
Definition: DDLParser.cc:53
DDLSAX2FileHandler is the SAX2 Handler for XML files found in the configuration file.
virtual const std::vector< std::string > & getFileList(void) const =0
Return a list of files as a vector of strings.
U second(std::pair< T, U > const &p)
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
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
bool parseOneFile(const std::string &filename)
Process a single files.
Definition: DDLParser.cc:111
DDLSAX2Handler * errHandler_
Definition: DDLParser.h:177
int j
Definition: DBlmapReader.cc:9
bool first
Definition: L1TdeRCT.cc:94
void clearFiles()
Clear the file list - see Warning!
Definition: DDLParser.cc:398
DDLSAX2FileHandler * getDDLSAX2FileHandler()
To get the parent this class allows access to the handler.
Definition: DDLParser.cc:74
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
#define DCOUT_V(M_v_Y, M_v_S)
Definition: DDdebug.h:54
std::vector< std::string > getFileList()
Return list of files.
Definition: DDLParser.cc:194
auto dp
Definition: deltaR.h:24
SAX2XMLReader * getXMLParser()
Get the SAX2Parser from the DDLParser. USE WITH CAUTION. Set your own handler, etc.
Definition: DDLParser.cc:68
string fname
main script
virtual void setNameSpace(const std::string &nms)
DDLDocumentProvider provides a set of URLs and filenames.
tuple filename
Definition: lut2db_cfg.py:20
DDLSAX2Handler inherits from Xerces C++ DefaultHandler.
void dumpFileList()
Print out the list of files.
Definition: DDLParser.cc:205
std::string fullPath() const
Definition: FileInPath.cc:171
#define DCOUT(M_v_Y, M_v_S)
Definition: DDdebug.h:53
tuple size
Write out results.
bool isParsed(const std::string &filename)
Is the file already parsed?
Definition: DDLParser.cc:100
int nFiles_
Number of files + 1.
Definition: DDLParser.h:164