23 #include "feature_redefine_warning.h" 24 #include <logging/logger.h> 27 #include <clips/clips.h> 31 #define ROUTER_NAME "clips-feature-redefine-warn" 37 class CLIPSRedefineWarningLogger
40 CLIPSRedefineWarningLogger(
Logger *logger,
const char *component = NULL)
44 component_ = strdup(component);
48 warn_filter_ =
"[CSTRCPSR1] WARNING: ";
51 ~CLIPSRedefineWarningLogger()
58 bool buffer_warning(
const char *str, std::string &buffer_string)
60 if (strcmp(str,
"\n") == 0) {
61 if (warn_buffer_ == warn_filter_) {
65 buffer_string = warn_buffer_;
71 if (warn_filter_.find(warn_buffer_) == std::string::npos) {
81 void log(
const char *str)
83 if (strcmp(str,
"\n") == 0) {
84 if (buffer_.find(
"Redefining ") == 0) {
85 logger_->log_error(component_ ? component_ :
"CLIPS",
"%s", buffer_.c_str());
98 std::string warn_buffer_;
99 std::string warn_filter_;
103 redefine_warning_router_query(
void *env,
char *logical_name)
105 if (strcmp(logical_name, WDIALOG) == 0)
return TRUE;
106 if (strcmp(logical_name, WWARNING) == 0)
return TRUE;
111 redefine_warning_router_print(
void *env,
char *logical_name,
char *str)
113 void *rc = GetEnvironmentRouterContext(env);
114 CLIPSRedefineWarningLogger *logger =
static_cast<CLIPSRedefineWarningLogger *
>(rc);
116 if (strcmp(logical_name, WWARNING) == 0) {
120 if (logger->buffer_warning(str, wbuffer)) {
122 EnvDeactivateRouter(env, (
char *)ROUTER_NAME);
123 EnvPrintRouter(env, logical_name, (
char *)wbuffer.c_str());
124 if (strcmp(str,
"\n") == 0 && wbuffer !=
"") {
125 EnvPrintRouter(env, logical_name, str);
127 EnvActivateRouter(env, (
char *)ROUTER_NAME);
137 redefine_warning_router_exit(
void *env,
int exit_code)
169 envs_[env_name] = clips;
171 std::string name =
"RWCLIPS|" + env_name;
173 CLIPSRedefineWarningLogger *cl =
new CLIPSRedefineWarningLogger(logger_, name.c_str());
175 EnvAddRouterWithContext(clips->cobj(), (
char *)ROUTER_NAME,
177 redefine_warning_router_query,
178 redefine_warning_router_print,
181 redefine_warning_router_exit,
183 clips->watch(
"compilations");
190 std::string name =
"RWCLIPS|" + env_name;
191 if (envs_.find(env_name) == envs_.end()) {
192 logger_->
log_warn(name.c_str(),
"Environment %s has not been registered " 193 "for redefine warning feature", env_name.c_str());
199 CLIPSRedefineWarningLogger *logger = NULL;
201 struct routerData *rd = RouterData(clips->cobj());
202 struct router *r = rd->ListOfRouters;
204 if (strcmp(r->name, ROUTER_NAME) == 0) {
205 logger =
static_cast<CLIPSRedefineWarningLogger *
>(r->context);
211 EnvDeleteRouter(clips->cobj(), (
char *)ROUTER_NAME);
214 envs_.erase(env_name);
Fawkes library namespace.
virtual ~RedefineWarningCLIPSFeature()
Destructor.
RedefineWarningCLIPSFeature(fawkes::Logger *logger)
Constructor.
CLIPS feature maintainer.
virtual void log_warn(const char *component, const char *format,...)=0
Log warning message.
virtual void clips_context_init(const std::string &env_name, fawkes::LockPtr< CLIPS::Environment > &clips)
Initialize a CLIPS context to use the provided feature.
virtual void clips_context_destroyed(const std::string &env_name)
Notification that a CLIPS environment has been destroyed.