00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "ers/FilterStream.h"
00011 #include "ers/InvalidReferenceIssue.h"
00012 #include "ers/StreamFactory.h"
00013 #include "ers/NotImplemented.h"
00014
00018 const char* const ers::FilterStream::FILTER_STREAM_TAG = "filter" ;
00019 const char* const ers::FilterStream::INCLUDE_TAG = "?" ;
00020 const char* const ers::FilterStream::EXCLUDE_TAG = "!";
00021 const char* const ers::FilterStream::TARGET_TAG = "@" ;
00022 const char* const ers::FilterStream::SEPARATORS = "," ;
00023
00024 namespace {
00025 ers::Stream *create_stream(const std::string &protocol, const std::string &uri) {
00026 if (protocol==ers::FilterStream::FILTER_STREAM_TAG) {
00027 ers::Stream *stream = ers::FilterStream::factory(uri);
00028
00029 return stream ;
00030 }
00031 return 0 ;
00032 }
00033 bool registered = ers::StreamFactory::instance()->register_factory(ers::FilterStream::FILTER_STREAM_TAG,create_stream) ;
00034 }
00035
00043 ers::FilterStream * ers::FilterStream::factory(const std::string &include_str, const::std::string &exclude_str, const std::string &target_str) {
00044 ers::Stream *target_stream = ers::StreamFactory::instance()->create_stream(target_str);
00045 std::vector<std::string> include_list = ers::Core::tokenize(include_str,SEPARATORS);
00046 std::vector<std::string> exclude_list = ers::Core::tokenize(exclude_str,SEPARATORS);
00047 return new FilterStream(target_stream,include_list,exclude_list);
00048 }
00049
00057 ers::FilterStream * ers::FilterStream::factory(const std::string ¶ms) {
00058 std::string::size_type include_start = params.find(INCLUDE_TAG);
00059 std::string::size_type exclude_start = params.find(EXCLUDE_TAG);
00060 std::string::size_type target_start = params.find(TARGET_TAG);
00061 std::string include_str = params.substr(include_start+1,exclude_start-1);
00062 std::string exclude_str = params.substr(exclude_start+1,target_start-exclude_start-1);
00063 std::string target_str = params.substr(target_start+1);
00064
00065 return factory(include_str,exclude_str,target_str);
00066 }
00067
00068
00072 ers::FilterStream::FilterStream() : ers::Stream() {
00073 }
00074
00075
00079 ers::FilterStream::FilterStream(const FilterStream &other) : ers::Stream(other) {
00080 }
00081
00082
00092 ers::FilterStream::FilterStream(ers::Stream *target_ptr, const std::vector<std::string> &
00093 include_list, const std::vector<std::string> & exclude_list) : ers::Stream() {
00094 ERS_CHECK_PTR(target_ptr);
00095 m_target_stream_ptr = target_ptr ;
00096 m_include = include_list ;
00097 m_exclude = exclude_list ;
00098 }
00099
00100
00101
00105 ers::FilterStream::~FilterStream() {
00106 delete(m_target_stream_ptr) ;
00107 }
00108
00115 bool ers::FilterStream::is_accept(const ers::Issue* issue_ptr) {
00116 ERS_CHECK_PTR(issue_ptr);
00117 std::string qualifiers = issue_ptr->get_value(ers::Issue::QUALIFIER_LIST_KEY) ;
00118 if (! qualifiers.empty()) {
00119 std::vector<std::string>::const_iterator e_pos ;
00120 for(e_pos = m_exclude.begin();e_pos!=m_exclude.end();e_pos++) {
00121 std::string::size_type conflict = qualifiers.find(*e_pos) ;
00122 if (conflict!=std::string::npos) {
00123 return false ;
00124 }
00125 }
00126 }
00127 if (! m_include.empty()) {
00128 std::vector<std::string>::const_iterator i_pos ;
00129 for(i_pos = m_include.begin();i_pos!=m_include.end();i_pos++) {
00130 std::string::size_type match = qualifiers.find(*i_pos) ;
00131 if (match!=std::string::npos) {
00132 return true ;
00133 }
00134 }
00135 return false ;
00136 }
00137 return true ;
00138 }
00139
00147 void ers::FilterStream::send(const ers::Issue *issue_ptr) {
00148 ERS_CHECK_PTR(issue_ptr);
00149 ERS_CHECK_PTR(m_target_stream_ptr);
00150 if (is_accept(issue_ptr)) {
00151
00152 m_target_stream_ptr->send(issue_ptr);
00153 } else {
00154
00155 }
00156 }
00157
00162 void ers::FilterStream::print_to(std::ostream& stream) const {
00163 stream << FILTER_STREAM_TAG << ':' ;
00164 std::vector<std::string>::const_iterator i_pos ;
00165 stream << INCLUDE_TAG ;
00166 for(i_pos = m_include.begin();i_pos!=m_include.end();i_pos++) {
00167 if (i_pos!=m_include.begin()) {
00168 stream << SEPARATORS ;
00169 }
00170 stream << *i_pos ;
00171 }
00172 stream << EXCLUDE_TAG ;
00173 std::vector<std::string>::const_iterator e_pos ;
00174 for(e_pos = m_exclude.begin();e_pos!=m_exclude.end();e_pos++) {
00175 if (e_pos!=m_exclude.begin()) {
00176 stream << SEPARATORS ;
00177 }
00178 stream << *e_pos ;
00179 }
00180 stream << TARGET_TAG ;
00181 stream << *m_target_stream_ptr ;
00182 }
00183
00184
00185