/*
* Created on May 3, 2004
*
* by gedl
*/
package pt.utl.ist.berserk.logic.serviceManager.delegateGenerator;
import java.lang.reflect.Modifier;
import java.util.Date;
import java.util.Iterator;
import pt.utl.ist.berserk.BerserkConfiguration;
import com.aragost.lang.Classes;
/**
* Created on May 3, 2004
*
* @author gedl
*
*/
public class ServiceDelegate
{
private 1.5.0/docs/api/java/lang/StringBuffer.html">StringBuffer generatedSourceFile
;
private 1.5.0/docs/api/java/lang/String.html">String pack
;
public ServiceDelegate
(ServiceDeclaration serviceDeclaration,
1.5.0/docs/api/java/lang/String.html">String packag
)
{
this.
init(serviceDeclaration, packag
);
}
private void init
(ServiceDeclaration serviceDeclaration,
1.5.0/docs/api/java/lang/String.html">String packag
)
{
this.
generatedSourceFile =
new 1.5.0/docs/api/java/lang/StringBuffer.html">StringBuffer();
this.
pack = packag
;
this.
generateCode(serviceDeclaration
);
}
private void generateCode
(ServiceDeclaration serviceDeclaration
)
{
this.
generateHeader();
this.
generatePackageDeclaration();
this.
generateImports();
this.
generatedSourceFile.
append(1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.
toString(serviceDeclaration.
getModifiers()));
this.
generatedSourceFile.
append(" class ").
append(serviceDeclaration.
getName()).
append(" ");
this.
generateInheritances(serviceDeclaration
);
this.
generateInterfaceImplementations(serviceDeclaration
);
this.
generatedSourceFile.
append("\n{\n");
this.
generateFields();
this.
generateConstructor(serviceDeclaration
);
this.
generateMethods(serviceDeclaration
);
this.
generatedSourceFile.
append("\n}\n");
}
private void generateHeader
()
{
this.
generatedSourceFile
.
append("/*This file was generated with BERSERK's service delegates generation tool.\n");
this.
generatedSourceFile.
append("/*Generation date: ").
append(new 5+0%2Fdocs%2Fapi+Date">Date(1.5.0/docs/api/java/lang/System.html">System.
currentTimeMillis()))
.
append("*/\n\n");
}
private void generateConstructor
(ServiceDeclaration serviceDeclaration
)
{
this.
generatedSourceFile.
append("public ").
append(serviceDeclaration.
getName());
this.
generatedSourceFile.
append("(Object requester)");
this.
generatedSourceFile.
append("{\n");
this.
generatedSourceFile.
append("\t\tthis.requester = requester;");
this.
generatedSourceFile.
append("\n}\n\n");
}
private void generateFields
()
{
this.
generatedSourceFile.
append("private Object requester;\n");
}
private void generateImports
()
{
this.
generatedSourceFile.
append("import pt.utl.ist.berserk.logic.serviceManager.IServiceManager;\n");
this.
generatedSourceFile
.
append("import pt.utl.ist.berserk.logic.filterManager.exceptions.FilterManagerException;\n");
this.
generatedSourceFile
.
append("import pt.utl.ist.berserk.logic.serviceManager.exceptions.ServiceManagerException;\n\n\n");
}
private void generatePackageDeclaration
()
{
if (this.
pack !=
null && !this.
pack.
equals(""))
{
this.
generatedSourceFile.
append("package ").
append(this.
pack).
append(";\n\n");
}
}
private void generateMethods
(ServiceDeclaration serviceDeclaration
)
{
for (1.5.0/docs/api/java/util/Iterator.html">Iterator iter = serviceDeclaration.
getMethods().
iterator(); iter.
hasNext();)
{
MethodDeclaration method =
(MethodDeclaration
) iter.
next();
this.
generatedSourceFile.
append(1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.
toString(method.
getModifiers())).
append(" ");
this.
generatedSourceFile.
append(method.
getReturnType()).
append(" ");
this.
generatedSourceFile.
append(method.
getName()).
append("_filtered (");
this.
generateParameters(method
);
this.
generatedSourceFile.
append(" )");
this.
generateThrows(method
);
this.
generatedSourceFile.
append("\n{");
this.
generateBody(serviceDeclaration.
getName(), method
);
this.
generatedSourceFile.
append("\n}");
}
}
private void generateThrows
(MethodDeclaration method
)
{
this.
generatedSourceFile.
append("throws ServiceManagerException, FilterManagerException");
for (1.5.0/docs/api/java/util/Iterator.html">Iterator iter = method.
getThrowsDeclaration().
iterator(); iter.
hasNext();)
{
1.5.0/docs/api/java/lang/String.html">String ex =
(1.5.0/docs/api/java/lang/String.html">String) iter.
next();
this.
generatedSourceFile.
append(",");
this.
generatedSourceFile.
append(ex
);
}
}
/**
* @param string
* @param method
*/
private void generateBody
(1.5.0/docs/api/java/lang/String.html">String serviceName, MethodDeclaration method
)
{
this.
generatedSourceFile.
append("\n\tIServiceManager manager = ");
if (BerserkConfiguration.
getInstantiationMethod() !=
null)
{
this.
generatedSourceFile.
append(BerserkConfiguration.
getServiceManager()).
append(".").
append(
BerserkConfiguration.
getInstantiationMethod());
}
else
{
this.
generatedSourceFile.
append("new ").
append(BerserkConfiguration.
getServiceManager());
}
this.
generatedSourceFile.
append("();");
this.
generatedSourceFile.
append("\n\tObject[] arguments= new Object[]{");
int counter =
0;
for (1.5.0/docs/api/java/util/Iterator.html">Iterator iter = method.
getArguments().
iterator(); iter.
hasNext();)
{
ParameterDeclaration param =
(ParameterDeclaration
) iter.
next();
if (counter
> 0
)
this.
generatedSourceFile.
append(",");
if (param.
getType().
isPrimitive())
{
1.5.0/docs/api/java/lang/Class.html">Class wrapper = Classes.
getWrapperClass(param.
getType());
this.
generatedSourceFile.
append("new ").
append(wrapper.
getName()).
append("(").
append(
param.
getName()).
append(")");
}
else
{
this.
generatedSourceFile.
append(param.
getName());
}
counter++
;
}
this.
generatedSourceFile.
append("};\n");
if (!method.
isAnonymousParameters())
{
this.
generatedSourceFile.
append("\n\tString[] names= new String[]{");
int counterNames =
0;
for (1.5.0/docs/api/java/util/Iterator.html">Iterator iter = method.
getArguments().
iterator(); iter.
hasNext();)
{
ParameterDeclaration param =
(ParameterDeclaration
) iter.
next();
if (counterNames
> 0
)
this.
generatedSourceFile.
append(",");
this.
generatedSourceFile.
append("\"").
append(param.
getName()).
append("\"");
counterNames++
;
}
this.
generatedSourceFile.
append("};\n");
}
this.
generatedSourceFile.
append("\n\ttry{\n");
if (!method.
getReturnType().
equals("void"))
this.
generatedSourceFile.
append("\n\t\treturn (").
append(method.
getReturnType()).
append(")");
this.
generatedSourceFile.
append("\t\tmanager.execute(this.requester,\"").
append(serviceName
).
append(
"\"");
this.
generatedSourceFile.
append(",\"").
append(method.
getName()).
append("\",arguments,names);");
this.
generatedSourceFile.
append("\n\t}");
this.
generateCatchStatements(method
);
}
/**
* @param method
*/
private void generateCatchStatements
(MethodDeclaration method
)
{
this.
generatedSourceFile.
append("\n\t\tcatch (ServiceManagerException e)\n\t\t{");
this.
generatedSourceFile.
append("\n\t\tthrow e;\n\t\t}");
this.
generatedSourceFile.
append("\n\t\tcatch (FilterManagerException e)\n\t\t{");
this.
generatedSourceFile.
append("\n\t\tthrow e;\n}");
for (1.5.0/docs/api/java/util/Iterator.html">Iterator iter = method.
getThrowsDeclaration().
iterator(); iter.
hasNext();)
{
1.5.0/docs/api/java/lang/String.html">String exception =
(1.5.0/docs/api/java/lang/String.html">String) iter.
next();
this.
generatedSourceFile.
append("\n\t\tcatch (").
append(exception
).
append(" e)\n\t\t{");
this.
generatedSourceFile.
append("\n\t\tthrow e;\n}");
}
this.
generatedSourceFile.
append("\n\t\tcatch (Throwable e)\n\t\t{");
this.
generatedSourceFile.
append("\n\t\tthrow new RuntimeException(e);\n}");
}
private void generateParameters
(MethodDeclaration method
)
{
int counter =
0;
for (1.5.0/docs/api/java/util/Iterator.html">Iterator iter = method.
getArguments().
iterator(); iter.
hasNext();)
{
ParameterDeclaration param =
(ParameterDeclaration
) iter.
next();
if (counter
> 0
)
this.
generatedSourceFile.
append(",");
this.
generatedSourceFile.
append(param.
getType().
getName()).
append(" ").
append(param.
getName());
counter++
;
}
}
private void generateInterfaceImplementations
(ServiceDeclaration serviceDeclaration
)
{
int counter =
0;
if (serviceDeclaration.
getInterfaces().
size() > 0
)
{
this.
generatedSourceFile.
append(" implements ");
for (1.5.0/docs/api/java/util/Iterator.html">Iterator iter = serviceDeclaration.
getInterfaces().
iterator(); iter.
hasNext();)
{
1.5.0/docs/api/java/lang/String.html">String interfaCe =
(1.5.0/docs/api/java/lang/String.html">String) iter.
next();
if (counter
> 0
)
this.
generatedSourceFile.
append(",");
this.
generatedSourceFile.
append(interfaCe
);
counter++
;
}
}
}
private void generateInheritances
(ServiceDeclaration serviceDeclaration
)
{
if (serviceDeclaration.
getSuperClass() !=
null)
this.
generatedSourceFile.
append("extends ").
append(serviceDeclaration.
getSuperClass())
.
append(" ");
}
public 1.5.0/docs/api/java/lang/String.html">String toString
()
{
1.5.0/docs/api/java/lang/StringBuffer.html">StringBuffer result =
new 1.5.0/docs/api/java/lang/StringBuffer.html">StringBuffer("[ServiceDelegate:");
result.
append("GeneratedCode: ").
append(this.
generatedSourceFile);
return new 1.5.0/docs/api/java/lang/String.html">String(result
);
}
/**
* @return Returns the generatedSourceFile.
*/
public 1.5.0/docs/api/java/lang/StringBuffer.html">StringBuffer getGeneratedSourceFile
()
{
return this.
generatedSourceFile;
}
}