8 #ifdef _MADARA_PYTHON_CALLBACKS_ 10 #include <boost/python/call.hpp> 18 #include "madara_jni.h" 61 "KnowledgeRecordFilters::add: " 62 "Adding C record filter\n");
65 for (uint32_t cur = 1; types > 0; cur <<= 1)
90 "KnowledgeRecordFilters::add: " 91 "Adding C aggregate filter\n");
106 "KnowledgeRecordFilters::add: " 107 "Adding aggregate functor filter\n");
122 "KnowledgeRecordFilters::add: " 123 "Adding buffer functor filter\n");
139 "KnowledgeRecordFilters::add: " 140 "Adding record function filter to types\n");
143 for (uint32_t cur = 1; types > 0; cur <<= 1)
164 if (callable != NULL)
169 "KnowledgeRecordFilters::add: " 170 "Adding Java record filter\n");
173 for (uint32_t cur = 1; types > 0; cur <<= 1)
192 if (callable != NULL)
197 "KnowledgeRecordFilters::add: " 198 "Adding Java aggregate filter\n");
206 #ifdef _MADARA_PYTHON_CALLBACKS_ 210 boost::python::object & callable)
212 if (!callable.is_none ())
215 for (uint32_t cur = 1; types > 0; cur <<= 1)
232 boost::python::object & callable)
234 if (!callable.is_none ())
253 for (uint32_t cur = 1; types > 0; cur <<= 1)
290 "Printing Knowledge Record Filter Chains by Type...\n");
292 for (FilterMap::const_iterator i =
filters_.begin ();
298 "%d = %d chained filters\n", i->first, i->second.size ());
321 uint32_t type = input.
type ();
322 FilterMap::const_iterator type_match =
filters_.find (type);
331 "KnowledgeRecordFilters::filter: " 332 "Entering record filter logic\n");
338 std::unique_ptr <Variables> heap_variables (
341 heap_variables->context_ =
context_;
343 for (FilterChain::const_iterator i = chain.begin ();
344 i != chain.end (); ++i)
349 "KnowledgeRecordFilters::filter: " 350 "Preparing args for filter\n");
362 arguments[1].set_value (name);
386 arguments[7].set_value (transport_context.
get_domain ());
392 arguments[0] = result;
397 "KnowledgeRecordFilters::filter: " 398 "Checking filter type\n");
401 if (i->is_functor ())
406 "KnowledgeRecordFilters::filter: " 407 "Calling functor filter\n");
409 result = i->functor->filter (arguments, *heap_variables.get ());
412 else if (i->is_java_callable ())
417 "KnowledgeRecordFilters::filter: " 418 "Calling Java filter\n");
426 jclass jvarClass = madara::utility::java::find_class (
427 jvm.env,
"com/madara/Variables");
428 jclass jlistClass = madara::utility::java::find_class (
429 jvm.env,
"com/madara/KnowledgeList");
431 jmethodID fromPointerCall = jvm.env->GetStaticMethodID (jvarClass,
432 "fromPointer",
"(J)Lcom/madara/Variables;");
433 jobject jvariables = jvm.env->CallStaticObjectMethod (jvarClass,
434 fromPointerCall, (jlong)heap_variables.get ());
437 jmethodID listConstructor = jvm.env->GetMethodID (jlistClass,
440 jlongArray ret = jvm.env->NewLongArray ((jsize)arguments.size ());
441 jlong * tmp =
new jlong[(jsize)arguments.size ()];
443 for (
unsigned int x = 0; x < arguments.size (); x++)
445 tmp[x] = (jlong)arguments[x].clone ();
448 jvm.env->SetLongArrayRegion (ret, 0, (jsize)arguments.size (), tmp);
452 jobject jlist = jvm.env->NewObject (jlistClass, listConstructor, ret);
455 jclass filterClass = jvm.env->GetObjectClass (i->java_object);
458 jmethodID filterMethod = jvm.env->GetMethodID (filterClass,
460 "(Lcom/madara/KnowledgeList;Lcom/madara/Variables;)Lcom/madara/KnowledgeRecord;");
465 "KnowledgeRecordFilters::filter: " 466 "Calling Java method\n");
469 jobject jresult = jvm.env->CallObjectMethod (i->java_object,
470 filterMethod, jlist, jvariables);
475 "KnowledgeRecordFilters::filter: " 476 "Obtaining pointer from Knowledge Record result\n");
478 jmethodID getPtrMethod = jvm.env->GetMethodID (
479 jvm.env->GetObjectClass (jresult),
"getCPtr",
"()J");
480 jlong cptr = jvm.env->CallLongMethod (jresult, getPtrMethod);
485 "KnowledgeRecordFilters::filter: " 486 "Checking return for origination outside of filter\n");
488 bool do_delete =
true;
490 for (
unsigned int x = 0; x < arguments.size (); x++)
492 if (cptr == (jlong)&(arguments[x]))
504 "KnowledgeRecordFilters::filter: " 505 "Doing a deep copy of the return value\n");
515 "KnowledgeRecordFilters::filter: " 516 "Deleting the original pointer\n");
521 jvm.env->DeleteWeakGlobalRef (jvarClass);
522 jvm.env->DeleteLocalRef (jvariables);
523 jvm.env->DeleteLocalRef (jresult);
524 jvm.env->DeleteLocalRef (jlist);
525 jvm.env->DeleteWeakGlobalRef (jlistClass);
526 jvm.env->DeleteLocalRef (ret);
530 #ifdef _MADARA_PYTHON_CALLBACKS_ 532 else if (i->is_python_callable ())
537 "KnowledgeRecordFilters::filter: " 538 "Calling Python filter\n");
541 madara::python::Acquire_GIL acquire_gil;
544 result = boost::python::call <madara::knowledge::KnowledgeRecord> (
545 i->python_function.ptr (), boost::ref (arguments),
546 boost::ref (*heap_variables.get ()));
552 else if (i->is_extern_unnamed ())
557 "KnowledgeRecordFilters::filter: " 558 "Calling unnamed C filter\n");
560 result = i->extern_unnamed (arguments, *heap_variables.get ());
567 i + 1 < arguments.size (); i += 2)
569 if (arguments[i].is_string_type ())
574 "KnowledgeRecordFilters::filter: Adding %s " 575 "to transport context.\n", arguments[i].to_string ().c_str ());
578 arguments[i].to_string (), arguments[i + 1]);
585 "KnowledgeRecordFilters::filter: ERROR. Filter attempted to" 586 " add records to transport context, but args[%d] was not" 587 " a string value.\n", i);
610 "KnowledgeRecordFilters::filter: " 611 "Entering aggregate filter method\n");
614 std::unique_ptr <Variables> heap_variables (
617 heap_variables->context_ =
context_;
623 if (i->is_functor ())
628 "KnowledgeRecordFilters::filter: " 629 "Checking vars for null\n");
637 "KnowledgeRecordFilters::filter: " 638 "Calling C++ filter\n");
640 i->functor->filter (records, transport_context,
646 "KnowledgeRecordFilters::filter: " 647 "Finished calling C++ filter\n");
654 "KnowledgeRecordFilters::filter: " 655 "Memory issues caused vars to be null before filtering\n");
659 else if (i->is_java_callable ())
665 std::auto_ptr <KnowledgeMap> heap_records (
new KnowledgeMap (records));
666 std::auto_ptr <transport::TransportContext> heap_context (
672 jclass jvarClass = madara::utility::java::find_class (jvm.
env,
673 "com/madara/Variables");
674 jclass jpacketClass = madara::utility::java::find_class (jvm.
env,
675 "com/madara/transport/filters/Packet");
676 jclass jcontextClass = madara::utility::java::find_class (jvm.
env,
677 "com/madara/transport/TransportContext");
679 jmethodID varfromPointerCall = jvm.
env->GetStaticMethodID (
681 "fromPointer",
"(J)Lcom/madara/Variables;");
682 jobject jvariables = jvm.
env->CallStaticObjectMethod (
684 varfromPointerCall, (jlong)heap_variables.get ());
686 jmethodID packetfromPointerCall = jvm.
env->GetStaticMethodID (
688 "fromPointer",
"(J)Lcom/madara/transport/filters/Packet;");
689 jobject jpacket = jvm.
env->CallStaticObjectMethod (jpacketClass,
690 packetfromPointerCall, (jlong)heap_records.get ());
692 jmethodID contextfromPointerCall = jvm.
env->GetStaticMethodID (
694 "fromPointer",
"(J)Lcom/madara/transport/TransportContext;");
695 jobject jcontext = jvm.
env->CallStaticObjectMethod (jcontextClass,
696 contextfromPointerCall, (jlong)heap_context.get ());
699 jclass filterClass = jvm.
env->GetObjectClass (i->java_object);
700 jmethodID filterMethod = jvm.
env->GetMethodID (filterClass,
702 "(Lcom/madara/transport/filters/Packet;" 703 "Lcom/madara/transport/TransportContext;Lcom/madara/Variables;)V");
709 "KnowledgeRecordFilters::filter: " 710 "Calling Java method\n");
712 jvm.
env->CallVoidMethod (i->java_object, filterMethod,
713 jpacket, jcontext, jvariables);
718 "KnowledgeRecordFilters::filter: " 719 "Overwriting resulting records from heap records\n");
724 for (KnowledgeMap::const_iterator i = heap_records->begin ();
725 i != heap_records->end (); ++i)
727 records[i->first] = i->second;
730 jvm.
env->DeleteLocalRef (filterClass);
731 jvm.
env->DeleteLocalRef (jcontext);
732 jvm.
env->DeleteLocalRef (jpacket);
733 jvm.
env->DeleteWeakGlobalRef (jvarClass);
734 jvm.
env->DeleteWeakGlobalRef (jpacketClass);
735 jvm.
env->DeleteWeakGlobalRef (jcontextClass);
740 #ifdef _MADARA_PYTHON_CALLBACKS_ 742 else if (i->is_python_callable ())
745 madara::python::Acquire_GIL acquire_gil;
748 boost::python::call <madara::knowledge::KnowledgeRecord> (
749 i->python_function.ptr (),
750 boost::ref (records), boost::ref (transport_context),
751 boost::ref (*heap_variables.get ()));
757 else if (i->is_extern_unnamed ())
759 i->unnamed_filter (records, transport_context,
760 *heap_variables.get ());
768 unsigned char * source,
int size,
int max_size)
const 771 for (filters::BufferFilters::const_reverse_iterator i =
buffer_filters_.rbegin ();
774 (*i)->decode (source, size, max_size);
779 unsigned char * source,
int size,
int max_size)
const 782 for (filters::BufferFilters::const_iterator i =
buffer_filters_.begin ();
785 (*i)->encode (source, size, max_size);
This class encapsulates an entry in a KnowledgeBase.
JNIEnv * env
The Java environment.
knowledge::KnowledgeRecord filter(const knowledge::KnowledgeRecord &input, const std::string &name, transport::TransportContext &context) const
Filters an input according to its filter chain.
This class encapsulates attaching and detaching to a VM.
void clear(uint32_t types)
Clears the list of filters for the specified types.
int32_t type(void) const
returns the size of the value
bool bitmask_check(T mask, T values)
Returns true if mask contains values.
This class stores a function definition.
void clear_aggregate_filters(void)
Clears the aggregate filters.
void filter_encode(unsigned char *source, int size, int max_size) const
Calls encode on the the buffer filter chain.
void filter_decode(unsigned char *source, int size, int max_size) const
Calls decode on the the buffer filter chain.
void print_num_filters(void) const
Prints the number of filters chained for each type.
Abstract base class for implementing aggregate record filters via a functor interface.
filters::BufferFilters buffer_filters_
List of buffer filters.
ThreadSafeContext * context_
Context used by this filter.
void attach(ThreadSafeContext *context)
Attaches a context.
This class stores variables and their values for use by any entity needing state information in a thr...
MADARA_Export utility::Refcounter< logger::Logger > global_logger
Abstract base class for implementing individual record filters via a functor interface.
Provides map of data types to a filter chain to apply to the data.
std::vector< KnowledgeRecord > FunctionArguments
Provides context about the transport.
This class stores a function definition.
uint64_t get_receive_bandwidth(void) const
Gets the receive bandwidth in bytes per second.
#define madara_logger_cond_log(conditional, logger, alt_logger_ptr, level,...)
High-performance logger that performs conditional logging based on first arg.
KnowledgeRecordFilters()
Default constructor.
size_t get_number_of_buffer_filters(void) const
Returns the number of buffer filters.
uint64_t get_current_time(void) const
Gets the current timestamp.
void clear_buffer_filters(void)
Clears the buffer filters.
int64_t get_operation(void) const
Get operation that the context is performing.
AggregateFilters aggregate_filters_
List of aggregate filters.
::std::map< std::string, KnowledgeRecord > KnowledgeMap
virtual ~KnowledgeRecordFilters()
Destructor.
void add_record(const std::string &key, const madara::knowledge::KnowledgeRecord &record)
Adds a record to the list that should be appended to send or rebroadcast.
size_t get_number_of_filtered_types(void) const
Returns the number of types that have filters.
uint64_t get_message_time(void) const
Gets the message timestamp.
size_t get_number_of_aggregate_filters(void) const
Returns the number of aggregate update filters.
T bitmask_remove(T mask, T values)
Removes values from a bit mask.
void operator=(const KnowledgeRecordFilters &rhs)
Assignment operator.
const std::string & get_domain(void) const
Returns the network domain.
const std::string & get_originator(void) const
Returns the current message originator.
logger::Logger & get_logger(void) const
Gets the logger used for information printing.
Abstract base class for implementing buffer filters via a functor interface.
void add(uint32_t types, knowledge::KnowledgeRecord(*function)(FunctionArguments &, Variables &))
Adds a filter to the list of types.
knowledge::KnowledgeRecord get(const std::string &key, const KnowledgeReferenceSettings &settings=knowledge::KnowledgeReferenceSettings(false))
Retrieves the value of a variable.
Provides an interface for external functions into the MADARA KaRL variable settings.
std::list< Function > FilterChain
a chain of filters
FilterMap filters_
Container for mapping types to filter chains.
uint64_t get_send_bandwidth(void) const
Gets the send/rebroadcast bandwidth in bytes per second.