/******************************************************************************/ /* File: request_processing.beh */ /* */ /* Describes the implementations for 3 classes: */ /* RequestProcessingVisitor, */ /* VendorFormat, and */ /* VendorDriver. */ /* */ /* The visitor class traverses the parts of a Request structure (created by */ /* parsing the external input) and breaks it up into separate "container" */ /* objects for storing each component of the request. */ /* These components are: */ /* the connection arguments, */ /* the request type (Query / Insert), */ /* the target data structure - table(s) and corresponding column(s), */ /* the generated SQL statement for submitting the request to the DBMS, */ /* the object hierarchy structure requested. */ /* The visitor class uses static methods defined in the Utils class for */ /* dynamically creating objects specific to the corresponding DBMS vendor. */ /* It finally returns a vector of these component objects. */ /* */ /* The methods defined here for the VendorFormat and VendorDriver classes are */ /* just used for printing out their contents using the provided PrintVisitor. */ /* */ /******************************************************************************/ RequestProcessingVisitor { {{ private String vendor; private String url; private String userid; private String password; private String requestType; private Vector targetData; private EntityStructure targetItem; private Vector targetColumns; private String lastColumnType; private String insertColumnValues; private String condition; private String orderTable; private String order; private String parentTable; private String parentColumn; private String childTable; private String childColumn; private String relationColumn; // Initialize variables used or storing intermediate state of the visitor public void start() { vendor = ""; url = ""; userid = ""; password = ""; requestType = ""; targetData = new Vector(); targetItem = null; targetColumns = new Vector(); insertColumnValues = ""; condition = ""; order = ""; parentTable = ""; parentColumn = ""; childTable = ""; childColumn = ""; relationColumn = ""; } // Implement the methods to be invoked on visiting each node in the object // hierarchy public void before(Vendor host) { vendor = host.get_vendor(); } public void before(Url host) { url = host.get_url(); } public void before(Userid host) { userid = host.get_userid(); } public void before(Password host) { password = host.get_password(); } public void before(Query host) { requestType = XMLandDB.QUERY; } public void before(Insert host) { requestType = XMLandDB.INSERT; } public void before(TableName host) { if (targetItem != null) { targetItem.setColumns(targetColumns); targetData.addElement(targetItem); targetColumns = new Vector(); } String tableName = host.get_name(); targetItem = new EntityStructure(tableName); parentTable = tableName; childTable = tableName; } public void before(ColumnSpec host) { String columnName = host.get_spec(); String columnType = host.get_type().toString(); targetColumns.addElement( new EntityStructure.ColumnDetail(columnName, columnType)); lastColumnType = columnType; } public void before(Condition host) { condition = host.get_condition(); } public void before(OrderItem host) { orderTable = ""; } public void before(OrderTable host) { orderTable = host.get_name(); } public void before(OrderColumn host) { order = order + (order.equals("") ? "" : ", ") + (orderTable.equals("") ? "" : (orderTable + ".")) + host.get_name(); } public void before(InsertValue host) { insertColumnValues = insertColumnValues + (insertColumnValues.equals("") ? "" : ", ") + ((lastColumnType.equals("Text") ? "'" : "") + host.get_value() + (lastColumnType.equals("Text") ? "'" : "")); } public void before(ParentTable host) { parentTable = host.get_name(); } public void before(ParentColumn host) { parentColumn = host.get_name(); } public void before(ChildTable host) { childTable = host.get_name(); } public void before(ChildColumn host) { childColumn = host.get_name(); } public void before(RelationColumn host) { relationColumn = host.get_name(); } public Object getReturnValue() { Vector returnValues = new Vector(); returnValues.addElement(new ConnectionArgs(vendor, url, userid, password)); returnValues.addElement(requestType); if (targetItem != null) { targetItem.setColumns(targetColumns); targetData.addElement(targetItem); } EntityStructure entities[] = new EntityStructure[targetData.size()]; targetData.copyInto(entities); returnValues.addElement(entities); String tableNames = "", columnNames = "", prefix = ""; for (int i = 0; i < entities.length; i++) { tableNames = tableNames + (tableNames.equals("") ? "" : ", ") + entities[i].tableName; if (entities.length > 1) prefix = entities[i].tableName + "."; for (int j = 0; j < entities[i].columns.length; j++) { columnNames = columnNames + (columnNames.equals("") ? "" : ", ") + prefix + entities[i].columns[j].name; } } String sqlStmt; if (requestType.equals(XMLandDB.QUERY)) // it is a select statement { if (! parentColumn.equals("")) order = ((entities.length > 1) ? (parentTable + ".") : "") + parentColumn + ", " + ((entities.length > 1) ? (childTable + ".") : "") + childColumn + (order.equals("") ? "" : (", " + order)); sqlStmt = buildSelectStatement(tableNames, columnNames, condition, order); } else // it is an insert statement { sqlStmt = buildInsertStatement(tableNames, columnNames, insertColumnValues); } returnValues.addElement(sqlStmt); returnValues.addElement(parentColumn.equals("") ? null : new HierarchyArgs(parentTable, parentColumn, childTable, childColumn, relationColumn)); return returnValues; } // Private accessory methods for constructing a SQL statement from parts. // All operations in this class involving dynamic creation of objects are // centralized here. private String buildSelectStatement(String tableNames, String columnNames, String condition, String order) { Object selectFormat = (Object) Utils.instantiate(vendor + "_SelectFormat"); if (selectFormat == null) return null; if (! Utils.executeSetMethod(selectFormat, "set_tableList", new Ident(tableNames))) return null; if (! Utils.executeSetMethod(selectFormat, "set_columnList", new Ident(columnNames))) return null; if (! condition.equals("")) { if (! Utils.executeSetMethod(selectFormat, "set_whereClause", new Ident(condition))) return null; } if (! order.equals("")) { if (! Utils.executeSetMethod(selectFormat, "set_orderByClause", new Ident(order))) return null; } Object vendorFormat = (Object) Utils.instantiate(vendor + "_Format"); if (vendorFormat == null) return null; if (! Utils.executeSetMethod(vendorFormat, "set_format", selectFormat, vendor + "_StmtFormat")) return null; return ((VendorFormat) vendorFormat).getSQLStatement(); } private String buildInsertStatement(String tableNames, String columnNames, String columnValues) { Object insertFormat = (Object) Utils.instantiate(vendor + "_InsertFormat"); if (insertFormat == null) return null; if (! Utils.executeSetMethod(insertFormat, "set_table", new Ident(tableNames))) return null; if (! Utils.executeSetMethod(insertFormat, "set_columnList", new Ident(columnNames))) return null; if (! Utils.executeSetMethod(insertFormat, "set_valueList", new Ident(columnValues))) return null; Object vendorFormat = (Object) Utils.instantiate(vendor + "_Format"); if (vendorFormat == null) return null; if (! Utils.executeSetMethod(vendorFormat, "set_format", insertFormat, vendor + "_StmtFormat")) return null; return ((VendorFormat) vendorFormat).getSQLStatement(); } }} } VendorFormat { {{ public String getSQLStatement() { StringWriter p = new StringWriter(); universal_trv0(new PrintVisitor(new PrintWriter(p))); return p.toString(); } }} } VendorDriver { {{ public String getDriverName() { StringWriter p = new StringWriter(); universal_trv0(new PrintVisitor(new PrintWriter(p))); return p.toString(); } }} }