23 #include "feature_redefine_warning.h" 25 #include <logging/logger.h> 28 #include <clips/clips.h> 32 #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()
59 buffer_warning(
const char *str, std::string &buffer_string)
61 if (strcmp(str,
"\n") == 0) {
62 if (warn_buffer_ == warn_filter_) {
66 buffer_string = warn_buffer_;
72 if (warn_filter_.find(warn_buffer_) == std::string::npos) {
85 if (strcmp(str,
"\n") == 0) {
86 if (buffer_.compare(0, 11,
"Redefining ") == 0) {
87 logger_->log_error(component_ ? component_ :
"CLIPS",
"%s", buffer_.c_str());
100 std::string warn_buffer_;
101 std::string warn_filter_;
105 redefine_warning_router_query(
void *env,
char *logical_name)
107 if (strcmp(logical_name, WDIALOG) == 0)
109 if (strcmp(logical_name, WWARNING) == 0)
115 redefine_warning_router_print(
void *env,
char *logical_name,
char *str)
117 void * rc = GetEnvironmentRouterContext(env);
118 CLIPSRedefineWarningLogger *logger = static_cast<CLIPSRedefineWarningLogger *>(rc);
120 if (strcmp(logical_name, WWARNING) == 0) {
124 if (logger->buffer_warning(str, wbuffer)) {
126 EnvDeactivateRouter(env, (
char *)ROUTER_NAME);
127 EnvPrintRouter(env, logical_name, (
char *)wbuffer.c_str());
128 if (strcmp(str,
"\n") == 0 && wbuffer !=
"") {
129 EnvPrintRouter(env, logical_name, str);
131 EnvActivateRouter(env, (
char *)ROUTER_NAME);
141 redefine_warning_router_exit(
void *env,
int exit_code)
170 envs_[env_name] = clips;
172 std::string name =
"RWCLIPS|" + env_name;
174 CLIPSRedefineWarningLogger *cl =
new CLIPSRedefineWarningLogger(logger_, name.c_str());
176 EnvAddRouterWithContext(clips->cobj(),
179 redefine_warning_router_query,
180 redefine_warning_router_print,
183 redefine_warning_router_exit,
185 clips->watch(
"compilations");
191 std::string name =
"RWCLIPS|" + env_name;
192 if (envs_.find(env_name) == envs_.end()) {
194 "Environment %s has not been registered " 195 "for redefine warning feature",
202 CLIPSRedefineWarningLogger *logger = NULL;
204 struct routerData *rd = RouterData(clips->cobj());
205 struct router * r = rd->ListOfRouters;
207 if (strcmp(r->name, ROUTER_NAME) == 0) {
208 logger = static_cast<CLIPSRedefineWarningLogger *>(r->context);
214 EnvDeleteRouter(clips->cobj(), (
char *)ROUTER_NAME);
217 envs_.erase(env_name);
Fawkes library namespace.
virtual ~RedefineWarningCLIPSFeature()
Destructor.
RedefineWarningCLIPSFeature(fawkes::Logger *logger)
Constructor.
virtual void log(LogLevel level, const char *component, const char *format,...)
Log message of given log level.
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.