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/11/07 14:28:35 UTC

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

hammant     01/11/07 05:28:35

  Modified:    apps/db/src/java/org/apache/avalon/db/basic/data
                        BasicRow.java BasicTable.java
  Added:       apps/db/src/java/org/apache/avalon/db/actions
                        ParameterAdaptable.java
               apps/db/src/java/org/apache/avalon/db/basic/actions
                        BasicInsert.java BasicSelect.java
               apps/db/src/java/org/apache/avalon/db/basic/parser
                        BasicLXSQLParser.java
               apps/db/src/java/org/apache/avalon/db/bcel/parser
                        BCELLXSQLParser.java
  Removed:     apps/db/src/java/org/apache/avalon/db/basic/parser
                        LXSQLParser.java
               apps/db/src/java/org/apache/avalon/db/bcel/parser
                        LXSQLParser.java
  Log:
  Refactoring and start of Basic Select Action
  
  Revision  Changes    Path
  1.1                  jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/actions/ParameterAdaptable.java
  
  Index: ParameterAdaptable.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.actions;
  
  import org.apache.avalon.db.services.DatabasePersistor;
  import org.apache.avalon.db.services.SQLParser;
  
  
  /**
   * Interface Action
   *
   *
   * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
   * @author Gerhard Froehlich <a href="mailto:g-froehlich@gmx.de">g-froehlich@gmx.de</a>
   * @version * $Revision: 1.5 $
   */
  public interface ParameterAdaptable extends Action {
      void execute(Object[] paramters) throws ActionException;
      void setParameters(Object[] paramters);
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicInsert.java
  
  Index: BasicInsert.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.basic.actions;
  
  import org.apache.avalon.db.actions.Insert;
  import org.apache.avalon.db.actions.ActionException;
  import org.apache.avalon.db.actions.impl.AbstractAction;
  
  import org.apache.avalon.db.data.impl.AbstractTableRow;
  import org.apache.avalon.db.data.Column;
  import org.apache.avalon.db.basic.data.BasicTable;
  import org.apache.avalon.db.basic.data.BasicRow;
  import org.w3c.dom.Document;
  import org.w3c.dom.Element;
  import org.w3c.dom.NodeList;
  
  import java.lang.reflect.Method;
  import java.lang.reflect.InvocationTargetException;
  import java.util.Vector;
  
  
  /**
   * Class BasicInsert
   *
   *
   * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
   * @version $Revision: 1.4 $
   */
  public class BasicInsert extends AbstractAction implements Insert {
  
      private Document mDocument;
      private BasicTable mTable;
      private int mRecordCount;
  
      /**
       * Constructor BasicInsert
       *
       *
       * @param table
       * @param document
       *
       */
      public BasicInsert(BasicTable table, Document document) {
          mTable = table;
          mDocument = document;
      }
  
  
  
      /**
       * Method execute
       *
       *
       */
      public void execute() throws ActionException {
  
          System.out.println("insert execute");
  
          System.out.println("mTable=" + mTable);
          System.out.println("mDocument=" + mDocument);
  
          Column[] columns = mTable.getColumns();
          int colCount = columns.length;
          Object[] values = new Object[colCount];
  
          Element rootElement = mDocument.getDocumentElement();
  
          NodeList subRootNodes = rootElement.getChildNodes();
  
          for (int f = 0 ; f < subRootNodes.getLength(); f++) {
              if (subRootNodes.item(f).getNodeName().equals("rows")) {
                  NodeList subRowsNodes = subRootNodes.item(f).getChildNodes();
                  Vector row = new Vector();
                  for (int x = 0 ; x < subRowsNodes.getLength(); x++) {
                      if (subRowsNodes.item(x).getNodeName().equals("row")) {
                          mRecordCount++;
                          NodeList subRowNodes = subRootNodes.item(f).getChildNodes();
                          for (int y = 0 ; y < subRowNodes.getLength(); y++) {
                              if (subRowNodes.item(y).getNodeName().equals("value")) {
                                  Element rowNode = (Element) subRowNodes.item(y);
                                  String colName = rowNode.getAttribute("column");
                                  String valueStr = rowNode.getNodeValue();
                                  int ix = mTable.getColumnIndex(colName);
                                  values[x] = valueStr;
                              }
                          }
                      } else {
                          // TODO
                      }
                  }
                  Vector pendingRow = new Vector();
                  for (int q = 0; q < values.length; q ++) {
                      if (values[q] == null) {
                          pendingRow.add(BasicRow.NOVALUE);
                      } else {
                          pendingRow.add(values[q]);
                      }
  
                  }
                  mTable.addRow(new BasicRow(mTable,pendingRow));
              } else {
                  //TODO
              }
          }
      }
  
      public int getRecordCount() {
          return mRecordCount;
      }
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicSelect.java
  
  Index: BasicSelect.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.basic.actions;
  
  import org.apache.avalon.db.actions.Select;
  import org.apache.avalon.db.actions.ActionException;
  import org.apache.avalon.db.actions.impl.AbstractAction;
  import org.apache.avalon.db.data.impl.AbstractTableRow;
  import org.apache.avalon.db.results.RowSet;
  import org.w3c.dom.Document;
  import org.w3c.dom.Element;
  import org.w3c.dom.NodeList;
  
  import java.lang.reflect.Method;
  import java.lang.reflect.InvocationTargetException;
  
  
  /**
   * Class BasicSelect
   *
   *
   * @author Gerhard Froehlich <a href="mailto:g-froehlich@gmx.de">g-froehlich@gmx.de</a>
   */
  public class BasicSelect extends AbstractAction implements Select {
  
      private Document mDocument;
      private boolean mPrepared;
      private boolean mWithParams;
  
      /**
       * Constructor BCELInsert
       *
       *
       * @param table
       * @param document
       *
       */
      public BasicSelect(Document document) {
          mDocument = document;
      }
  
      /**
       * Method execute
       *
       *
       */
      public void execute() throws ActionException {
          System.out.println("select execute");
  
          if(getPrepared()) {
              //only check params and stuff
              //no results
          }
      }
  
      public void execute(String[] params) {
          System.out.println("select execute prepared");
      }
  
      public void setPrepared(boolean b) {
          mPrepared = b;
      }
  
      public boolean getPrepared() {
          return mPrepared;
      }
  
      public void setWithParams(boolean b) {
          mWithParams = b;
      }
  
      public boolean getWithParams() {
          return mWithParams;
      }
  
      public RowSet getRowSet() {
          return null;
      }
  
  }
  
  
  
  1.2       +3 -0      jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/data/BasicRow.java
  
  Index: BasicRow.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/data/BasicRow.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- BasicRow.java	2001/11/07 12:01:14	1.1
  +++ BasicRow.java	2001/11/07 13:28:35	1.2
  @@ -14,6 +14,9 @@
   
   public class BasicRow extends AbstractTableRow {
   
  +    public static class NoValue {}
  +    public static NoValue NOVALUE = new NoValue();
  +
       protected Vector mRow;
       protected Column[] mColumns;
   
  
  
  
  1.3       +9 -0      jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/data/BasicTable.java
  
  Index: BasicTable.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/data/BasicTable.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- BasicTable.java	2001/11/07 12:24:20	1.2
  +++ BasicTable.java	2001/11/07 13:28:35	1.3
  @@ -17,5 +17,14 @@
           super(name, columns);
       }
   
  +    public int getColumnIndex(String columnName) {
  +        for (int x = 0; x < mColumns.length; x++) {
  +            if (mColumns[x].getColumnName().equals(columnName)) {
  +                return x;
  +            }
  +        }
  +        return -1;
  +    }
  +
   
   }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/parser/BasicLXSQLParser.java
  
  Index: BasicLXSQLParser.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.basic.parser;
  
  import org.apache.avalon.db.server.AbstractLXSQLParser;
  import org.apache.avalon.db.actions.Select;
  import org.apache.avalon.db.actions.ActionException;
  import org.apache.avalon.db.actions.CreateTable;
  import org.apache.avalon.db.actions.Insert;
  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.data.Column;
  import org.apache.avalon.db.data.impl.DefaultColumn;
  import org.apache.avalon.db.bcel.actions.AbstractBCELAction;
  import org.apache.avalon.db.basic.actions.BasicCreateTable;
  import org.apache.avalon.db.basic.actions.BasicInsert;
  import org.apache.avalon.db.basic.data.BasicTable;
  import org.apache.avalon.framework.component.ComponentManager;
  import org.apache.avalon.framework.component.ComponentException;
  import org.apache.bcel.generic.InstructionFactory;
  import org.apache.bcel.generic.ConstantPoolGen;
  import org.apache.bcel.generic.ClassGen;
  import org.apache.bcel.generic.Type;
  import org.apache.bcel.Constants;
  import org.w3c.dom.Element;
  import org.w3c.dom.Document;
  import org.w3c.dom.NodeList;
  import org.w3c.dom.Node;
  
  import java.util.Vector;
  
  
  /**
   * Class BCELSQLParser
   *
   *
   * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
   * @version $Revision: 1.14 $
   */
  public class BasicLXSQLParser extends AbstractLXSQLParser {
  
      /**
       * Method createSelectAction
       *
       *
       * @param request
       *
       * @return
       *
       */
      public Select createSelectAction(SelectRequest request) throws ActionException {
  
        // TODO
        return null;
  
      }
  
      /**
       * Method createCreateTableAction
       *
       *
       * @param request
       *
       * @return
       *
       */
      public CreateTable createCreateTableAction(CreateTableRequest request) throws ActionException {
  
          Document doc = parseLXSQLString(request.getSql());
  
          Element rootElement = doc.getDocumentElement();
          getLogger().debug("rootElement=" + rootElement.getTagName());
  
          String tableName = rootElement.getAttribute("name");
  
          NodeList subRootNodes = rootElement.getChildNodes();
  
          Vector columns = new Vector();
  
          for (int f = 0 ; f < subRootNodes.getLength(); f++) {
              if (subRootNodes.item(f).getNodeName().equals("columns")) {
                  NodeList subColumnsNodes = subRootNodes.item(f).getChildNodes();
                  for (int x = 0 ; x < subColumnsNodes.getLength(); x++) {
                      if (subColumnsNodes.item(x).getNodeName().equals("column")) {
                          Node columnNode = subColumnsNodes.item(x);
                          String fieldName = columnNode.getAttributes().getNamedItem("name").getNodeValue();
                          String sqlFieldType = columnNode.getAttributes().getNamedItem("type").getNodeValue();
                          String fieldType = getJavaType(sqlFieldType).toString();
                          Column column = new DefaultColumn(fieldName, sqlFieldType, fieldType);
                          columns.add(column);
                      } else {
                          // TODO  There should be no other element types inside <columns>
                      }
  
                  }
  
              } else {
                  //TODO  Only <columns> is supported in <create-table> so far
              }
          }
  
          //TODO need to create constrcutor suitable for superclass.
  
          CreateTable action = new BasicCreateTable(tableName, columns);
          action.setDatabasePersistor(mDatabasePersistor);
          return action;
  
      }
  
  
      /**
       * Method createInsertAction
       *
       *
       * @param request
       *
       * @return
       *
       */
      public Insert createInsertAction(InsertRequest request) throws ActionException {
  
          Document doc = parseLXSQLString(request.getSql());
          Element rootElement = doc.getDocumentElement();
          String tableName = rootElement.getAttribute("table-name");
  
          System.out.println("mDatabasePersistor" + mDatabasePersistor);
          System.out.println("=tn=" + tableName);
          BasicTable table = (BasicTable) mDatabasePersistor.getTable(tableName);
          System.out.println("=table=" + table);
          Insert action = new BasicInsert(table, doc);
          action.setDatabasePersistor(mDatabasePersistor);
  
          return action;
      }
  
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/bcel/parser/BCELLXSQLParser.java
  
  Index: BCELLXSQLParser.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.server.AbstractLXSQLParser;
  import org.apache.avalon.db.bcel.actions.BCELSelect;
  import org.apache.avalon.db.bcel.actions.AbstractBCELAction;
  import org.apache.avalon.db.bcel.actions.BCELCreateTable;
  import org.apache.avalon.db.bcel.actions.BCELInsert;
  import org.apache.avalon.db.bcel.data.BCELTable;
  import org.apache.avalon.db.actions.Select;
  import org.apache.avalon.db.actions.ActionException;
  import org.apache.avalon.db.actions.CreateTable;
  import org.apache.avalon.db.actions.Insert;
  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.data.Column;
  import org.apache.avalon.db.data.impl.DefaultColumn;
  import org.apache.avalon.framework.component.ComponentManager;
  import org.apache.avalon.framework.component.ComponentException;
  import org.apache.bcel.generic.InstructionFactory;
  import org.apache.bcel.generic.ConstantPoolGen;
  import org.apache.bcel.generic.ClassGen;
  import org.apache.bcel.generic.Type;
  import org.apache.bcel.Constants;
  import org.w3c.dom.Element;
  import org.w3c.dom.Document;
  import org.w3c.dom.NodeList;
  import org.w3c.dom.Node;
  
  import java.util.Vector;
  
  
  /**
   * Class BCELSQLParser
   *
   *
   * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
   * @version $Revision: 1.14 $
   */
  public class BCELLXSQLParser extends AbstractLXSQLParser {
  
      protected BCELHelper bcelHelper = new BCELHelper();
  
      public void compose(ComponentManager componentManager) throws ComponentException {
          super.compose(componentManager);
          bcelHelper.setDatabasePersistor(mDatabasePersistor);
      }
  
      /**
       * Method createSelectAction
       *
       *
       * @param request
       *
       * @return
       *
       */
      public Select createSelectAction(SelectRequest request) throws ActionException {
  
  
          Document doc = parseLXSQLString(request.getSql());
          Element rootElement = doc.getDocumentElement();
          Select action = new BCELSelect(doc);
          if(request.getPrepared()) {
              action.setPrepared(true);
          } else if(request.getParams().length > 0) {
              action.setWithParams(true);
          }
          action.setDatabasePersistor(mDatabasePersistor);
          ((AbstractBCELAction) action).setBCELHelper(bcelHelper);
          return action;
  
      }
  
      /**
       * Method createCreateTableAction
       *
       *
       * @param request
       *
       * @return
       *
       */
      public CreateTable createCreateTableAction(CreateTableRequest request) throws ActionException {
  
          Document doc = parseLXSQLString(request.getSql());
  
          Element rootElement = doc.getDocumentElement();
          getLogger().debug("rootElement=" + rootElement.getTagName());
  
          String tableName = rootElement.getAttribute("name");
          String tableRowName = tableName + "Row";
  
  
          String newTableRowClassName = bcelHelper.createUniqueClassName(tableRowName);
          ClassGen cg = new ClassGen(newTableRowClassName,
                                 "org.apache.avalon.db.data.impl.AbstractTableRow",
                                 "<SQL Generated>", Constants.ACC_PUBLIC | Constants.ACC_SUPER,
                                 null);
          ConstantPoolGen cp = cg.getConstantPool();
          cg.addEmptyConstructor(Constants.ACC_PUBLIC);
          InstructionFactory factory = new InstructionFactory(cg);
  
          NodeList subRootNodes = rootElement.getChildNodes();
  
          Vector columns = new Vector();
  
          for (int f = 0 ; f < subRootNodes.getLength(); f++) {
              if (subRootNodes.item(f).getNodeName().equals("columns")) {
                  NodeList subColumnsNodes = subRootNodes.item(f).getChildNodes();
                  for (int x = 0 ; x < subColumnsNodes.getLength(); x++) {
                      if (subColumnsNodes.item(x).getNodeName().equals("column")) {
                          Node columnNode = subColumnsNodes.item(x);
                          String fieldName = columnNode.getAttributes().getNamedItem("name").getNodeValue();
                          String sqlFieldType = columnNode.getAttributes().getNamedItem("type").getNodeValue();
                          Type fieldType = bcelHelper.getType(sqlFieldType);
                          Column column = new DefaultColumn(fieldName, sqlFieldType, fieldType.toString());
  
                          columns.add(column);
                          bcelHelper.createFieldAndSetter(cp, cg, factory, fieldType, fieldName, tableName);
                      } else {
                          // TODO  There should be no other element types inside <columns>
                      }
  
                  }
  
              } else {
                  //TODO  Only <columns> is supported in <create-table> so far
              }
          }
  
          //TODO need to create constrcutor suitable for superclass.
  
          try {
              cg.getJavaClass().dump(newTableRowClassName + tableName + ".class");
          } catch (java.io.IOException e) {
              System.err.println(e);
          }
  
          CreateTable action = new BCELCreateTable(cg.getJavaClass(), tableName, tableRowName, newTableRowClassName, columns);
          action.setDatabasePersistor(mDatabasePersistor);
          ((AbstractBCELAction) action).setBCELHelper(bcelHelper);
          return action;
  
      }
  
  
      /**
       * Method createInsertAction
       *
       *
       * @param request
       *
       * @return
       *
       */
      public Insert createInsertAction(InsertRequest request) throws ActionException {
  
          Document doc = parseLXSQLString(request.getSql());
          Element rootElement = doc.getDocumentElement();
          String tableName = rootElement.getAttribute("table-name");
  
          System.out.println("mDatabasePersistor" + mDatabasePersistor);
          System.out.println("=tn=" + tableName);
          String uniqueTableName = bcelHelper.getGeneratedClassName(tableName);
          System.out.println("=utn=" + uniqueTableName);
          BCELTable table = (BCELTable) mDatabasePersistor.getTable(tableName);
          System.out.println("=table=" + table);
          Insert action = new BCELInsert(table, doc);
          action.setDatabasePersistor(mDatabasePersistor);
          ((AbstractBCELAction) action).setBCELHelper(bcelHelper);
  
          return action;
  
      }
  
  }
  
  
  

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