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:[EMAIL PROTECTED]">[EMAIL PROTECTED]</a> * @author Gerhard Froehlich <a href="mailto:[EMAIL PROTECTED]">[EMAIL PROTECTED]</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:[EMAIL PROTECTED]">[EMAIL PROTECTED]</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:[EMAIL PROTECTED]">[EMAIL PROTECTED]</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:[EMAIL PROTECTED]">[EMAIL PROTECTED]</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:[EMAIL PROTECTED]">[EMAIL PROTECTED]</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: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>