23 #include "ComponentHandler.h"
27 ComponentHandler::ComponentHandler()
29 logger = Logger::getLogger(
"ComponentHandler");
32 ComponentHandler::~ComponentHandler()
37 void ComponentHandler::init()
39 if(_cmp_instance==NULL)
42 _cmp_instance->running =
false;
46 void* ComponentHandler::service(
void* arg)
50 string methInfo,retValue;
51 _cmp_instance->getServer().Receive(fd,methInfo,1024);
52 methInfo =methInfo.substr(0,methInfo.find_last_of(
">")+1);
53 _cmp_instance->logger << (
"Component method " + methInfo) << endl;
57 _cmp_instance->logger <<
"Bean call parsed successfully" << endl;
58 if(methInfo.find(
"lang=\"c++\"")!=string::npos || methInfo.find(
"lang='c++'")!=string::npos)
60 Document doc = parser.getDocument(methInfo);
61 Element message = doc.getRootElement();
62 if(message.getTagName()!=
"service")
66 if(message.getAttributes().size()<4)
70 else if(message.getAttribute(
"name")==
"")
74 else if(message.getAttribute(
"returnType")==
"")
78 else if(message.getAttribute(
"beanName")==
"")
82 else if(message.getAttribute(
"lang")==
"")
86 if(message.getChildElements().size()!=1)
90 else if(message.getChildElements().at(0).getTagName()!=
"args")
98 ElementList argts = message.getChildElements().at(0).getChildElements();
99 for (
unsigned var = 0; var < argts.size(); var++)
103 if(arg.getTagName()!=
"argument")
105 else if(arg.getAttribute(
"type")==
"")
107 if(arg.getText()==
"" && arg.getChildElements().size()==0)
109 if(arg.getAttribute(
"type")!=
"")
111 Element obj = arg.getChildElements().at(0);
112 string objxml = obj.render();
113 string objClassName = obj.getTagName();
114 value = ser.unSerializeUnknown(objxml,arg.getAttribute(
"type"));
116 argus.push_back(arg.getAttribute(
"type"));
117 valus.push_back(value);
119 string className =
"Component_"+message.getAttribute(
"beanName");
120 _cmp_instance->logger << (
"Bean class = " + className) << endl;
121 string returnType = message.getAttribute(
"returnType");
122 string lang = message.getAttribute(
"lang");
123 ClassInfo clas = reflector.getClassInfo(className);
124 string methodName = message.getAttribute(
"name");
125 _cmp_instance->logger << (
"Bean service = " + methodName) << endl;
126 if(clas.getClassName()==
"")
130 Method meth = clas.getMethod(methodName,argus);
131 if(meth.getMethodName()==
"")
133 throw new ComponentHandlerException(
"service does not exist for the bean or the bean does not exist or is not regsitered\n\n",retValue);
137 _cmp_instance->logger << (
"Got Bean service " + methodName) << endl;
140 void *_temp = reflector.newInstanceGVP(ctor);
141 _cmp_instance->logger << (
"Got Bean") << endl;
142 if(returnType==
"void" || returnType==
"")
144 _cmp_instance->logger <<
"Void return" << endl;
145 reflector.invokeMethod<
void*>(_temp,meth,valus);
146 retValue = (
"<return:void></return:void>");
150 _cmp_instance->logger << (
"Return type = " + returnType) << endl;
151 if(returnType==
"int")
153 int retv = reflector.invokeMethod<
int>(_temp,meth,valus);
154 retValue = (
"<return:int>"+CastUtil::lexical_cast<
string>(retv)+
"</return:int>");
156 else if(returnType==
"float")
158 float retv = reflector.invokeMethod<
float>(_temp,meth,valus);
159 retValue = (
"<return:float>"+CastUtil::lexical_cast<
string>(retv)+
"</return:float>");
161 else if(returnType==
"double")
163 double retv = reflector.invokeMethod<
double>(_temp,meth,valus);
164 retValue = (
"<return:double>"+CastUtil::lexical_cast<
string>(retv)+
"</return:double>");
166 else if(returnType==
"string")
168 string retv = reflector.invokeMethod<
string>(_temp,meth,valus);
169 retValue = (
"<return:string>"+retv+
"</return:string>");
171 else if(returnType!=
"")
173 void* retobj = reflector.invokeMethodUnknownReturn(_temp,meth,valus);
174 string oxml = ser.serializeUnknown(retobj,returnType);
175 retValue = (
"<return:"+returnType+
">"+oxml+
"</return:"+returnType+
">");
183 retValue =
"<return:exception>This is a C++ daemon</return:exception>";
187 _cmp_instance->getServer().Send(fd,retValue);
192 _cmp_instance->logger << e->getMessage() << endl;
193 _cmp_instance->getServer().Send(fd,retValue);
198 _cmp_instance->logger <<
"Component exception occurred" << endl;
199 retValue = (
"<return:exception>XmlParseException occurred</return:exception>");
200 _cmp_instance->getServer().Send(fd,retValue);
206 void ComponentHandler::initComponent()
211 bool ComponentHandler::registerComponent(
string name)
214 if(_cmp_instance->components.find(name)!=_cmp_instance->components.end())
220 _cmp_instance->components[name] =
"";
225 bool ComponentHandler::unregisterComponent(
string name)
228 map<string,string>::iterator it = _cmp_instance->components.find(name);
229 if(it!=_cmp_instance->components.end())
231 _cmp_instance->components.erase(it);
239 void ComponentHandler::trigger(
string port)
242 if(_cmp_instance->running)
244 Server serv(port,
false,500,&service,2);
245 _cmp_instance->server = serv;
247 _cmp_instance->running =
true;
251 void ComponentHandler::stop()
253 _cmp_instance->server.stop();