package util;
import java.util.*;
import java.text.*;
import java.io.*;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;


public class BeanCodeGenerator
{
    private String fullclassname;
    private String imports;
    private String sourcefile;
    private String outputdirectory;

    public void execute() throws BuildException
    {
        StringBuffer className = new StringBuffer();
        String packagePath = null;
        StringBuffer fileName = new StringBuffer();
        StringBuffer set = new StringBuffer();
        StringBuffer get = new StringBuffer();
        StringBuffer is = new StringBuffer();
        StringBuffer fullPath = new StringBuffer();
        String dataType = null;
        String fieldName = null;
        String fourSpaces = "    ";
        String eightSpaces = "        ";
        String line = null;
        StringTokenizer parser = null;
        Vector allFields = new Vector();
        String fieldDataType[] = null;

        int startClassName = fullclassname.lastIndexOf('.');

        if (startClassName > -1)
        {
            className.append(fullclassname.substring(startClassName + 1));
            packagePath = fullclassname.substring(0,startClassName);
        }
        else
        {
            className.append(fullclassname);
        }

        fileName.append(className.toString());
        fileName.append(".java");

    	try
        {
            BufferedReader in = new BufferedReader(new FileReader(sourcefile));
            FileWriter out = null;

            if (outputdirectory != null)
            {
                fullPath.append(outputdirectory);
                Properties props = System.getProperties();
                String pathSeparator = (String) props.get("file.separator");

                if (! (outputdirectory.endsWith(pathSeparator)) )
                {
                    fullPath.append(pathSeparator);
                }

                fullPath.append(fileName.toString());
                out = new FileWriter(fullPath.toString());
            }
			else
			{
				out = new FileWriter(fileName.toString());
            }

            if(packagePath != null)
            {
            	out.write("package ");
                out.write(packagePath);
                out.write(";\n");
            }

            if (imports != null)
            {
                parser = new StringTokenizer(imports,";");


                while (parser.hasMoreTokens())
                {
                    out.write("import ");
                    out.write(parser.nextToken());
                    out.write(";\n");
                }
            }

            out.write("\npublic class ");
            out.write(className.toString());
            out.write("\n");
            out.write("{\n");

            String firstLetter = null;
            StringBuffer capsFieldName = null;

            while ( (line = in.readLine()) != null)
            {
                parser = new StringTokenizer(line, ",");

                dataType = parser.nextToken();
                fieldName = parser.nextToken();

                out.write(fourSpaces);
                out.write("private ");
                out.write(dataType);
                out.write(" ");
                out.write(fieldName);
                out.write(";");
				out.write("\n");

                fieldDataType = new String[3];
                capsFieldName = new StringBuffer();
                firstLetter = fieldName.substring(0,1);
                capsFieldName.append(firstLetter.toUpperCase());
                capsFieldName.append(fieldName.substring(1));
                fieldDataType[0] = capsFieldName.toString();
                fieldDataType[1] = fieldName;
                fieldDataType[2] = dataType;
                allFields.addElement(fieldDataType);
            }

			out.write("\n");

            for (int counter = 0; counter < allFields.size(); counter++)
            {
                out.write(fourSpaces);
                out.write("public void ");
                set = new StringBuffer();
                set.append("set");
                fieldDataType =  (String[]) allFields.elementAt(counter);
                set.append(fieldDataType[0]);
                set.append("(");
                set.append(fieldDataType[2]);
                set.append(" ");
                set.append(fieldDataType[1]);
                set.append(")\n");
                out.write(set.toString());
                out.write(fourSpaces);
            	out.write("{\n");
                out.write(eightSpaces);
                out.write("this.");
                out.write(fieldDataType[1]);
                out.write(" = ");
                out.write(fieldDataType[1]);
                out.write(";\n");
                out.write(fourSpaces);
            	out.write("}\n\n");
            }

            for (int counter = 0; counter < allFields.size(); counter++)
            {
                fieldDataType =  (String[]) allFields.elementAt(counter);
                out.write(fourSpaces);
                out.write("public ");
                out.write(fieldDataType[2]);
                get = new StringBuffer();

                if (!fieldDataType[2].equals("boolean"))
                {
                	get.append(" get");
                }
                else
                {
                	get.append(" is");
                }

                get.append(fieldDataType[0]);
                get.append("(");
                get.append(")\n");
                out.write(get.toString());
                out.write(fourSpaces);
            	out.write("{\n");
                out.write(eightSpaces);
                out.write("return ");
                out.write(fieldDataType[1]);
                out.write(";\n");
                out.write(fourSpaces);
            	out.write("}\n\n");
            }

            out.write("}");
            out.flush();
            out.close();
            in.close();
        }
        catch(Exception e)
        {
           e.printStackTrace();
        }
    }

    public void setFullclassname(String fullclassname)
    {
    	this.fullclassname = fullclassname;
    }

    public void setImports(String imports)
    {
    	this.imports = imports;
    }

    public void setSourcefile(String sourcefile)
    {
    	this.sourcefile = sourcefile;
    }

    public void setOutputdirectory(String outputdirectory)
    {
    	this.outputdirectory = outputdirectory;
    }

    protected void createClass(String file, String fullClassName, String imports)
    {
        StringBuffer className = new StringBuffer();
        String packagePath = null;
        StringBuffer fileName = new StringBuffer();
        StringBuffer set = new StringBuffer();
        StringBuffer get = new StringBuffer();
        StringBuffer is = new StringBuffer();
        StringBuffer fullPath = new StringBuffer();
        String dataType = null;
        String fieldName = null;
        String fourSpaces = "    ";
        String eightSpaces = "        ";
        String line = null;
        StringTokenizer parser = null;
        Vector allFields = new Vector();
        String fieldDataType[] = null;

        int startClassName = fullClassName.lastIndexOf('.');

        if (startClassName > -1)
        {
            className.append(fullClassName.substring(startClassName + 1));
            packagePath = fullClassName.substring(0,startClassName);
        }
        else
        {
            className.append(fullClassName);
        }

        fileName.append(className.toString());
        fileName.append(".java");

    	try
        {
            BufferedReader in = new BufferedReader(new FileReader(file));
            FileWriter out = null;

            if (outputdirectory != null)
            {
                fullPath.append(outputdirectory);
                Properties props = System.getProperties();
                String pathSeparator = (String) props.get("file.separator");

                if (! (outputdirectory.endsWith(pathSeparator)) )
                {
                    fullPath.append(pathSeparator);
                }

                fullPath.append(fileName.toString());
                out = new FileWriter(fullPath.toString());
            }
			else
			{
				out = new FileWriter(fileName.toString());
            }

            if(packagePath != null)
            {
            	out.write("package ");
                out.write(packagePath);
                out.write(";\n");
            }

            if (imports != null)
            {
                parser = new StringTokenizer(imports,";");


                while (parser.hasMoreTokens())
                {
                    out.write("import ");
                    out.write(parser.nextToken());
                    out.write(";\n");
                }
            }

            out.write("\npublic class ");
            out.write(className.toString());
            out.write("\n");
            out.write("{\n");

            String firstLetter = null;
            StringBuffer capsFieldName = null;

            while ( (line = in.readLine()) != null)
            {
                parser = new StringTokenizer(line, ",");

                dataType = parser.nextToken();
                fieldName = parser.nextToken();

                out.write(fourSpaces);
                out.write("private ");
                out.write(dataType);
                out.write(" ");
                out.write(fieldName);
                out.write(";");
				out.write("\n");

                fieldDataType = new String[3];
                capsFieldName = new StringBuffer();
                firstLetter = fieldName.substring(0,1);
                capsFieldName.append(firstLetter.toUpperCase());
                capsFieldName.append(fieldName.substring(1));
                fieldDataType[0] = capsFieldName.toString();
                fieldDataType[1] = fieldName;
                fieldDataType[2] = dataType;
                allFields.addElement(fieldDataType);
            }

			out.write("\n");

            for (int counter = 0; counter < allFields.size(); counter++)
            {
                out.write(fourSpaces);
                out.write("public void ");
                set = new StringBuffer();
                set.append("set");
                fieldDataType =  (String[]) allFields.elementAt(counter);
                set.append(fieldDataType[0]);
                set.append("(");
                set.append(fieldDataType[2]);
                set.append(" ");
                set.append(fieldDataType[1]);
                set.append(")\n");
                out.write(set.toString());
                out.write(fourSpaces);
            	out.write("{\n");
                out.write(eightSpaces);
                out.write("this.");
                out.write(fieldDataType[1]);
                out.write(" = ");
                out.write(fieldDataType[1]);
                out.write(";\n");
                out.write(fourSpaces);
            	out.write("}\n\n");
            }

            for (int counter = 0; counter < allFields.size(); counter++)
            {
                fieldDataType =  (String[]) allFields.elementAt(counter);
                out.write(fourSpaces);
                out.write("public ");
                out.write(fieldDataType[2]);
                get = new StringBuffer();

                if (!fieldDataType[2].equals("boolean"))
                {
                	get.append(" get");
                }
                else
                {
                	get.append(" is");
                }

                get.append(fieldDataType[0]);
                get.append("(");
                get.append(")\n");
                out.write(get.toString());
                out.write(fourSpaces);
            	out.write("{\n");
                out.write(eightSpaces);
                out.write("return ");
                out.write(fieldDataType[1]);
                out.write(";\n");
                out.write(fourSpaces);
            	out.write("}\n\n");
            }

            out.write("}");
            out.flush();
            out.close();
            in.close();
        }
        catch(Exception e)
        {
            System.out.println(file + "\n");
           e.printStackTrace();
        }
    }
}