TAO_Notify::XML_Saver Class Reference

Save Notification Service Topology to an XML file. More...

#include <XML_Saver.h>

Inheritance diagram for TAO_Notify::XML_Saver:

Inheritance graph
[legend]
Collaboration diagram for TAO_Notify::XML_Saver:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 XML_Saver (bool timestamp=true)
virtual ~XML_Saver ()
bool open (const ACE_CString &file_name, size_t backup_count)
virtual bool begin_object (CORBA::Long id, const ACE_CString &type, const NVPList &attrs, bool changed)
 Begin the storage of an object.
virtual void end_object (CORBA::Long id, const ACE_CString &type)
 End the storage of an object.
virtual void close (void)
 Close the saver.

Private Member Functions

void backup_file_name (char *file_path, size_t nfile)

Private Attributes

FILE * output_
 A stream representing our current output.
bool close_out_
ACE_CString base_name_
 the name of the output file
size_t backup_count_
bool timestamp_
 true to enable timestamping
ACE_CString indent_
 A string consisting of spaces that is our current indentation level.

Detailed Description

Save Notification Service Topology to an XML file.

Definition at line 33 of file XML_Saver.h.


Constructor & Destructor Documentation

TAO_Notify::XML_Saver::XML_Saver ( bool  timestamp = true  ) 

Construct an XML_Saver. Initialization is deferred to "open()"

Definition at line 17 of file XML_Saver.cpp.

00018     : output_ (0)
00019     , close_out_ (false)
00020     , backup_count_ (1)
00021     , timestamp_ (timestamp)
00022   {
00023   }

TAO_Notify::XML_Saver::~XML_Saver (  )  [virtual]

Definition at line 25 of file XML_Saver.cpp.

References ACE_ERROR, ACE_TEXT(), and LM_ERROR.

00026   {
00027     if (this->output_ != 0)
00028     {
00029       ACE_ERROR ((LM_ERROR,
00030         ACE_TEXT ("(%P|%t) XML_Saver warning close not called or failed\n")
00031         ));
00032     }
00033   }


Member Function Documentation

void TAO_Notify::XML_Saver::backup_file_name ( char *  file_path,
size_t  nfile 
) [private]

Definition at line 36 of file XML_Saver.cpp.

References MAXPATHLEN, and ACE_OS::snprintf().

Referenced by close().

00037   {
00038     ACE_OS::snprintf(file_path, MAXPATHLEN, "%s.%3.3d",
00039       this->base_name_.c_str (),
00040       nfile);
00041   }

bool TAO_Notify::XML_Saver::begin_object ( CORBA::Long  id,
const ACE_CString type,
const NVPList attrs,
bool  changed 
) [virtual]

Begin the storage of an object.

Call this function with the type and ID of an object to be stored. This object may have children, and this will necessitate nested calls to begin_object. Design principle: Names should be descriptive enough to allow the objects' parent to create an instance of the desired class. This instance will be registered with the poa using the id. The instance itself should will load its own attributes. Example <proxy type="push_supplier" events="any" id="20"...> is not a good design because the name "proxy" is not descriptive enough. "<structured_proxy_push_supplier id="20"...> is better because this allows the parent to create the correct type of object without decoding attributes.

Parameters:
id numeric id for this object
type string containing the unique type name for this class of objects
attrs a collection of name/value attributes
change true if this object's attributes have changed.
Returns:
bool want_all_children. If true even changed children should be saved.

Implements TAO_Notify::Topology_Saver.

Definition at line 159 of file XML_Saver.cpp.

References ACE_ASSERT, ACE_String_Base< CHAR >::c_str(), ACE_OS::fprintf(), indent_, output_, TAO_Notify::NVPList::size(), and TAO_Notify::TOPOLOGY_ID_NAME.

Referenced by open().

00163   {
00164     ACE_ASSERT(this->output_ != 0);
00165 
00166     FILE * const out = this->output_;
00167 
00168     ACE_OS::fprintf (out, "%s%s%s", indent_.c_str(), "<", type.c_str());
00169     if (id != 0)
00170     {
00171       // not all ostreams know what to do with a CORBA::Long
00172       long const lid = id;
00173       ACE_OS::fprintf (out, " %s%s%ld%s", TOPOLOGY_ID_NAME, "=\"", lid, "\"");
00174     }
00175 
00176     ACE_CString::size_type const BUF_SIZE = 512;
00177     ACE_CString tmp(BUF_SIZE);
00178     for (size_t idx = 0; idx < attrs.size(); ++idx)
00179     {
00180       ACEXML_escape_string(attrs[idx].value, tmp);
00181       ACE_OS::fprintf (out, "%s%s%s%s%s", " ",
00182         attrs[idx].name.c_str (), "=\"", tmp.c_str(), "\"");
00183     }
00184     ACE_OS::fprintf (out, ">\n");
00185     this->indent_ += "  ";
00186     return true;
00187   }

void TAO_Notify::XML_Saver::close ( void   )  [virtual]

Close the saver.

This is not pure virtual. The default implementation does nothing.

There should be a corresponding open, but the signature may vary based on the type of saver, so we can't include it in the interface.

Reimplemented from TAO_Notify::Topology_Saver.

Definition at line 44 of file XML_Saver.cpp.

References backup_count_, backup_file_name(), base_name_, ACE_String_Base< CHAR >::c_str(), end_object(), ACE_OS::fclose(), MAXPATHLEN, output_, ACE_OS::rename(), ACE_OS::strcpy(), and ACE_OS::unlink().

00045   {
00046     if (this->close_out_ && this->output_ != 0)
00047     {
00048       this->end_object(0, "notification_service");
00049 
00050       ACE_OS::fclose(this->output_);
00051       this->output_ = 0;
00052 
00053       // delete the oldest backup file (if it exists)
00054       size_t nfile = this->backup_count_ - 1;
00055       char old_path [MAXPATHLEN + 1];
00056       backup_file_name (old_path, nfile);
00057       ACE_OS::unlink (old_path);
00058 
00059       while (nfile != 0)
00060       {
00061         char new_path [MAXPATHLEN + 1];
00062         nfile -= 1;
00063         backup_file_name (new_path, nfile);
00064         // this may fail, we don't care
00065         ACE_OS::rename (new_path, old_path);
00066         ACE_OS::strcpy (old_path, new_path);
00067       }
00068       // old_path now contains the name of the backup file
00069       ACE_CString xml_name = this->base_name_;
00070       xml_name += ".xml";
00071 
00072       ACE_OS::rename (xml_name.c_str (), old_path);
00073 
00074       ACE_CString new_name = this->base_name_;
00075       new_name += ".new";
00076       ACE_OS::rename (new_name.c_str (), xml_name.c_str ());
00077     }
00078     this->output_ = 0;
00079   }

void TAO_Notify::XML_Saver::end_object ( CORBA::Long  id,
const ACE_CString type 
) [virtual]

End the storage of an object.

This function should be called to end the scope of the current object and commit it to the persistent store.

Implements TAO_Notify::Topology_Saver.

Definition at line 189 of file XML_Saver.cpp.

References ACE_ASSERT, ACE_String_Base< CHAR >::c_str(), ACE_OS::fprintf(), indent_, and output_.

Referenced by close().

00191   {
00192     ACE_ASSERT(this->output_ != 0);
00193     FILE * const out = this->output_;
00194     if (this->indent_.length() >= 2)
00195     {
00196       this->indent_ = this->indent_.substr(2);
00197     }
00198     ACE_OS::fprintf (out, "%s%s%s%s", indent_.c_str(), "</",
00199                      type.c_str(), ">\n");
00200   }

bool TAO_Notify::XML_Saver::open ( const ACE_CString file_name,
size_t  backup_count 
)

Open the output file.

Parameters:
file_name the fully qualified file name
Returns:
true if successful

Definition at line 82 of file XML_Saver.cpp.

References CORBA::Exception::_tao_print_exception(), ACE_ERROR, ACE_TEXT(), ACE_UINT64_FORMAT_SPECIFIER, backup_count_, base_name_, begin_object(), ACE_String_Base< CHAR >::c_str(), close_out_, ACE_OS::fclose(), ACE_OS::fopen(), ACE_OS::fprintf(), ACE_High_Res_Timer::gettimeofday(), LM_ERROR, output_, TAO_Notify::NVPList::push_back(), ACE_Time_Value::sec(), ACE_OS::sprintf(), and ACE_Time_Value::usec().

Referenced by TAO_Notify::XML_Topology_Factory::create_saver().

00083   {
00084     this->base_name_ = base_name;
00085     this->backup_count_ = backup_count;
00086     if (base_name ==  "cout")
00087     {
00088       this->output_ = stdout;
00089       this->close_out_ = false;
00090     }
00091     else if (base_name ==  "cerr")
00092     {
00093       this->output_ = stderr;
00094       this->close_out_ = false;
00095     }
00096     else
00097     {
00098       ACE_CString file_name = base_name;
00099       file_name += ".new";
00100 
00101       this->output_ = ACE_OS::fopen (file_name.c_str(), ACE_TEXT("wb"));
00102       if (this->output_) {
00103         this->close_out_ = true;
00104       } else {
00105         ACE_ERROR ((LM_ERROR,
00106           ACE_TEXT ("(%P|%t) XML_Saver unable to open %s\n"),
00107             base_name.c_str()));
00108       }
00109     }
00110     if (this->output_ != 0)
00111     {
00112       FILE * const out = this->output_;
00113 
00114       ACE_OS::fprintf (out, "<?xml version=\"1.0\"?>\n");
00115 
00116       try
00117       {
00118         bool changed = true;
00119         NVPList attrs;
00120 
00121         ACE_Time_Value const now = ACE_High_Res_Timer::gettimeofday();
00122 
00123         ACE_UINT64 nowus = now.usec();
00124         static const ACE_UINT64 USECSPERSEC = 1000 * 1000;
00125         ACE_UINT64 const tmpus = now.sec();
00126         nowus += tmpus * USECSPERSEC;
00127 
00128         char nowusstr[128];
00129 #ifdef ACE_LACKS_LONGLONG_T
00130         nowus.as_string(nowusstr);
00131 #else
00132         ACE_OS::sprintf(nowusstr, ACE_UINT64_FORMAT_SPECIFIER, nowus);
00133 #endif /* ACE_LACKS_LONGLONG_T */
00134 
00135         attrs.push_back(NVP("version", "1.0"));
00136         if (this->timestamp_)
00137         {
00138           attrs.push_back(NVP("timestamp", nowusstr));
00139         }
00140         this->begin_object(0, "notification_service", attrs, changed);
00141       }
00142       catch (const CORBA::Exception& ex)
00143       {
00144         ex._tao_print_exception (
00145           ACE_TEXT (
00146             "(%P|%t) XML_Saver Unknown exception\n"));
00147         if (this->close_out_ && this->output_ != 0)
00148           {
00149             (void) ACE_OS::fclose (this->output_);
00150           }
00151 
00152         this->output_ = 0;
00153       }
00154     }
00155     return this->output_ != 0;
00156   }


Member Data Documentation

size_t TAO_Notify::XML_Saver::backup_count_ [private]

Definition at line 70 of file XML_Saver.h.

Referenced by close(), and open().

ACE_CString TAO_Notify::XML_Saver::base_name_ [private]

the name of the output file

Definition at line 69 of file XML_Saver.h.

Referenced by close(), and open().

bool TAO_Notify::XML_Saver::close_out_ [private]

Definition at line 66 of file XML_Saver.h.

Referenced by open().

ACE_CString TAO_Notify::XML_Saver::indent_ [private]

A string consisting of spaces that is our current indentation level.

Definition at line 76 of file XML_Saver.h.

Referenced by begin_object(), and end_object().

FILE* TAO_Notify::XML_Saver::output_ [private]

A stream representing our current output.

Definition at line 65 of file XML_Saver.h.

Referenced by begin_object(), close(), end_object(), and open().

bool TAO_Notify::XML_Saver::timestamp_ [private]

true to enable timestamping

Definition at line 73 of file XML_Saver.h.


The documentation for this class was generated from the following files:
Generated on Tue Feb 2 17:46:46 2010 for TAO_CosNotification by  doxygen 1.4.7