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

@ -1,97 +1,93 @@
This is the README file for version 1.2 of Helma Object Publisher.
===========
ABOUT HELMA
===========
============================
ABOUT HELMA OBJECT PUBLISHER
============================
Helma is a scriptable platform for creating dynamic, database backed
web sites.
Helma Object Publisher is a web application server.
Helma provides an easy way to map relational database tables to objects.
These objects are wrapped with a layer of scripts and skins that allow
them to be presented and manipulated over the web. The clue here is that
both functions and skins work in an object oriented manner and force
a clear separation between content, functionality and presentation.
Actions are special functions that are callable over the web. Macros are
special functions that expose functionality to the presentation layer.
Skins are pieces of layout that do not contain any application logic,
only macro tags as placeholders for parts that are dynamically provided
by the application.
With Helma Object Publisher (sometimes simply refered to as Helma or
Hop) you can define Objects and map them to a relational database
table. These so-called HopObjects can be created, modified and deleted
using a comfortable object/container model. Hence, no manual fiddling
around with database code is necessary.
HopObjects are extended JavaScript objects which can be scripted using
server-side JavaScript. Beyond the common JavaScript features, Helma
provides special "skin" and template functionalities which facilitate
the rendering of objects via a web interface.
Thanks to Helma's relational database mapping technology, HopObjects
create a hierarchical structure, the Url space of a Helma site. The
parts between slashes in a Helma Url represent HopObjects (similar to
the document tree in static sites). The Helma Url space can be thought
of as an analogy to the Document Object Model (Dom) in client-side
JavaScript.
In short, Helma provides a one stop framework to create web applications
with less code and in shorter time than most of the other software out
there.
===================
SYSTEM REQUIREMENTS
===================
You need a Java virtual machine 1.3 or higher to run Helma.
Windows: 1) On Windows Helma won't run with Microsoft's version of
Java (jview). You can get a compatible Java runtime from Sun or IBM:
http://java.sun.com/j2se/1.3/jre/download-windows.html
http://www.ibm.com/java/jdk/download/ 2) In the Windows start script
I've hardcoded c:\java\lib\classes.zip in the CLASSPATH argument. Not
good.
For Windows, Linux and Solaris you can get a Java runtime or development
kit from http://java.sun.com/j2se/downloads.html.
Macintosh: 1) If you are using the Mac version you should own a G3 CPU
and/or have MRJ 2.2 (http://www.apple.com/java) installed. Other
platforms have less frustration potential. The Mac OS version
currently is not up-to-date (version 0.1).
If you are on Mac OS X, you already have a Java runtime that will work
well with Helma.
Linux: The recomended virtual machine for running Helma on Linux is
Blackdown's port of JDK 1.2.2 RC4
(http://www.blackdown.org/java-linux/mirrors.html). JDK 1.1.7v3 will
work, but much slower and show a lot of CPU activity even when the
Helma is idle. IBM's version of JDK 1.1.8 also works well, but this
JVM has some problems of its own with thread handling.
Unfortunately, there is no Java 2 interpreter for Mac OS Classic, so
you can't use Helma on Mac OS 9.
============================
INSTALLING AND RUNNING HELMA
============================
Simply unzip or untar the contents of the archive file into any place
on your hard disk. Start Helma by invoking hop.bat or hop.sh from the
command line, depending on whether you are on Windows or
Linux/Unix/MacOSX. If the java command is not found, try setting the
JAVA_HOME variable in the start script to the location of your Java
installation.
You may also want to have a look at the start script for other settings.
You can adjust server wide settings in the server.properties file. For
example, you should set the smtp property to the name of the SMTP server
that Helma should use to send Email. Applications can be started or
stopped by editing the apps.properties file through the web interface
using the Management application that is part of Helma.
Simply unzip the contents of the archive file into any place on your
hard disk. Start Helma by opening the file hop.bat or hop.sh,
respectively.
If you manage to get it running you should be able to connect your
browser to http://localhost:8080/ or http://127.0.0.1:8080/
(port 8080 on the local machine, that is).
browser to http://127.0.0.1:8080/ (port 8080, that is).
Helma comes with a version of Jetty, a lightweight yet industrial strenth
web server developed by Mortbay Consulting. See http://jetty.mortbay.com/
for more information. While Jetty works well for deploying real web sites,
you may want to run Helma behind an existing web server. This is most
easily done by running Helma with the AJPv13 listener which allows you to
plug Helma into any web server using the Apache mod_jk module. See
http://jakarta.apache.org/tomcat/tomcat-4.1-doc/jk2/index.html for more
information on mod_jk and AJPv13.
This version is set up to use its own embedded Web server and a very
basic embedded object database. For this reason it is able to run
virtually without installation on any platform with a Java 1.1 virtual
machine.
Finally, Helma can be plugged into Servlet containers using Servlet
classes that communicate with Helma either directly or via Java RMI.
(Be warned that these options may be harder to set up and maintain though,
since most of the recent development efforts have been geared towards the
mod_jk/AJPv13 setup.)
On the other hand, the embedded Web server and object db are meant for
development work and not ready for prime time deployment. For that
you'd probably use an external relational database, the Berkeley DB
package and a full featured Web server like Apache.
=====================================
DOCUMENTATION AND FURTHER INFORMATION
=====================================
Currently, documentation-in-progress is available online at
http://helma.org/. We know that it sucks and hope to do some substantial
improvments within the coming weeks and months.
Currently, a documentation-in-progress is available online only.
Please refer to http://helma.org/docs/.
Your input is highly welcome. There is a mailing-list to discuss Helma at
http://helma.org/lists/listinfo/hop. Don't hesitate to voice any questions,
proposals, complaints, praise you may have on the list. We know we have
a lot to do and to learn, and we're open to suggestions.
For further information http://helma.org generally is a good place.
There is also a mailing-list about Helma-related stuff available at
http://helma.org/lists/listinfo/hop.
For questions, comments or suggestions feel free to contact
tobi@helma.at.
For questions, comments or suggestions also feel free to contact
hannes@helma.at.
--
Last modified on December 5, 2002 by Hannes Wallnoefer <hannes@helma.at>
This document was last modified on Friday 22 June 2001 by
tobi@helma.at

View file

@ -44,100 +44,78 @@ Object Publisher, a powerful and fast scriptable open source web
application server (which itself is written in Java). Antville works
with a relational database in the backend.
Check out http://project.antville.org/ for more information.
============================
ABOUT HELMA OBJECT PUBLISHER
============================
===========
ABOUT HELMA
===========
Helma Object Publisher is a web application server.
Helma is a scriptable platform for creating dynamic, database backed
web sites.
With Helma Object Publisher (sometimes simply refered to as Helma or
Hop) you can define Objects and map them to a relational database
table. These so-called HopObjects can be created, modified and deleted
using a comfortable object/container model. Hence, no manual fiddling
around with database code is necessary.
Helma provides an easy way to map relational database tables to objects.
These objects are wrapped with a layer of scripts and skins that allow
them to be presented and manipulated over the web. The clue here is that
both functions and skins work in an object oriented manner and force
a clear separation between content, functionality and presentation.
Actions are special functions that are callable over the web. Macros are
special functions that expose functionality to the presentation layer.
Skins are pieces of layout that do not contain any application logic,
only macro tags as placeholders for parts that are dynamically provided
by the application.
HopObjects are extended JavaScript objects which can be scripted using
server-side JavaScript. Beyond the common JavaScript features, Helma
provides special "skin" and template functionalities which facilitate
the rendering of objects via a web interface.
Thanks to Helma's relational database mapping technology, HopObjects
create a hierarchical structure, the Url space of a Helma site. The
parts between slashes in a Helma Url represent HopObjects (similar to
the document tree in static sites). The Helma Url space can be thought
of as an analogy to the Document Object Model (Dom) in client-side
JavaScript.
In short, Helma provides a one stop framework to create web applications
with less code and in shorter time than most of the other software out
there.
===================
SYSTEM REQUIREMENTS
===================
You need a Java virtual machine 1.3 or higher to run Helma.
You need Java 2 runtime version 1.3 or higher to run Helma. Helma has
been used successfully on Windows, Linux and Mac OS X platforms.
For Windows, Linux and Solaris you can get a Java runtime or development
kit from http://java.sun.com/j2se/downloads.html.
If you are on Mac OS X, you already have a Java runtime that will work
well with Helma.
Unfortunately, there is no Java 2 interpreter for Mac OS Classic, so
you can't use Helma on Mac OS 9.
============================
INSTALLING AND RUNNING HELMA
============================
Simply unzip or untar the contents of the archive file into any place
on your hard disk. Start Helma by invoking hop.bat or hop.sh from the
command line, depending on whether you are on Windows or
Linux/Unix/MacOSX. If the java command is not found, try setting the
JAVA_HOME variable in the start script to the location of your Java
installation.
You may also want to have a look at the start script for other settings.
You can adjust server wide settings in the server.properties file. For
example, you should set the smtp property to the name of the SMTP server
that Helma should use to send Email. Applications can be started or
stopped by editing the apps.properties file through the web interface
using the Management application that is part of Helma.
Simply unzip the contents of the archive file into any place on your
hard disk. Start Helma by opening the file hop.bat or hop.sh,
respectively.
If you manage to get it running you should be able to connect your
browser to http://localhost:8080/ or http://127.0.0.1:8080/
(port 8080 on the local machine, that is).
browser to http://127.0.0.1:8080/ (port 8080, that is).
Helma comes with a version of Jetty, a lightweight yet industrial strenth
web server developed by Mortbay Consulting. See http://jetty.mortbay.com/
for more information. While Jetty works well for deploying real web sites,
you may want to run Helma behind an existing web server. This is most
easily done by running Helma with the AJPv13 listener which allows you to
plug Helma into any web server using the Apache mod_jk module. See
http://jakarta.apache.org/tomcat/tomcat-4.1-doc/jk2/index.html for more
information on mod_jk and AJPv13.
This version is set up to use its own embedded Web server and a very
basic embedded object database. For this reason it is able to run
virtually without installation on any platform with a Java 1.1 virtual
machine.
Finally, Helma can be plugged into Servlet containers using Servlet
classes that communicate with Helma either directly or via Java RMI.
(Be warned that these options may be harder to set up and maintain though,
since most of the recent development efforts have been geared towards the
mod_jk/AJPv13 setup.)
On the other hand, the embedded Web server and object db are meant for
development work and not ready for prime time deployment. For that
you'd probably use an external relational database, the Berkeley DB
package and a full featured Web server like Apache.
=====================================
DOCUMENTATION AND FURTHER INFORMATION
=====================================
Currently, documentation-in-progress is available online at
http://helma.org/. We know that it sucks and hope to do some substantial
improvments within the coming weeks and months.
Currently, a documentation-in-progress is available online only.
Please refer to http://helma.org/.
Your input is highly welcome. There is a mailing-list to discuss Helma at
http://helma.org/lists/listinfo/hop. Don't hesitate to voice any questions,
proposals, complaints, praise you may have on the list. We know we have
a lot to do and to learn, and we're open to suggestions.
For further information http://helma.org generally is a good place.
There is also a mailing-list about Helma-related stuff available at
http://helma.org/lists/listinfo/hop.
For questions, comments or suggestions feel free to contact
tobi@helma.at.
For questions, comments or suggestions also feel free to contact
antville@helma.org.
--
Last modified on December 5, 2002 by Hannes Wallnoefer <hannes@helma.at>
This document was last modified on Friday 25 October 2002 by
hannes@helma.at

View file

@ -35,7 +35,7 @@ rem set JAVA_OPTIONS=-server -Xmx128m
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Setting the script path
set INSTALL_DIR=%~d0%~p0
set SCRIPT_DIR=%~d0%~p0
:: Using JAVA_HOME variable if defined. Otherwise,
:: Java executable must be contained in PATH variable
@ -48,7 +48,7 @@ if "%JAVA_HOME%"=="" goto default
:: Setting HOP_HOME to script path if undefined
if "%HOP_HOME%"=="" (
set HOP_HOME=%INSTALL_DIR%
set HOP_HOME=%SCRIPT_DIR%
)
cd %HOP_HOME%
@ -76,4 +76,4 @@ if not "%HOP_HOME%"=="" (
)
:: Invoking the Java virtual machine
%JAVACMD% %JAVA_OPTIONS% -jar "%INSTALL_DIR%\launcher.jar" %OPTIONS%
%JAVACMD% %JAVA_OPTIONS% -jar launcher.jar %OPTIONS%

View file

@ -32,11 +32,6 @@ else
JAVACMD=java
fi
# Get the Helma installation directory
INSTALL_DIR="${0%/*}"
cd $INSTALL_DIR
INSTALL_DIR=$PWD
# get HOP_HOME variable if it isn't set
if test -z "$HOP_HOME"; then
# try to get HOP_HOME from script file and pwd
@ -69,5 +64,5 @@ if [ "$HOP_HOME" ]; then
SWITCHES="$SWITCHES -h $HOP_HOME"
fi
# Invoke the Java VM
$JAVACMD $JAVA_OPTIONS -jar "$INSTALL_DIR/launcher.jar" $SWITCHES
# Invoking the Java VM
$JAVACMD $JAVA_OPTIONS -jar launcher.jar $SWITCHES

View file

@ -8,7 +8,7 @@
<target name="init">
<property name="Name" value="helma"/>
<property name="year" value="1998-${year}"/>
<property name="version" value="1.2-rc2"/>
<property name="version" value="1.2-rc1"/>
<property name="project" value="helma"/>
<property name="build.compiler" value="classic"/>
@ -28,7 +28,7 @@
<property name="jar.name" value="${project}"/>
<property name="package.name" value="${project}-${version}"/>
<property name="antclick.name" value="antclick-1.0pre3"/>
<property name="antclick.name" value="antclick-1.0pre2"/>
<property name="debug" value="on"/>
<property name="optimize" value="on"/>
@ -196,13 +196,10 @@
<!-- copy the launcher jar file -->
<copy file="${home.dir}/launcher.jar" todir="${build.work}/"/>
<!-- copy README.txt -->
<copy file="${home.dir}/README.txt" todir="${build.work}/"/>
<!-- copy the whole docs-directory -->
<!-- copy todir="${build.work}/docs">
<copy todir="${build.work}/docs">
<fileset dir="${build.docs}"/>
</copy -->
</copy>
<!-- copy all libraries except helma-YYYYMMDD.jar -->
<copy todir="${build.work}/lib">

View file

@ -35,7 +35,7 @@ rem set JAVA_OPTIONS=-server -Xmx128m
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Setting the script path
set INSTALL_DIR=%~d0%~p0
set SCRIPT_DIR=%~d0%~p0
:: Using JAVA_HOME variable if defined. Otherwise,
:: Java executable must be contained in PATH variable
@ -48,7 +48,7 @@ if "%JAVA_HOME%"=="" goto default
:: Setting HOP_HOME to script path if undefined
if "%HOP_HOME%"=="" (
set HOP_HOME=%INSTALL_DIR%
set HOP_HOME=%SCRIPT_DIR%
)
cd %HOP_HOME%
@ -76,4 +76,4 @@ if not "%HOP_HOME%"=="" (
)
:: Invoking the Java virtual machine
%JAVACMD% %JAVA_OPTIONS% -jar "%INSTALL_DIR%\launcher.jar" %OPTIONS%
%JAVACMD% %JAVA_OPTIONS% -jar launcher.jar %OPTIONS%

9
hop.sh
View file

@ -32,11 +32,6 @@ else
JAVACMD=java
fi
# Get the Helma installation directory
INSTALL_DIR="${0%/*}"
cd $INSTALL_DIR
INSTALL_DIR=$PWD
# get HOP_HOME variable if it isn't set
if test -z "$HOP_HOME"; then
# try to get HOP_HOME from script file and pwd
@ -69,5 +64,5 @@ if [ "$HOP_HOME" ]; then
SWITCHES="$SWITCHES -h $HOP_HOME"
fi
# Invoke the Java VM
$JAVACMD $JAVA_OPTIONS -jar "$INSTALL_DIR/launcher.jar" $SWITCHES
# Invoking the Java VM
$JAVACMD $JAVA_OPTIONS -jar launcher.jar $SWITCHES

Binary file not shown.

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!");
@ -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

@ -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;
@ -122,8 +116,6 @@ public final class DbMapping implements Updatable {
prop2db = new HashMap ();
db2prop = new HashMap ();
columnMap = new HashMap ();
parent = null;
idField = 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);
}
@ -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 ())
@ -695,23 +682,10 @@ public final class NodeManager {
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)
@ -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)
@ -969,18 +941,10 @@ public final class NodeManager {
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)
@ -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