ffead.server.doc
ComponentHandler.cpp
1 /*
2  Copyright 2009-2012, Sumeet Chhetri
3 
4  Licensed under the Apache License, Version 2.0 (the "License");
5  you may not use this file except in compliance with the License.
6  You may obtain a copy of the License at
7 
8  http://www.apache.org/licenses/LICENSE-2.0
9 
10  Unless required by applicable law or agreed to in writing, software
11  distributed under the License is distributed on an "AS IS" BASIS,
12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  See the License for the specific language governing permissions and
14  limitations under the License.
15 */
16 /*
17  * ComponentHandler.cpp
18  *
19  * Created on: Mar 26, 2010
20  * Author: sumeet
21  */
22 
23 #include "ComponentHandler.h"
24 
25 ComponentHandler* _cmp_instance = NULL;
26 
27 ComponentHandler::ComponentHandler()
28 {
29  logger = Logger::getLogger("ComponentHandler");
30 }
31 
32 ComponentHandler::~ComponentHandler()
33 {
34 
35 }
36 
37 void ComponentHandler::init()
38 {
39  if(_cmp_instance==NULL)
40  {
41  _cmp_instance = new ComponentHandler();
42  _cmp_instance->running = false;
43  }
44 }
45 
46 void* ComponentHandler::service(void* arg)
47 {
48  int fd = *(int*)arg;
49  init();
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;
54  try
55  {
56  XmlParser parser("Parser");
57  _cmp_instance->logger << "Bean call parsed successfully" << endl;
58  if(methInfo.find("lang=\"c++\"")!=string::npos || methInfo.find("lang='c++'")!=string::npos)
59  {
60  Document doc = parser.getDocument(methInfo);
61  Element message = doc.getRootElement();
62  if(message.getTagName()!="service")
63  {
64  throw new ComponentHandlerException("No service Tag\n",retValue);
65  }
66  if(message.getAttributes().size()<4)
67  {
68  throw new ComponentHandlerException("name,beanName,returnType and lang are mandatory attributes\n",retValue);
69  }
70  else if(message.getAttribute("name")=="")
71  {
72  throw new ComponentHandlerException("name attribute missing\n",retValue);
73  }
74  else if(message.getAttribute("returnType")=="")
75  {
76  throw new ComponentHandlerException("returnType attribute missing\n",retValue);
77  }
78  else if(message.getAttribute("beanName")=="")
79  {
80  throw new ComponentHandlerException("beanName attribute missing\n",retValue);
81  }
82  else if(message.getAttribute("lang")=="")
83  {
84  throw new ComponentHandlerException("lang attribute missing\n",retValue);
85  }
86  if(message.getChildElements().size()!=1)
87  {
88  throw new ComponentHandlerException("message tag should have only one child tag\n",retValue);
89  }
90  else if(message.getChildElements().at(0).getTagName()!="args")
91  {
92  throw new ComponentHandlerException("message tag should have an args child tag\n",retValue);
93  }
94  Serialize ser;
95  Reflector reflector;
96  args argus;
97  vals valus;
98  ElementList argts = message.getChildElements().at(0).getChildElements();
99  for (unsigned var = 0; var < argts.size(); var++)
100  {
101  void *value = NULL;
102  Element arg = argts.at(var);
103  if(arg.getTagName()!="argument")
104  throw new ComponentHandlerException("Invalid Tag, only argument tag allowed\n",retValue);
105  else if(arg.getAttribute("type")=="")
106  throw new ComponentHandlerException("every argument tag should have a type attribute\n",retValue);
107  if(arg.getText()=="" && arg.getChildElements().size()==0)
108  throw new ComponentHandlerException("argument value missing\n",retValue);
109  if(arg.getAttribute("type")!="")
110  {
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"));
115  }
116  argus.push_back(arg.getAttribute("type"));
117  valus.push_back(value);
118  }
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()=="")
127  {
128  throw new ComponentHandlerException("bean does not exist or is not regsitered\n",retValue);
129  }
130  Method meth = clas.getMethod(methodName,argus);
131  if(meth.getMethodName()=="")
132  {
133  throw new ComponentHandlerException("service does not exist for the bean or the bean does not exist or is not regsitered\n\n",retValue);
134  }
135  else
136  {
137  _cmp_instance->logger << ("Got Bean service " + methodName) << endl;
138  args argus;
139  Constructor ctor = clas.getConstructor(argus);
140  void *_temp = reflector.newInstanceGVP(ctor);
141  _cmp_instance->logger << ("Got Bean") << endl;
142  if(returnType=="void" || returnType=="")
143  {
144  _cmp_instance->logger << "Void return" << endl;
145  reflector.invokeMethod<void*>(_temp,meth,valus);
146  retValue = ("<return:void></return:void>");
147  }
148  else
149  {
150  _cmp_instance->logger << ("Return type = " + returnType) << endl;
151  if(returnType=="int")
152  {
153  int retv = reflector.invokeMethod<int>(_temp,meth,valus);
154  retValue = ("<return:int>"+CastUtil::lexical_cast<string>(retv)+"</return:int>");
155  }
156  else if(returnType=="float")
157  {
158  float retv = reflector.invokeMethod<float>(_temp,meth,valus);
159  retValue = ("<return:float>"+CastUtil::lexical_cast<string>(retv)+"</return:float>");
160  }
161  else if(returnType=="double")
162  {
163  double retv = reflector.invokeMethod<double>(_temp,meth,valus);
164  retValue = ("<return:double>"+CastUtil::lexical_cast<string>(retv)+"</return:double>");
165  }
166  else if(returnType=="string")
167  {
168  string retv = reflector.invokeMethod<string>(_temp,meth,valus);
169  retValue = ("<return:string>"+retv+"</return:string>");
170  }
171  else if(returnType!="")
172  {
173  void* retobj = reflector.invokeMethodUnknownReturn(_temp,meth,valus);
174  string oxml = ser.serializeUnknown(retobj,returnType);
175  retValue = ("<return:"+returnType+">"+oxml+"</return:"+returnType+">");
176  }
177  }
178 
179  }
180  }
181  else
182  {
183  retValue = "<return:exception>This is a C++ daemon</return:exception>";
184  }
185  //_cmp_instance->logger << "\nSending data = "<< retValue << "\n" << endl;
186  if(retValue!="")
187  _cmp_instance->getServer().Send(fd,retValue);
188  //close(fd);
189  }
190  catch(ComponentHandlerException *e)
191  {
192  _cmp_instance->logger << e->getMessage() << endl;
193  _cmp_instance->getServer().Send(fd,retValue);
194  close(fd);
195  }
196  catch(...)
197  {
198  _cmp_instance->logger << "Component exception occurred" << endl;
199  retValue = ("<return:exception>XmlParseException occurred</return:exception>");
200  _cmp_instance->getServer().Send(fd,retValue);
201  close(fd);
202  }
203  return NULL;
204 }
205 
206 void ComponentHandler::initComponent()
207 {
208 
209 }
210 
211 bool ComponentHandler::registerComponent(string name)
212 {
213  init();
214  if(_cmp_instance->components.find(name)!=_cmp_instance->components.end())
215  {
216  return false;
217  }
218  else
219  {
220  _cmp_instance->components[name] = "";
221  return true;
222  }
223 }
224 
225 bool ComponentHandler::unregisterComponent(string name)
226 {
227  init();
228  map<string,string>::iterator it = _cmp_instance->components.find(name);
229  if(it!=_cmp_instance->components.end())
230  {
231  _cmp_instance->components.erase(it);
232  return true;
233  }
234  else
235  return false;
236 }
237 
238 
239 void ComponentHandler::trigger(string port)
240 {
241  init();
242  if(_cmp_instance->running)
243  return;
244  Server serv(port,false,500,&service,2);
245  _cmp_instance->server = serv;
246  //_cmp_instance->getServer() = new Server(port,500,&service);
247  _cmp_instance->running = true;
248  return;
249 }
250 
251 void ComponentHandler::stop()
252 {
253  _cmp_instance->server.stop();
254 }