ffead.server.doc
FFEADContext.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  * FFEADContext.cpp
18  *
19  * Created on: Oct 17, 2010
20  * Author: root
21  */
22 
23 #include "FFEADContext.h"
24 
25 FFEADContext::FFEADContext(string depFile)
26 {
27  XmlParser parser("Parser");
28  Element root = parser.getDocument(depFile).getRootElement();
29  ElementList eles = root.getChildElements();
30  vector<string> beanchk;
31  if(eles.size()>0 && root.getTagName()=="beans")
32  {
33  for (unsigned int var = 0; var < eles.size(); var++)
34  {
35  Element ele = eles.at(var);
36  if(ele.getTagName()=="bean")
37  {
38  Bean bean;
39  bean.name = ele.getAttribute("name");
40  bean.value = ele.getAttribute("value");
41  bean.inbuilt = ele.getAttribute("inbuilt");
42  if(ele.getAttribute("bean")!="")
43  throw "Invalid attribute";
44  bean.bean = ele.getAttribute("bean");
45  bean.clas = ele.getAttribute("class");
46  bean.intfType = ele.getAttribute("intfType");
47  bean.injectAs = ele.getAttribute("injectAs");
48  bean.realbean = true;
49  ElementList eleeles = ele.getChildElements();
50  if(eleeles.size()==0)
51  {
52 
53  }
54  else
55  {
56  for (unsigned int var1 = 0; var1 < eleeles.size(); var1++)
57  {
58  Element ele1 = eleeles.at(var1);
59  if(ele1.getTagName()=="inject")
60  {
61  if(ele1.getAttribute("bean")!="")
62  {
63  beanchk.push_back(ele1.getAttribute("bean"));
64  bean.injs.push_back(ele1.getAttribute("bean"));
65  if(ele1.getAttribute("name")!="")
66  bean.names.push_back(ele1.getAttribute("name"));
67  else
68  bean.names.push_back(ele1.getAttribute("bean"));
69  bean.types.push_back(ele1.getAttribute("intfType"));
70  }
71  else
72  {
73  Bean beanc;
74  beanc.name = ele1.getAttribute("name");
75  beanc.value = ele1.getAttribute("value");
76  beanc.inbuilt = ele1.getAttribute("inbuilt");
77  beanc.clas = ele1.getAttribute("class");
78  beanc.intfType = ele1.getAttribute("intfType");
79  beanc.realbean = false;
80  injbns[beanc.name] = beanc;
81  bean.injs.push_back(beanc.name);
82  bean.names.push_back(beanc.name);
83  }
84  }
85  else
86  {
87  throw "Invalid tag";
88  }
89  }
90  }
91  beans[bean.name] = bean;
92  }
93  else
94  {
95  throw "Invalid tag";
96  }
97  }
98  }
99 }
100 
101 FFEADContext::~FFEADContext()
102 {
103  this->clear();
104 }
105 
106 void* FFEADContext::getBean(Bean bean)
107 {
108  void *_temp = NULL;
109  string type;
110  if(bean.inbuilt!="" && bean.value!="")
111  {
112  type = bean.inbuilt;
113  if(bean.inbuilt=="string")
114  {
115  string *in = new string(bean.value);
116  _temp = in;
117  }
118  else if(bean.inbuilt=="int")
119  {
120  int *in = new int;
121  *in = CastUtil::lexical_cast<int>(bean.value);
122  _temp = in;
123  }
124  else if(bean.inbuilt=="flaot")
125  {
126  float *in = new float;
127  *in = CastUtil::lexical_cast<float>(bean.value);
128  _temp = in;
129  }
130  else if(bean.inbuilt=="double")
131  {
132  double *in = new double;
133  *in = CastUtil::lexical_cast<double>(bean.value);
134  _temp = in;
135  }
136  else if(bean.inbuilt=="long")
137  {
138  long *in = new long;
139  *in = CastUtil::lexical_cast<long>(bean.value);
140  _temp = in;
141  }
142  else if(bean.inbuilt=="bool")
143  {
144  bool *in = new bool;
145  if(bean.value=="true")
146  *in = true;
147  else if(bean.value=="false")
148  *in = false;
149  _temp = in;
150  }
151  else if(bean.inbuilt=="char")
152  {
153  char *in = new char;
154  *in = bean.value[0];
155  _temp = in;
156  }
157  }
158  else if(bean.inbuilt!="" && bean.value=="")
159  {
160  throw "Invalid value for inbuilt type";
161  }
162  else if(bean.injectAs=="" || bean.injs.size()==0)
163  {
164  Reflector reflector;
165  args argus;
166  ClassInfo clas = reflector.getClassInfo(bean.clas);
167  Constructor ctor = clas.getConstructor(argus);
168  _temp = reflector.newInstanceGVP(ctor);
169  type = bean.clas;
170  }
171  else if(bean.injectAs=="prop")
172  {
173  type = bean.clas;
174  Reflector reflector;
175  args argus;
176  vals valus;
177  ClassInfo clas = reflector.getClassInfo(bean.clas);
178  Constructor ctor = clas.getConstructor(argus);
179  _temp = reflector.newInstanceGVP(ctor);
180  for (unsigned int var = 0; var < bean.injs.size(); var++)
181  {
182  Bean beanc = injbns[bean.injs.at(var)];
183  if(beanc.name=="")
184  beanc = beans[bean.injs.at(var)];
185  string methodName("set");
186  methodName += AfcUtil::camelCased(bean.names.at(var));
187  if(beanc.inbuilt!="")
188  argus.push_back(beanc.inbuilt);
189  else if(beanc.clas!="")
190  argus.push_back(beanc.clas);
191  else
192  throw "Invalid or no bean type defined";
193  Method meth = clas.getMethod(methodName,argus);
194  void *value = getBean(beanc);
195  valus.push_back(value);
196  reflector.invokeMethod<void*>(_temp,meth,valus);
197  valus.clear();
198  argus.clear();
199  }
200  }
201  else if(bean.injectAs=="cons")
202  {
203  type = bean.clas;
204  Reflector reflector;
205  args argus;
206  vals valus;
207  ClassInfo clas = reflector.getClassInfo(bean.clas);
208  for (unsigned int var = 0; var < bean.injs.size(); var++)
209  {
210  Bean beanc = injbns[bean.injs.at(var)];
211  if(beanc.name=="")
212  beanc = beans[bean.injs.at(var)];
213  if(beanc.inbuilt!="")
214  argus.push_back(beanc.inbuilt);
215  else if(beanc.clas!="")
216  argus.push_back(beanc.clas);
217  else
218  throw "Invalid or no bean type defined";
219  void *value = getBean(beanc);
220  valus.push_back(value);
221  }
222  Constructor ctor = clas.getConstructor(argus);
223  _temp = reflector.newInstanceGVP(ctor,valus);
224  }
225  else if(bean.injectAs=="intf")
226  {
227  type = bean.clas;
228  Reflector reflector;
229  args argus;
230  vals valus;
231  ClassInfo clas = reflector.getClassInfo(bean.clas);
232  Constructor ctor = clas.getConstructor(argus);
233  _temp = reflector.newInstanceGVP(ctor);
234  for (unsigned int var = 0; var < bean.injs.size(); var++)
235  {
236  Bean beanc = injbns[bean.injs.at(var)];
237  if(beanc.name=="")
238  beanc = beans[bean.injs.at(var)];
239  string methodName("set");
240  methodName += AfcUtil::camelCased(bean.names.at(var));
241  if(bean.types.at(var)!="")
242  argus.push_back(bean.types.at(var));
243  else
244  throw "Invalid or no bean type defined";
245  Method meth = clas.getMethod(methodName,argus);
246  void *value = getBean(beanc);
247  valus.push_back(value);
248  reflector.invokeMethod<void*>(_temp,meth,valus);
249  valus.clear();
250  argus.clear();
251  }
252  }
253  objects[type] = _temp;
254  return _temp;
255 }
256 
257 void* FFEADContext::getBean(string beanName)
258 {
259  Bean bean = beans[beanName];
260  return getBean(bean);
261 }
262 
263 
264 void FFEADContext::clear()
265 {
266  if(cleared)
267  return;
268  map<string,void*>::iterator objectsIter;
269  for (objectsIter=objects.begin();objectsIter != objects.end();objectsIter++)
270  {
271  if(objectsIter->first=="string" || objectsIter->first=="int" || objectsIter->first=="long"
272  || objectsIter->first=="double" || objectsIter->first=="float" || objectsIter->first=="bool"
273  || objectsIter->first=="char")
274  delete objectsIter->second;
275  else
276  {
277  Reflector reflector;
278  reflector.destroy(objectsIter->second,objectsIter->first);
279  }
280  }
281  cleared = true;
282 }