Subversion Repositories bacoAlunos

Rev

Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * 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;
    }
}