You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ke...@apache.org on 2011/04/21 22:48:54 UTC

svn commit: r1095816 - in /incubator/isis/trunk/runtimes/dflt/objectstores/sql: impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/ impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/ impl/src/main/java/org/apache/isi...

Author: kevin
Date: Thu Apr 21 20:48:54 2011
New Revision: 1095816

URL: http://svn.apache.org/viewvc?rev=1095816&view=rev
Log:
Redefined SQL dataclasses as replaceable variables, defined and initialised in JdbcConnector and used by JdbcFieldMappingFactoryInstaller.
Updated documentation.

Modified:
    incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/FieldMappingLookup.java
    incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/IdMappingAbstract.java
    incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/VersionMapping.java
    incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcConnector.java
    incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcGeneralValueMapper.java
    incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/installer/JdbcFieldMappingFactoryInstaller.java
    incubator/isis/trunk/runtimes/dflt/objectstores/sql/src/docbkx/guide/isis-sql-objectstore.xml
    incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/testsystem/dataclasses/SimpleClassTwo.java
    incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/test/config/hsql.properties

Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/FieldMappingLookup.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/FieldMappingLookup.java?rev=1095816&r1=1095815&r2=1095816&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/FieldMappingLookup.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/FieldMappingLookup.java Thu Apr 21 20:48:54 2011
@@ -17,7 +17,6 @@
  *  under the License.
  */
 
-
 package org.apache.isis.runtimes.dflt.objectstores.sql;
 
 import java.util.HashMap;
@@ -28,6 +27,7 @@ import org.apache.log4j.Logger;
 import org.apache.isis.core.commons.exceptions.NotYetImplementedException;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcConnector;
 import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcGeneralValueMapper;
 import org.apache.isis.runtimes.dflt.objectstores.sql.mapping.FieldMapping;
 import org.apache.isis.runtimes.dflt.objectstores.sql.mapping.FieldMappingFactory;
@@ -35,11 +35,12 @@ import org.apache.isis.runtimes.dflt.obj
 import org.apache.isis.runtimes.dflt.objectstores.sql.mapping.ObjectReferenceMappingFactory;
 import org.apache.isis.runtimes.dflt.runtime.context.IsisContext;
 
-
 public class FieldMappingLookup {
     private static final Logger LOG = Logger.getLogger(FieldMappingLookup.class);
-    private final Map<ObjectSpecification, FieldMappingFactory> fieldMappings = new HashMap<ObjectSpecification, FieldMappingFactory>();
-    private final Map<ObjectSpecification, ObjectReferenceMappingFactory> referenceMappings = new HashMap<ObjectSpecification, ObjectReferenceMappingFactory>();
+    private final Map<ObjectSpecification, FieldMappingFactory> fieldMappings =
+        new HashMap<ObjectSpecification, FieldMappingFactory>();
+    private final Map<ObjectSpecification, ObjectReferenceMappingFactory> referenceMappings =
+        new HashMap<ObjectSpecification, ObjectReferenceMappingFactory>();
     private FieldMappingFactory referenceFieldMappingfactory;
     private ObjectReferenceMappingFactory objectReferenceMappingfactory;
 
@@ -49,22 +50,22 @@ public class FieldMappingLookup {
         if (factory != null) {
             return factory.createFieldMapping(field);
         } else if (spec.isEncodeable()) {
-            factory = new JdbcGeneralValueMapper.Factory("VARCHAR(65)");
+            factory = new JdbcGeneralValueMapper.Factory(JdbcConnector.TYPE_DEFAULT());
             addFieldMappingFactory(spec, factory);
             return factory.createFieldMapping(field);
-        } else {//if (true /* TODO test for reference */) {
+        } else {// if (true /* TODO test for reference */) {
             factory = referenceFieldMappingfactory;
             addFieldMappingFactory(spec, factory);
             return factory.createFieldMapping(field);
-        //} else {
-            //throw new IsisException("No mapper for " + spec + " (no default mapper)");
+            // } else {
+            // throw new IsisException("No mapper for " + spec + " (no default mapper)");
         }
     }
 
     public ObjectReferenceMapping createMapping(ObjectSpecification spec) {
         return createMapping(spec.getShortIdentifier(), spec);
     }
-    
+
     public ObjectReferenceMapping createMapping(String columnName, ObjectSpecification spec) {
         ObjectReferenceMappingFactory factory = referenceMappings.get(spec);
         if (factory != null) {
@@ -74,13 +75,13 @@ public class FieldMappingLookup {
             throw new NotYetImplementedException();
         } else {// if (true /* TODO test for reference */) {
             factory = objectReferenceMappingfactory;
-         //   add(spec, factory);
+            // add(spec, factory);
             return factory.createReferenceMapping(columnName, spec); // TODO: here
-        //} else {
-        //    throw new IsisException("No mapper for " + spec + " (no default mapper)");
+            // } else {
+            // throw new IsisException("No mapper for " + spec + " (no default mapper)");
         }
     }
-    
+
     public void addFieldMappingFactory(final Class<?> valueType, final FieldMappingFactory mapper) {
         ObjectSpecification spec = IsisContext.getSpecificationLoader().loadSpecification(valueType);
         addFieldMappingFactory(spec, mapper);
@@ -91,13 +92,14 @@ public class FieldMappingLookup {
         fieldMappings.put(specification, mapper);
     }
 
-    public void addReferenceMappingFactory(final ObjectSpecification specification, final ObjectReferenceMappingFactory mapper) {
-       LOG.debug("add mapper " + mapper + " for " + specification);
-       referenceMappings.put(specification, mapper);
+    public void addReferenceMappingFactory(final ObjectSpecification specification,
+        final ObjectReferenceMappingFactory mapper) {
+        LOG.debug("add mapper " + mapper + " for " + specification);
+        referenceMappings.put(specification, mapper);
     }
 
     public void init() {
-    // fieldMappingFactory.load(this);
+        // fieldMappingFactory.load(this);
     }
 
     public IdMapping createIdMapping() {

Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/IdMappingAbstract.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/IdMappingAbstract.java?rev=1095816&r1=1095815&r2=1095816&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/IdMappingAbstract.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/IdMappingAbstract.java Thu Apr 21 20:48:54 2011
@@ -19,101 +19,95 @@
 
 package org.apache.isis.runtimes.dflt.objectstores.sql;
 
-import org.apache.isis.runtimes.dflt.objectstores.sql.SqlOid.State;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.runtimes.dflt.objectstores.sql.SqlOid.State;
+import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcConnector;
 import org.apache.isis.runtimes.dflt.runtime.context.IsisContext;
 import org.apache.isis.runtimes.dflt.runtime.persistence.adaptermanager.AdapterManager;
 import org.apache.isis.runtimes.dflt.runtime.persistence.oidgenerator.simple.SerialOid;
 
 public class IdMappingAbstract {
-	private String column;
+    private String column;
 
-	protected void setColumn(String column) {
-		this.column = Sql.identifier(column);
-	}
-
-	protected String getColumn() {
-		return column;
-	}
-
-	public void appendWhereClause(DatabaseConnector connector,
-			StringBuffer sql, Oid oid) {
-		sql.append(column);
-		connector.addToQueryValues(primaryKeyAsObject(oid));
-		sql.append(" = ?");
-	}
-
-	public void appendCreateColumnDefinitions(StringBuffer sql) {
-		sql.append(column);
-		sql.append(" ");
-		sql.append("INTEGER NOT NULL PRIMARY KEY");
-	}
-
-	public void appendColumnDefinitions(StringBuffer sql) {
-		sql.append(column);
-		sql.append(" ");
-		sql.append("INTEGER");
-	}
-
-	public void appendColumnNames(StringBuffer sql) {
-		sql.append(column);
-	}
-
-	public void appendInsertValues(DatabaseConnector connector,
-			StringBuffer sql, ObjectAdapter object) {
-		if (object == null) {
-			sql.append("NULL");
-		} else {
-			sql.append(connector.addToQueryValues(primaryKeyAsObject(object
-					.getOid())));
-		}
-	}
-
-	/*
-	 * This doesn't have to be an Int, it should be any object.
-	 */
-	public Object primaryKeyAsObject(final Oid oid) {
-		if (oid instanceof SqlOid) {
-			PrimaryKey pk = ((SqlOid) oid).getPrimaryKey();
-			return pk.naturalValue();
-		} else
-			return ((SerialOid) oid).getSerialNo();
-	}
-
-	public String primaryKey(final Oid oid) {
-		if (oid instanceof SqlOid)
-			return "" + ((SqlOid) oid).getPrimaryKey().stringValue() + "";
-		else
-			return "" + ((SerialOid) oid).getSerialNo();
-	}
-
-	public Oid recreateOid(final Results rs,
-			final ObjectSpecification specification) {
-		PrimaryKey key;
-		Object object = rs.getObject(column);
-		if (object == null) {
-			return null;
-		} else {
-			int id = ((Integer) object).intValue();
-			key = new IntegerPrimaryKey(id);
-		}
-		Oid oid = new SqlOid(specification.getFullIdentifier(), key, State.PERSISTENT);
-		return oid;
-	}
-
-	protected ObjectAdapter getAdapter(final ObjectSpecification specification,
-			final Oid oid) {
-		AdapterManager objectLoader = IsisContext.getPersistenceSession()
-				.getAdapterManager();
-		ObjectAdapter adapter = objectLoader.getAdapterFor(oid);
-		if (adapter != null) {
-			return adapter;
-		} else {
-			return IsisContext.getPersistenceSession().recreateAdapter(oid,
-					specification);
-		}
-	}
+    protected void setColumn(String column) {
+        this.column = Sql.identifier(column);
+    }
+
+    protected String getColumn() {
+        return column;
+    }
+
+    public void appendWhereClause(DatabaseConnector connector, StringBuffer sql, Oid oid) {
+        sql.append(column);
+        connector.addToQueryValues(primaryKeyAsObject(oid));
+        sql.append(" = ?");
+    }
+
+    public void appendCreateColumnDefinitions(StringBuffer sql) {
+        sql.append(column);
+        sql.append(" ");
+        sql.append(JdbcConnector.TYPE_PK() + " NOT NULL PRIMARY KEY");
+    }
+
+    public void appendColumnDefinitions(StringBuffer sql) {
+        sql.append(column);
+        sql.append(" ");
+        sql.append(JdbcConnector.TYPE_PK());
+    }
+
+    public void appendColumnNames(StringBuffer sql) {
+        sql.append(column);
+    }
+
+    public void appendInsertValues(DatabaseConnector connector, StringBuffer sql, ObjectAdapter object) {
+        if (object == null) {
+            sql.append("NULL");
+        } else {
+            sql.append(connector.addToQueryValues(primaryKeyAsObject(object.getOid())));
+        }
+    }
+
+    /*
+     * This doesn't have to be an Int, it should be any object.
+     */
+    public Object primaryKeyAsObject(final Oid oid) {
+        if (oid instanceof SqlOid) {
+            PrimaryKey pk = ((SqlOid) oid).getPrimaryKey();
+            return pk.naturalValue();
+        } else
+            return ((SerialOid) oid).getSerialNo();
+    }
+
+    public String primaryKey(final Oid oid) {
+        if (oid instanceof SqlOid)
+            return "" + ((SqlOid) oid).getPrimaryKey().stringValue() + "";
+        else
+            return "" + ((SerialOid) oid).getSerialNo();
+    }
+
+    public Oid recreateOid(final Results rs, final ObjectSpecification specification) {
+        PrimaryKey key;
+        Object object = rs.getObject(column);
+        if (object == null) {
+            return null;
+        } else {
+            int id = ((Integer) object).intValue();
+            key = new IntegerPrimaryKey(id);
+        }
+        Oid oid = new SqlOid(specification.getFullIdentifier(), key, State.PERSISTENT);
+        return oid;
+    }
+
+    protected ObjectAdapter getAdapter(final ObjectSpecification specification, final Oid oid) {
+        AdapterManager objectLoader = IsisContext.getPersistenceSession().getAdapterManager();
+        ObjectAdapter adapter = objectLoader.getAdapterFor(oid);
+        if (adapter != null) {
+            return adapter;
+        } else {
+            return IsisContext.getPersistenceSession().recreateAdapter(oid, specification);
+        }
+    }
 
 }

Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/VersionMapping.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/VersionMapping.java?rev=1095816&r1=1095815&r2=1095816&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/VersionMapping.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/VersionMapping.java Thu Apr 21 20:48:54 2011
@@ -84,7 +84,7 @@ public class VersionMapping {
 
         sql.append(",");
         sql.append(lastActivityDateColumn);
-        sql.append(" " + JdbcConnector.timeStampType());
+        sql.append(" " + JdbcConnector.TYPE_TIMESTAMP());
 
         return sql.toString();
     }

Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcConnector.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcConnector.java?rev=1095816&r1=1095815&r2=1095816&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcConnector.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcConnector.java Thu Apr 21 20:48:54 2011
@@ -29,17 +29,18 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
+import org.apache.log4j.Logger;
+import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
+
+import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.commons.debug.DebugBuilder;
 import org.apache.isis.runtimes.dflt.objectstores.sql.AbstractDatabaseConnector;
 import org.apache.isis.runtimes.dflt.objectstores.sql.Results;
 import org.apache.isis.runtimes.dflt.objectstores.sql.SqlMetaData;
 import org.apache.isis.runtimes.dflt.objectstores.sql.SqlObjectStore;
 import org.apache.isis.runtimes.dflt.objectstores.sql.SqlObjectStoreException;
-import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.commons.debug.DebugBuilder;
 import org.apache.isis.runtimes.dflt.runtime.context.IsisContext;
-import org.apache.log4j.Logger;
-import org.joda.time.DateTimeZone;
-import org.joda.time.LocalDate;
 
 public class JdbcConnector extends AbstractDatabaseConnector {
     private static final Logger LOG = Logger.getLogger(JdbcConnector.class);
@@ -155,17 +156,26 @@ public class JdbcConnector extends Abstr
      * return new JdbcResults(statement); } catch (SQLException e) { throw new ObjectAdapterRuntimeException(e); } }
      */
 
-    // static String TYPE_BOOLEAN;
+    static String TYPE_BOOLEAN;
     static String TYPE_TIMESTAMP;
     static String TYPE_DATETIME;
     static String TYPE_DATE;
     static String TYPE_TIME;
+    static String TYPE_SHORT;
+    static String TYPE_DOUBLE;
+    static String TYPE_FLOAT;
+    static String TYPE_LONG;
+    static String TYPE_INT;
+    static String TYPE_PK;
+    static String TYPE_STRING;
+    static String TYPE_PASSWORD;
+    static String TYPE_DEFAULT;
 
     /**
      * Default SQL data types used to define the fields in the database. By providing this method, we allow the user an
-     * opportunity to override these types by specifying alternatives in sql.properties (or which ever). 
-     * For example, Postgresql does not know about DATETIME, but can use TIMESTAMP instead.
-     *  
+     * opportunity to override these types by specifying alternatives in sql.properties (or which ever). For example,
+     * Postgresql does not know about DATETIME, but can use TIMESTAMP instead.
+     * 
      * @param dataTypes
      * @param baseName
      */
@@ -174,12 +184,62 @@ public class JdbcConnector extends Abstr
         TYPE_DATETIME = dataTypes.getString(baseName + "datetime", "DATETIME");
         TYPE_DATE = dataTypes.getString(baseName + "date", "DATE");
         TYPE_TIME = dataTypes.getString(baseName + "time", "TIME");
+        TYPE_DOUBLE = dataTypes.getString(baseName + "double", "FLOAT");
+        TYPE_FLOAT = dataTypes.getString(baseName + "float", "FLOAT");
+        TYPE_SHORT = dataTypes.getString(baseName + "short", "INT");
+        TYPE_LONG = dataTypes.getString(baseName + "long", "INT");
+        TYPE_INT = dataTypes.getString(baseName + "int", "INT");
+        TYPE_BOOLEAN = dataTypes.getString(baseName + "boolean", "CHAR(1)");
+        TYPE_PK = dataTypes.getString(baseName + "primarykey", "INTEGER");
+        TYPE_STRING = dataTypes.getString(baseName + "string", "VARCHAR(65)");
+        TYPE_PASSWORD = dataTypes.getString(baseName + "password", "VARCHAR(12)");
+        TYPE_DEFAULT = dataTypes.getString(baseName + "default", "VARCHAR(65)");
     }
 
-    public static String timeStampType() {
+    public static String TYPE_TIMESTAMP() {
         return TYPE_TIMESTAMP;
     }
 
+    public static String TYPE_SHORT() {
+        return TYPE_SHORT;
+    }
+
+    public static String TYPE_INT() {
+        return TYPE_INT;
+    }
+
+    public static String TYPE_LONG() {
+        return TYPE_LONG;
+    }
+
+    public static String TYPE_FLOAT() {
+        return TYPE_FLOAT;
+    }
+
+    public static String TYPE_DOUBLE() {
+        return TYPE_DOUBLE;
+    }
+
+    public static String TYPE_BOOLEAN() {
+        return TYPE_BOOLEAN;
+    }
+
+    public static String TYPE_PK() {
+        return TYPE_PK;
+    }
+
+    public static String TYPE_STRING() {
+        return TYPE_STRING;
+    }
+
+    public static String TYPE_PASSWORD() {
+        return TYPE_PASSWORD;
+    }
+
+    public static String TYPE_DEFAULT() {
+        return TYPE_DEFAULT;
+    }
+
     @Override
     public Results select(final String sql) {
         LOG.debug("SQL: " + sql);
@@ -222,14 +282,16 @@ public class JdbcConnector extends Abstr
             int i = 1;
             try {
                 for (final Object value : queryValues) {
-                    if (value instanceof LocalDate){
-                        try{
+                    if (value instanceof LocalDate) {
+                        try {
                             statement.setObject(i, value, java.sql.Types.DATE);
-                        } catch (SQLException e){
-                            // This daft catch is required my MySQL, which also requires the TimeZone offset to be "undone"
+                        } catch (SQLException e) {
+                            // This daft catch is required my MySQL, which also requires the TimeZone offset to be
+                            // "undone"
                             LocalDate localDate = (LocalDate) value;
                             int millisOffset = -DateTimeZone.getDefault().getOffset(null);
-                            final Date javaDate = localDate.toDateTimeAtStartOfDay(DateTimeZone.forOffsetMillis(millisOffset)).toDate();
+                            final Date javaDate =
+                                localDate.toDateTimeAtStartOfDay(DateTimeZone.forOffsetMillis(millisOffset)).toDate();
 
                             statement.setObject(i, javaDate, java.sql.Types.DATE);
                         }
@@ -396,4 +458,5 @@ public class JdbcConnector extends Abstr
         queryValues.add(o);
         return "?";
     }
+
 }

Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcGeneralValueMapper.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcGeneralValueMapper.java?rev=1095816&r1=1095815&r2=1095816&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcGeneralValueMapper.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcGeneralValueMapper.java Thu Apr 21 20:48:54 2011
@@ -52,8 +52,6 @@ public class JdbcGeneralValueMapper exte
         this.type = type;
     }
 
-    // TODO:KAM: here X
-
     @Override
     protected Object preparedStatementObject(ObjectAdapter value) {
         if (value == null)

Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/installer/JdbcFieldMappingFactoryInstaller.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/installer/JdbcFieldMappingFactoryInstaller.java?rev=1095816&r1=1095815&r2=1095816&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/installer/JdbcFieldMappingFactoryInstaller.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/installer/JdbcFieldMappingFactoryInstaller.java Thu Apr 21 20:48:54 2011
@@ -17,7 +17,6 @@
  *  under the License.
  */
 
-
 package org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.installer;
 
 import org.apache.isis.applib.value.Color;
@@ -30,6 +29,7 @@ import org.apache.isis.applib.value.Time
 import org.apache.isis.applib.value.TimeStamp;
 import org.apache.isis.runtimes.dflt.objectstores.sql.FieldMappingFactoryInstaller;
 import org.apache.isis.runtimes.dflt.objectstores.sql.FieldMappingLookup;
+import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcConnector;
 import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcDateMapper;
 import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcDateTimeMapper;
 import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcGeneralValueMapper;
@@ -39,24 +39,24 @@ import org.apache.isis.runtimes.dflt.obj
 import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcTimeMapper;
 import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcTimestampMapper;
 
-
 public class JdbcFieldMappingFactoryInstaller implements FieldMappingFactoryInstaller {
 
     @Override
     public void load(FieldMappingLookup lookup) {
-        lookup.addFieldMappingFactory(boolean.class, new JdbcGeneralValueMapper.Factory("CHAR(1)"));
-        lookup.addFieldMappingFactory(short.class, new JdbcGeneralValueMapper.Factory("INT"));
-        lookup.addFieldMappingFactory(int.class, new JdbcGeneralValueMapper.Factory("INT"));
-        lookup.addFieldMappingFactory(long.class, new JdbcGeneralValueMapper.Factory("INT"));
-        lookup.addFieldMappingFactory(float.class, new JdbcGeneralValueMapper.Factory("FLOAT"));
-        lookup.addFieldMappingFactory(double.class, new JdbcGeneralValueMapper.Factory("FLOAT"));
+        lookup.addFieldMappingFactory(boolean.class, new JdbcGeneralValueMapper.Factory(JdbcConnector.TYPE_BOOLEAN()));
+        lookup.addFieldMappingFactory(short.class, new JdbcGeneralValueMapper.Factory(JdbcConnector.TYPE_SHORT()));
+        lookup.addFieldMappingFactory(int.class, new JdbcGeneralValueMapper.Factory(JdbcConnector.TYPE_INT()));
+        lookup.addFieldMappingFactory(long.class, new JdbcGeneralValueMapper.Factory(JdbcConnector.TYPE_LONG()));
+        lookup.addFieldMappingFactory(float.class, new JdbcGeneralValueMapper.Factory(JdbcConnector.TYPE_FLOAT()));
+        lookup.addFieldMappingFactory(double.class, new JdbcGeneralValueMapper.Factory(JdbcConnector.TYPE_DOUBLE()));
         lookup.addFieldMappingFactory(char.class, new JdbcGeneralValueMapper.Factory("CHAR(2)"));
 
         lookup.addFieldMappingFactory(Money.class, new JdbcMoneyValueMapper.Factory("FLOAT", "VARCHAR(3)"));
         lookup.addFieldMappingFactory(Percentage.class, new JdbcGeneralValueMapper.Factory("FLOAT"));
-        lookup.addFieldMappingFactory(Password.class, new JdbcGeneralValueMapper.Factory("VARCHAR(12)"));
-        lookup.addFieldMappingFactory(Color.class, new JdbcGeneralValueMapper.Factory("INT"));
-        lookup.addFieldMappingFactory(String.class, new JdbcGeneralValueMapper.Factory("VARCHAR(65)"));
+        lookup
+            .addFieldMappingFactory(Password.class, new JdbcGeneralValueMapper.Factory(JdbcConnector.TYPE_PASSWORD()));
+        lookup.addFieldMappingFactory(Color.class, new JdbcGeneralValueMapper.Factory(JdbcConnector.TYPE_SHORT()));
+        lookup.addFieldMappingFactory(String.class, new JdbcGeneralValueMapper.Factory(JdbcConnector.TYPE_STRING()));
 
         lookup.addFieldMappingFactory(Date.class, new JdbcDateMapper.Factory());
         lookup.addFieldMappingFactory(Time.class, new JdbcTimeMapper.Factory());
@@ -69,10 +69,9 @@ public class JdbcFieldMappingFactoryInst
         lookup.addFieldMappingFactory(java.sql.Timestamp.class, new JdbcTimestampMapper.Factory());
 
         lookup.setReferenceFieldMappingFactory(new JdbcObjectReferenceFieldMapping.Factory());
-        
-        lookup .setObjectReferenceMappingfactory(new JdbcObjectReferenceMappingFactory());
+
+        lookup.setObjectReferenceMappingfactory(new JdbcObjectReferenceMappingFactory());
 
     }
 
 }
-

Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/src/docbkx/guide/isis-sql-objectstore.xml
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/src/docbkx/guide/isis-sql-objectstore.xml?rev=1095816&r1=1095815&r2=1095816&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/src/docbkx/guide/isis-sql-objectstore.xml (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/src/docbkx/guide/isis-sql-objectstore.xml Thu Apr 21 20:48:54 2011
@@ -83,6 +83,23 @@
     </abstract>
 
     <sect1>
+      <title>Background</title>
+
+      <para>The SQL objectstore provides a fully-automatic object store that
+      uses a SQL-compatible database server.</para>
+
+      <para>All domain objects (entities) are introspected during
+      initialisation, and have a 1-to-1 mapping onto a database table. All
+      properties (values) are mapped onto one or more columns with each
+      database table.</para>
+
+      <para>Domain object classes are introspected and all properties
+      recursively introspected to value types. Thus, if a property stores a
+      reference to a class, that class's properties are introspected,
+      etc.</para>
+    </sect1>
+
+    <sect1>
       <title>Setup</title>
 
       <sect2>
@@ -105,28 +122,192 @@
         <para>The driver property must contain the name of the jdbc driver
         class that provides access to your SQL server. Known examples are
         given below in <xref linkend="sec.servers.tested" />.</para>
+      </sect2>
 
-        <para></para>
+      <sect2>
+        <title>Table Creation</title>
+
+        <para>Missing database tables are automatically created when the SQL
+        objectstore is initialised.</para>
+
+        <para>Please note that changes to domain classes such as renaming
+        fields (properties) or the classes themselves, are
+        <emphasis>not</emphasis> automatically detected. If you rename a
+        property after a table has been created, you should use the
+        appropriate database administration tool to rename the column in the
+        containing table.</para>
+
+        <para>If you rename a domain class (entity), you must also rename the
+        appropriate table.</para>
       </sect2>
     </sect1>
 
     <sect1>
       <title>Mappers</title>
 
-      <para>For persistance, classes are introspected and all properties
-      recursively introspected to value types. Thus, if a property stores a
-      reference to a class, that class's properties are introspected,
-      etc.</para>
+      <para>The mappers take care of mapping a value type onto a SQL data
+      type. Default mappers are provided by JdbcFieldMappingFactoryInstaller.
+      </para>
 
-      <para>By default, the value types are mapped onto SQL data types, as
-      determined by the mappers. Default mappers are provided by
-      AutoMapperFactory.</para>
+      <sect2>
+        <title>Modifiable values</title>
+
+        <para>The following SQL datatypes can be overridden, if specified in
+        the properties file (the default value is given in parenthesis), [the
+        mapped value classes are given in square brackets]:<simplelist>
+            <member>isis.persistor.sql.datatypes.timestamp (DATETIME)
+            [TimeStamp, java.sql.Timestamp]</member>
+          </simplelist></para>
+
+        <para><simplelist>
+            <member>isis.persistor.sql.datatypes.datetime (DATETIME)
+            [DateTime]</member>
+          </simplelist></para>
+
+        <para><simplelist>
+            <member>isis.persistor.sql.datatypes.date (DATE) [Date,
+            java.sql.Date, java.util.Date]</member>
+          </simplelist></para>
+
+        <para><simplelist>
+            <member>isis.persistor.sql.datatypes.time (TIME) [Time]</member>
+          </simplelist></para>
+
+        <para><simplelist>
+            <member>isis.persistor.sql.datatypes.double (FLOAT)
+            [double]</member>
+          </simplelist></para>
+
+        <para><simplelist>
+            <member>isis.persistor.sql.datatypes.float (FLOAT)
+            [float]</member>
+          </simplelist></para>
+
+        <para><simplelist>
+            <member>isis.persistor.sql.datatypes.short (INT) [short,
+            Color]</member>
+          </simplelist></para>
+
+        <para><simplelist>
+            <member>isis.persistor.sql.datatypes.long (INT) [long]</member>
+          </simplelist></para>
+
+        <para><simplelist>
+            <member>isis.persistor.sql.datatypes.int (INT) [int]</member>
+          </simplelist></para>
+
+        <para><simplelist>
+            <member>isis.persistor.sql.datatypes.boolean (CHAR(1))
+            [boolean]</member>
+          </simplelist></para>
+
+        <para><simplelist>
+            <member>isis.persistor.sql.datatypes.string (VARCHAR(65))
+            [String]</member>
+          </simplelist></para>
+
+        <para><simplelist>
+            <member>isis.persistor.sql.datatypes.password (VARCHAR(12))
+            [Password]</member>
+          </simplelist></para>
+
+        <para><simplelist>
+            <member>isis.persistor.sql.datatypes.default (VARCHAR(65))
+            [Everything else, e.g. Image]</member>
+          </simplelist></para>
+
+        <para><simplelist>
+            <member>isis.persistor.sql.datatypes.primarykey (INTEGER)
+            [IdMappingAbstract -&gt; JdbcObjectReferenceMapping -&gt;
+            JdbcObjectReferenceFieldMapping]</member>
+          </simplelist></para>
+
+        <para>The final value, primarykey, is a special value.</para>
+
+        <para>In general, be very careful about changing the SQL data type, as
+        the default value mappers are written assuming the default values.
+        Data parsing uses prepared statements and reads/writes values as
+        objects.</para>
+      </sect2>
+
+      <sect2>
+        <title>Fixed values</title>
+
+        <para>The following classes are not modifiable:</para>
+
+        <para>[char] is set to CHAR(1)</para>
+
+        <para>[Money] value is FLOAT, currency is VARCHAR(3)</para>
+
+        <para>[Percentage] is FLOAT</para>
+      </sect2>
     </sect1>
 
     <sect1>
-      <title></title>
+      <title>Naming Conventions</title>
 
-      <para></para>
+      <para>While case is determined by the capabilities of the database
+      driver, all SQL names will be written in UPPER CASE, below.</para>
+
+      <sect2>
+        <title>Tables</title>
+
+        <para>By default, all Isis tables are preceded with "ISIS_".</para>
+
+        <sect3>
+          <title>Internal Tables</title>
+
+          <para>ISIS_ADMIN_SERIAL_ID ISIS_ADMIN_SERVICES</para>
+        </sect3>
+
+        <sect3>
+          <title>Domain Tables</title>
+
+          <para>Only the "class" part of the package name is used. Thus a
+          domain class called "some.package.Client", will be mapped onto a
+          table "ISIS_CLIENT".</para>
+        </sect3>
+      </sect2>
+
+      <sect2>
+        <title>Columns</title>
+
+        <sect3>
+          <title>Internal columns</title>
+
+          <para>ID column: PK_ID</para>
+
+          <para>VERSION BIGINT,</para>
+
+          <para>MODIFIED_BY VARCHAR(32),</para>
+
+          <para>MODIFIED_ON TIMESTAMP</para>
+        </sect3>
+
+        <sect3>
+          <title>Properties</title>
+
+          <para>Most properties are named as per the class property. This
+          means you must take care not to use SQL reserved labels are property
+          names. The exceptions are collections and multi-field values (e.g.
+          Money).</para>
+        </sect3>
+
+        <sect3>
+          <title>Collections</title>
+
+          <para>Collections are mapped onto the child class:</para>
+
+          <para>If a parent class (some.package.Parent) has a collection of
+          (some.other.package.Child) named "children", the child table
+          (ISIS_CHILD) gets a column labeled "FK_PARENT_CHILDREN" of type
+          primarykey. The child property is assigned the ID of the parent
+          class.</para>
+
+          <para>This means that a given child can only appear in one parent's
+          collection of the same name.</para>
+        </sect3>
+      </sect2>
     </sect1>
   </chapter>
 
@@ -179,7 +360,39 @@
             <para><property>isis.persistor.sql.jdbc.user=sa</property></para>
 
             <para><property>isis.persistor.sql.jdbc.password=</property></para>
-          </blockquote></para>
+          </blockquote>The default TimeStamp and DateTime SQL data class is
+        DATETIME, which does not work on Postgresql. Here, the default must be
+        replaced with the following properties file entries:</para>
+
+        <blockquote>
+          <para>isis.persistor.sql.datatypes.timestamp=TIMESTAMP </para>
+
+          <para>isis.persistor.sql.datatypes.datetime=TIMESTAMP</para>
+        </blockquote>
+
+        <para></para>
+      </sect2>
+
+      <sect2>
+        <title>MySQL</title>
+
+        <para>There was an issue with storing and correctly retrieving date
+        (time) values - a special "try .. catch" has been used to ensure that
+        UTC temporal values are correctly retrieved.</para>
+      </sect2>
+
+      <sect2>
+        <title>Microsoft SQL Server 2008</title>
+
+        <para></para>
+      </sect2>
+
+      <sect2>
+        <title>IBM DB2 (v8)</title>
+
+        <para>Beware! This version of DB2 has a very small limit on table and
+        column names. You will have to keep your domain class and property
+        names short to suite, especially collections (see ..).</para>
       </sect2>
     </sect1>
 
@@ -196,8 +409,9 @@
         </listitem>
 
         <listitem>
-          <para>standard classes: Money ([does not work]), Percentage (FLOAT),
-          Password (VARCHAR(12)), Color (INT), String (VARCHAR (65)).</para>
+          <para>standard classes: Money (FLOAT and VARCHAR(3)), Percentage
+          (FLOAT), Password (VARCHAR(12)), Color (INT), String (VARCHAR
+          (65)).</para>
         </listitem>
 
         <listitem>
@@ -211,8 +425,9 @@
             </listitem>
 
             <listitem>
-              <para>blah Time, DateTime, java.sql.Time, java.util.Date,
-              java.sql.Timestamp blah</para>
+              <para>blah Time, DateTime (DATETIME), java.sql.Time,
+              java.util.Date, java.sql.Timestamp (DATETIME), TimeStamp
+              (DATETIME) blah</para>
             </listitem>
           </itemizedlist>
         </listitem>
@@ -226,6 +441,9 @@
       <code>org.apache.isis.alternatives.objectstore.sql.FieldMappingFactoryInstaller</code>
       ..</para>
 
+      <para>Default automapper is
+      <code>org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.installer.JdbcFieldMappingFactoryInstaller</code></para>
+
       <para></para>
     </sect1>
   </chapter>
@@ -329,7 +547,7 @@
     <sect1>
       <title>Edit History</title>
 
-      <para>Last editted: Kevin, 31/01/2011.<!--dd/mm/yyyy--></para>
+      <para>Last editted: Kevin, 21/04/2011.<!--dd/mm/yyyy--></para>
     </sect1>
   </appendix>
 </book>

Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/testsystem/dataclasses/SimpleClassTwo.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/testsystem/dataclasses/SimpleClassTwo.java?rev=1095816&r1=1095815&r2=1095816&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/testsystem/dataclasses/SimpleClassTwo.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/testsystem/dataclasses/SimpleClassTwo.java Thu Apr 21 20:48:54 2011
@@ -29,33 +29,33 @@ import org.apache.isis.applib.AbstractDo
  * 
  */
 public class SimpleClassTwo extends AbstractDomainObject {
-	public String title() {
-		return text;
-	}
-
-	// {{ String type
-	public String text;
-
-	public String getText() {
-		return text;
-	}
-
-	public void setText(final String text) {
-		this.text = text;
-	}
-
-	// }}
-
-	// {{ Value
-	private Integer integer;
-
-	public Integer getValue() {
-		return integer;
-	}
-
-	public void setValue(final Integer integer) {
-		this.integer = integer;
-	}
-	// }}
+    public String title() {
+        return text;
+    }
+
+    // {{ String type
+    public String text;
+
+    public String getText() {
+        return text;
+    }
+
+    public void setText(final String text) {
+        this.text = text;
+    }
+
+    // }}
+
+    // {{ Value
+    private int integer;
+
+    public int getValue() {
+        return integer;
+    }
+
+    public void setValue(final int integer) {
+        this.integer = integer;
+    }
+    // }}
 
 }

Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/test/config/hsql.properties
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/test/config/hsql.properties?rev=1095816&r1=1095815&r2=1095816&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/test/config/hsql.properties (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/test/config/hsql.properties Thu Apr 21 20:48:54 2011
@@ -4,3 +4,6 @@ isis.persistor.sql.jdbc.driver=org.hsqld
 isis.persistor.sql.jdbc.connection=jdbc:hsqldb:file:hsql-db/tests
 isis.persistor.sql.jdbc.user=sa
 isis.persistor.sql.jdbc.password=
+
+# testing
+isis.persistor.sql.datatypes.string=VARCHAR(70)