VOTableReader.hh 2.84 KB
/*
 * VOTableReader.hh
 *
 *  Created on: 7 août 2013
 *      Author: CS
 */

#ifndef VOTABLEREADER_HH_
#define VOTABLEREADER_HH_

#include "XMLReader.hh"

namespace TimeTableCatalog {

/**
 * Reads a TimeTable from an InternalXML formated file.
 * Something like :
 *  <?xml version="1.0" encoding="UTF-8"?>
 *  <VOTABLE version="1.3">
 *   <DESCRIPTION> Time Table generated by AMDA @ CDPP;
 Conditions:   Solar Proton Events Affecting the Earth Environment from http://www.swpc.noaa.gov/ftpdir/indices/SPE.txt
 January 1976 - July 2007
 PARTICLE EVENT
 Start - Maximum;
 Source: Upload Time Table;
 Creation Date :  2009-04-07 12:26:52;
 </DESCRIPTION>
 <RESOURCE>
 <DESCRIPTION> AMDA @ CDPP</DESCRIPTION>
 <TABLE>
 <FIELD datatype="char" name="Start Time" ID="TimeIntervalStart" ucd="time.start">
 <DESCRIPTION>time tag for beginning of interval</DESCRIPTION>
 </FIELD>
 <FIELD datatype="char" name="Stop Time" ID="TimeIntervalStop" ucd="time.stop">
 <DESCRIPTION>time tag for end of interval</DESCRIPTION>
 </FIELD>
 <DATA>
 <TABLEDATA>
 <TR>
 <TD>1976-04-30T21:20:00</TD>
 <TD>1976-05-01T17:00:00</TD>
 </TR>
 <TR>
 <TD>1977-09-19T14:30:00</TD>
 <TD>1977-09-19T21:30:00</TD>
 </TR>
 </TABLEDATA>
 </DATA>
 </TABLE>
 </RESOURCE>
 </VOTABLE>
 *
 */
class VOTableReader: public TimeTableCatalog::XMLReader {
public:

	static const std::string FORMAT;

	VOTableReader(const std::string& pPath);
	virtual ~VOTableReader();

	/**
	 * Creates an instance of this.
	 */
	std::unique_ptr<AbstractReader> createInstance(const std::string& pPath);

	/**
	 * Gets the first xml node of the tt in this XML format.
	 */
	std::string getFirstNode();

	ParameterDescription::ParameterType getTypeFromString(std::string type);

private:

	/**
	 * Processes each interested node of an XMl file.
	 */
	void processNode(TimeTable& pTT, xmlTextReaderPtr reader, int &crtIndex);

	/**
	 * Read DESCRIPTION tags
	 */
	void readDescription(TimeTable& pTT, xmlTextReaderPtr reader);

	/**
	 * Read FIELD tags
	 */
	void readField(TimeTable& pTT, xmlTextReaderPtr reader);

	/**
	 * Read TR/TD tags
	 */
	void readInterval (TimeTable& pTT, xmlTextReaderPtr reader, int pcrtIndex);

	/**
	 * Extracts metadata from a tag text.
	 */
	void readMetadata(const std::string& pDescription, TimeTable& pTimeTable);

	bool _readingVOTable;

	bool _readingResource;

	bool _readingTable;

	/**
	 * Flag indicating we are currently reading a FIELD TAG
	 */
	bool    _readingField;

	/**
	 *  Flag indicating we are currently reading a DESCRITPTION TAG
	 */
	bool    _readingDescription;

	/**
	 * Flag indicating we are currently reading a TR TAG
	 */
	bool    _readingTr;

	/**
	 * Flag indicating we are currently reading a TD TAG
	 */
	bool    _readingTd;

	/**
	 * Current TD TAG count
	 */
	int _tdCount;

	/**
	 * Current FIELD TAG count
	 */
	int _fieldCount;
};

} /* namespace TimeTableCatalog */
#endif /* VOTABLEREADER_HH_ */