You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avalon.apache.org by ha...@apache.org on 2001/10/31 13:43:23 UTC

cvs commit: jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/bcel/parser BCELSQLParser.java GeneratedObjectClassLoader.java

hammant     01/10/31 04:43:23

  Added:       apps/db/src/java/org/apache/avalon/db/bcel/actions
                        AbstractBCELAction.java BCELCreateTable.java
                        BCELInsertSingleValue.java
               apps/db/src/java/org/apache/avalon/db/bcel/parser
                        BCELSQLParser.java GeneratedObjectClassLoader.java
  Log:
  New bcel package
  
  Revision  Changes    Path
  1.1                  jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/bcel/actions/AbstractBCELAction.java
  
  Index: AbstractBCELAction.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.avalon.db.bcel.actions;
  
  import org.apache.avalon.db.services.DatabasePersistor;
  import org.apache.avalon.db.bcel.parser.GeneratedObjectClassLoader;
  import org.apache.avalon.db.bcel.parser.BCELSQLParser;
  
  public class AbstractBCELAction {
  
      protected DatabasePersistor mDatabasePersistor;
      protected BCELSQLParser mBCELSQLParser;
  
      public void setDatabasePersistor(DatabasePersistor databasePersistor) {
          mDatabasePersistor = databasePersistor;
      }
      public void setBCELSQLParser(BCELSQLParser bcelSQLParser) {
          mBCELSQLParser = bcelSQLParser;
      }
  
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/bcel/actions/BCELCreateTable.java
  
  Index: BCELCreateTable.java
  ===================================================================
  
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.avalon.db.bcel.actions;
  
  
  
  import org.apache.avalon.db.actions.CreateTable;
  import org.apache.avalon.db.actions.ActionException;
  import org.apache.avalon.db.services.DatabasePersistor;
  import org.apache.avalon.db.data.Table;
  import org.apache.bcel.classfile.JavaClass;
  
  
  /**
   * Class BCELCreateTable
   *
   *
   * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
   * @version $Revision: 1.1 $
   */
  public class BCELCreateTable extends AbstractBCELAction implements CreateTable {
  
      private JavaClass mPendingClass;
      private String mTableName;
      private int mRecordCount;
  
      /**
       * Constructor BCELCreateTable
       *
       *
       * @param pendingClass
       * @param tableName
       *
       */
      public BCELCreateTable(JavaClass pendingClass, String tableName) {
          mPendingClass = pendingClass;
          mTableName = tableName;
      }
  
  
  
      /**
       * Method execute
       *
       *
       */
      public void execute() throws ActionException {
          if (mDatabasePersistor.tableExists(mTableName)) {
              throw new ActionException("Table " + mTableName + " Already Exists");
          }
          byte[] bytes = mPendingClass.getBytes();
          mBCELSQLParser.addGeneratedClass(mTableName, bytes);
          Table table = (Table) mBCELSQLParser.getGeneratedInstance(mTableName);
          mDatabasePersistor.addTable(mTableName, table);
      }
  
      public int getRecordCount() {
          return mRecordCount;
      }
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/bcel/actions/BCELInsertSingleValue.java
  
  Index: BCELInsertSingleValue.java
  ===================================================================
  
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.avalon.db.bcel.actions;
  
  
  
  import org.apache.avalon.db.actions.Insert;
  import org.apache.avalon.db.data.Table;
  import org.apache.avalon.db.services.DatabasePersistor;
  import org.apache.bcel.classfile.JavaClass;
  
  import java.util.Vector;
  import java.util.Iterator;
  
  import java.lang.reflect.Method;
  import java.lang.reflect.InvocationTargetException;
  
  
  /**
   * Class BCELInsertSingleValue
   *
   *
   * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
   * @version $Revision: 1.1 $
   */
  public class BCELInsertSingleValue extends AbstractBCELAction implements Insert {
  
      private Vector mColumnNames;
      private Vector mColumnValues;
      private Table mTable;
  
      /**
       * Constructor BCELInsertSingleValue
       *
       *
       * @param table
       * @param columnNames
       * @param columnValues
       *
       */
      public BCELInsertSingleValue(Table table, Vector columnNames, Vector columnValues) {
  
          mTable = table;
          mColumnNames = columnNames;
          mColumnValues = columnValues;
      }
  
      public void setDatabasePersistor(DatabasePersistor databasePersistor) {
          mDatabasePersistor = databasePersistor;
      }
  
      /**
       * Method execute
       *
       *
       */
      public void execute() {
  
          StringBuffer sb = new StringBuffer();
          Iterator it = mColumnNames.iterator();
          Iterator it2 = mColumnValues.iterator();
  
          //repeated setxxxxx(yyyyyy);
          try {
              while (it.hasNext()) {
                  String name = (String) it.next();
                  Object value = it2.next();
                  Method meth = mTable.getClass().getDeclaredMethod("set" + name,
                                                                    new Class[]{
                                                                        value.getClass() });
  
                  meth.invoke(mTable, new Object[]{ value });
              }
          } catch (NoSuchMethodException nsme) {
  
              //TODO throw
              System.out.println("nsme " + nsme.getMessage());
          } catch (IllegalAccessException iae) {
  
              //TODO
              System.out.println("nsme " + iae.getMessage());
          } catch (InvocationTargetException ite) {
  
              //TODO
              System.out.println("nsme " + ite.getMessage());
          }
      }
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/bcel/parser/BCELSQLParser.java
  
  Index: BCELSQLParser.java
  ===================================================================
  
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.avalon.db.bcel.parser;
  
  
  
  import org.apache.avalon.db.services.SQLParser;
  import org.apache.avalon.db.services.DatabasePersistor;
  import org.apache.avalon.db.actions.Action;
  import org.apache.avalon.db.actions.Select;
  import org.apache.avalon.db.actions.CreateTable;
  import org.apache.avalon.db.actions.Insert;
  import org.apache.avalon.db.transport.Request;
  import org.apache.avalon.db.transport.SelectRequest;
  import org.apache.avalon.db.transport.CreateTableRequest;
  import org.apache.avalon.db.transport.InsertRequest;
  import org.apache.avalon.db.bcel.actions.BCELCreateTable;
  import org.apache.avalon.db.bcel.actions.BCELInsertSingleValue;
  import org.apache.avalon.db.data.Table;
  import org.apache.avalon.db.data.Column;
  import org.apache.avalon.db.data.impl.DefaultColumn;
  import org.apache.avalon.phoenix.Block;
  import org.apache.avalon.framework.context.Contextualizable;
  import org.apache.avalon.framework.context.Context;
  import org.apache.avalon.framework.context.ContextException;
  import org.apache.avalon.framework.component.Composable;
  import org.apache.avalon.framework.component.ComponentManager;
  import org.apache.avalon.framework.component.ComponentException;
  import org.apache.avalon.framework.configuration.Configurable;
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  import org.apache.avalon.framework.activity.Initializable;
  import org.apache.avalon.framework.logger.AbstractLoggable;
  import org.apache.bcel.Constants;
  import org.apache.bcel.generic.*;
  import org.apache.bcel.classfile.Field;
  
  import java.util.StringTokenizer;
  import java.util.Vector;
  import java.util.HashMap;
  
  
  /**
   * Class BCELSQLParser
   *
   *
   * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
   * @version $Revision: 1.1 $
   */
  public class BCELSQLParser extends AbstractLoggable
          implements Block, SQLParser, Contextualizable, Composable, Configurable, Initializable {
  
      private DatabasePersistor mDatabasePersistor;
      private GeneratedObjectClassLoader mGenClassLoader = new GeneratedObjectClassLoader();
      private static int mGenObjSeq;
      private HashMap mGeneratedObjTranslation = new HashMap();
  
  
      /**
       * Method createAction
       *
       *
       * @param request
       *
       * @return
       *
       */
      public Action createAction(Request request) {
          return null;
      }
  
      /**
       * Method contextualize
       *
       *
       * @param context
       *
       * @throws ContextException
       *
       */
      public void contextualize(Context context) throws ContextException {}
  
      /**
       * Method compose
       *
       *
       * @param componentManager
       *
       * @throws ComponentException
       *
       */
      public void compose(ComponentManager componentManager) throws ComponentException {
          mDatabasePersistor =
              (DatabasePersistor) componentManager.lookup(DatabasePersistor.class.getName());
      }
  
      /**
       * Method configure
       *
       *
       * @param configuration
       *
       * @throws ConfigurationException
       *
       */
      public void configure(Configuration configuration) throws ConfigurationException {}
  
      /**
       * Method initialize
       *
       *
       * @throws Exception
       *
       */
      public void initialize() throws Exception {}
  
      /**
       * Method createSelectAction
       *
       *
       * @param request
       *
       * @return
       *
       */
      public Select createSelectAction(SelectRequest request) {
          return null;
      }
  
      private String getWordOne(String str) {
  
          int ix0 = str.indexOf(' ');
  
          if (ix0 == -1) {
              ix0 = str.length();
          }
  
          return str.substring(0, ix0);
      }
  
      private String getWordTwo(String str) {
  
          int ix0 = str.indexOf(' ');
          int ix1 = str.indexOf(' ', ix0 + 1);
  
          if (ix1 == -1) {
              ix1 = str.length();
          }
  
          return str.substring(ix0 + 1, ix1);
      }
  
      private String getWordThree(String str) {
  
          int ix0 = str.indexOf(' ');
          int ix1 = str.indexOf(' ', ix0 + 1);
          int ix2 = str.indexOf(' ', ix1 + 1);
  
          if (ix2 == -1) {
              ix2 = str.length();
          }
  
          return str.substring(ix1 + 1, ix2);
      }
  
      private String getWordFour(String str) {
  
          int ix0 = str.indexOf(' ');
          int ix1 = str.indexOf(' ', ix0 + 1);
          int ix2 = str.indexOf(' ', ix1 + 1);
          int ix3 = str.indexOf(' ', ix2 + 1);
  
          if (ix3 == -1) {
              ix3 = str.length();
          }
  
          return str.substring(ix2 + 1, ix3);
      }
  
      private String getBracketedExpr(String str) {
  
          int ix0 = str.indexOf('(');
          int ix1 = str.lastIndexOf(')');
  
          System.out.println("str=" + str);
          System.out.println("ix0=" + ix0);
          System.out.println("ix1=" + ix1);
  
          return str.substring(ix0 + 1, ix1);
      }
  
      /**
       * Method createCreateTableAction
       *
       *
       * @param request
       *
       * @return
       *
       */
      public CreateTable createCreateTableAction(CreateTableRequest request) {
  
          String table = getWordThree(request.getSql());
          String values = getBracketedExpr(request.getSql());
          StringTokenizer st = new StringTokenizer(values, ",");
          ClassGen cg = new ClassGen(table + "Row",
                                     "org.apache.avalon.db.data.impl.AbstractTableRow",
                                     "<SQL Generated>", Constants.ACC_PUBLIC | Constants.ACC_SUPER,
                                     null);
          ConstantPoolGen cp = cg.getConstantPool();
          Vector columns = new Vector();
  
          while (st.hasMoreTokens()) {
              String fieldStr = st.nextToken();
              StringTokenizer st2 = new StringTokenizer(fieldStr, " ");
  
              System.out.println("FieldStr=" + fieldStr);
  
              String fieldName = st2.nextToken();
              String sqlFieldType = st2.nextToken();
              Type fieldType = getType(sqlFieldType);
              Column column = new DefaultColumn(fieldName, sqlFieldType, fieldType.toString());
  
              columns.add(column);
              createField(cp, cg, fieldType, fieldName);
              createSetter(cp, cg, fieldType, fieldName, table);
          }
  
          //TODO need to create constrcutor suitable for superclass.
          try {
              cg.getJavaClass().dump(table + "Row.class");
          } catch (java.io.IOException e) {
              System.err.println(e);
          }
  
          CreateTable action = new BCELCreateTable(cg.getJavaClass(), table);
          action.setDatabasePersistor(mDatabasePersistor);
          return action;
      }
  
      private Type getType(String type) {
  
          System.out.println("Type=(" + type + ")");
  
          if (type.equals("varchar")) {
              return Type.STRING;
          } else if (type.equals("char")) {
              return Type.STRING;
          }
  
          return Type.VOID;
      }
  
      private void createField(ConstantPoolGen cp, ClassGen cg, Type fieldType, String name) {
  
          System.out.println("fn=" + name);
          System.out.println("Type2=" + fieldType);
  
          FieldGen fg = new FieldGen(Constants.ACC_PUBLIC, fieldType, name, cp);
  
          cg.addField(fg.getField());
      }
  
      private void createSetter(ConstantPoolGen cp, ClassGen cg, Type fieldType, String name,
                                String table) {
  
          InstructionList il = new InstructionList();
          MethodGen mg = new MethodGen(Constants.ACC_PUBLIC,    // access flags
                                       Type.VOID,               // return type
                                       new Type[]{ fieldType }, new String[]{ "value" },    // arg names
                                       "set" + name, table,     // method, class
                                       il, cp);
  
          mg.stripAttributes(true);
          mg.setMaxStack();
          mg.setMaxLocals();
          cg.addMethod(mg.getMethod());
      }
  
      /**
       * Method createInsertAction
       *
       *
       * @param request
       *
       * @return
       *
       */
      public Insert createInsertAction(InsertRequest request) {
  
          String tableName = getWordThree(request.getSql());
          Table table = mDatabasePersistor.getTable(tableName);
          String type = getWordFour(request.getSql());
  
          if (type.startsWith("(")) {
  
              //return createNamedColumnsInsert(table);
          } else if (type.startsWith("values")) {
              return createAllValuesInsert(table, request.getSql());
          } else if (type.startsWith("select")) {
  
              //return createSelectInsert(table);
          }
  
          return null;
      }
  
      //private Insert createNamedColumnsInsert(Table table, String sql ) {
      //}
      private Insert createAllValuesInsert(Table table, String sql) {
  
          String values = getBracketedExpr(sql);
          StringTokenizer st = new StringTokenizer(values, ",");
          Vector valuesVec = new Vector();
  
          while (st.hasMoreTokens()) {
              valuesVec.add(st.nextToken().trim());
          }
  
          //TODO get columns from table.
          return new BCELInsertSingleValue(table, null, valuesVec);
      }
  
      //private Insert createSelectInsert(Table table, String sql) {
      //}
  
      public void addGeneratedClass(String name, byte[] bytes) {
          mGenClassLoader.addGeneratedClass(name, bytes);
      }
      public Object getGeneratedInstance(String name) {
          return mGenClassLoader.getGeneratedInstance(name);
      }
  
  
      /**
       * Method main
       *
       *
       * @param args
       *
       */
      public static void main(String[] args) {
  
          BCELSQLParser parser = new BCELSQLParser();
  
          parser.createCreateTableAction(
              new CreateTableRequest("CREATE TABLE Fred (Wilma varchar, Barney varchar)"));
      }
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/bcel/parser/GeneratedObjectClassLoader.java
  
  Index: GeneratedObjectClassLoader.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  
  package org.apache.avalon.db.bcel.parser;
  
  import java.net.URLClassLoader;
  import java.util.HashMap;
  
  public class GeneratedObjectClassLoader extends ClassLoader {
  
      private HashMap mGeneratedClasses = new HashMap();
  
      public Class findClass(String name) {
          Holder holder = (Holder) mGeneratedClasses.get(name);
          byte[] bytes = holder.getBytes();
          return defineClass(name, bytes, 0, bytes.length);
      }
  
      void addGeneratedClass(String name, byte[] bytes) {
          mGeneratedClasses.put(name, new Holder(bytes));
      }
  
      Object getGeneratedInstance(String name) {
          Class clazz = findClass(name);
          try {
              return clazz.newInstance();
          } catch (Throwable t) {
              return null;
          }
      }
  
      private class Holder {
          private byte[] ba;
          Holder(byte[] ba) {
              this.ba = ba;
          }
          byte[] getBytes() {
              return ba;
          }
      }
  }
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>