This commit was manufactured by cvs2svn to create tag

'helma_1_2_rc1'.
This commit is contained in:
hns 2002-12-06 18:17:34 +00:00
parent 817395e8b0
commit 4ff57fb2ac
14 changed files with 195 additions and 367 deletions

View file

@ -168,13 +168,7 @@ public class ClassInfo {
if (indexedReadMethod != null && indexedReadMethod.getParameterTypes().length != 1) {
throw new ProgrammingError("Indexed getter of property ' " + propertyName + "' should have 1 parameter!");
}
// Work around reflection bug, Hannes Wallnoefer 11/2002
if (indexedReadMethod != null && Modifier.isPublic (indexedReadMethod.getModifiers ()))
indexedReadMethod.setAccessible (true);
if (indexedWriteMethod != null) {
// Work around reflection bug, Hannes Wallnoefer 11/2002
if (Modifier.isPublic (indexedWriteMethod.getModifiers ()))
indexedWriteMethod.setAccessible (true);
Class [] paramCls = indexedWriteMethod.getParameterTypes();
if (paramCls == null || paramCls.length != 2) {
throw new ProgrammingError("Indexed setter of property ' " + propertyName + "' should have 2 parameter!");
@ -194,13 +188,7 @@ public class ClassInfo {
if (readMethod != null && readMethod.getParameterTypes().length != 0) {
throw new ProgrammingError("Non indexed getter of indxed property ' " + propertyName + "' is not supposed to have a parameter!");
}
// Work around reflection bug, Hannes Wallnoefer 11/2002
if (readMethod != null && Modifier.isPublic (readMethod.getModifiers ()))
readMethod.setAccessible (true);
if (writeMethod != null) {
// Work around reflection bug, Hannes Wallnoefer 11/2002
if (Modifier.isPublic (writeMethod.getModifiers ()))
writeMethod.setAccessible (true);
Class [] paramCls = writeMethod.getParameterTypes();
if (paramCls == null || paramCls.length != 1) {
throw new ProgrammingError("Non indexed setter of indexed property ' " + propertyName + "' should have 1 parameter!");
@ -220,13 +208,7 @@ public class ClassInfo {
if (readMethod != null && readMethod.getParameterTypes().length != 0) {
throw new ProgrammingError("Non indexed getter of property ' " + propertyName + "' is not supposed to have a parameter!");
}
// Work around reflection bug, Hannes Wallnoefer 11/2002
if (readMethod != null && Modifier.isPublic (readMethod.getModifiers ()))
readMethod.setAccessible (true);
if (writeMethod != null) {
// Work around reflection bug, Hannes Wallnoefer 11/2002
if (Modifier.isPublic (writeMethod.getModifiers ()))
writeMethod.setAccessible (true);
Class [] paramCls = writeMethod.getParameterTypes();
if (paramCls == null || paramCls.length != 1) {
throw new ProgrammingError("Non indexed setter of property ' " + propertyName + "' should have 1 parameter!");
@ -236,8 +218,8 @@ public class ClassInfo {
}
}
}
// Add to cache
// Add to cache
if (debug) System.out.println("** property '" + propertyName + "' + found, add to cache");
if (beanProperties==null) {
beanProperties = new Hashtable();
@ -248,7 +230,7 @@ public class ClassInfo {
}
return descriptor;
}
/**
* Get the list of public method in this class or superclass, by name (the
@ -417,7 +399,6 @@ public class ClassInfo {
}
} // if class not public
// Work around reflection bug, Hannes Wallnoefer 11/2002
if (Modifier.isPublic (method.getModifiers ()))
method.setAccessible (true);
// save it
@ -537,7 +518,6 @@ public class ClassInfo {
}
} // for
} // if class not public
// Work around reflection bug, Hannes Wallnoefer 11/2002
if (Modifier.isPublic (method.getModifiers ()))
method.setAccessible (true);
// save it

View file

@ -25,7 +25,7 @@ import org.apache.xmlrpc.*;
public class Server implements IPathElement, Runnable {
public static final String version = "1.2 RC2 2002/12/05";
public static final String version = "1.2 RC1 2002/12/03";
public final long starttime;
// if true we only accept RMI and XML-RPC connections from

View file

@ -1,46 +0,0 @@
// DbColumn.java
// Copyright 2002 Hannes Wallnoefer, Helma.org
package helma.objectmodel.db;
/**
* A class that encapsulates the Column name and data type of a
* column in a relational table.
*/
public final class DbColumn {
private final String name;
private final int type;
private final Relation relation;
/**
* Constructor
*/
public DbColumn (String name, int type, Relation rel) {
this.name = name;
this.type = type;
this.relation = rel;
}
/**
* Get the column name.
*/
public String getName() {
return name;
}
/**
* Get this columns SQL data type.
*/
public int getType() {
return type;
}
/**
* Return the relation associated with this column. May be null.
*/
public Relation getRelation() {
return relation;
}
}

View file

@ -13,8 +13,8 @@ import java.util.StringTokenizer;
import java.sql.*;
import com.workingdogs.village.*;
/**
* A DbMapping describes how a certain type of Nodes is to mapped to a
/**
* A DbMapping describes how a certain type of Nodes is to mapped to a
* relational database table. Basically it consists of a set of JavaScript property-to-
* Database row bindings which are represented by instances of the Relation class.
*/
@ -43,21 +43,15 @@ public final class DbMapping implements Updatable {
Relation subRelation;
Relation propRelation;
// if this defines a subnode mapping with groupby layer,
// we need a DbMapping for those groupby nodes
// if this defines a subnode mapping with groupby layer, we need a DbMapping for those groupby nodes
DbMapping groupbyMapping;
// Map of property names to Relations objects
HashMap prop2db;
// Map of db columns to Relations objects.
// Case insensitive, keys are stored in upper case so
// lookups must do a toUpperCase().
// Map of db columns to Relations objects
HashMap db2prop;
// list of columns to fetch from db
DbColumn[] columns = null;
// Map of db columns by name
HashMap columnMap;
String[] columns = null;
// pre-rendered select statement
String select = null;
@ -121,8 +115,6 @@ public final class DbMapping implements Updatable {
prop2db = new HashMap ();
db2prop = new HashMap ();
columnMap = new HashMap ();
parent = null;
@ -193,7 +185,6 @@ public final class DbMapping implements Updatable {
keydef = null;
// same with columns and select string
columns = null;
columnMap.clear();
select = null;
@ -220,8 +211,8 @@ public final class DbMapping implements Updatable {
rel.update (dbField, props);
p2d.put (propName, rel);
if (rel.columnName != null &&
(rel.reftype == Relation.PRIMITIVE ||
rel.reftype == Relation.REFERENCE))
(rel.reftype == Relation.PRIMITIVE ||
rel.reftype == Relation.REFERENCE))
d2p.put (rel.columnName.toUpperCase (), rel);
// app.logEvent ("Mapping "+propName+" -> "+dbField);
}
@ -240,7 +231,7 @@ public final class DbMapping implements Updatable {
if (subRelation == null)
subRelation = new Relation (subnodeMapping, "_children", this, props);
subRelation.update (subnodeMapping, props);
// if subnodes are accessed via access name or group name,
// if subnodes are accessed via access name or group name,
// the subnode relation is also the property relation.
if (subRelation.accessor != null || subRelation.groupby != null)
propRelation = subRelation;
@ -259,7 +250,7 @@ public final class DbMapping implements Updatable {
}
/**
/**
* Method in interface Updatable.
*/
public void remove () {
@ -488,7 +479,7 @@ public final class DbMapping implements Updatable {
groupbyMapping.typename = subRelation.groupbyPrototype;
}
public void setPropertyRelation (Relation rel) {
propRelation = rel;
}
@ -576,11 +567,11 @@ public final class DbMapping implements Updatable {
/**
* Return an array of DbColumns for the relational table mapped by this DbMapping.
* Return a Village Schema object for this DbMapping.
*/
public synchronized DbColumn[] getColumns() throws ClassNotFoundException, SQLException {
public synchronized String[] getColumns() throws ClassNotFoundException, SQLException {
if (!isRelational ())
throw new SQLException ("Can't get columns for non-relational data mapping "+this);
throw new SQLException ("Can't get Schema for non-relational data mapping");
if (source == null && parentMapping != null)
return parentMapping.getColumns ();
// Use local variable cols to avoid synchronization (schema may be nulled elsewhere)
@ -589,46 +580,25 @@ public final class DbMapping implements Updatable {
// and build a string of column names.
Connection con = getConnection ();
Statement stmt = con.createStatement ();
String t = getTableName();
if (t == null)
throw new SQLException ("Table name is null in getColumns() for "+this);
ResultSet rs = stmt.executeQuery (
new StringBuffer("SELECT * FROM ")
.append(t).append(" WHERE 1 = 0").toString());
ResultSet rs = stmt.executeQuery ("select * from "+getTableName()+" where 1 = 0");
if (rs == null)
throw new SQLException ("Error retrieving columns for "+this);
throw new SQLException ("Error retrieving DB scheme for "+this);
ResultSetMetaData meta = rs.getMetaData ();
// ok, we have the meta data, now loop through mapping...
int ncols = meta.getColumnCount ();
columns = new DbColumn[ncols];
columns = new String[ncols];
for (int i=0; i<ncols; i++) {
String colName = meta.getColumnName (i+1);
Relation rel = columnNameToRelation (colName);
columns[i] = new DbColumn (colName, meta.getColumnType (i+1), rel);
columns[i] = meta.getColumnName (i+1);
Relation rel = columnNameToRelation (columns[i]);
if (rel == null || (rel.reftype != Relation.PRIMITIVE &&
rel.reftype != Relation.REFERENCE))
continue;
rel.setColumnType (meta.getColumnType (i+1));
}
}
return columns;
}
public DbColumn getColumn (String columnName) throws ClassNotFoundException, SQLException {
DbColumn col = (DbColumn) columnMap.get(columnName);
if (col == null) {
DbColumn[] cols = columns;
if (cols == null)
cols = getColumns();
for (int i=0; i<cols.length; i++) {
if (columnName.equalsIgnoreCase (cols[i].getName())) {
col = cols[i];
break;
}
}
if (col == null)
throw new SQLException ("Column "+columnName+" not found in "+this);
columnMap.put (columnName, col);
}
return col;
}
public StringBuffer getSelect () throws SQLException, ClassNotFoundException {
String sel = select;
if (sel != null)
@ -649,8 +619,13 @@ public final class DbMapping implements Updatable {
if (table == null && parentMapping != null)
return parentMapping.needsQuotes (columnName);
try {
DbColumn col = getColumn (columnName);
switch (col.getType()) {
Relation rel = (Relation) db2prop.get (columnName.toUpperCase());
if (rel == null)
throw new SQLException ("Error retrieving relational schema for "+this);
// make sure columns are initialized and up to date
if (columns == null)
getColumns();
switch (rel.getColumnType()) {
case Types.CHAR:
case Types.VARCHAR:
case Types.LONGVARCHAR:

View file

@ -234,7 +234,7 @@ public final class Node implements INode, Serializable {
/**
* Constructor used for nodes being stored in a relational database table.
*/
public Node (DbMapping dbm, ResultSet rs, DbColumn[] columns, WrappedNodeManager nmgr)
public Node (DbMapping dbm, ResultSet rs, String[] columns, WrappedNodeManager nmgr)
throws SQLException {
this.nmgr = nmgr;
@ -265,35 +265,35 @@ public final class Node implements INode, Serializable {
for (int i=0; i<columns.length; i++) {
Relation rel = columns[i].getRelation();
Relation rel = dbm.columnNameToRelation (columns[i]);
if (rel == null || (rel.reftype != Relation.PRIMITIVE &&
rel.reftype != Relation.REFERENCE))
continue;
Property newprop = new Property (rel.propName, this);
switch (columns[i].getType()) {
switch (rel.getColumnType()) {
case Types.BIT:
newprop.setBooleanValue (rs.getBoolean(columns[i].getName()));
newprop.setBooleanValue (rs.getBoolean(columns[i]));
break;
case Types.TINYINT:
case Types.BIGINT:
case Types.SMALLINT:
case Types.INTEGER:
newprop.setIntegerValue (rs.getLong(columns[i].getName()));
newprop.setIntegerValue (rs.getLong(columns[i]));
break;
case Types.REAL:
case Types.FLOAT:
case Types.DOUBLE:
newprop.setFloatValue (rs.getDouble(columns[i].getName()));
newprop.setFloatValue (rs.getDouble(columns[i]));
break;
case Types.DECIMAL:
case Types.NUMERIC:
BigDecimal num = rs.getBigDecimal (columns[i].getName());
BigDecimal num = rs.getBigDecimal (columns[i]);
if (num == null)
break;
if (num.scale() > 0)
@ -305,20 +305,20 @@ public final class Node implements INode, Serializable {
case Types.LONGVARBINARY:
case Types.VARBINARY:
case Types.BINARY:
newprop.setStringValue (rs.getString(columns[i].getName()));
newprop.setStringValue (rs.getString(columns[i]));
break;
case Types.LONGVARCHAR:
case Types.CHAR:
case Types.VARCHAR:
case Types.OTHER:
newprop.setStringValue (rs.getString(columns[i].getName()));
newprop.setStringValue (rs.getString(columns[i]));
break;
case Types.DATE:
case Types.TIME:
case Types.TIMESTAMP:
newprop.setDateValue (rs.getTimestamp(columns[i].getName()));
newprop.setDateValue (rs.getTimestamp(columns[i]));
break;
case Types.NULL:
@ -327,7 +327,7 @@ public final class Node implements INode, Serializable {
// continue;
default:
newprop.setStringValue (rs.getString(columns[i].getName()));
newprop.setStringValue (rs.getString(columns[i]));
break;
}
@ -1837,7 +1837,7 @@ public final class Node implements INode, Serializable {
*/
public INode getNonVirtualParent () {
INode node = this;
for (int i=0; i<5; i++) {
for (int i=0; i<3; i++) {
if (node == null) break;
if (node.getState() != Node.VIRTUAL)
return node;

View file

@ -580,13 +580,7 @@ public final class NodeManager {
try {
Connection con = dbm.getConnection ();
st = con.createStatement ();
st.executeUpdate (new StringBuffer ("DELETE FROM ")
.append(dbm.getTableName ())
.append(" WHERE ")
.append(dbm.getIDField())
.append(" = ")
.append(node.getID())
.toString());
st.executeUpdate ("DELETE FROM "+dbm.getTableName ()+" WHERE "+dbm.getIDField ()+" = "+node.getID ());
} finally {
if (st != null) try {
st.close ();
@ -611,11 +605,7 @@ public final class NodeManager {
Statement stmt = null;
try {
Connection con = map.getConnection ();
String q = new StringBuffer("SELECT MAX(")
.append(map.getIDField())
.append(") FROM ")
.append(map.getTableName())
.toString();
String q = "SELECT MAX("+map.getIDField()+") FROM "+map.getTableName();
stmt = con.createStatement ();
ResultSet rs = stmt.executeQuery (q);
// check for empty table
@ -649,10 +639,7 @@ public final class NodeManager {
String retval = null;
try {
Connection con = map.getConnection ();
String q = new StringBuffer("SELECT ")
.append(map.getIDgen())
.append(".nextval FROM dual")
.toString();
String q = "SELECT "+map.getIDgen()+".nextval FROM dual";
stmt = con.createStatement();
ResultSet rs = stmt.executeQuery (q);
if (!rs.next ())
@ -690,28 +677,15 @@ public final class NodeManager {
Statement stmt = null;
try {
String q = null;
if (home.getSubnodeRelation() != null) {
// subnode relation was explicitly set
q = new StringBuffer("SELECT ")
.append(idfield)
.append(" FROM ")
.append(table)
.append(" ")
.append(home.getSubnodeRelation())
.toString();
q = "SELECT "+idfield+" FROM "+table+" "+home.getSubnodeRelation();
} else {
// let relation object build the query
q = new StringBuffer("SELECT ")
.append(idfield)
.append(" FROM ")
.append(table)
.append(rel.buildQuery (home,
home.getNonVirtualParent (), null,
" WHERE ", true))
.toString();
q = "SELECT "+idfield+" FROM "+table + rel.buildQuery (home, home.getNonVirtualParent (), null, " WHERE ", true);
}
if (logSql)
@ -721,7 +695,7 @@ public final class NodeManager {
if (rel.maxSize > 0)
stmt.setMaxRows (rel.maxSize);
ResultSet result = stmt.executeQuery (q);
// problem: how do we derive a SyntheticKey from a not-yet-persistent Node?
Key k = rel.groupby != null ? home.getKey (): null;
while (result.next ()) {
@ -732,8 +706,8 @@ public final class NodeManager {
continue;
// make the proper key for the object, either a generic DB key or a groupby key
Key key = rel.groupby == null ?
(Key) new DbKey (rel.otherType, kstr) :
(Key) new SyntheticKey (k, kstr);
(Key) new DbKey (rel.otherType, kstr) :
(Key) new SyntheticKey (k, kstr);
retval.add (new NodeHandle (key));
// if these are groupby nodes, evict nullNode keys
if (rel.groupby != null) {
@ -776,7 +750,7 @@ public final class NodeManager {
Connection con = dbm.getConnection ();
Statement stmt = con.createStatement ();
DbColumn[] columns = dbm.getColumns ();
String[] columns = dbm.getColumns ();
StringBuffer q = dbm.getSelect ();
try {
if (home.getSubnodeRelation() != null) {
@ -834,7 +808,7 @@ public final class NodeManager {
if (missing > 0) {
Connection con = dbm.getConnection ();
Statement stmt = con.createStatement ();
DbColumn[] columns = dbm.getColumns ();
String[] columns = dbm.getColumns ();
StringBuffer q = dbm.getSelect ();
try {
String idfield = rel.groupby != null ? rel.groupby : dbm.getIDField ();
@ -861,10 +835,8 @@ public final class NodeManager {
q.append (") ");
if (rel.groupby != null) {
q.append (rel.renderConstraints (home, home.getNonVirtualParent ()));
if (rel.order != null) {
q.append (" ORDER BY ");
q.append (rel.order);
}
if (rel.order != null)
q.append (" ORDER BY "+rel.order);
}
if (logSql)
@ -965,27 +937,19 @@ public final class NodeManager {
Statement stmt = null;
try {
String q = null;
if (home.getSubnodeRelation() != null) {
// use the manually set subnoderelation of the home node
q = new StringBuffer("SELECT count(*) FROM ")
.append(table)
.append(" ")
.append(home.getSubnodeRelation())
.toString();
q = "SELECT count(*) FROM "+table+" "+home.getSubnodeRelation();
} else {
// let relation object build the query
q = new StringBuffer("SELECT count(*) FROM ")
.append(table)
.append(rel.buildQuery (home, home.getNonVirtualParent(),
null, " WHERE ", false))
.toString();
q = "SELECT count(*) FROM "+table + rel.buildQuery (home, home.getNonVirtualParent (), null, " WHERE ", false);
}
if (logSql)
app.logEvent ("### countNodes: "+q);
stmt = con.createStatement();
ResultSet rs = stmt.executeQuery (q);
@ -1026,13 +990,7 @@ public final class NodeManager {
Statement stmt = null;
try {
String q = new StringBuffer("SELECT ")
.append(namefield)
.append(" FROM ")
.append(table)
.append(" ORDER BY ")
.append(namefield)
.toString();
String q = "SELECT "+namefield+" FROM "+table+" ORDER BY "+namefield;
stmt = con.createStatement ();
if (logSql)
@ -1079,7 +1037,7 @@ public final class NodeManager {
Connection con = dbm.getConnection ();
stmt = con.createStatement ();
DbColumn[] columns = dbm.getColumns ();
String[] columns = dbm.getColumns ();
StringBuffer q = dbm.getSelect ();
q.append ("WHERE ");
q.append (idfield);
@ -1141,7 +1099,7 @@ public final class NodeManager {
DbMapping dbm = rel.otherType;
Connection con = dbm.getConnection ();
DbColumn[] columns = dbm.getColumns ();
String[] columns = dbm.getColumns ();
StringBuffer q = dbm.getSelect ();
if (home.getSubnodeRelation () != null) {
// combine our key with the constraints in the manually set subnode relation
@ -1186,7 +1144,7 @@ public final class NodeManager {
}
/**
* Get a DbMapping for a given prototype name. This is just a proxy
* Get a DbMapping for a given prototype name. This is just a proxy
* method to the app's getDbMapping() method.
*/
public DbMapping getDbMapping (String protoname) {