23 #include "AOPEngine.h"
25 AOPEngine::AOPEngine() {
30 AOPEngine::~AOPEngine() {
34 void AOPEngine::execute(
string fileName)
40 infile.open(fileName.c_str());
44 while(getline(infile, data))
48 if(data.find(
"@INCLUDE")!=string::npos)
50 StringUtil::eraseAll(data,
"@INCLUDE(\"");
51 StringUtil::eraseAll(data,
"\")");
53 StringUtil::split(tr, data, (
";"));
54 for(
unsigned int i=0;i<tr.size();i++)
56 include += (
"#include \"" + tr.at(i) +
"\"\n");
59 else if(data.find(
"@ASPECTBEGIN")!=string::npos)
63 else if(data.find(
"@EXECUTION")!=string::npos)
65 StringUtil::eraseAll(data,
"@EXECUTION(\"");
66 StringUtil::eraseAll(data,
"\")");
68 StringUtil::split(tr, data, (
" "));
69 for(
unsigned int i=0;i<tr.size();i++)
72 aspect.setClassName(tr.at(i));
74 aspect.setMethodName(tr.at(i));
77 else if(data.find(
"@STRICT")!=string::npos)
79 StringUtil::eraseAll(data,
"@STRICT(\"");
80 StringUtil::eraseAll(data,
"\")");
81 aspect.setStrict(data);
83 else if(data.find(
"@ARGS")!=string::npos)
85 StringUtil::eraseAll(data,
"@ARGS(\"");
86 StringUtil::eraseAll(data,
"\")");
87 aspect.setArguTypes(data);
89 StringUtil::split(tr, data, (
";"));
90 aspect.setArgumentTypes(tr);
92 else if(data.find(
"@RETURN")!=string::npos)
94 StringUtil::eraseAll(data,
"@RETURN(\"");
95 StringUtil::eraseAll(data,
"\")");
96 aspect.setReturnType(data);
98 else if(data.find(
"@WHEN")!=string::npos)
100 StringUtil::eraseAll(data,
"@WHEN(\"");
101 StringUtil::eraseAll(data,
"\")");
102 aspect.setWhen(data);
104 else if(data.find(
"@CODE")!=string::npos)
106 StringUtil::eraseAll(data,
"@CODE(");
107 StringUtil::eraseAll(data,
")");
108 aspect.setCode(data);
110 else if(data.find(
"@ASPECTEND")!=string::npos)
112 this->aspects.push_back(aspect);
118 if(this->aspects.size()>0)
120 for(
unsigned int i=0;i<this->aspects.size();i++)
123 aspect = this->aspects.at(i);
124 string classN =
"/home/sumeet/workspace/default/"+aspect.getClassName()+
".cpp";
125 infile.open(classN.c_str());
129 while(getline(infile, data))
131 content += (data +
"\n");
134 if(aspect.getReturnType()==
"*")
136 if(aspect.getStrict()==
"true")
137 signature += (
" "+aspect.getClassName()+
"::"+aspect.getMethodName()+
"(");
139 signature += (aspect.getMethodName()+
"(");
143 if(aspect.getStrict()==
"true")
144 signature += (aspect.getReturnType()+
" "+aspect.getClassName()+
"::"+aspect.getMethodName()+
"(");
146 signature += (aspect.getReturnType()+
" "+aspect.getMethodName()+
"(");
148 string prior,later,temp,argus,arginit,argsig;
149 unsigned int f = content.find(signature);
152 prior = content.substr(0,f);
153 later = content.substr(f);
154 unsigned s = later.find_first_of(
"(")+1;
155 unsigned e = later.find_first_of(
")");
156 argus = later.substr(s,e-s);
158 StringUtil::split(tr, argus, (
","));
159 for(
unsigned int i=0;i<tr.size();i++)
161 StringUtil::split(tc, tr.at(i), (
" "));
166 arginit += (tc.at(0) +
" _" + te +
" = " + tc.at(1)) +
";\n";
167 argsig += (tc.at(0));
171 if(aspect.getArguTypes()==argsig)
173 unsigned g = later.find_first_of(
"{");
174 prior = content.substr(0,f+g+1);
175 later = content.substr(f+g+1);
176 unsigned h = later.find_first_of(
"}");
177 temp = later.substr(0,h);
178 later = later.substr(h);
179 if(aspect.getWhen()==
"BEFORE")
181 temp = (
"\n" + arginit + aspect.getCode() +
"\n" + temp);
185 temp = (temp +
"\n" + arginit + aspect.getCode() +
"\n");
187 content = (include + prior + temp + later);
188 string aop_name =
"/home/sumeet/Desktop/_AOP_"+aspect.getClassName()+
".cpp";
189 ofile.open(aop_name.c_str());
190 ofile.write(content.c_str(),content.length());