void* ComponentHandler::service(void* arg) { int fd = *(int*)arg; init(); string methInfo,retValue; _cmp_instance->getServer()->Receive(fd,methInfo,1024); methInfo =methInfo.substr(0,methInfo.find_last_of(">")+1); _cmp_instance->logger << methInfo << flush; try { XmlParser parser("Parser"); _cmp_instance->logger << "\nBean call parsed successfully\n" << flush; if(methInfo.find("lang=\"c++\"")!=string::npos || methInfo.find("lang='c++'")!=string::npos) { Document doc = parser.getDocument(methInfo); Element message = doc.getRootElement(); if(message.getTagName()!="service") { throw new ComponentHandlerException("No service Tag\n",retValue); } if(message.getAttributes().size()<4) { throw new ComponentHandlerException("name,beanName,returnType and lang are mandatory attributes\n",retValue); } else if(message.getAttribute("name")=="") { throw new ComponentHandlerException("name attribute missing\n",retValue); } else if(message.getAttribute("returnType")=="") { throw new ComponentHandlerException("returnType attribute missing\n",retValue); } else if(message.getAttribute("beanName")=="") { throw new ComponentHandlerException("beanName attribute missing\n",retValue); } else if(message.getAttribute("lang")=="") { throw new ComponentHandlerException("lang attribute missing\n",retValue); } if(message.getChildElements().size()!=1) { throw new ComponentHandlerException("message tag should have only one child tag\n",retValue); } else if(message.getChildElements().at(0).getTagName()!="args") { throw new ComponentHandlerException("message tag should have an args child tag\n",retValue); } Serialize ser; Reflector reflector; args argus; vals valus; ElementList argts = message.getChildElements().at(0).getChildElements(); for (unsigned var = 0; var < argts.size(); var++) { void *value = NULL; Element arg = argts.at(var); if(arg.getTagName()!="argument") throw new ComponentHandlerException("Invalid Tag, only argument tag allowed\n",retValue); else if(arg.getAttribute("type")=="") throw new ComponentHandlerException("every argument tag should have a type attribute\n",retValue); if(arg.getText()=="" && arg.getChildElements().size()==0) throw new ComponentHandlerException("argument value missing\n",retValue); if(arg.getAttribute("type")!="") { Element obj = arg.getChildElements().at(0); string objxml = obj.render(); string objClassName = obj.getTagName(); value = ser.unSerializeUnknown(objxml,arg.getAttribute("type")); } argus.push_back(arg.getAttribute("type")); valus.push_back(value); } string className = "Component_"+message.getAttribute("beanName"); _cmp_instance->logger << "\nBean class = " << className << "\n" << flush; string returnType = message.getAttribute("returnType"); string lang = message.getAttribute("lang"); ClassInfo clas = reflector.getClassInfo(className); string methodName = message.getAttribute("name"); _cmp_instance->logger << "\nBean service = " << methodName << "\n" << flush; if(clas.getClassName()=="") { throw new ComponentHandlerException("bean does not exist or is not regsitered\n",retValue); } Method meth = clas.getMethod(methodName,argus); if(meth.getMethodName()=="") { throw new ComponentHandlerException("service does not exist for the bean or the bean does not exist or is not regsitered\n\n",retValue); } else { _cmp_instance->logger << "\nGot Bean service " << methodName << "\n" << flush; args argus; Constructor ctor = clas.getConstructor(argus); void *_temp = reflector.newInstanceGVP(ctor); _cmp_instance->logger << "\nGot Bean " << _temp << "\n" << flush; if(returnType=="void" || returnType=="") { _cmp_instance->logger << "\nVoid return " << "\n" << flush; reflector.invokeMethod<void*>(_temp,meth,valus); retValue = ("<return:void></return:void>"); } else { _cmp_instance->logger << "\nReturn type = "<< returnType << "\n" << flush; if(returnType=="int") { int retv = reflector.invokeMethod<int>(_temp,meth,valus); retValue = ("<return:int>"+CastUtil::lexical_cast<string>(retv)+"</return:int>"); } else if(returnType=="float") { float retv = reflector.invokeMethod<float>(_temp,meth,valus); retValue = ("<return:float>"+CastUtil::lexical_cast<string>(retv)+"</return:float>"); } else if(returnType=="double") { double retv = reflector.invokeMethod<double>(_temp,meth,valus); retValue = ("<return:double>"+CastUtil::lexical_cast<string>(retv)+"</return:double>"); } else if(returnType=="string") { string retv = reflector.invokeMethod<string>(_temp,meth,valus); retValue = ("<return:string>"+retv+"</return:string>"); } else if(returnType!="") { void* retobj = reflector.invokeMethodUnknownReturn(_temp,meth,valus); string oxml = ser.serializeUnknown(retobj,returnType); retValue = ("<return:"+returnType+">"+oxml+"</return:"+returnType+">"); } } } } else { retValue = "<return:exception>This is a C++ daemon</return:exception>"; } _cmp_instance->logger << "\nSending data = "<< retValue << "\n" << flush; if(retValue!="") _cmp_instance->getServer()->Send(fd,retValue); //close(fd); } catch(ComponentHandlerException *e) { _cmp_instance->logger << e->getMessage() << flush; _cmp_instance->getServer()->Send(fd,retValue); close(fd); } catch(...) { _cmp_instance->logger << "exception occurred" << flush; retValue = ("<return:exception>XmlParseException occurred</return:exception>"); _cmp_instance->getServer()->Send(fd,retValue); close(fd); } }
void* MethodInvoc::service(void* arg) { int fd = *(int*)arg; init(); string methInfo,retValue; _methinv_instance->server.Receive(fd,methInfo,1024); methInfo =methInfo.substr(0,methInfo.find_last_of(">")+1); try { XmlParser parser("Parser"); if(methInfo.find("lang=\"c++\"")!=string::npos || methInfo.find("lang='c++'")!=string::npos) { Document doc = parser.getDocument(methInfo); Element message = doc.getRootElement(); if(message.getTagName()!="method") { throw MethodInvokerException("No method Tag\n",retValue); } if(message.getAttributes().size()<3) { throw MethodInvokerException("name,class and lang are mandatory attributes\n",retValue); } else if(message.getAttribute("name")=="") { throw MethodInvokerException("name attribute missing\n",retValue); } else if(message.getAttribute("className")=="") { throw MethodInvokerException("class attribute missing\n",retValue); } else if(message.getAttribute("lang")=="") { throw MethodInvokerException("lang attribute missing\n",retValue); } if(message.getChildElements().size()!=1) { throw MethodInvokerException("message tag should have only one child tag\n",retValue); } else if(message.getChildElements().at(0).getTagName()!="args") { throw MethodInvokerException("message tag should have an args child tag\n",retValue); } XMLSerialize ser; Reflector reflector; args argus; vals valus; ElementList argts = message.getChildElements().at(0).getChildElements(); for (unsigned var = 0; var < argts.size(); var++) { void *value = NULL; Element arg = argts.at(var); if(arg.getTagName()!="argument" || arg.getAttribute("type")=="") throw MethodInvokerException("every argument tag should have a name and type attribute\n",retValue); if(arg.getText()=="" && arg.getChildElements().size()==0) throw MethodInvokerException("argument value missing\n",retValue); if(arg.getAttribute("type")=="int") { int *vt = new int; *vt = CastUtil::lexical_cast<int>(arg.getText()); value = vt; } else if(arg.getAttribute("type")=="float") { float *vt = new float; *vt = CastUtil::lexical_cast<float>(arg.getText()); value = vt; } else if(arg.getAttribute("type")=="double") { double *vt = new double; *vt = CastUtil::lexical_cast<double>(arg.getText()); value = vt; } else if(arg.getAttribute("type")=="string") { string *vt = new string; *vt = CastUtil::lexical_cast<string>(arg.getText()); value = vt; } else if(arg.getAttribute("type")!="") { Element obj = arg.getChildElements().at(0); string objxml = obj.render(); string objClassName = obj.getTagName(); value = ser.unSerializeUnknown(objxml,arg.getAttribute("type")); } argus.push_back(arg.getAttribute("type")); valus.push_back(value); } string className = message.getAttribute("className"); string returnType = message.getAttribute("returnType"); string lang = message.getAttribute("lang"); ClassInfo clas = reflector.getClassInfo(className); string methodName = message.getAttribute("name");; if(clas.getClassName()=="") { throw MethodInvokerException("class does not exist or is not in the library path\n",retValue); } Method meth = clas.getMethod(methodName,argus); if(meth.getMethodName()=="") { throw MethodInvokerException("method does not exist for the class or the class does not exist in the library path\n",retValue); } else { args argus; Constructor ctor = clas.getConstructor(argus); void *_temp = reflector.newInstanceGVP(ctor); if(returnType=="void" || returnType=="") { reflector.invokeMethod<void*>(_temp,meth,valus); retValue = ("<return:void></return:void>"); } else { if(returnType=="int") { int retv = reflector.invokeMethod<int>(_temp,meth,valus); retValue = ("<return:int>"+CastUtil::lexical_cast<string>(retv)+"</return:int>"); } else if(returnType=="float") { float retv = reflector.invokeMethod<float>(_temp,meth,valus); retValue = ("<return:float>"+CastUtil::lexical_cast<string>(retv)+"</return:float>"); } else if(returnType=="double") { double retv = reflector.invokeMethod<double>(_temp,meth,valus); retValue = ("<return:double>"+CastUtil::lexical_cast<string>(retv)+"</return:double>"); } else if(returnType=="string") { string retv = reflector.invokeMethod<string>(_temp,meth,valus); retValue = ("<return:string>"+retv+"</return:string>"); } else if(returnType!="") { void* retobj = reflector.invokeMethodUnknownReturn(_temp,meth,valus); string oxml = ser.serializeUnknown(retobj,returnType); retValue = ("<return:"+returnType+">"+oxml+"</return:"+returnType+">"); } } } } else { retValue = "<return:exception>This is a C++ daemon</return:exception>"; } if(retValue!="") _methinv_instance->server.Send(fd,retValue); close(fd); } catch(MethodInvokerException *e) { _methinv_instance->server.Send(fd,retValue); close(fd); } catch(...) { retValue = ("<return:exception>XmlParseException occurred</return:exception>"); _methinv_instance->server.Send(fd,retValue); close(fd); } return NULL; }