/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Event/ers/ers-00-00-03/src/FilterStream.cxx

Go to the documentation of this file.
00001 /*
00002  *  FilterStream.cxx
00003  *  ers
00004  *
00005  *  Created by Matthias Wiesmann on 31.03.05.
00006  *  Copyright 2005 CERN. All rights reserved.
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             // ERS_DEBUG_0("build stream %x",stream); 
00029             return stream ; 
00030         } // if
00031         return 0 ;
00032     } // create_stream
00033     bool registered = ers::StreamFactory::instance()->register_factory(ers::FilterStream::FILTER_STREAM_TAG,create_stream) ;
00034 } // anonymous namespace 
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 } // factory
00049 
00057 ers::FilterStream * ers::FilterStream::factory(const std::string &params) {
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     // ERS_DEBUG_0("include: '%s' exclude: '%s' target '%s'",include_str.c_str(),exclude_str.c_str(), target_str.c_str()); 
00065     return factory(include_str,exclude_str,target_str); 
00066 } // factory
00067 
00068 
00072 ers::FilterStream::FilterStream() : ers::Stream() {
00073 } // FilterStream
00074 
00075 
00079 ers::FilterStream::FilterStream(const FilterStream &other) : ers::Stream(other) {
00080 } // FilterStream
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 } // FilterStream
00099 
00100 
00101 
00105 ers::FilterStream::~FilterStream() {
00106     delete(m_target_stream_ptr) ; 
00107 } // FilterStream
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()) { // we check if qualifiers are in exclude list
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             } // found conflict 
00125         } // for 
00126     } // there are some qualifiers 
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             } // found match 
00134         } // for
00135         return false ; 
00136     } // include list contains items 
00137     return true ; 
00138 } // is_accept
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         // ERS_DEBUG_3("accepted %s:",issue_ptr->what()); 
00152         m_target_stream_ptr->send(issue_ptr); 
00153     } else {
00154         // ERS_DEBUG_3("rejected %s:",issue_ptr->what()); 
00155     } 
00156 } // send
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         } // if not first 
00170         stream << *i_pos ; 
00171     } // for include 
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         } // if not first 
00178         stream << *e_pos ; 
00179     } // for exclude 
00180     stream << TARGET_TAG ; 
00181     stream << *m_target_stream_ptr ; 
00182 } // print_to
00183 
00184 
00185 

Generated on Tue Nov 29 22:58:27 2016 for BOSS_7.0.2 by  doxygen 1.4.7