Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

Tools::HierarchicalConfigurationReader Class Reference

This is advanced version of ConfigurationReader. More...

#include <HierarchyConfigReader.h>

Inheritance diagram for Tools::HierarchicalConfigurationReader:

Inheritance graph
[legend]
Collaboration diagram for Tools::HierarchicalConfigurationReader:

Collaboration graph
[legend]
List of all members.

Public Member Functions

virtual StringclassName (void) const
 Answer receiver class name.
virtual ConfigurationreadConfiguration (Configuration *configuration)
virtual void readLine (void)
virtual StringparseLine (void)
virtual void parseAssignment (String *line)
virtual void parseBlockOpenning (String *line)
virtual void parseBlockClosing (String *line)
virtual ConfigurationgetConfigurationFor (String *path)
virtual void pushConfiguration (void)
virtual void popConfiguration (void)

Protected Attributes

OrderedCollectionstack

Detailed Description

This is advanced version of ConfigurationReader.

It allows to have nested configurations inside one file. Nested configuration can be specified like this:

  topLevelItem = value1
  nestedConfig1 {
    nestedLevelItem1 = value2
  }
  nestedConfig2.nestedLevelItem2 = value3
  nestedConfig2.nestedLevelItem3 = value4
  

Definition at line 44 of file HierarchyConfigReader.h.


Member Function Documentation

String * Tools::HierarchicalConfigurationReader::className void   )  const [virtual]
 

Answer receiver class name.

Because there isn't any standard way to obtain class name this method comes to place.

Every class should rewrite this method but many didn't (yet).

Reimplemented from Core::Object.

Definition at line 34 of file HierarchyConfigReader.cc.

00035 {
00036     return new String("HierarchicalConfigurationReader");
00037 }

Configuration * Tools::HierarchicalConfigurationReader::getConfigurationFor String path  )  [virtual]
 

Definition at line 131 of file HierarchyConfigReader.cc.

References Tools::ConfigurationReader::_configuration, Tools::Configuration::at(), Core::String::copy(), Core::String::indexOf(), Tools::Configuration::instances(), nil, Tools::ConfigurationReader::put(), and Core::String::size().

Referenced by parseAssignment().

00132 {
00133     Configuration *config = _configuration;
00134     String *item;
00135     int index;
00136 
00137     do {
00138         index = path->indexOf('.');
00139         if (index < 0) item = path;
00140         else {
00141             item = dynamic_cast<String *>(path->copy(0, index));
00142             path = dynamic_cast<String *>(path->copy(index + 1, path->size()));
00143         }
00144         config = dynamic_cast<Configuration *>(config->at(item, nil));
00145         if (config == nil) {
00146             Configuration *subConfig = new Configuration;
00147             put(item, subConfig);
00148             Configuration::instances()->put(item, subConfig);
00149             config = subConfig;
00150         }
00151     } while (item != path);
00152 
00153     return config;
00154 }

void Tools::HierarchicalConfigurationReader::parseAssignment String line  )  [virtual]
 

Definition at line 89 of file HierarchyConfigReader.cc.

References Tools::ConfigurationReader::_configuration, Core::String::copy(), getConfigurationFor(), Core::Collection::isEmpty(), Core::String::lastIndexOf(), Tools::Configuration::put(), Core::String::size(), and Core::String::trimBlanks().

Referenced by readLine().

00090 {
00091     String *path, *item, *value;
00092     Configuration *config;
00093     long idx = line->indexOf('=');
00094 
00095     path = dynamic_cast<String *>(line->copy(0, idx))->trimBlanks();
00096     if (path->isEmpty()) return;
00097     value = dynamic_cast<String *>(line->copy(idx + 1, line->size()))->trimBlanks();
00098 
00099     idx = path->lastIndexOf('.');
00100     if (idx < 0) {
00101         item = path;
00102         config = _configuration;
00103     } else {
00104         item = dynamic_cast<String *>(path->copy(idx + 1, path->size()));
00105         path = dynamic_cast<String *>(path->copy(0, idx));
00106         config = getConfigurationFor(path);
00107     }
00108     config->put(item, value);
00109 }

void Tools::HierarchicalConfigurationReader::parseBlockClosing String line  )  [virtual]
 

Definition at line 125 of file HierarchyConfigReader.cc.

References popConfiguration().

Referenced by readLine().

00126 {
00127     popConfiguration();
00128 }

void Tools::HierarchicalConfigurationReader::parseBlockOpenning String line  )  [virtual]
 

Definition at line 111 of file HierarchyConfigReader.cc.

References Tools::ConfigurationReader::_configuration, Core::Object::error(), Tools::Configuration::instances(), pushConfiguration(), and Tools::ConfigurationReader::put().

Referenced by readLine().

00112 {
00113     Configuration *subConfig = new Configuration;
00114     line = line->trimBlanks();
00115     if (line->isEmpty()) {
00116         error(new String("Configration parse error: block must have a name."),
00117               new String(__PRETTY_FUNCTION__), this);
00118     }
00119     put(line, subConfig);
00120     Configuration::instances()->put(line, subConfig);
00121     pushConfiguration();
00122     _configuration = subConfig;
00123 }

String * Tools::HierarchicalConfigurationReader::parseLine void   )  [virtual]
 

Definition at line 74 of file HierarchyConfigReader.cc.

References Tools::ConfigurationReader::_stream, Core::String::copy(), Core::String::indexOf(), Core::Stream::nextLine(), Core::SequenceableCollection::replaceAll(), and Core::String::trimBlanks().

Referenced by readLine().

00075 {
00076     String *line;
00077     long idx;
00078 
00079     line = dynamic_cast<String *>(_stream->nextLine());
00080     line->replaceAll(Character::tab(), Character::space());
00081 
00082     /* Remove comments */
00083     idx = line->indexOf('#');
00084     if (idx > 0) line = dynamic_cast<String *>(line->copy(0, idx));
00085     line = line->trimBlanks();
00086     return line;
00087 }

void Tools::HierarchicalConfigurationReader::popConfiguration void   )  [virtual]
 

Definition at line 161 of file HierarchyConfigReader.cc.

References Tools::ConfigurationReader::_configuration, Core::OrderedCollection::removeFirst(), and stack.

Referenced by parseBlockClosing().

00162 {
00163     _configuration = dynamic_cast<Configuration *>(stack->removeFirst());
00164 }

void Tools::HierarchicalConfigurationReader::pushConfiguration void   )  [virtual]
 

Definition at line 156 of file HierarchyConfigReader.cc.

References Tools::ConfigurationReader::_configuration, Core::OrderedCollection::addFirst(), and stack.

Referenced by parseBlockOpenning().

00157 {
00158     stack->addFirst(_configuration);
00159 }

Configuration * Tools::HierarchicalConfigurationReader::readConfiguration Configuration configuration  )  [virtual]
 

Reimplemented from Tools::ConfigurationReader.

Definition at line 40 of file HierarchyConfigReader.cc.

References Tools::ConfigurationReader::readConfiguration(), and stack.

00041 {
00042     stack = new OrderedCollection;
00043     return ConfigurationReader::readConfiguration(configuration);
00044 }

void Tools::HierarchicalConfigurationReader::readLine void   )  [virtual]
 

Reimplemented from Tools::ConfigurationReader.

Definition at line 46 of file HierarchyConfigReader.cc.

References Core::String::copy(), Core::SequenceableCollection::copyReplace(), Core::SequenceableCollection::first(), Core::String::indexOf(), Core::Collection::isEmpty(), Core::SequenceableCollection::last(), parseAssignment(), parseBlockClosing(), parseBlockOpenning(), parseLine(), and Core::String::size().

00047 {
00048     String *line = parseLine();
00049 
00050     if (line->isEmpty()) return;
00051 
00052     /* On backslash concatenate next line */
00053     while (line->last()->isEqual(Character::value('\\'))) {
00054         line = dynamic_cast<String *>(
00055                    line->copyReplace(line->size()-1, line->size(), parseLine()));
00056     }
00057 
00058     if (line->first()->isEqual(Character::value('}'))) {
00059         parseBlockClosing(line);
00060     } else {
00061         long idx;
00062         idx = line->indexOf('{');
00063         if (idx > 0 && idx < line->size()) {
00064             parseBlockOpenning(dynamic_cast<String *>(line->copy(0, idx-1)));
00065         } else {
00066             idx = line->indexOf('=');
00067             if (idx > 0 && idx < line->size()) {
00068                 parseAssignment(line);
00069             }
00070         }
00071     }
00072 }


Member Data Documentation

OrderedCollection* Tools::HierarchicalConfigurationReader::stack [protected]
 

Definition at line 47 of file HierarchyConfigReader.h.

Referenced by popConfiguration(), pushConfiguration(), and readConfiguration().


The documentation for this class was generated from the following files:
Generated on Mon Nov 27 09:52:38 2006 for Smalltalk like C++ Class Library by  doxygen 1.4.2