00001
00002
00003
00004
00005
00006
00007
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #include "xmlflow.hpp"
00041 #include "processor/xmlstreamer.hpp"
00042 #include "processor/xmlflowcontext.hpp"
00043 #include "flow/consumers/nullconsumer.hpp"
00044
00045 BEGIN_XDFLENGINE_NS
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055 PassiveStreamNode::PassiveStreamNode()
00056 {
00057 DEBUG_CREATE(PassiveStreamNode)
00058 }
00059
00060
00061
00062
00063 PassiveStreamNode::~PassiveStreamNode()
00064 {
00065 DEBUG_DEL(PassiveStreamNode)
00066 }
00067
00068
00069
00070
00071 void PassiveStreamNode::streamXML(XMLStreamConsumer* p_pStreamConsumer, XMLFlowContext* p_pStreamContext) const
00072 {
00073
00074 char* l_pszValuatedChunk=0;
00075
00076
00077 DEBUG_FUNC(PassiveStreamNode::streamXML)
00078
00079 PREP_CATCH_XML_FLOW_ERROR;
00080
00081
00082 if(MemBuffer::length()>0)
00083 {
00084 WATCH_XML_FLOW_ERROR
00085 {
00086 l_pszValuatedChunk=p_pStreamContext->calculateValue( MemBuffer::data());
00087 (*p_pStreamConsumer) << l_pszValuatedChunk;
00088 }
00089 CATCH_XML_FLOW_ERROR_RELEASE_AND_RETURN
00090 }
00091
00092 RELEASE_AND_RETURN:
00093 l_pszValuatedChunk = releaseCharBuffer( l_pszValuatedChunk);
00094 ON_XML_FLOW_ERROR_THROW;
00095 }
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112 ActiveStreamNode::ActiveStreamNode(XMLStreamerFactory* p_pStreamerFactory, StreamerParams* p_pStreamerParams)
00113 {
00114 DEBUG_CREATE(ActiveStreamNode)
00115 m_pStreamerFactory = p_pStreamerFactory;
00116 m_pStreamerParams = p_pStreamerParams;
00117 }
00118
00119
00120
00121
00122 ActiveStreamNode::~ActiveStreamNode()
00123 {
00124 DEBUG_DEL(ActiveStreamNode)
00125 if(m_pStreamerParams)
00126 {
00127 while( ! m_pStreamerParams->empty())releaseCharBuffer(m_pStreamerParams->pop());
00128 delete m_pStreamerParams;
00129 }
00130 while( ! m_vaChildStreamNodes.empty()) delete m_vaChildStreamNodes.pop();
00131 }
00132
00133
00134
00135
00136 StreamerParams* ActiveStreamNode::getParams()
00137 {
00138 return m_pStreamerParams;
00139 }
00140
00141
00142
00143
00144 void ActiveStreamNode::appendChild(XMLFlowNode* p_pChildStreamNode)
00145 {
00146 DEBUG_FUNC(ActiveStreamNode::appendChild)
00147 m_vaChildStreamNodes.push( p_pChildStreamNode);
00148 }
00149
00150
00151
00152
00153 void ActiveStreamNode::streamXML(XMLStreamConsumer* p_pStreamConsumer, XMLFlowContext* p_pStreamContext) const
00154 {
00155
00156 XMLFlowNode* l_pStreamNode;
00157 XMLStreamer* l_pXMLStreamer=0;
00158 XMLStreamConsumer* l_pXMLConsumer=0;
00159 XMLStreamConsumer* l_pErrorOutput=0;
00160 NullConsumer* l_pNullConsumer=0;
00161 unsigned int i;
00162 const char* l_pszEnclose;
00163 const char* l_pszOutput;
00164 const char* l_pszComment;
00165 StreamerParams* l_pszValuatedParams=0;
00166 bool l_fErrorFatal;
00167 bool l_fStreamerInitOK;
00168 bool l_fEncloseCDATA;
00169
00170
00171 PREP_CATCH_XML_FLOW_ERROR;
00172
00173 DEBUG_FUNC(ActiveStreamNode::streamXML)
00174
00175
00176
00177
00178 l_pszValuatedParams = valuateParameters( p_pStreamContext, m_pStreamerParams);
00179
00180
00181 l_fErrorFatal = true;
00182 if( strcmp( XMLStreamer::getParamValue(l_pszValuatedParams, REQ_ERRFATAL, REQ_ERRFATAL_DEF), REQ_FALSE) == 0 ) l_fErrorFatal = false;
00183
00184
00185 l_pErrorOutput = 0;
00186 l_pszOutput = XMLStreamer::getParamValue( l_pszValuatedParams, REQ_OUTPUTERROR, REQ_OUTPUTERROR_DEF);
00187 if( strcmp( l_pszOutput, REQ_PARENTOUTPUT) == 0) l_pErrorOutput = p_pStreamConsumer;
00188 if( strcmp( l_pszOutput, REQ_NOOUTPUT) == 0)
00189 {
00190 if(!l_pNullConsumer) l_pNullConsumer = new NullConsumer;
00191 l_pErrorOutput = l_pNullConsumer;
00192 }
00193 if( !l_pErrorOutput )l_pErrorOutput = p_pStreamContext->getNamedBuffer( l_pszOutput);
00194 if( !l_pErrorOutput )
00195 {
00196 MAKE_XMLFLOW_EXCEPTION ( ERRCODE_LOC_FLOWBUILDER + ERRCODE_CAUSE_MISSINGREF , "No error buffer was found with that name." , l_pszOutput, "ActiveStreamNode::streamXML", "", false );
00197 goto RELEASE_AND_RETURN;
00198 }
00199
00200
00201 l_pszComment = XMLStreamer::getParamValue(l_pszValuatedParams, REQ_COMMENT, "");
00202 if (strlen( l_pszComment)>0) logout << "\n" << l_pszComment << "\n\n";
00203
00204
00205 l_pszEnclose = XMLStreamer::getParamValue( l_pszValuatedParams, REQ_ENCLOSE, REQ_ENCLOSE_DEF);
00206 if(strlen(l_pszEnclose)==0) l_pszEnclose = 0;
00207
00208
00209 l_fEncloseCDATA = false;
00210 if( strcmp( XMLStreamer::getParamValue(l_pszValuatedParams, REQ_ENCLOSECDATA, REQ_ENCLOSECDATA_DEF), REQ_TRUE) == 0 ) l_fEncloseCDATA = true;
00211
00212
00213 l_pXMLConsumer = 0;
00214 l_pszOutput = XMLStreamer::getParamValue(l_pszValuatedParams, REQ_OUTPUT, REQ_OUTPUT_DEF);
00215 if( strcmp( l_pszOutput, REQ_PARENTOUTPUT) == 0) l_pXMLConsumer = p_pStreamConsumer;
00216 if( strcmp( l_pszOutput, REQ_NOOUTPUT) == 0)
00217 {
00218 if(!l_pNullConsumer) l_pNullConsumer = new NullConsumer;
00219 l_pXMLConsumer = l_pNullConsumer;
00220 }
00221 if( !l_pXMLConsumer ) l_pXMLConsumer = p_pStreamContext->getNamedBuffer( l_pszOutput);
00222 if( !l_pXMLConsumer )
00223 {
00224 MAKE_XMLFLOW_EXCEPTION ( ERRCODE_LOC_FLOWBUILDER + ERRCODE_CAUSE_MISSINGREF , "No output buffer was found with that name." , l_pszOutput, "ActiveStreamNode::streamXML", "", false );
00225 goto RELEASE_AND_RETURN;
00226 }
00227
00228
00229 l_pXMLStreamer = m_pStreamerFactory->getStreamer( l_pszValuatedParams, p_pStreamContext, l_pXMLConsumer);
00230
00231 if(l_pszEnclose) (*p_pStreamConsumer) << "<" << l_pszEnclose << ">\n";
00232 if(l_fEncloseCDATA) (*p_pStreamConsumer) << "<![CDATA[";
00233
00234
00235 WATCH_XML_FLOW_ERROR
00236 {
00237 l_fStreamerInitOK = l_pXMLStreamer->initStream();
00238 if ( l_fStreamerInitOK )
00239 {
00240 for(i=0; i < m_vaChildStreamNodes.size(); i++)
00241 {
00242 l_pStreamNode = m_vaChildStreamNodes.get(i);
00243 l_pStreamNode->streamXML( l_pXMLStreamer, p_pStreamContext);
00244 }
00245 l_pXMLStreamer->commitStream(true);
00246
00247 }
00248
00249 }
00250 CATCH_XML_FLOW_ERROR_RELEASE_AND_RETURN
00251
00252 if(l_fEncloseCDATA) (*p_pStreamConsumer) << "]]>";
00253 if(l_pszEnclose) (*p_pStreamConsumer) << "</" << l_pszEnclose << ">\n";
00254
00255 RELEASE_AND_RETURN:
00256
00257 ON_XML_FLOW_ERROR_DO
00258 {
00259 if(l_pErrorOutput) (*l_pXMLFlowException) >> (*l_pErrorOutput);
00260 }
00261
00262 if(l_pNullConsumer) delete l_pNullConsumer;
00263 if(l_pszValuatedParams)
00264 {
00265 while( !l_pszValuatedParams->empty() ) releaseCharBuffer( l_pszValuatedParams->pop());
00266 delete l_pszValuatedParams;
00267 }
00268 delete l_pXMLStreamer;
00269
00270 ON_XML_FLOW_ERROR_DO
00271 {
00272 if( l_fErrorFatal) throw l_pXMLFlowException;
00273 else delete l_pXMLFlowException;
00274 }
00275 }
00276
00277
00278
00279
00280 StreamerParams* ActiveStreamNode::valuateParameters(XMLFlowContext* p_pStreamContext,const StreamerParams* p_pStreamerParams) const
00281 {
00282
00283 unsigned int l_uiSize;
00284 unsigned int i;
00285 char* l_pszValue;
00286 char* l_pszCalculatedValue;
00287 const char* l_pszKey;
00288 StreamerParams* l_pszValuatedParams;
00289
00290
00291
00292 l_pszValuatedParams = new StreamerParams;
00293 l_uiSize=p_pStreamerParams->size();
00294 for(i=0 ; i< l_uiSize; i++)
00295 {
00296 l_pszKey = p_pStreamerParams->getKey(i);
00297 l_pszValue = p_pStreamerParams->get(i);
00298 l_pszCalculatedValue = p_pStreamContext->calculateValue( l_pszValue);
00299 l_pszValuatedParams->add( l_pszCalculatedValue, l_pszKey);
00300 }
00301
00302 return l_pszValuatedParams;
00303
00304 }
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317 RootStreamNode::RootStreamNode():ActiveStreamNode(0,0)
00318 {
00319 DEBUG_CREATE(RootStreamNode)
00320 }
00321
00322
00323
00324
00325 RootStreamNode::~RootStreamNode()
00326 {
00327 DEBUG_DEL(RootStreamNode)
00328 }
00329
00330
00331
00332
00333
00334 void RootStreamNode::streamXML( XMLStreamConsumer* p_pStreamConsumer, XMLFlowContext* p_pStreamContext) const
00335 {
00336
00337 XMLFlowNode* l_pStreamNode;
00338 unsigned int i;
00339
00340
00341 PREP_CATCH_XML_FLOW_ERROR;
00342
00343 DEBUG_FUNC(RootStreamNode::streamXML)
00344
00345 WATCH_XML_FLOW_ERROR
00346 {
00347 for(i=0; i < m_vaChildStreamNodes.size(); i++)
00348 {
00349 l_pStreamNode = m_vaChildStreamNodes.get(i);
00350 l_pStreamNode->streamXML( p_pStreamConsumer, p_pStreamContext);
00351 }
00352
00353 }
00354 CATCH_XML_FLOW_ERROR_RELEASE_AND_RETURN
00355
00356 RELEASE_AND_RETURN:
00357
00358 ON_XML_FLOW_ERROR_THROW;
00359 }
00360
00361
00362
00363
00364 END_XDFLENGINE_NS
00365
00366
00367