fintp_base
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
FilterChain.h
Go to the documentation of this file.
1 /*
2 * FinTP - Financial Transactions Processing Application
3 * Copyright (C) 2013 Business Information Systems (Allevo) S.R.L.
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>
17 * or contact Allevo at : 031281 Bucuresti, 23C Calea Vitan, Romania,
18 * phone +40212554577, office@allevo.ro <mailto:office@allevo.ro>, www.allevo.ro.
19 */
20 
21 #ifndef FILTERCHAIN_H
22 #define FILTERCHAIN_H
23 
24 #ifdef WIN32
25  #define __MSXML_LIBRARY_DEFINED__
26 #endif
27 
28 #include <vector>
29 #include <map>
30 #include <string>
31 #include "AbstractFilter.h"
32 
33 using namespace std;
34 
35 namespace FinTP
36 {
37  //EXPIMP_TEMPLATE template class ExportedObject std::vector< AbstractFilter* >;
38  //EXPIMP_TEMPLATE template class ExportedObject std::vector< AbstractFilter::FilterMethod >;
39  //EXPIMP_TEMPLATE template class ExportedObject std::map< AbstractFilter::FilterMethod, vector< AbstractFilter::FilterMethod >* >;
40 
41  typedef pair< AbstractFilter::FilterMethod, vector< AbstractFilter::FilterMethod >* > FilterChainPair;
42 
44  {
45  public:
46  FilterChain();
47  ~FilterChain();
48 
49  // adds a filter and returns its index
50  int AddFilter( FilterType::FilterTypeEnum type, NameValueCollection* properties );
51 
52  // access a filter based on its index
53  AbstractFilter* operator[]( int i ) { return m_Filters[ i ]; }
54 
55  //overrides
56  bool canLogPayload() { return true; }
57 
58  AbstractFilter::FilterResult ProcessMessage( XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument* inputOutputData, NameValueCollection& transportHeaders, bool asClient );
59  AbstractFilter::FilterResult ProcessMessage( const XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument* inputData, AbstractFilter::buffer_type outputData, NameValueCollection& transportHeaders, bool asClient );
60  AbstractFilter::FilterResult ProcessMessage( AbstractFilter::buffer_type inputData, XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument* outputData, NameValueCollection& transportHeaders, bool asClient );
61  AbstractFilter::FilterResult ProcessMessage( AbstractFilter::buffer_type inputData, AbstractFilter::buffer_type outputData, NameValueCollection& transportHeaders, bool asClient );
62 
63  AbstractFilter::FilterResult ProcessMessage( const XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument* inputData, unsigned char** outputData, NameValueCollection& transportHeaders, bool asClient )
64  {
65  throw FilterInvalidMethod( AbstractFilter::XmlToBuffer );
66  }
67 
68  AbstractFilter::FilterResult ProcessMessage( AbstractFilter::buffer_type inputData, unsigned char** outputData, NameValueCollection& transportHeaders, bool asClient )
69  {
70  throw FilterInvalidMethod( AbstractFilter::BufferToBuffer );
71  }
72 
73  // return true if the filter can execute the requested operation in client/server context
74  bool isMethodSupported( FilterMethod method, bool asClient, bool untilNow = false );
75 
76  void Report( bool onlySupported = false, bool displayChain = false );
77 
78  void Rollback();
79  void Commit();
80  void Abort();
81 
82  private :
83 
84  vector< AbstractFilter* > m_Filters;
85 
86  map< AbstractFilter::FilterMethod, vector< AbstractFilter::FilterMethod >* > m_CompiledChainsAsClient;
87  map< AbstractFilter::FilterMethod, vector< AbstractFilter::FilterMethod >* > m_CompiledChainsAsServer;
88 
89  bool BuildChain( AbstractFilter::FilterMethod method, AbstractFilter::FilterMethod chainMethod, bool asClient, const unsigned int index = 0 );
90  void BuildChains();
91 
92  bool isFirstFilter( int index ) const { return index == 0; }
93  bool isLastFilter( int index ) const { return index == m_Filters.size() - 1; }
94 
95  //FilterMethod getFilterMethod( const int filterIndex ) const;
96  };
97 }
98 
99 #endif // FILTERCHAIN_H