com.idega.eclipse.ejbwizards.IDOEntityCreator.java Source code

Java tutorial

Introduction

Here is the source code for com.idega.eclipse.ejbwizards.IDOEntityCreator.java

Source

/*
 * $Id$ Created on Apr 19,
 * 2006
 * 
 * Copyright (C) 2006 Idega Software hf. All Rights Reserved.
 * 
 * This software is the proprietary information of Idega hf. Use is subject to
 * license terms.
 */
package com.idega.eclipse.ejbwizards;

import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.Signature;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.Block;
import org.eclipse.jdt.core.dom.CastExpression;
import org.eclipse.jdt.core.dom.CatchClause;
import org.eclipse.jdt.core.dom.ClassInstanceCreation;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.MarkerAnnotation;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.MethodInvocation;
import org.eclipse.jdt.core.dom.Modifier;
import org.eclipse.jdt.core.dom.ParameterizedType;
import org.eclipse.jdt.core.dom.ParenthesizedExpression;
import org.eclipse.jdt.core.dom.PrimitiveType;
import org.eclipse.jdt.core.dom.ReturnStatement;
import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
import org.eclipse.jdt.core.dom.Statement;
import org.eclipse.jdt.core.dom.SuperMethodInvocation;
import org.eclipse.jdt.core.dom.ThisExpression;
import org.eclipse.jdt.core.dom.ThrowStatement;
import org.eclipse.jdt.core.dom.TryStatement;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.jdt.core.dom.TypeLiteral;
import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
import org.eclipse.jdt.core.dom.VariableDeclarationStatement;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.Document;
import org.eclipse.text.edits.MalformedTreeException;

public class IDOEntityCreator extends BeanCreator {

    public IDOEntityCreator(IResource resource) {
        this(resource, false);
    }

    public IDOEntityCreator(IResource resource, boolean isLegacyEntity) {
        super(resource, isLegacyEntity);
    }

    protected void generateCode() throws JavaModelException {
        IProgressMonitor monitor = new NullProgressMonitor();
        monitor.beginTask("Begin creation", IProgressMonitor.UNKNOWN); //$NON-NLS-1$

        IResource idoEntityResource = getType().getResource();
        IPackageFragment pack = getType().getPackageFragment();
        ICompilationUnit unit = getType().getCompilationUnit();

        String typeName = idoEntityResource.getName().substring(0,
                idoEntityResource.getName().lastIndexOf("BMPBean"));
        String[] interfaces = getType().getSuperInterfaceTypeSignatures();

        ICompilationUnit interfaceUnit = pack.createCompilationUnit(typeName + ".java", "", true, //$NON-NLS-1$//$NON-NLS-2$
                new SubProgressMonitor(monitor, 2));
        ICompilationUnit interfaceHomeUnit = pack.createCompilationUnit(typeName + "Home.java", "", true, //$NON-NLS-1$//$NON-NLS-2$
                new SubProgressMonitor(monitor, 2));
        ICompilationUnit homeImplUnit = pack.createCompilationUnit(typeName + "HomeImpl.java", "", true, //$NON-NLS-1$//$NON-NLS-2$
                new SubProgressMonitor(monitor, 2));

        try {
            createInterface(monitor, interfaceUnit.getWorkingCopy(monitor), pack.getElementName(), typeName,
                    interfaces);
            createHomeInterface(monitor, interfaceHomeUnit.getWorkingCopy(monitor), pack.getElementName(),
                    typeName);
            createHomeImplementation(monitor, homeImplUnit.getWorkingCopy(monitor), pack.getElementName(),
                    typeName);
            addInterfaceToBean(monitor, unit.getWorkingCopy(monitor), typeName);
        } catch (MalformedTreeException e) {
            e.printStackTrace();
        } catch (BadLocationException e) {
            e.printStackTrace();
        }

        monitor.done();
    }

    private void createInterface(IProgressMonitor monitor, ICompilationUnit iUnit, String typePackage, String name,
            String[] interfaces) throws JavaModelException, MalformedTreeException, BadLocationException {
        String source = iUnit.getBuffer().getContents();
        Document document = new Document(source);

        ASTParser parser = ASTParser.newParser(AST.JLS3);
        parser.setSource(iUnit);

        CompilationUnit unit = (CompilationUnit) parser.createAST(monitor);
        unit.recordModifications();

        AST ast = unit.getAST();

        // Package statement
        unit.setPackage(getPackageDeclaration(ast, typePackage));

        // class declaration
        String superInterface = null;
        if (!this.isLegacyEntity) {
            superInterface = "IDOEntity";
            addInterfaceImport("com.idega.data.IDOEntity");
        } else {
            superInterface = "IDOLegacyEntity";
            addInterfaceImport("com.idega.data.IDOLegacyEntity");
        }

        TypeDeclaration classType = getTypeDeclaration(ast, name, true, superInterface, interfaces,
                getInterfaceImports());
        unit.types().add(classType);

        MethodFilter[] nonValidFilter = {
                new MethodFilter(getType().getTypeQualifiedName(), MethodFilter.TYPE_WHOLE),
                new MethodFilter(WizardConstants.INITIALIZE_ATTRIBUTES, MethodFilter.TYPE_WHOLE),
                new MethodFilter(WizardConstants.SET_DEFAULT_VALUES, MethodFilter.TYPE_WHOLE),
                new MethodFilter(WizardConstants.INSERT_START_DATA, MethodFilter.TYPE_WHOLE),
                new MethodFilter(WizardConstants.GET_ENTITY_NAME, MethodFilter.TYPE_WHOLE),
                new MethodFilter(WizardConstants.UPDATE, MethodFilter.TYPE_WHOLE),
                new MethodFilter(WizardConstants.DELETE, MethodFilter.TYPE_WHOLE),
                new MethodFilter(WizardConstants.INSERT, MethodFilter.TYPE_WHOLE),
                new MethodFilter(WizardConstants.REMOVE, MethodFilter.TYPE_WHOLE),
                new MethodFilter(WizardConstants.GET_NAME_OF_MIDDLE_TABLE, MethodFilter.TYPE_WHOLE),
                new MethodFilter(WizardConstants.GET_ID_COLUMN_NAME, MethodFilter.TYPE_WHOLE),
                new MethodFilter(WizardConstants.EJB_START, MethodFilter.TYPE_PREFIX) };

        List methods = filterMethods(getType().getMethods(), null, nonValidFilter);
        for (Iterator iter = methods.iterator(); iter.hasNext();) {
            IMethod method = (IMethod) iter.next();
            MethodDeclaration methodConstructor = getMethodDeclaration(ast, method, getInterfaceImports());
            classType.bodyDeclarations().add(methodConstructor);
        }

        writeImports(ast, unit, getInterfaceImports());
        commitChanges(iUnit, unit, document);
    }

    private void createHomeInterface(IProgressMonitor monitor, ICompilationUnit iUnit, String typePackage,
            String name) throws JavaModelException, MalformedTreeException, BadLocationException {
        iUnit.getBuffer().setContents("");
        String source = iUnit.getBuffer().getContents();
        Document document = new Document(source);

        ASTParser parser = ASTParser.newParser(AST.JLS3);
        parser.setSource(iUnit);

        CompilationUnit unit = (CompilationUnit) parser.createAST(null);
        unit.recordModifications();

        AST ast = unit.getAST();

        // Package statement
        unit.setPackage(getPackageDeclaration(ast, typePackage));

        // class declaration
        TypeDeclaration classType = getTypeDeclaration(ast, name + "Home", true, "IDOHome", null,
                getHomeInterfaceImports());
        addHomeInterfaceImport("com.idega.data.IDOHome");
        unit.types().add(classType);

        // create() method
        MethodDeclaration methodConstructor = ast.newMethodDeclaration();
        methodConstructor.setConstructor(false);
        methodConstructor.modifiers().addAll(ast.newModifiers(Modifier.PUBLIC));
        methodConstructor.setReturnType2(ast.newSimpleType(ast.newSimpleName(name)));
        methodConstructor.setName(ast.newSimpleName("create"));
        methodConstructor.thrownExceptions().add(ast.newName("CreateException"));
        addHomeInterfaceImport("javax.ejb.CreateException");
        classType.bodyDeclarations().add(methodConstructor);

        // findByPrimarKey(Object) method
        methodConstructor = ast.newMethodDeclaration();
        methodConstructor.setConstructor(false);
        methodConstructor.modifiers().addAll(ast.newModifiers(Modifier.PUBLIC));
        methodConstructor.setReturnType2(ast.newSimpleType(ast.newSimpleName(name)));
        methodConstructor.setName(ast.newSimpleName("findByPrimaryKey"));
        methodConstructor.thrownExceptions().add(ast.newName("FinderException"));
        addHomeInterfaceImport("javax.ejb.FinderException");
        classType.bodyDeclarations().add(methodConstructor);

        SingleVariableDeclaration variableDeclaration = ast.newSingleVariableDeclaration();
        variableDeclaration.modifiers().addAll(ast.newModifiers(Modifier.NONE));
        variableDeclaration.setType(ast.newSimpleType(ast.newSimpleName("Object")));
        variableDeclaration.setName(ast.newSimpleName("pk"));
        methodConstructor.parameters().add(variableDeclaration);

        if (this.isLegacyEntity) {
            // createLegacy(int) method
            methodConstructor = ast.newMethodDeclaration();
            methodConstructor.setConstructor(false);
            methodConstructor.modifiers().addAll(ast.newModifiers(Modifier.PUBLIC));
            methodConstructor.setReturnType2(ast.newSimpleType(ast.newSimpleName(name)));
            methodConstructor.setName(ast.newSimpleName("createLegacy"));
            classType.bodyDeclarations().add(methodConstructor);

            // findByPrimarKey(int) method
            methodConstructor = ast.newMethodDeclaration();
            methodConstructor.setConstructor(false);
            methodConstructor.modifiers().addAll(ast.newModifiers(Modifier.PUBLIC));
            methodConstructor.setReturnType2(ast.newSimpleType(ast.newSimpleName(name)));
            methodConstructor.setName(ast.newSimpleName("findByPrimaryKey"));
            methodConstructor.thrownExceptions().add(ast.newName("FinderException"));
            classType.bodyDeclarations().add(methodConstructor);

            variableDeclaration = ast.newSingleVariableDeclaration();
            variableDeclaration.modifiers().addAll(ast.newModifiers(Modifier.NONE));
            variableDeclaration.setType(ast.newPrimitiveType(PrimitiveType.INT));
            variableDeclaration.setName(ast.newSimpleName("id"));
            methodConstructor.parameters().add(variableDeclaration);

            // findByPrimarKeyLegacy(int) method
            methodConstructor = ast.newMethodDeclaration();
            methodConstructor.setConstructor(false);
            methodConstructor.modifiers().addAll(ast.newModifiers(Modifier.PUBLIC));
            methodConstructor.setReturnType2(ast.newSimpleType(ast.newSimpleName(name)));
            methodConstructor.setName(ast.newSimpleName("findByPrimaryKeyLegacy"));
            methodConstructor.thrownExceptions().add(ast.newName("SQLException"));
            addHomeInterfaceImport("java.sql.SQLException");
            classType.bodyDeclarations().add(methodConstructor);

            variableDeclaration = ast.newSingleVariableDeclaration();
            variableDeclaration.modifiers().addAll(ast.newModifiers(Modifier.NONE));
            variableDeclaration.setType(ast.newPrimitiveType(PrimitiveType.INT));
            variableDeclaration.setName(ast.newSimpleName("id"));
            methodConstructor.parameters().add(variableDeclaration);
        }

        MethodFilter[] validFilter = { new MethodFilter(WizardConstants.EJB_CREATE_START, MethodFilter.TYPE_PREFIX),
                new MethodFilter(WizardConstants.EJB_HOME_START, MethodFilter.TYPE_PREFIX),
                new MethodFilter(WizardConstants.EJB_FIND_START, MethodFilter.TYPE_PREFIX) };
        List methods = filterMethods(getType().getMethods(), validFilter, null);
        for (Iterator iter = methods.iterator(); iter.hasNext();) {
            IMethod method = (IMethod) iter.next();
            String fullMethodName = method.getElementName();
            String methodName = cutAwayEJBSuffix(fullMethodName);

            String returnType = method.getReturnType();
            if (fullMethodName.startsWith(WizardConstants.EJB_FIND_START)
                    || fullMethodName.startsWith(WizardConstants.EJB_CREATE_START)) {
                if (!(Signature.getSimpleName(Signature.toString(method.getReturnType()))
                        .indexOf(Signature.getSimpleName("java.util.Collection")) != -1)
                        && !(Signature.getSimpleName(Signature.toString(method.getReturnType()))
                                .indexOf(Signature.getSimpleName("java.util.Set")) != -1)) {
                    returnType = name;
                }
            }
            if (!returnType.equals(name)) {
                returnType = getReturnType(returnType);
            }

            methodConstructor = getMethodDeclaration(ast, method, methodName, returnType, getHomeInterfaceImports(),
                    false);
            classType.bodyDeclarations().add(methodConstructor);
        }

        writeImports(ast, unit, getHomeInterfaceImports());
        commitChanges(iUnit, unit, document);
    }

    private void createHomeImplementation(IProgressMonitor monitor, ICompilationUnit iUnit, String typePackage,
            String name) throws JavaModelException, MalformedTreeException, BadLocationException {
        iUnit.getBuffer().setContents("");
        String source = iUnit.getBuffer().getContents();
        Document document = new Document(source);

        ASTParser parser = ASTParser.newParser(AST.JLS3);
        parser.setSource(iUnit);

        CompilationUnit unit = (CompilationUnit) parser.createAST(monitor);
        unit.recordModifications();

        AST ast = unit.getAST();

        // Package statement
        unit.setPackage(getPackageDeclaration(ast, typePackage));

        // class declaration
        TypeDeclaration classType = getTypeDeclaration(ast, name + "HomeImpl", false, "IDOFactory", null,
                getHomeImplImports());
        classType.superInterfaceTypes().add(ast.newSimpleType(ast.newSimpleName(name + "Home")));
        addHomeImplImport("com.idega.data.IDOFactory");
        unit.types().add(classType);

        // create() method
        MethodDeclaration methodConstructor = ast.newMethodDeclaration();
        methodConstructor.setConstructor(false);
        if (this.isJDK1_5) {
            MarkerAnnotation annotation = ast.newMarkerAnnotation();
            annotation.setTypeName(ast.newSimpleName("Override"));
            methodConstructor.modifiers().add(annotation);
        }
        methodConstructor.modifiers().addAll(ast.newModifiers(Modifier.PUBLIC));
        if (this.isJDK1_5) {
            ParameterizedType returnType = ast.newParameterizedType(ast.newSimpleType(ast.newSimpleName("Class")));
            returnType.typeArguments().add(ast.newSimpleType(ast.newSimpleName(name + "Home")));
            methodConstructor.setReturnType2(returnType);
        } else {
            methodConstructor.setReturnType2(ast.newSimpleType(ast.newSimpleName("Class")));
        }
        methodConstructor.setName(ast.newSimpleName("getEntityInterfaceClass"));

        classType.bodyDeclarations().add(methodConstructor);

        Block constructorBlock = ast.newBlock();
        methodConstructor.setBody(constructorBlock);

        TypeLiteral typeLiteral = ast.newTypeLiteral();
        typeLiteral.setType(ast.newSimpleType(ast.newSimpleName(name)));

        ReturnStatement returnStatement = ast.newReturnStatement();
        returnStatement.setExpression(typeLiteral);
        constructorBlock.statements().add(returnStatement);

        // create() method
        methodConstructor = ast.newMethodDeclaration();
        methodConstructor.setConstructor(false);
        methodConstructor.modifiers().addAll(ast.newModifiers(Modifier.PUBLIC));
        methodConstructor.setReturnType2(ast.newSimpleType(ast.newSimpleName(name)));
        methodConstructor.setName(ast.newSimpleName("create"));
        methodConstructor.thrownExceptions().add(ast.newName("CreateException"));
        addHomeImplImport("javax.ejb.CreateException");
        classType.bodyDeclarations().add(methodConstructor);

        constructorBlock = ast.newBlock();
        methodConstructor.setBody(constructorBlock);

        SuperMethodInvocation superMethodInvocation = ast.newSuperMethodInvocation();
        superMethodInvocation.setName(ast.newSimpleName("createIDO"));

        CastExpression ce = ast.newCastExpression();
        ce.setType(ast.newSimpleType(ast.newSimpleName(name)));
        ce.setExpression(superMethodInvocation);

        returnStatement = ast.newReturnStatement();
        returnStatement.setExpression(ce);
        constructorBlock.statements().add(returnStatement);

        // findByPrimarKey(Object) method
        methodConstructor = ast.newMethodDeclaration();
        methodConstructor.setConstructor(false);
        methodConstructor.modifiers().addAll(ast.newModifiers(Modifier.PUBLIC));
        methodConstructor.setReturnType2(ast.newSimpleType(ast.newSimpleName(name)));
        methodConstructor.setName(ast.newSimpleName("findByPrimaryKey"));
        methodConstructor.thrownExceptions().add(ast.newName("FinderException"));
        addHomeImplImport("javax.ejb.FinderException");
        classType.bodyDeclarations().add(methodConstructor);

        SingleVariableDeclaration variableDeclaration = ast.newSingleVariableDeclaration();
        variableDeclaration.modifiers().addAll(ast.newModifiers(Modifier.NONE));
        variableDeclaration.setType(ast.newSimpleType(ast.newSimpleName("Object")));
        variableDeclaration.setName(ast.newSimpleName("pk"));
        methodConstructor.parameters().add(variableDeclaration);

        constructorBlock = ast.newBlock();
        methodConstructor.setBody(constructorBlock);

        superMethodInvocation = ast.newSuperMethodInvocation();
        superMethodInvocation.setName(ast.newSimpleName("findByPrimaryKeyIDO"));
        superMethodInvocation.arguments().add(ast.newSimpleName("pk"));

        ce = ast.newCastExpression();
        ce.setType(ast.newSimpleType(ast.newSimpleName(name)));
        ce.setExpression(superMethodInvocation);

        returnStatement = ast.newReturnStatement();
        returnStatement.setExpression(ce);
        constructorBlock.statements().add(returnStatement);

        if (this.isLegacyEntity) {
            // createLegacy() method
            methodConstructor = ast.newMethodDeclaration();
            methodConstructor.setConstructor(false);
            methodConstructor.modifiers().addAll(ast.newModifiers(Modifier.PUBLIC));
            methodConstructor.setReturnType2(ast.newSimpleType(ast.newSimpleName(name)));
            methodConstructor.setName(ast.newSimpleName("createLegacy"));
            classType.bodyDeclarations().add(methodConstructor);

            constructorBlock = ast.newBlock();
            methodConstructor.setBody(constructorBlock);

            TryStatement tryStatement = ast.newTryStatement();
            constructorBlock.statements().add(tryStatement);
            Block tryBlock = ast.newBlock();
            tryStatement.setBody(tryBlock);

            MethodInvocation mi = ast.newMethodInvocation();
            mi.setName(ast.newSimpleName("create"));

            returnStatement = ast.newReturnStatement();
            returnStatement.setExpression(mi);
            tryBlock.statements().add(returnStatement);

            CatchClause catchClause = ast.newCatchClause();
            tryStatement.catchClauses().add(catchClause);
            variableDeclaration = ast.newSingleVariableDeclaration();
            variableDeclaration.modifiers().addAll(ast.newModifiers(Modifier.NONE));
            variableDeclaration.setType(ast.newSimpleType(ast.newSimpleName(("CreateException"))));
            variableDeclaration.setName(ast.newSimpleName("ce"));
            catchClause.setException(variableDeclaration);
            Block catchBlock = ast.newBlock();
            catchClause.setBody(catchBlock);

            ClassInstanceCreation cc = ast.newClassInstanceCreation();
            cc.setType(ast.newSimpleType(ast.newSimpleName("RuntimeException")));
            mi = ast.newMethodInvocation();
            mi.setExpression(ast.newSimpleName("ce"));
            mi.setName(ast.newSimpleName("getMessage"));
            cc.arguments().add(mi);

            ThrowStatement throwStatement = ast.newThrowStatement();
            throwStatement.setExpression(cc);
            catchBlock.statements().add(throwStatement);

            // findByPrimarKey(int) method
            methodConstructor = ast.newMethodDeclaration();
            methodConstructor.setConstructor(false);
            methodConstructor.modifiers().addAll(ast.newModifiers(Modifier.PUBLIC));
            methodConstructor.setReturnType2(ast.newSimpleType(ast.newSimpleName(name)));
            methodConstructor.setName(ast.newSimpleName("findByPrimaryKey"));
            methodConstructor.thrownExceptions().add(ast.newName("FinderException"));
            classType.bodyDeclarations().add(methodConstructor);

            variableDeclaration = ast.newSingleVariableDeclaration();
            variableDeclaration.modifiers().addAll(ast.newModifiers(Modifier.NONE));
            variableDeclaration.setType(ast.newPrimitiveType(PrimitiveType.INT));
            variableDeclaration.setName(ast.newSimpleName("id"));
            methodConstructor.parameters().add(variableDeclaration);

            constructorBlock = ast.newBlock();
            methodConstructor.setBody(constructorBlock);

            superMethodInvocation = ast.newSuperMethodInvocation();
            superMethodInvocation.setName(ast.newSimpleName("findByPrimaryKeyIDO"));
            superMethodInvocation.arguments().add(ast.newSimpleName("id"));

            ce = ast.newCastExpression();
            ce.setType(ast.newSimpleType(ast.newSimpleName(name)));
            ce.setExpression(superMethodInvocation);

            returnStatement = ast.newReturnStatement();
            returnStatement.setExpression(ce);
            constructorBlock.statements().add(returnStatement);

            // findByPrimarKeyLegacy(int) method
            methodConstructor = ast.newMethodDeclaration();
            methodConstructor.setConstructor(false);
            methodConstructor.modifiers().addAll(ast.newModifiers(Modifier.PUBLIC));
            methodConstructor.setReturnType2(ast.newSimpleType(ast.newSimpleName(name)));
            methodConstructor.setName(ast.newSimpleName("findByPrimaryKeyLegacy"));
            methodConstructor.thrownExceptions().add(ast.newName("SQLException"));
            addHomeImplImport("java.sql.SQLException");
            classType.bodyDeclarations().add(methodConstructor);

            variableDeclaration = ast.newSingleVariableDeclaration();
            variableDeclaration.modifiers().addAll(ast.newModifiers(Modifier.NONE));
            variableDeclaration.setType(ast.newPrimitiveType(PrimitiveType.INT));
            variableDeclaration.setName(ast.newSimpleName("id"));
            methodConstructor.parameters().add(variableDeclaration);

            constructorBlock = ast.newBlock();
            methodConstructor.setBody(constructorBlock);

            tryStatement = ast.newTryStatement();
            constructorBlock.statements().add(tryStatement);
            tryBlock = ast.newBlock();
            tryStatement.setBody(tryBlock);

            mi = ast.newMethodInvocation();
            mi.setName(ast.newSimpleName("findByPrimaryKey"));
            mi.arguments().add(ast.newSimpleName("id"));

            returnStatement = ast.newReturnStatement();
            returnStatement.setExpression(mi);
            tryBlock.statements().add(returnStatement);

            catchClause = ast.newCatchClause();
            tryStatement.catchClauses().add(catchClause);
            variableDeclaration = ast.newSingleVariableDeclaration();
            variableDeclaration.modifiers().addAll(ast.newModifiers(Modifier.NONE));
            variableDeclaration.setType(ast.newSimpleType(ast.newSimpleName(("FinderException"))));
            variableDeclaration.setName(ast.newSimpleName("fe"));
            catchClause.setException(variableDeclaration);
            catchBlock = ast.newBlock();
            catchClause.setBody(catchBlock);

            cc = ast.newClassInstanceCreation();
            cc.setType(ast.newSimpleType(ast.newSimpleName("SQLException")));
            mi = ast.newMethodInvocation();
            mi.setExpression(ast.newSimpleName("fe"));
            mi.setName(ast.newSimpleName("getMessage"));
            cc.arguments().add(mi);

            throwStatement = ast.newThrowStatement();
            throwStatement.setExpression(cc);
            catchBlock.statements().add(throwStatement);
        }

        MethodFilter[] validFilter = { new MethodFilter(WizardConstants.EJB_CREATE_START, MethodFilter.TYPE_PREFIX),
                new MethodFilter(WizardConstants.EJB_HOME_START, MethodFilter.TYPE_PREFIX),
                new MethodFilter(WizardConstants.EJB_FIND_START, MethodFilter.TYPE_PREFIX) };
        List methods = filterMethods(getType().getMethods(), validFilter, null);
        for (Iterator iter = methods.iterator(); iter.hasNext();) {
            IMethod method = (IMethod) iter.next();
            String fullMethodName = method.getElementName();
            String methodName = cutAwayEJBSuffix(fullMethodName);
            String[] parameterNames = method.getParameterNames();

            String returnType = method.getReturnType();
            if (fullMethodName.startsWith(WizardConstants.EJB_FIND_START)
                    || fullMethodName.startsWith(WizardConstants.EJB_CREATE_START)) {
                if (!(Signature.getSimpleName(Signature.toString(method.getReturnType()))
                        .indexOf(Signature.getSimpleName("java.util.Collection")) != -1)
                        && !(Signature.getSimpleName(Signature.toString(method.getReturnType()))
                                .indexOf(Signature.getSimpleName("java.util.Set")) != -1)) {
                    returnType = name;
                }
            }
            if (!returnType.equals(name)) {
                returnType = getReturnType(returnType);
            }

            methodConstructor = getMethodDeclaration(ast, method, methodName, returnType, getHomeImplImports(),
                    false);
            classType.bodyDeclarations().add(methodConstructor);

            constructorBlock = ast.newBlock();
            methodConstructor.setBody(constructorBlock);

            constructorBlock.statements().add(getIDOCheckOutStatement(ast, getHomeImplImports()));

            if (fullMethodName.startsWith(WizardConstants.EJB_FIND_START)) {
                if (Signature.getSimpleName(Signature.toString(method.getReturnType()))
                        .indexOf(Signature.getSimpleName("java.util.Collection")) != -1) {
                    constructorBlock.statements().add(
                            getDataCollectingStatement(ast, returnType, "ids", fullMethodName, parameterNames));
                    constructorBlock.statements().add(getIDOCheckInStatement(ast));
                    constructorBlock.statements()
                            .add(getObjectReturnStatement(ast, "getEntityCollectionForPrimaryKeys", "ids"));
                } else if (Signature.getSimpleName(Signature.toString(method.getReturnType()))
                        .indexOf(Signature.getSimpleName("java.util.Set")) != -1) {
                    constructorBlock.statements().add(
                            getDataCollectingStatement(ast, returnType, "ids", fullMethodName, parameterNames));
                    constructorBlock.statements().add(getIDOCheckInStatement(ast));
                    constructorBlock.statements()
                            .add(getObjectReturnStatement(ast, "getEntitySetForPrimaryKeys", "ids"));
                } else {
                    constructorBlock.statements()
                            .add(getDataCollectingStatement(ast, "Object", "pk", fullMethodName, parameterNames));
                    constructorBlock.statements().add(getIDOCheckInStatement(ast));
                    constructorBlock.statements().add(getObjectReturnStatement(ast, "findByPrimaryKey", "pk"));
                }
            } else if (fullMethodName.startsWith(WizardConstants.EJB_HOME_START)) {
                constructorBlock.statements().add(
                        getDataCollectingStatement(ast, returnType, "theReturn", fullMethodName, parameterNames));
                constructorBlock.statements().add(getIDOCheckInStatement(ast));
                constructorBlock.statements().add(getPrimitiveReturnStatement(ast, "theReturn"));
            } else if (fullMethodName.startsWith(WizardConstants.EJB_CREATE_START)) {
                constructorBlock.statements()
                        .add(getDataCollectingStatement(ast, "Object", "pk", fullMethodName, parameterNames));

                ce = ast.newCastExpression();
                ce.setType(ast.newSimpleType(ast.newSimpleName(getType().getTypeQualifiedName())));
                ce.setExpression(ast.newSimpleName("entity"));

                ParenthesizedExpression pe = ast.newParenthesizedExpression();
                pe.setExpression(ce);
                MethodInvocation mi = ast.newMethodInvocation();
                mi.setExpression(pe);
                mi.setName(ast.newSimpleName("ejbPostCreate"));
                constructorBlock.statements().add(ast.newExpressionStatement(mi));

                constructorBlock.statements().add(getIDOCheckInStatement(ast));

                TryStatement tryStatement = ast.newTryStatement();
                constructorBlock.statements().add(tryStatement);
                Block tryBlock = ast.newBlock();
                tryStatement.setBody(tryBlock);

                mi = ast.newMethodInvocation();
                mi.setName(ast.newSimpleName("findByPrimaryKey"));
                mi.arguments().add(ast.newSimpleName("pk"));

                returnStatement = ast.newReturnStatement();
                returnStatement.setExpression(mi);
                tryBlock.statements().add(returnStatement);

                CatchClause catchClause = ast.newCatchClause();
                tryStatement.catchClauses().add(catchClause);
                variableDeclaration = ast.newSingleVariableDeclaration();
                variableDeclaration.modifiers().addAll(ast.newModifiers(Modifier.NONE));
                variableDeclaration.setType(ast.newSimpleType(ast.newSimpleName(("FinderException"))));
                variableDeclaration.setName(ast.newSimpleName("fe"));
                catchClause.setException(variableDeclaration);
                Block catchBlock = ast.newBlock();
                catchClause.setBody(catchBlock);

                ClassInstanceCreation cc = ast.newClassInstanceCreation();
                cc.setType(ast.newSimpleType(ast.newSimpleName("IDOCreateException")));
                addHomeImplImport("com.idega.data.IDOCreateException");
                cc.arguments().add(ast.newSimpleName(("fe")));

                ThrowStatement throwStatement = ast.newThrowStatement();
                throwStatement.setExpression(cc);
                catchBlock.statements().add(throwStatement);

                catchClause = ast.newCatchClause();
                tryStatement.catchClauses().add(catchClause);
                variableDeclaration = ast.newSingleVariableDeclaration();
                variableDeclaration.modifiers().addAll(ast.newModifiers(Modifier.NONE));
                variableDeclaration.setType(ast.newSimpleType(ast.newSimpleName(("Exception"))));
                variableDeclaration.setName(ast.newSimpleName("e"));
                catchClause.setException(variableDeclaration);
                catchBlock = ast.newBlock();
                catchClause.setBody(catchBlock);

                cc = ast.newClassInstanceCreation();
                cc.setType(ast.newSimpleType(ast.newSimpleName("IDOCreateException")));
                cc.arguments().add(ast.newSimpleName(("e")));

                throwStatement = ast.newThrowStatement();
                throwStatement.setExpression(cc);
                catchBlock.statements().add(throwStatement);
            }
        }

        writeImports(ast, unit, getHomeImplImports());
        commitChanges(iUnit, unit, document);
    }

    private Statement getIDOCheckOutStatement(AST ast, Set imports) {
        VariableDeclarationFragment vdf = ast.newVariableDeclarationFragment();
        vdf.setName(ast.newSimpleName("entity"));
        VariableDeclarationStatement vds = ast.newVariableDeclarationStatement(vdf);
        vds.setType(ast.newSimpleType(ast.newSimpleName("IDOEntity")));
        imports.add("com.idega.data.IDOEntity");

        ThisExpression thisExpression = ast.newThisExpression();
        MethodInvocation mi = ast.newMethodInvocation();
        mi.setExpression(thisExpression);
        mi.setName(ast.newSimpleName("idoCheckOutPooledEntity"));
        vdf.setInitializer(mi);

        return vds;
    }

    private Statement getIDOCheckInStatement(AST ast) {
        ThisExpression thisExpression = ast.newThisExpression();
        MethodInvocation mi = ast.newMethodInvocation();
        mi.setExpression(thisExpression);
        mi.setName(ast.newSimpleName("idoCheckInPooledEntity"));
        mi.arguments().add(ast.newSimpleName("entity"));

        return ast.newExpressionStatement(mi);
    }

    private Statement getDataCollectingStatement(AST ast, String returnType, String variableName, String methodName,
            String[] parameterNames) {
        VariableDeclarationFragment vdf = ast.newVariableDeclarationFragment();
        vdf.setName(ast.newSimpleName(variableName));
        VariableDeclarationStatement vds = ast.newVariableDeclarationStatement(vdf);
        vds.setType(getType(ast, returnType));

        CastExpression ce = ast.newCastExpression();
        ce.setType(ast.newSimpleType(ast.newSimpleName(getType().getTypeQualifiedName())));
        ce.setExpression(ast.newSimpleName("entity"));

        ParenthesizedExpression pe = ast.newParenthesizedExpression();
        pe.setExpression(ce);
        MethodInvocation mi = ast.newMethodInvocation();
        mi.setExpression(pe);
        mi.setName(ast.newSimpleName(methodName));
        vdf.setInitializer(mi);

        for (int i = 0; i < parameterNames.length; i++) {
            mi.arguments().add(ast.newSimpleName(parameterNames[i]));
        }

        return vds;
    }

    private Statement getObjectReturnStatement(AST ast, String methodName, String parameterName) {
        ThisExpression thisExpression = ast.newThisExpression();
        MethodInvocation mi = ast.newMethodInvocation();
        mi.setExpression(thisExpression);
        mi.setName(ast.newSimpleName(methodName));
        mi.arguments().add(ast.newSimpleName(parameterName));

        ReturnStatement returnStatement = ast.newReturnStatement();
        returnStatement.setExpression(mi);

        return returnStatement;
    }

    private Statement getPrimitiveReturnStatement(AST ast, String variableName) {
        ReturnStatement returnStatement = ast.newReturnStatement();
        returnStatement.setExpression(ast.newName(variableName));

        return returnStatement;
    }

    private String cutAwayEJBSuffix(String realMethodName) {
        String methodName = new String(realMethodName);
        if (realMethodName.startsWith(WizardConstants.EJB_FIND_START)) {
            methodName = "find" + realMethodName.substring(WizardConstants.EJB_FIND_START.length());
        } else if (realMethodName.startsWith(WizardConstants.EJB_HOME_START)) {
            String firstChar = realMethodName.substring(WizardConstants.EJB_HOME_START.length(),
                    WizardConstants.EJB_HOME_START.length() + 1);
            methodName = firstChar.toLowerCase() + realMethodName
                    .substring(WizardConstants.EJB_HOME_START.length() + 1, realMethodName.length());
        } else if (realMethodName.startsWith(WizardConstants.EJB_CREATE_START)) {
            methodName = "create" + realMethodName.substring(WizardConstants.EJB_CREATE_START.length());
        }
        return methodName;
    }
}