casa  5.7.0-16
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
asdm::TableStreamReader< T, R > Class Template Reference

A generic class to read a file containing an ASDM table as a stream. More...

#include <TableStreamReader.h>

Public Member Functions

 TableStreamReader ()
 An empty constructor. More...
 
virtual ~TableStreamReader ()
 The destructor. More...
 
void open (const std::string &directory)
 Opens a file expected to contain an ASDM table of type T with rows of type R. More...
 
void reset ()
 Repositions the read head to the beginning of the table. More...
 
const std::vector< R * > & nextNRows (unsigned int nRows)
 Reads at most n rows in the file, creates as many memory representations of these rows and return the reference of a vector of pointers on these representations. More...
 
const std::vector< R * > & untilNBytes (unsigned int nBytes)
 Reads as many rows as possible in the file, keeps their in memory representation until the number of read bytes is greater or equal a number of bytes, n, passed as a parameter to the method. More...
 
bool hasRows ()
 Returns true if the end of the file has not been reached. More...
 
void close ()
 Releases all the resources allocated to the instance which can be reused with another file. More...
 

Private Types

enum  State {
  S_CLOSED,
  S_OPENED
}
 
enum  Transition {
  T_OPEN,
  T_CHECK,
  T_RESET,
  T_READ,
  T_CLOSE
}
 

Private Member Functions

void checkState (Transition t, const std::string &methodName) const
 
void clear ()
 Empty the local storage containing the rows obtained during the last read operation. More...
 
void skipUntilEmptyLine (int maxSkips)
 
std::string nextLine ()
 
std::pair< std::string,
std::string > 
headerField2Pair (const std::string &hf)
 
std::string requireMIMEHeader ()
 
std::pair< std::string,
std::string > 
requireHeaderField (const std::string &hf)
 
void requireBoundary (const std::string &boundary, int maxLines)
 
std::string accumulateUntilBoundary (const std::string &boundary, int maxLines)
 
std::string requireBoundaryInCT (const std::string &ctValue)
 
std::string unquote (const std::string &s, std::string &unquoted)
 

Private Attributes

std::string tablePath
 
std::ifstream tableFile
 
std::string currentLine
 
std::string boundary_1
 
off_t fileSizeInBytes
 
off_t endBoundarySizeInBytes
 
asdm::EndianIFStream eifs
 
std::vector< std::string > attributesSeq
 
asdm::ASDM asdm
 
std::vector< R * > rows
 
char * readBuffer
 
std::streampos whereRowsStart
 
State currentState
 

Detailed Description

template<class T, class R>
class asdm::TableStreamReader< T, R >

A generic class to read a file containing an ASDM table as a stream.

The purpose of this class is to provide the programmer with a way to read a file containing an ASDM table by successive slices. Each slice is transformed into the in memory representation of the rows which have been read. A slice can be specified in two ways :

Remarks

Parameters
TThe parameter T must be the type of one of the tables which can be found in an ASDM (e.g. AntennaTable)
RThe parameter R must be the type of the rows which make the content of a table of type T (e.g. AntennaRow is T is AntennaTable).

Definition at line 39 of file TableStreamReader.h.

Member Enumeration Documentation

template<class T , class R >
enum asdm::TableStreamReader::State
private
Enumerator
S_CLOSED 
S_OPENED 

Definition at line 265 of file TableStreamReader.h.

template<class T , class R >
enum asdm::TableStreamReader::Transition
private
Enumerator
T_OPEN 
T_CHECK 
T_RESET 
T_READ 
T_CLOSE 

Definition at line 266 of file TableStreamReader.h.

Constructor & Destructor Documentation

template<class T , class R >
asdm::TableStreamReader< T, R >::TableStreamReader ( )
inline
template<class T , class R >
virtual asdm::TableStreamReader< T, R >::~TableStreamReader ( )
inlinevirtual

The destructor.

Definition at line 49 of file TableStreamReader.h.

Member Function Documentation

template<class T , class R >
std::string asdm::TableStreamReader< T, R >::accumulateUntilBoundary ( const std::string &  boundary,
int  maxLines 
)
inlineprivate

cout << "Entering accumulateUntilBoundary with maxLines = " << maxLines << std::endl;

not sure where this trim is coming from

Definition at line 415 of file TableStreamReader.h.

References casa::name(), asdm::TableStreamReader< T, R >::nextLine(), and casacore::trim().

Referenced by asdm::TableStreamReader< T, R >::open().

template<class T , class R >
void asdm::TableStreamReader< T, R >::checkState ( Transition  t,
const std::string &  methodName 
) const
inlineprivate
template<class T , class R >
void asdm::TableStreamReader< T, R >::clear ( )
inlineprivate

Empty the local storage containing the rows obtained during the last read operation.

Definition at line 282 of file TableStreamReader.h.

References asdm::TableStreamReader< T, R >::rows.

Referenced by asdm::TableStreamReader< T, R >::close(), asdm::TableStreamReader< T, R >::nextNRows(), asdm::TableStreamReader< T, R >::reset(), and asdm::TableStreamReader< T, R >::untilNBytes().

template<class T , class R >
void asdm::TableStreamReader< T, R >::close ( )
inline
template<class T , class R >
bool asdm::TableStreamReader< T, R >::hasRows ( )
inline
template<class T , class R >
std::pair<std::string, std::string> asdm::TableStreamReader< T, R >::headerField2Pair ( const std::string &  hf)
inlineprivate
template<class T , class R >
std::string asdm::TableStreamReader< T, R >::nextLine ( )
inlineprivate
template<class T , class R >
const std::vector<R*>& asdm::TableStreamReader< T, R >::nextNRows ( unsigned int  nRows)
inline

Reads at most n rows in the file, creates as many memory representations of these rows and return the reference of a vector of pointers on these representations.

Parameters
nRowsthe maximum number of rows to read.
Returns
a constant reference to a vector of pointers on instances of R.

Definition at line 194 of file TableStreamReader.h.

References asdm::TableStreamReader< T, R >::asdm, asdm::TableStreamReader< T, R >::attributesSeq, asdm::TableStreamReader< T, R >::checkState(), asdm::TableStreamReader< T, R >::clear(), asdm::TableStreamReader< T, R >::eifs, asdm::ASDM::getTable(), asdm::TableStreamReader< T, R >::hasRows(), casa::name(), asdm::TableStreamReader< T, R >::rows, and asdm::TableStreamReader< T, R >::T_READ.

template<class T , class R >
void asdm::TableStreamReader< T, R >::open ( const std::string &  directory)
inline

Opens a file expected to contain an ASDM table of type T with rows of type R.

Parameters
directorythe path to the directory containing the file.

Open the file.

Determine the size of the file.

And start parsing the content.

cout << "boundary_1 = " << boundary_1 << std::endl;

We have the xmlHeader, let's parse it.

Then it's an "old fashioned" MIME file for tables. Just try to deserialize it with Big_Endian for the bytes ordering.

It's a new (and correct) MIME file for tables.

1st) Look for a BulkStoreRef element with an attribute byteOrder.

Skip the two first children (Entity and ContainerEntity).

We found BulkStoreRef, now look for its attribute byteOrder.

2nd) Look for the Attributes element and grab the names of the elements it contains.

Create an EndianIFStream from the substring containing the binary part.

We do nothing with that but we have to read it.

Let's read numRows but ignore it and rely on the value specified in the ASDM.xml file.

Memorize the starting point of rows.

find where the rows end, seek to near the end

the accumulateUntilBoundary looks at "lines", but it may be starting from inside the binary part where null values might be found At most, there might be 100 bytes of null, or 100 lines. So limit the search to 100 lines before giving up.

the full size of the boundary and anything after it

reset back to start of rows

Update the state

Definition at line 58 of file TableStreamReader.h.

References asdm::TableStreamReader< T, R >::accumulateUntilBoundary(), asdm::TableStreamReader< T, R >::attributesSeq, asdm::ByteOrder::Big_Endian, asdm::TableStreamReader< T, R >::boundary_1, asdm::TableStreamReader< T, R >::checkState(), asdm::TableStreamReader< T, R >::currentState, asdm::TableStreamReader< T, R >::eifs, asdm::TableStreamReader< T, R >::endBoundarySizeInBytes, asdm::TableStreamReader< T, R >::fileSizeInBytes, asdm::Entity::fromBin(), asdm::ByteOrder::fromString(), casa::name(), asdm::TableStreamReader< T, R >::requireBoundary(), asdm::TableStreamReader< T, R >::requireMIMEHeader(), asdm::TableStreamReader< T, R >::S_OPENED, asdm::TableStreamReader< T, R >::skipUntilEmptyLine(), asdm::TableStreamReader< T, R >::T_OPEN, asdm::TableStreamReader< T, R >::tableFile, asdm::TableStreamReader< T, R >::tablePath, and asdm::TableStreamReader< T, R >::whereRowsStart.

template<class T , class R >
void asdm::TableStreamReader< T, R >::requireBoundary ( const std::string &  boundary,
int  maxLines 
)
inlineprivate

cout << "Entering require boundary with boundary == '" << boundary << "' and maxLines = " << maxLines << std::endl;

Definition at line 398 of file TableStreamReader.h.

References casa::name(), and asdm::TableStreamReader< T, R >::nextLine().

Referenced by asdm::TableStreamReader< T, R >::open().

template<class T , class R >
std::string asdm::TableStreamReader< T, R >::requireBoundaryInCT ( const std::string &  ctValue)
inlineprivate
template<class T , class R >
std::pair<std::string, std::string> asdm::TableStreamReader< T, R >::requireHeaderField ( const std::string &  hf)
inlineprivate
template<class T , class R >
std::string asdm::TableStreamReader< T, R >::requireMIMEHeader ( )
inlineprivate

MIME-Version

cout << name_value.first << "=" << name_value.second << std::endl; if (currentLine != "MIME-Version: 1.0") // a work around for the case when the very first character is not the expected "M" (happened with some corrupted data).

Content-Type

cout << "boundary_1 =" << boundary_1 << std::endl;

Content-Description name_value = requireHeaderField("CONTENT-DESCRIPTION");

Content-Location name_value = requireHeaderField("CONTENT-LOCATION");

Look for an empty line in the at most 10 subsequent lines.

Definition at line 343 of file TableStreamReader.h.

References asdm::TableStreamReader< T, R >::boundary_1, asdm::TableStreamReader< T, R >::currentLine, asdm::TableStreamReader< T, R >::headerField2Pair(), casa::name(), asdm::TableStreamReader< T, R >::nextLine(), asdm::TableStreamReader< T, R >::requireBoundaryInCT(), asdm::TableStreamReader< T, R >::requireHeaderField(), casacore::C::second, asdm::TableStreamReader< T, R >::skipUntilEmptyLine(), and asdm::TableStreamReader< T, R >::tablePath.

Referenced by asdm::TableStreamReader< T, R >::open().

template<class T , class R >
void asdm::TableStreamReader< T, R >::reset ( )
inline

Repositions the read head to the beginning of the table.

The internal storage containing the result of the last read operation is cleared.

Definition at line 182 of file TableStreamReader.h.

References asdm::TableStreamReader< T, R >::checkState(), asdm::TableStreamReader< T, R >::clear(), asdm::TableStreamReader< T, R >::T_RESET, asdm::TableStreamReader< T, R >::tableFile, and asdm::TableStreamReader< T, R >::whereRowsStart.

template<class T , class R >
void asdm::TableStreamReader< T, R >::skipUntilEmptyLine ( int  maxSkips)
inlineprivate

cout << "Entering skipUntilEmptyLine" << std::endl;

not sure where this trim is coming from

cout << "Exiting skipUntilEmptyLine" << std::endl;

Definition at line 288 of file TableStreamReader.h.

References casa::name(), asdm::TableStreamReader< T, R >::nextLine(), and casacore::trim().

Referenced by asdm::TableStreamReader< T, R >::open(), and asdm::TableStreamReader< T, R >::requireMIMEHeader().

template<class T , class R >
std::string asdm::TableStreamReader< T, R >::unquote ( const std::string &  s,
std::string &  unquoted 
)
inlineprivate
template<class T , class R >
const std::vector<R*>& asdm::TableStreamReader< T, R >::untilNBytes ( unsigned int  nBytes)
inline

Reads as many rows as possible in the file, keeps their in memory representation until the number of read bytes is greater or equal a number of bytes, n, passed as a parameter to the method.

Parameters
nthe number of read bytes which is used as an upper limit to the read operation.
Returns
a constant reference to a vector of pointers on instances of R.

Definition at line 214 of file TableStreamReader.h.

References asdm::TableStreamReader< T, R >::asdm, asdm::TableStreamReader< T, R >::attributesSeq, asdm::TableStreamReader< T, R >::checkState(), asdm::TableStreamReader< T, R >::clear(), asdm::TableStreamReader< T, R >::eifs, asdm::ASDM::getTable(), asdm::TableStreamReader< T, R >::hasRows(), casa::name(), asdm::TableStreamReader< T, R >::rows, asdm::TableStreamReader< T, R >::T_READ, and asdm::TableStreamReader< T, R >::tableFile.

Member Data Documentation

template<class T , class R >
asdm::ASDM asdm::TableStreamReader< T, R >::asdm
private
template<class T , class R >
std::vector<std::string> asdm::TableStreamReader< T, R >::attributesSeq
private
template<class T , class R >
std::string asdm::TableStreamReader< T, R >::boundary_1
private
template<class T , class R >
std::string asdm::TableStreamReader< T, R >::currentLine
private
template<class T , class R >
State asdm::TableStreamReader< T, R >::currentState
private
template<class T , class R >
asdm::EndianIFStream asdm::TableStreamReader< T, R >::eifs
private
template<class T , class R >
off_t asdm::TableStreamReader< T, R >::endBoundarySizeInBytes
private
template<class T , class R >
off_t asdm::TableStreamReader< T, R >::fileSizeInBytes
private
template<class T , class R >
char* asdm::TableStreamReader< T, R >::readBuffer
private
template<class T , class R >
std::vector<R*> asdm::TableStreamReader< T, R >::rows
private
template<class T , class R >
std::ifstream asdm::TableStreamReader< T, R >::tableFile
private
template<class T , class R >
std::string asdm::TableStreamReader< T, R >::tablePath
private
template<class T , class R >
std::streampos asdm::TableStreamReader< T, R >::whereRowsStart
private

The documentation for this class was generated from the following file: