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 2010/11/14 20:38:09 UTC

svn commit: r1035054 - in /incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore: ./ auto/ jdbc/

Author: kevin
Date: Sun Nov 14 19:38:08 2010
New Revision: 1035054

URL: http://svn.apache.org/viewvc?rev=1035054&view=rev
Log:
Extended use of prepared values array to WHERE clauses of INSERT and UPDATE. All values should now be passed in via "?" in SQL string.

Modified:
    incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/IdMappingAbstract.java
    incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/IntegerPrimaryKey.java
    incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/PrimaryKey.java
    incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/SqlObjectStore.java
    incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/StringPrimaryKey.java
    incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/TransientKey.java
    incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/VersionMapping.java
    incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/auto/AutoCollectionMapper.java
    incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/auto/AutoMapper.java
    incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/auto/CombinedCollectionMapper.java
    incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/jdbc/JdbcConnector.java
    incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/jdbc/JdbcObjectReferenceFieldMapping.java
    incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/jdbc/JdbcObjectReferenceMapping.java

Modified: incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/IdMappingAbstract.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/IdMappingAbstract.java?rev=1035054&r1=1035053&r2=1035054&view=diff
==============================================================================
--- incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/IdMappingAbstract.java (original)
+++ incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/IdMappingAbstract.java Sun Nov 14 19:38:08 2010
@@ -38,11 +38,13 @@ public class IdMappingAbstract {
 		return column;
 	}
 
-	public void appendWhereClause(StringBuffer sql, Oid oid) {
+	public void appendWhereClause(DatabaseConnector connector,
+			StringBuffer sql, Oid oid) {
 		sql.append(column);
-		sql.append(" = ");
-		String id = primaryKey(oid);
-		sql.append(id);
+		connector.addToQueryValues(primaryKeyAsObject(oid));
+		sql.append(" = ?");
+		// String id = primaryKey(oid);
+		// sql.append(id);
 	}
 
 	public void appendCreateColumnDefinitions(StringBuffer sql) {
@@ -66,20 +68,18 @@ public class IdMappingAbstract {
 		if (object == null) {
 			sql.append(connector.addToQueryValues(null));
 		} else {
-			sql.append(connector.addToQueryValues(primaryKeyAsInt(object
+			sql.append(connector.addToQueryValues(primaryKeyAsObject(object
 					.getOid())));
 		}
 	}
 
-	public long primaryKeyAsInt(final Oid oid) {
+	/*
+	 * This doesn't have to be an Int, it should be any object.
+	 */
+	public Object primaryKeyAsObject(final Oid oid) {
 		if (oid instanceof SqlOid) {
-			if (((SqlOid) oid).getPrimaryKey() instanceof IntegerPrimaryKey) {
-				long i = ((IntegerPrimaryKey) ((SqlOid) oid).getPrimaryKey())
-						.intValue();
-				return i;
-			} else {
-				return 0;
-			}
+			PrimaryKey pk = ((SqlOid) oid).getPrimaryKey();
+			return pk.naturalValue();
 		} else
 			return ((SerialOid) oid).getSerialNo();
 	}

Modified: incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/IntegerPrimaryKey.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/IntegerPrimaryKey.java?rev=1035054&r1=1035053&r2=1035054&view=diff
==============================================================================
--- incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/IntegerPrimaryKey.java (original)
+++ incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/IntegerPrimaryKey.java Sun Nov 14 19:38:08 2010
@@ -60,4 +60,9 @@ public class IntegerPrimaryKey implement
 		return primaryKey;
 	}
 
+	@Override
+	public Object naturalValue() {
+		return intValue();
+	}
+
 }

Modified: incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/PrimaryKey.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/PrimaryKey.java?rev=1035054&r1=1035053&r2=1035054&view=diff
==============================================================================
--- incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/PrimaryKey.java (original)
+++ incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/PrimaryKey.java Sun Nov 14 19:38:08 2010
@@ -17,13 +17,13 @@
  *  under the License.
  */
 
-
 package org.apache.isis.extensions.sql.objectstore;
 
 import java.io.Serializable;
 
-
 public interface PrimaryKey extends Serializable {
 
-    public String stringValue();
+	public String stringValue();
+
+	public Object naturalValue();
 }

Modified: incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/SqlObjectStore.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/SqlObjectStore.java?rev=1035054&r1=1035053&r2=1035054&view=diff
==============================================================================
--- incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/SqlObjectStore.java (original)
+++ incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/SqlObjectStore.java Sun Nov 14 19:38:08 2010
@@ -17,7 +17,6 @@
  *  under the License.
  */
 
-
 package org.apache.isis.extensions.sql.objectstore;
 
 import java.util.List;
@@ -46,312 +45,376 @@ import org.apache.isis.runtime.transacti
 import org.apache.isis.runtime.transaction.updatenotifier.UpdateNotifier;
 import org.apache.log4j.Logger;
 
-
 public final class SqlObjectStore implements ObjectStore {
-    private static final String TABLE_NAME = "no_services";
-    private static final String ID_COLUMN = "id";
-    private static final String PRIMARYKEY_COLUMN = "pk_id";
-    public static final String BASE_NAME = "isis.persistence.sql";
-    private static final Logger LOG = Logger.getLogger(SqlObjectStore.class);
-    private DatabaseConnectorPool connectionPool;
-    private ObjectMappingLookup objectMappingLookup;
-    private boolean isInitialized;
-
-    public void abortTransaction() {}
-
-    public CreateObjectCommand createCreateObjectCommand(final ObjectAdapter object) {
-        return new CreateObjectCommand() {
-            public void execute(final PersistenceCommandContext context) {
-                DatabaseConnector connection = ((SqlExecutionContext) context).getConnection();
-                LOG.debug("  create object " + object);
-                ObjectMapping mapping = objectMappingLookup.getMapping(object, connection);
-                mapping.createObject(connection, object);
-            }
-
-            public ObjectAdapter onObject() {
-                return object;
-            }
-
-            public String toString() {
-                return "CreateObjectCommand [object=" + object + "]";
-            }
-        };
-    }
-
-    public DestroyObjectCommand createDestroyObjectCommand(final ObjectAdapter object) {
-        return new DestroyObjectCommand() {
-            public void execute(final PersistenceCommandContext context) {
-                DatabaseConnector connection = ((SqlExecutionContext) context).getConnection();
-                LOG.debug("  destroy object " + object);
-                ObjectMapping mapping = objectMappingLookup.getMapping(object, connection);
-                mapping.destroyObject(connection, object);
-            }
-
-            public ObjectAdapter onObject() {
-                return object;
-            }
-
-            public String toString() {
-                return "DestroyObjectCommand [object=" + object + "]";
-            }
-        };
-    }
-
-    public SaveObjectCommand createSaveObjectCommand(final ObjectAdapter object) {
-        return new SaveObjectCommand() {
-            public void execute(final PersistenceCommandContext context) {
-                DatabaseConnector connection = ((SqlExecutionContext) context).getConnection();
-                LOG.debug("  save object " + object);
-                if (object.getSpecification().isCollectionOrIsAggregated()) {
-                    /*
-                     * ObjectAdapter parent = object.getSpecification().getAggregate(object);
-                     * LOG.debug("change to internal collection being persisted through parent");
-                     * 
-                     * // TODO a better plan would be ask the mapper to save the collection // -
-                     * saveCollection(parent, collection) mapperLookup.getMapper(connection,
-                     * parent).save(connection, parent); connectionPool.release(connection);
-                     */
-                    throw new NotYetImplementedException(object.toString());
-                } else {
-                    ObjectMapping mapping = objectMappingLookup.getMapping(object, connection);
-                    mapping.save(connection, object);
-                    connectionPool.release(connection);
-                }
-            }
-
-            public ObjectAdapter onObject() {
-                return object;
-            }
-
-            public String toString() {
-                return "SaveObjectCommand [object=" + object + "]";
-            }
-
-        };
-    }
-
-    public void debugData(final DebugString debug) {
-        debug.appendln("initialised", isInitialized);
-        debug.appendln("connection pool", connectionPool);
-        debug.appendln("Database:");
-        debug.indent();
-        connectionPool.debug(debug);
-        debug.unindent();
-        objectMappingLookup.debugData(debug);
-    }
-
-    public String debugTitle() {
-        return null;
-    }
-
-    public void endTransaction() {}
-
-    public void execute(final List<PersistenceCommand> commands) {
-        DatabaseConnector connector = connectionPool.acquire();
-        connector.begin();
-
-        IsisTransactionManager transactionManager = IsisContext.getTransactionManager();
-        MessageBroker messageBroker = IsisContext.getMessageBroker();
-        UpdateNotifier updateNotifier = IsisContext.getUpdateNotifier();
-        SqlExecutionContext context = new SqlExecutionContext(connector, transactionManager, messageBroker, updateNotifier);
-        try {
-            for (PersistenceCommand command : commands) {
-                command.execute(context);
-            }
-            connector.commit();
-        } catch (IsisException e) {
-            LOG.warn("Failure during execution", e);
-            connector.rollback();
-            throw e;
-        } finally {
-            connectionPool.release(connector);
-        }
-    }
-
-    public boolean flush(final PersistenceCommand[] commands) {
-        return false;
-    }
-
-    public ObjectAdapter[] getInstances(final PersistenceQuery query) {
-        if (query instanceof PersistenceQueryFindByTitle) {
-            return findByTitle((PersistenceQueryFindByTitle) query);
-        } else if (query instanceof PersistenceQueryFindAllInstances) {
-            return getAllInstances((PersistenceQueryFindAllInstances) query);
-        } else if (query instanceof PersistenceQueryFindByPattern)  {
-            return findByPattern((PersistenceQueryFindByPattern) query);
-        } else {
-            throw new SqlObjectStoreException("Query type not supported: " + query);
-        }
-    }
-
-    private ObjectAdapter[] findByPattern(final PersistenceQueryFindByPattern query) {
-        ObjectSpecification specification = query.getSpecification();
-        DatabaseConnector connector = connectionPool.acquire();
-        ObjectMapping mapper = objectMappingLookup.getMapping(specification, connector);
-        ObjectAdapter instances[] = mapper.getInstances(connector, specification, query);
-        connectionPool.release(connector);
-        return instances;
-    }
-
-    private ObjectAdapter[] getAllInstances(final PersistenceQueryFindAllInstances criteria) {
-        ObjectSpecification spec = criteria.getSpecification();
-        return allInstances(spec);
-    }
-
-    private ObjectAdapter[] allInstances(ObjectSpecification spec) {
-        DatabaseConnector connector = connectionPool.acquire();
-        ObjectMapping mapper = objectMappingLookup.getMapping(spec, connector);
-        ObjectAdapter[] instances = mapper.getInstances(connector, spec);
-        Vector<ObjectAdapter> matchingInstances = new Vector<ObjectAdapter>();
-        for (int i = 0; i < instances.length; i++) {
-            matchingInstances.addElement(instances[i]);
-        }
-        connectionPool.release(connector);
-        ObjectAdapter[] instanceArray = new ObjectAdapter[matchingInstances.size()];
-        matchingInstances.copyInto(instanceArray);
-        return instanceArray;
-    }
-
-    private ObjectAdapter[] findByTitle(final PersistenceQueryFindByTitle criteria) {
-        ObjectSpecification spec = criteria.getSpecification();
-        DatabaseConnector connector = connectionPool.acquire();
-        ObjectMapping mapper = objectMappingLookup.getMapping(spec, connector);
-
-        ObjectAdapter[] instances = mapper.getInstances(connector, spec, criteria.getTitle());
-        connectionPool.release(connector);
-        return instances;
-    }
-
-    public ObjectAdapter getObject(final Oid oid, final ObjectSpecification hint) {
-        DatabaseConnector connection = connectionPool.acquire();
-        ObjectMapping mapper = objectMappingLookup.getMapping(hint, connection);
-        ObjectAdapter object = mapper.getObject(connection, oid, hint);
-        connectionPool.release(connection);
-        return object;
-    }
-
-    public Oid getOidForService(String name) {
-        DatabaseConnector connector = connectionPool.acquire();
-
-        
-        StringBuffer sql = new StringBuffer();
-        sql.append("select ");
-        sql.append(Sql.identifier(PRIMARYKEY_COLUMN));
-        sql.append(" from ");
-        sql.append(Sql.identifier(TABLE_NAME));
-        sql.append(" where ");
-        sql.append(Sql.identifier(ID_COLUMN));
-        sql.append(" = ");
-        sql.append(Sql.escapeAndQuoteValue(name));
-        
-        Results results = connector.select(sql.toString());
-        if (results.next()) {
-            int key = results.getInt(PRIMARYKEY_COLUMN);
-            connectionPool.release(connector);
-            return SqlOid.createPersistent(name, new IntegerPrimaryKey(key));
-        } else {
-            connectionPool.release(connector);
-            return null;
-        }
-    }
-
-    public boolean hasInstances(final ObjectSpecification spec) {
-        DatabaseConnector connection = connectionPool.acquire();
-        ObjectMapping mapper = objectMappingLookup.getMapping(spec, connection);
-        boolean hasInstances = mapper.hasInstances(connection, spec);
-        connectionPool.release(connection);
-        return hasInstances;
-    }
-
-    public boolean isFixturesInstalled() {
-        return isInitialized;
-    }
-
-    public void open() {
-        Sql.setMetaData(connectionPool.acquire().getMetaData());
-        
-        DebugString debug = new DebugString();
-        connectionPool.debug(debug);
-        LOG.info("Database: " + debug);
-        
-        objectMappingLookup.init();
-
-        DatabaseConnector connector = connectionPool.acquire();
-        isInitialized = connector.hasTable(Sql.identifier(TABLE_NAME));
-        if (!isInitialized) {
-            StringBuffer sql = new StringBuffer();
-            sql.append("create table ");
-            sql.append(Sql.identifier(TABLE_NAME));
-            sql.append(" (");
-            sql.append(Sql.identifier(PRIMARYKEY_COLUMN));
-            sql.append(" int, ");
-            sql.append(Sql.identifier(ID_COLUMN));
-            sql.append(" varchar(255)");
-            sql.append(")");
-            connector.update(sql.toString());
-        }
-    }
-
-    public String name() {
-        return "SQL Object Store";
-    }
-
-    public void registerService(final String name, final Oid oid) {
-        DatabaseConnector connector = connectionPool.acquire();
-        String soid = ((SqlOid) oid).getPrimaryKey().stringValue();
-        
-        StringBuffer sql = new StringBuffer();
-        sql.append("insert into ");
-        sql.append(Sql.identifier(TABLE_NAME));
-        sql.append(" (");
-        sql.append(Sql.identifier(PRIMARYKEY_COLUMN));
-        sql.append(", ");
-        sql.append(Sql.identifier(ID_COLUMN));
-        sql.append(") values (");
-        sql.append(soid);
-        sql.append(", ");
-        sql.append(Sql.escapeAndQuoteValue(name));
-        sql.append(")");
-        connector.insert(sql.toString());
-        connectionPool.release(connector);
-    }
-
-    public void reset() {}
-
-    public void resolveField(final ObjectAdapter object, final ObjectAssociation field) {
-        if (field.isOneToManyAssociation()) {
-            DatabaseConnector connection = connectionPool.acquire();
-            ObjectSpecification spec = object.getSpecification();
-            ObjectMapping mapper = objectMappingLookup.getMapping(spec, connection);
-            mapper.resolveCollection(connection, object, field);
-            connectionPool.release(connection);
-        } else {
-            resolveImmediately(field.get(object));
-        }
-    }
-
-    public void resolveImmediately(final ObjectAdapter object) {
-        DatabaseConnector connector = connectionPool.acquire();
-        ObjectMapping mapping = objectMappingLookup.getMapping(object, connector);
-        mapping.resolve(connector, object);
-        connectionPool.release(connector);
-    }
-
-    public void setConnectionPool(final DatabaseConnectorPool connectionPool) {
-        this.connectionPool = connectionPool;
-    }
-
-    public void setMapperLookup(final ObjectMappingLookup mapperLookup) {
-        this.objectMappingLookup = mapperLookup;
-    }
-
-    public void close() {
-        objectMappingLookup.shutdown();
-        // DatabaseConnector connection = connectionPool.acquire();
-        // connection.update("SHUTDOWN");
-        connectionPool.shutdown();
-    }
-
-    public void startTransaction() {}
+	private static final String TABLE_NAME = "no_services";
+	private static final String ID_COLUMN = "id";
+	private static final String PRIMARYKEY_COLUMN = "pk_id";
+	public static final String BASE_NAME = "isis.persistence.sql";
+	private static final Logger LOG = Logger.getLogger(SqlObjectStore.class);
+	private DatabaseConnectorPool connectionPool;
+	private ObjectMappingLookup objectMappingLookup;
+	private boolean isInitialized;
+
+	@Override
+	public void abortTransaction() {
+	}
+
+	@Override
+	public CreateObjectCommand createCreateObjectCommand(
+			final ObjectAdapter object) {
+		return new CreateObjectCommand() {
+			@Override
+			public void execute(final PersistenceCommandContext context) {
+				DatabaseConnector connection = ((SqlExecutionContext) context)
+						.getConnection();
+				LOG.debug("  create object " + object);
+				ObjectMapping mapping = objectMappingLookup.getMapping(object,
+						connection);
+				mapping.createObject(connection, object);
+			}
+
+			@Override
+			public ObjectAdapter onObject() {
+				return object;
+			}
+
+			@Override
+			public String toString() {
+				return "CreateObjectCommand [object=" + object + "]";
+			}
+		};
+	}
+
+	@Override
+	public DestroyObjectCommand createDestroyObjectCommand(
+			final ObjectAdapter object) {
+		return new DestroyObjectCommand() {
+			@Override
+			public void execute(final PersistenceCommandContext context) {
+				DatabaseConnector connection = ((SqlExecutionContext) context)
+						.getConnection();
+				LOG.debug("  destroy object " + object);
+				ObjectMapping mapping = objectMappingLookup.getMapping(object,
+						connection);
+				mapping.destroyObject(connection, object);
+			}
+
+			@Override
+			public ObjectAdapter onObject() {
+				return object;
+			}
+
+			@Override
+			public String toString() {
+				return "DestroyObjectCommand [object=" + object + "]";
+			}
+		};
+	}
+
+	@Override
+	public SaveObjectCommand createSaveObjectCommand(final ObjectAdapter object) {
+		return new SaveObjectCommand() {
+			@Override
+			public void execute(final PersistenceCommandContext context) {
+				DatabaseConnector connection = ((SqlExecutionContext) context)
+						.getConnection();
+				LOG.debug("  save object " + object);
+				if (object.getSpecification().isCollectionOrIsAggregated()) {
+					/*
+					 * ObjectAdapter parent =
+					 * object.getSpecification().getAggregate(object);
+					 * LOG.debug(
+					 * "change to internal collection being persisted through parent"
+					 * );
+					 * 
+					 * // TODO a better plan would be ask the mapper to save the
+					 * collection // - saveCollection(parent, collection)
+					 * mapperLookup.getMapper(connection,
+					 * parent).save(connection, parent);
+					 * connectionPool.release(connection);
+					 */
+					throw new NotYetImplementedException(object.toString());
+				} else {
+					ObjectMapping mapping = objectMappingLookup.getMapping(
+							object, connection);
+					mapping.save(connection, object);
+					connectionPool.release(connection);
+				}
+			}
+
+			@Override
+			public ObjectAdapter onObject() {
+				return object;
+			}
+
+			@Override
+			public String toString() {
+				return "SaveObjectCommand [object=" + object + "]";
+			}
+
+		};
+	}
+
+	@Override
+	public void debugData(final DebugString debug) {
+		debug.appendln("initialised", isInitialized);
+		debug.appendln("connection pool", connectionPool);
+		debug.appendln("Database:");
+		debug.indent();
+		connectionPool.debug(debug);
+		debug.unindent();
+		objectMappingLookup.debugData(debug);
+	}
+
+	@Override
+	public String debugTitle() {
+		return null;
+	}
+
+	@Override
+	public void endTransaction() {
+	}
+
+	@Override
+	public void execute(final List<PersistenceCommand> commands) {
+		DatabaseConnector connector = connectionPool.acquire();
+		connector.begin();
+
+		IsisTransactionManager transactionManager = IsisContext
+				.getTransactionManager();
+		MessageBroker messageBroker = IsisContext.getMessageBroker();
+		UpdateNotifier updateNotifier = IsisContext.getUpdateNotifier();
+		SqlExecutionContext context = new SqlExecutionContext(connector,
+				transactionManager, messageBroker, updateNotifier);
+		try {
+			for (PersistenceCommand command : commands) {
+				command.execute(context);
+			}
+			connector.commit();
+		} catch (IsisException e) {
+			LOG.warn("Failure during execution", e);
+			connector.rollback();
+			throw e;
+		} finally {
+			connectionPool.release(connector);
+		}
+	}
+
+	public boolean flush(final PersistenceCommand[] commands) {
+		return false;
+	}
+
+	@Override
+	public ObjectAdapter[] getInstances(final PersistenceQuery query) {
+		if (query instanceof PersistenceQueryFindByTitle) {
+			return findByTitle((PersistenceQueryFindByTitle) query);
+		} else if (query instanceof PersistenceQueryFindAllInstances) {
+			return getAllInstances((PersistenceQueryFindAllInstances) query);
+		} else if (query instanceof PersistenceQueryFindByPattern) {
+			return findByPattern((PersistenceQueryFindByPattern) query);
+		} else {
+			throw new SqlObjectStoreException("Query type not supported: "
+					+ query);
+		}
+	}
+
+	private ObjectAdapter[] findByPattern(
+			final PersistenceQueryFindByPattern query) {
+		ObjectSpecification specification = query.getSpecification();
+		DatabaseConnector connector = connectionPool.acquire();
+		ObjectMapping mapper = objectMappingLookup.getMapping(specification,
+				connector);
+		ObjectAdapter instances[] = mapper.getInstances(connector,
+				specification, query);
+		connectionPool.release(connector);
+		return instances;
+	}
+
+	private ObjectAdapter[] getAllInstances(
+			final PersistenceQueryFindAllInstances criteria) {
+		ObjectSpecification spec = criteria.getSpecification();
+		return allInstances(spec);
+	}
+
+	private ObjectAdapter[] allInstances(ObjectSpecification spec) {
+		DatabaseConnector connector = connectionPool.acquire();
+		ObjectMapping mapper = objectMappingLookup.getMapping(spec, connector);
+		ObjectAdapter[] instances = mapper.getInstances(connector, spec);
+		Vector<ObjectAdapter> matchingInstances = new Vector<ObjectAdapter>();
+		for (int i = 0; i < instances.length; i++) {
+			matchingInstances.addElement(instances[i]);
+		}
+		connectionPool.release(connector);
+		ObjectAdapter[] instanceArray = new ObjectAdapter[matchingInstances
+				.size()];
+		matchingInstances.copyInto(instanceArray);
+		return instanceArray;
+	}
+
+	private ObjectAdapter[] findByTitle(
+			final PersistenceQueryFindByTitle criteria) {
+		ObjectSpecification spec = criteria.getSpecification();
+		DatabaseConnector connector = connectionPool.acquire();
+		ObjectMapping mapper = objectMappingLookup.getMapping(spec, connector);
+
+		ObjectAdapter[] instances = mapper.getInstances(connector, spec,
+				criteria.getTitle());
+		connectionPool.release(connector);
+		return instances;
+	}
+
+	@Override
+	public ObjectAdapter getObject(final Oid oid, final ObjectSpecification hint) {
+		DatabaseConnector connection = connectionPool.acquire();
+		ObjectMapping mapper = objectMappingLookup.getMapping(hint, connection);
+		ObjectAdapter object = mapper.getObject(connection, oid, hint);
+		connectionPool.release(connection);
+		return object;
+	}
+
+	@Override
+	public Oid getOidForService(String name) {
+		DatabaseConnector connector = connectionPool.acquire();
+
+		StringBuffer sql = new StringBuffer();
+		sql.append("select ");
+		sql.append(Sql.identifier(PRIMARYKEY_COLUMN));
+		sql.append(" from ");
+		sql.append(Sql.identifier(TABLE_NAME));
+		sql.append(" where ");
+		sql.append(Sql.identifier(ID_COLUMN));
+		sql.append(" = ?");
+		// sql.append(Sql.escapeAndQuoteValue(name));
+		connector.addToQueryValues(name);
+
+		Results results = connector.select(sql.toString());
+		if (results.next()) {
+			int key = results.getInt(PRIMARYKEY_COLUMN);
+			connectionPool.release(connector);
+			return SqlOid.createPersistent(name, new IntegerPrimaryKey(key));
+		} else {
+			connectionPool.release(connector);
+			return null;
+		}
+	}
+
+	@Override
+	public boolean hasInstances(final ObjectSpecification spec) {
+		DatabaseConnector connection = connectionPool.acquire();
+		ObjectMapping mapper = objectMappingLookup.getMapping(spec, connection);
+		boolean hasInstances = mapper.hasInstances(connection, spec);
+		connectionPool.release(connection);
+		return hasInstances;
+	}
+
+	@Override
+	public boolean isFixturesInstalled() {
+		return isInitialized;
+	}
+
+	@Override
+	public void open() {
+		Sql.setMetaData(connectionPool.acquire().getMetaData());
+
+		DebugString debug = new DebugString();
+		connectionPool.debug(debug);
+		LOG.info("Database: " + debug);
+
+		objectMappingLookup.init();
+
+		DatabaseConnector connector = connectionPool.acquire();
+		isInitialized = connector.hasTable(Sql.identifier(TABLE_NAME));
+		if (!isInitialized) {
+			StringBuffer sql = new StringBuffer();
+			sql.append("create table ");
+			sql.append(Sql.identifier(TABLE_NAME));
+			sql.append(" (");
+			sql.append(Sql.identifier(PRIMARYKEY_COLUMN));
+			sql.append(" int, ");
+			sql.append(Sql.identifier(ID_COLUMN));
+			sql.append(" varchar(255)");
+			sql.append(")");
+			connector.update(sql.toString());
+		}
+	}
+
+	@Override
+	public String name() {
+		return "SQL Object Store";
+	}
+
+	@Override
+	public void registerService(final String name, final Oid oid) {
+		DatabaseConnector connector = connectionPool.acquire();
+		// String soid = ((SqlOid) oid).getPrimaryKey().stringValue();
+
+		StringBuffer sql = new StringBuffer();
+		sql.append("insert into ");
+		sql.append(Sql.identifier(TABLE_NAME));
+		sql.append(" (");
+		sql.append(Sql.identifier(PRIMARYKEY_COLUMN));
+		sql.append(", ");
+		sql.append(Sql.identifier(ID_COLUMN));
+		sql.append(") values (?,?)");
+		// sql.append(soid);
+		// sql.append(", ");
+		// sql.append(Sql.escapeAndQuoteValue(name));
+		// sql.append(")");
+
+		connector.addToQueryValues(((SqlOid) oid).getPrimaryKey()
+				.naturalValue());
+		connector.addToQueryValues(name);
+
+		connector.insert(sql.toString());
+		connectionPool.release(connector);
+	}
+
+	@Override
+	public void reset() {
+	}
+
+	@Override
+	public void resolveField(final ObjectAdapter object,
+			final ObjectAssociation field) {
+		if (field.isOneToManyAssociation()) {
+			DatabaseConnector connection = connectionPool.acquire();
+			ObjectSpecification spec = object.getSpecification();
+			ObjectMapping mapper = objectMappingLookup.getMapping(spec,
+					connection);
+			mapper.resolveCollection(connection, object, field);
+			connectionPool.release(connection);
+		} else {
+			resolveImmediately(field.get(object));
+		}
+	}
+
+	@Override
+	public void resolveImmediately(final ObjectAdapter object) {
+		DatabaseConnector connector = connectionPool.acquire();
+		ObjectMapping mapping = objectMappingLookup.getMapping(object,
+				connector);
+		mapping.resolve(connector, object);
+		connectionPool.release(connector);
+	}
+
+	public void setConnectionPool(final DatabaseConnectorPool connectionPool) {
+		this.connectionPool = connectionPool;
+	}
+
+	public void setMapperLookup(final ObjectMappingLookup mapperLookup) {
+		this.objectMappingLookup = mapperLookup;
+	}
+
+	@Override
+	public void close() {
+		objectMappingLookup.shutdown();
+		// DatabaseConnector connection = connectionPool.acquire();
+		// connection.update("SHUTDOWN");
+		connectionPool.shutdown();
+	}
+
+	@Override
+	public void startTransaction() {
+	}
 
 }

Modified: incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/StringPrimaryKey.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/StringPrimaryKey.java?rev=1035054&r1=1035053&r2=1035054&view=diff
==============================================================================
--- incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/StringPrimaryKey.java (original)
+++ incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/StringPrimaryKey.java Sun Nov 14 19:38:08 2010
@@ -17,39 +17,47 @@
  *  under the License.
  */
 
-
 package org.apache.isis.extensions.sql.objectstore;
 
 public class StringPrimaryKey implements PrimaryKey {
-    private static final long serialVersionUID = 1L;
-    private final String primaryKey;
+	private static final long serialVersionUID = 1L;
+	private final String primaryKey;
 
-    public StringPrimaryKey(final String primaryKey) {
-        this.primaryKey = primaryKey;
-    }
-
-    public boolean equals(final Object obj) {
-        if (obj == this) {
-            return true;
-        }
-        if (obj instanceof StringPrimaryKey) {
-            StringPrimaryKey o = ((StringPrimaryKey) obj);
-            return primaryKey == o.primaryKey;
-        }
-        return false;
-    }
-
-    public int hashCode() {
-        int hash = 17;
-        hash = 37 * hash + primaryKey.hashCode();
-        return hash;
-    }
-
-    public String stringValue() {
-        return "" + primaryKey;
-    }
-
-    public String toString() {
-        return "" + primaryKey;
-    }
+	public StringPrimaryKey(final String primaryKey) {
+		this.primaryKey = primaryKey;
+	}
+
+	@Override
+	public boolean equals(final Object obj) {
+		if (obj == this) {
+			return true;
+		}
+		if (obj instanceof StringPrimaryKey) {
+			StringPrimaryKey o = ((StringPrimaryKey) obj);
+			return primaryKey == o.primaryKey;
+		}
+		return false;
+	}
+
+	@Override
+	public int hashCode() {
+		int hash = 17;
+		hash = 37 * hash + primaryKey.hashCode();
+		return hash;
+	}
+
+	@Override
+	public String stringValue() {
+		return "" + primaryKey;
+	}
+
+	@Override
+	public String toString() {
+		return "" + primaryKey;
+	}
+
+	@Override
+	public Object naturalValue() {
+		return stringValue();
+	}
 }

Modified: incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/TransientKey.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/TransientKey.java?rev=1035054&r1=1035053&r2=1035054&view=diff
==============================================================================
--- incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/TransientKey.java (original)
+++ incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/TransientKey.java Sun Nov 14 19:38:08 2010
@@ -17,18 +17,23 @@
  *  under the License.
  */
 
-
 package org.apache.isis.extensions.sql.objectstore;
 
 public class TransientKey implements PrimaryKey {
-    private static final long serialVersionUID = 1L;
-    private long transientId;
+	private static final long serialVersionUID = 1L;
+	private final long transientId;
+
+	public TransientKey(final long id) {
+		transientId = id;
+	}
 
-    public TransientKey(final long id) {
-        transientId = id;
-    }
+	@Override
+	public String stringValue() {
+		return "" + transientId;
+	}
 
-    public String stringValue() {
-        return "" + transientId;
-    }
+	@Override
+	public Object naturalValue() {
+		return transientId;
+	}
 }

Modified: incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/VersionMapping.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/VersionMapping.java?rev=1035054&r1=1035053&r2=1035054&view=diff
==============================================================================
--- incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/VersionMapping.java (original)
+++ incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/VersionMapping.java Sun Nov 14 19:38:08 2010
@@ -44,22 +44,21 @@ public class VersionMapping {
 	// TODO:KAM: here
 	public String insertValues(DatabaseConnector connector,
 			SerialNumberVersion version) {
-		// String timestamp = new Timestamp(new Date().getTime()).toString();
-		// return version.sequence() + ", '" + version.getUser() + "',  '" +
-		// timestamp + "'";
 		connector.addToQueryValues(version.getSequence());
 		connector.addToQueryValues(version.getUser());
 		connector.addToQueryValues(new Timestamp(new Date().getTime()));
 		return "?,?,?";
 	}
 
-	public String whereClause(SerialNumberVersion version) {
-		return versionColumn + " = " + version.getSequence();
+	public String whereClause(DatabaseConnector connector,
+			SerialNumberVersion version) {
+		connector.addToQueryValues(version.getSequence());
+		return versionColumn + " = ?";
 	}
 
 	public String updateAssigment(DatabaseConnector connector, long nextSequence) {
 		connector.addToQueryValues(nextSequence);
-		return versionColumn + " = ?";// + nextSequence;
+		return versionColumn + " = ?";
 	}
 
 	public String appendSelectColumns() {
@@ -89,8 +88,10 @@ public class VersionMapping {
 		return sql.toString();
 	}
 
-	public Object appendUpdateValues(long versionSequence) {
-		return versionColumn + "=" + versionSequence;
+	public Object appendUpdateValues(DatabaseConnector connector,
+			long versionSequence) {
+		connector.addToQueryValues(versionSequence);
+		return versionColumn + "= ?";
 	}
 
 	public Version getLock(Results rs) {

Modified: incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/auto/AutoCollectionMapper.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/auto/AutoCollectionMapper.java?rev=1035054&r1=1035053&r2=1035054&view=diff
==============================================================================
--- incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/auto/AutoCollectionMapper.java (original)
+++ incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/auto/AutoCollectionMapper.java Sun Nov 14 19:38:08 2010
@@ -123,7 +123,7 @@ public class AutoCollectionMapper extend
         sql.append("delete from ");
         sql.append(tableName);
         sql.append(" where ");
-        idMapping.appendWhereClause(sql, parent.getOid());
+        idMapping.appendWhereClause(connector, sql, parent.getOid());
         connector.update(sql.toString());
 
         sql = new StringBuffer();

Modified: incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/auto/AutoMapper.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/auto/AutoMapper.java?rev=1035054&r1=1035053&r2=1035054&view=diff
==============================================================================
--- incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/auto/AutoMapper.java (original)
+++ incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/auto/AutoMapper.java Sun Nov 14 19:38:08 2010
@@ -126,9 +126,9 @@ public class AutoMapper extends Abstract
 			final ObjectAdapter object) {
 		StringBuffer sql = new StringBuffer();
 		sql.append("delete from " + table + " where ");
-		idMapping.appendWhereClause(sql, object.getOid());
+		idMapping.appendWhereClause(connector, sql, object.getOid());
 		sql.append(" and ");
-		sql.append(versionMapping.whereClause((SerialNumberVersion) object
+		sql.append(versionMapping.whereClause(connector, (SerialNumberVersion) object
 				.getVersion()));
 		int updateCount = connector.update(sql.toString());
 		if (updateCount == 0) {
@@ -183,7 +183,7 @@ public class AutoMapper extends Abstract
 			final Oid oid, final ObjectSpecification hint) {
 		StringBuffer sql = createSelectStatement();
 		sql.append(" where ");
-		idMapping.appendWhereClause(sql, oid);
+		idMapping.appendWhereClause(connector, sql, oid);
 		Results rs = connector.select(completeSelectStatement(sql));
 		if (rs.next()) {
 			return loadObject(connector, hint, rs);
@@ -290,7 +290,7 @@ public class AutoMapper extends Abstract
 		sql.append(",");
 		sql.append(versionMapping.appendSelectColumns());
 		sql.append(" from " + table + " where ");
-		idMapping.appendWhereClause(sql, object.getOid());
+		idMapping.appendWhereClause(connector, sql, object.getOid());
 
 		Results rs = connector.select(sql.toString());
 		if (rs.next()) {
@@ -346,9 +346,9 @@ public class AutoMapper extends Abstract
 		sql.append(", ");
 		titleMapping.appendUpdateAssignment(connector, sql, object);
 		sql.append(" where ");
-		idMapping.appendWhereClause(sql, object.getOid());
+		idMapping.appendWhereClause(connector, sql, object.getOid());
 		sql.append(" and ");
-		sql.append(versionMapping.whereClause((SerialNumberVersion) object
+		sql.append(versionMapping.whereClause(connector, (SerialNumberVersion) object
 				.getVersion()));
 
 		int updateCount = connector.update(sql.toString());

Modified: incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/auto/CombinedCollectionMapper.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/auto/CombinedCollectionMapper.java?rev=1035054&r1=1035053&r2=1035054&view=diff
==============================================================================
--- incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/auto/CombinedCollectionMapper.java (original)
+++ incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/auto/CombinedCollectionMapper.java Sun Nov 14 19:38:08 2010
@@ -175,7 +175,7 @@ public class CombinedCollectionMapper ex
             StringBuffer update = new StringBuffer(sql);
             foreignKeyMapping.appendUpdateValues(connector, update, parent);
             update.append(" where ");
-            idMapping.appendWhereClause(update, element.getOid());
+            idMapping.appendWhereClause(connector, update, element.getOid());
             connector.insert(update.toString());
         }
     }

Modified: incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/jdbc/JdbcConnector.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/jdbc/JdbcConnector.java?rev=1035054&r1=1035053&r2=1035054&view=diff
==============================================================================
--- incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/jdbc/JdbcConnector.java (original)
+++ incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/jdbc/JdbcConnector.java Sun Nov 14 19:38:08 2010
@@ -17,7 +17,6 @@
  *  under the License.
  */
 
-
 package org.apache.isis.extensions.sql.objectstore.jdbc;
 
 import java.sql.Connection;
@@ -39,281 +38,347 @@ import org.apache.isis.extensions.sql.ob
 import org.apache.isis.runtime.context.IsisContext;
 import org.apache.log4j.Logger;
 
-
 public class JdbcConnector extends AbstractDatabaseConnector {
-    private static final Logger LOG = Logger.getLogger(JdbcConnector.class);
-    private Connection connection;
+	private static final Logger LOG = Logger.getLogger(JdbcConnector.class);
+	private Connection connection;
 
-    public void close() {
-        try {
-            if (connection != null) {
-                LOG.info("close");
-                connection.close();
-            }
-        } catch (SQLException e) {
-            throw new SqlObjectStoreException("Failed to close", e);
-        }
-    }
-
-    public int count(final String sql) {
-        LOG.debug("SQL: " + sql);
-        PreparedStatement statement;
-        try {
-            statement = connection.prepareStatement(sql);
-            ResultSet result = statement.executeQuery();
-            result.next();
-            int count = result.getInt(1);
-            statement.close();
-            return count;
-        } catch (SQLException e) {
-            throw new SqlObjectStoreException("Failed count", e);
-        }
-    }
-
-    public void delete(final String sql) {
-        update(sql);
-    }
-
-    public void open() {
-        try {
-            IsisConfiguration params = IsisContext.getConfiguration();
-            String BASE = SqlObjectStore.BASE_NAME + ".jdbc.";
-            String driver = params.getString(BASE + "driver");
-            String url = params.getString(BASE + "connection");
-            String user = params.getString(BASE + "user");
-            String password = params.getString(BASE + "password");
-            
-           if (connection != null ) {
-               throw new SqlObjectStoreException("Connection already established");
-           }
-            
-            if (driver == null) {
-                throw new SqlObjectStoreException("No driver specified for database connection");
-            }
-            if (url == null) {
-                throw new SqlObjectStoreException("No connection URL specified to database");
-            }
-            if (user == null) {
-                throw new SqlObjectStoreException("No user specified for database connection");
-            }
-            if (password == null) {
-                throw new SqlObjectStoreException("No password specified for database connection");
-            }
-
-            Class.forName(driver);
-            LOG.info("Connecting to " + url + " as " + user);
-            connection = DriverManager.getConnection(url, user, password);
-            if (connection == null) {
-                throw new SqlObjectStoreException("No connection established to " + url);
-            }
-        } catch (SQLException e) {
-            throw new SqlObjectStoreException("Failed to start", e);
-        } catch (ClassNotFoundException e) {
-            throw new SqlObjectStoreException("Could not find database driver", e);
-        }
-    }
-
-    /*
-     * public void executeStoredProcedure(final StoredProcedure storedProcedure) { Parameter[] parameters =
-     * storedProcedure.getParameters(); StringBuffer sql = new StringBuffer("{call ");
-     * sql.append(storedProcedure.getName()); sql.append(" ("); for (int i = 0, no = parameters.length; i <
-     * no; i++) { sql.append(i == 0 ? "?" : ",?"); } sql.append(")}"); LOG.debug("SQL: " + sql);
-     * 
-     * CallableStatement statement; try { statement = connection.prepareCall(sql.toString());
-     * 
-     * for (int i = 0; i < parameters.length; i++) { LOG.debug(" setup param " + i + " " + parameters[i]);
-     * parameters[i].setupParameter(i + 1, parameters[i].getName(), storedProcedure); } LOG.debug(" execute
-     * "); statement.execute(); for (int i = 0; i < parameters.length; i++) { parameters[i].retrieve(i + 1,
-     * parameters[i].getName(), storedProcedure); LOG.debug(" retrieve param " + i + " " + parameters[i]); } }
-     * catch (SQLException e) { throw new ObjectAdapterRuntimeException(e); }
-     * 
-     * }
-     * 
-     * 
-     * public MultipleResults executeStoredProcedure(final String name, final Parameter[] parameters) {
-     * StringBuffer sql = new StringBuffer("{call "); sql.append(name); sql.append(" ("); for (int i = 0; i <
-     * parameters.length; i++) { sql.append(i == 0 ? "?" : ",?"); } sql.append(")}"); LOG.debug("SQL: " +
-     * sql);
-     * 
-     * CallableStatement statement; try { statement = connection.prepareCall(sql.toString());
-     * 
-     * StoredProcedure storedProcedure = new JdbcStoredProcedure(statement);
-     * 
-     * for (int i = 0; i < parameters.length; i++) { LOG.debug(" setup param " + i + " " + parameters[i]);
-     * parameters[i].setupParameter(i + 1, parameters[i].getName(), storedProcedure); } LOG.debug(" execute
-     * "); statement.execute(); for (int i = 0; i < parameters.length; i++) { parameters[i].retrieve(i + 1,
-     * parameters[i].getName(), storedProcedure); LOG.debug(" retrieve param " + i + " " + parameters[i]); }
-     * 
-     * return new JdbcResults(statement); } catch (SQLException e) { throw new ObjectAdapterRuntimeException(e);
-     * } }
-     */
-
-    public Results select(final String sql) {
-        LOG.debug("SQL: " + sql);
-        PreparedStatement statement;
-        try {
-            statement = connection.prepareStatement(sql);
-            return new JdbcResults(statement.executeQuery());
-        } catch (SQLException e) {
-            throw new SqlObjectStoreException(e);
-        }
-    }
-
-    public int update(final String sql) {
-        LOG.debug("SQL: " + sql);
-        PreparedStatement statement;
-        try {
-            statement = connection.prepareStatement(sql);
-            if (queryValues.size() > 0){
-            	int i = 1;
-            	for (Object value : queryValues) {
-					statement.setObject(i++, value);
-				}
-            }
-            int updateCount = statement.executeUpdate();
-            
-            queryValues.clear();
-            
-            statement.close();
-            return updateCount;
-        } catch (SQLException e) {
-            LOG.error("failed to execute " + sql, e);
-            throw new SqlObjectStoreException("SQL error", e);
-        }
-    }
-
-    public boolean hasTable(final String tableName) {
-        try {
-            ResultSet set = connection.getMetaData().getTables(null, null, tableName, null);
-            if (set.next()) {
-                LOG.debug("Found " + set.getString("TABLE_NAME"));
-                set.close();
-                return true;
-            } else {
-                set.close();
-                return false;
-            }
-        } catch (SQLException e) {
-            throw new SqlObjectStoreException(e);
-        }
-    }
-
-    public boolean hasColumn(final String tableName, final String columnName) {
-        try {
-            ResultSet set = connection.getMetaData().getColumns(null, null, tableName, columnName);
-            if (set.next()) {
-                LOG.debug("Found " + set.getString("COLUMN_NAME") + " in " + set.getString("TABLE_NAME"));
-                set.close();
-                return true;
-            } else {
-                set.close();
-                return false;
-            }
-        } catch (SQLException e) {
-            throw new SqlObjectStoreException(e);
-        }
-    }
-
-    public void insert(final String sql) {
-        update(sql);
-    }
-
-    public void insert(final String sql, final Object oid) {
-        LOG.debug("SQL: " + sql);
-        PreparedStatement statement;
-        try {
-            statement = connection.prepareStatement(sql);
-            statement.executeUpdate();
-            /*
-             * require 3.0 ResultSet rs = statement.getGeneratedKeys(); if(rs.next()) { int id = rs.getInt(1);
-             * }
-             */statement.close();
-        } catch (SQLException e) {
-            throw new SqlObjectStoreException("SQL error", e);
-        }
-    }
-
-    public Connection getConnection() {
-        return connection;
-    }
-
-    public void commit() {
-        try {
-            LOG.debug("commit");
-            connection.commit();
-            connection.setAutoCommit(true);
-        } catch (SQLException e) {
-            throw new SqlObjectStoreException("Commit error", e);
-        }
-    }
-
-    public void begin() {
-        try {
-            LOG.debug("begin transaction");
-            connection.setAutoCommit(false);
-            queryValues.clear();
-        } catch (SQLException e) {
-            throw new SqlObjectStoreException("Rollback error", e);
-        }
-
-    }            
-
-
-    public void rollback() {
-        try {
-            LOG.debug("rollback");
-            connection.rollback();
-            connection.setAutoCommit(true);
-        } catch (SQLException e) {
-            throw new SqlObjectStoreException("Rollback error", e);
-        }
-    }
-    
-    public SqlMetaData getMetaData() {
-        try {
-            DatabaseMetaData metaData = connection.getMetaData();
-            return new JdbcSqlMetaData(metaData);
-        } catch (SQLException e) {
-            throw new SqlObjectStoreException("Metadata error", e);
-        }
-    }
-
-    public void debug(DebugString debug) {
-        try {
-            DatabaseMetaData metaData = connection.getMetaData();
-            debug.appendln("Product", metaData.getDatabaseProductName() + "  " +  metaData.getDatabaseProductVersion());
-            try {
-                debug.appendln("Product Version", metaData.getDatabaseMajorVersion() + "." + metaData.getDatabaseMinorVersion());
-            } catch (AbstractMethodError ignore) {}
-            debug.appendln("Drive", metaData.getDriverName() + "  " + metaData.getDriverVersion());
-            debug.appendln("Driver Version", metaData.getDriverMajorVersion() + "." + metaData.getDriverMinorVersion());
-            debug.appendln("Keywords", metaData.getSQLKeywords());
-            debug.appendln("Date/Time functions", metaData.getTimeDateFunctions());
-            debug.appendln("Date/Time functions", metaData.getTimeDateFunctions());
-            debug.appendln("Mixed case identifiers", metaData.supportsMixedCaseIdentifiers());
-            debug.appendln("Lower case identifiers", metaData.storesLowerCaseIdentifiers());
-            debug.appendln("Lower case quoted", metaData.storesLowerCaseQuotedIdentifiers());
-            debug.appendln("Mixed case identifiers", metaData.storesMixedCaseIdentifiers());
-            debug.appendln("Mixed case quoted", metaData.storesMixedCaseQuotedIdentifiers());
-            debug.appendln("Upper case identifiers", metaData.storesUpperCaseIdentifiers());
-            debug.appendln("Upper case quoted", metaData.storesUpperCaseQuotedIdentifiers());
-        } catch (SQLException e) {
-            throw new SqlObjectStoreException("Metadata error", e);
-        }
-    }
-    
-    // TODO:KAM All insert/update call must add their values via this
-    private List<Object> queryValues = new ArrayList<Object>();
-    public String addToQueryValues(int i){
-    	queryValues.add(i);
-    	return "?";
-    }
-    public String addToQueryValues(String s){
-    	queryValues.add(s);
-    	return "?";
-    }
-    public String addToQueryValues(Object o){
-    	queryValues.add(o);
-    	return "?";
-    }
+	@Override
+	public void close() {
+		try {
+			if (connection != null) {
+				LOG.info("close");
+				connection.close();
+			}
+		} catch (SQLException e) {
+			throw new SqlObjectStoreException("Failed to close", e);
+		}
+	}
+
+	@Override
+	public int count(final String sql) {
+		LOG.debug("SQL: " + sql);
+		PreparedStatement statement;
+		try {
+			statement = connection.prepareStatement(sql);
+			ResultSet result = statement.executeQuery();
+			result.next();
+			int count = result.getInt(1);
+			statement.close();
+			return count;
+		} catch (SQLException e) {
+			throw new SqlObjectStoreException("Failed count", e);
+		}
+	}
+
+	@Override
+	public void delete(final String sql) {
+		update(sql);
+	}
+
+	public void open() {
+		try {
+			IsisConfiguration params = IsisContext.getConfiguration();
+			String BASE = SqlObjectStore.BASE_NAME + ".jdbc.";
+			String driver = params.getString(BASE + "driver");
+			String url = params.getString(BASE + "connection");
+			String user = params.getString(BASE + "user");
+			String password = params.getString(BASE + "password");
+
+			if (connection != null) {
+				throw new SqlObjectStoreException(
+						"Connection already established");
+			}
+
+			if (driver == null) {
+				throw new SqlObjectStoreException(
+						"No driver specified for database connection");
+			}
+			if (url == null) {
+				throw new SqlObjectStoreException(
+						"No connection URL specified to database");
+			}
+			if (user == null) {
+				throw new SqlObjectStoreException(
+						"No user specified for database connection");
+			}
+			if (password == null) {
+				throw new SqlObjectStoreException(
+						"No password specified for database connection");
+			}
+
+			Class.forName(driver);
+			LOG.info("Connecting to " + url + " as " + user);
+			connection = DriverManager.getConnection(url, user, password);
+			if (connection == null) {
+				throw new SqlObjectStoreException(
+						"No connection established to " + url);
+			}
+		} catch (SQLException e) {
+			throw new SqlObjectStoreException("Failed to start", e);
+		} catch (ClassNotFoundException e) {
+			throw new SqlObjectStoreException("Could not find database driver",
+					e);
+		}
+	}
+
+	/*
+	 * public void executeStoredProcedure(final StoredProcedure storedProcedure)
+	 * { Parameter[] parameters = storedProcedure.getParameters(); StringBuffer
+	 * sql = new StringBuffer("{call "); sql.append(storedProcedure.getName());
+	 * sql.append(" ("); for (int i = 0, no = parameters.length; i < no; i++) {
+	 * sql.append(i == 0 ? "?" : ",?"); } sql.append(")}"); LOG.debug("SQL: " +
+	 * sql);
+	 * 
+	 * CallableStatement statement; try { statement =
+	 * connection.prepareCall(sql.toString());
+	 * 
+	 * for (int i = 0; i < parameters.length; i++) { LOG.debug(" setup param " +
+	 * i + " " + parameters[i]); parameters[i].setupParameter(i + 1,
+	 * parameters[i].getName(), storedProcedure); } LOG.debug(" execute ");
+	 * statement.execute(); for (int i = 0; i < parameters.length; i++) {
+	 * parameters[i].retrieve(i + 1, parameters[i].getName(), storedProcedure);
+	 * LOG.debug(" retrieve param " + i + " " + parameters[i]); } } catch
+	 * (SQLException e) { throw new ObjectAdapterRuntimeException(e); }
+	 * 
+	 * }
+	 * 
+	 * 
+	 * public MultipleResults executeStoredProcedure(final String name, final
+	 * Parameter[] parameters) { StringBuffer sql = new StringBuffer("{call ");
+	 * sql.append(name); sql.append(" ("); for (int i = 0; i <
+	 * parameters.length; i++) { sql.append(i == 0 ? "?" : ",?"); }
+	 * sql.append(")}"); LOG.debug("SQL: " + sql);
+	 * 
+	 * CallableStatement statement; try { statement =
+	 * connection.prepareCall(sql.toString());
+	 * 
+	 * StoredProcedure storedProcedure = new JdbcStoredProcedure(statement);
+	 * 
+	 * for (int i = 0; i < parameters.length; i++) { LOG.debug(" setup param " +
+	 * i + " " + parameters[i]); parameters[i].setupParameter(i + 1,
+	 * parameters[i].getName(), storedProcedure); } LOG.debug(" execute ");
+	 * statement.execute(); for (int i = 0; i < parameters.length; i++) {
+	 * parameters[i].retrieve(i + 1, parameters[i].getName(), storedProcedure);
+	 * LOG.debug(" retrieve param " + i + " " + parameters[i]); }
+	 * 
+	 * return new JdbcResults(statement); } catch (SQLException e) { throw new
+	 * ObjectAdapterRuntimeException(e); } }
+	 */
+
+	@Override
+	public Results select(final String sql) {
+		LOG.debug("SQL: " + sql);
+		PreparedStatement statement;
+		try {
+			statement = connection.prepareStatement(sql);
+			addPreparedValues(statement);
+			return new JdbcResults(statement.executeQuery());
+		} catch (SQLException e) {
+			throw new SqlObjectStoreException(e);
+		} finally {
+			clearPreparedValues();
+		}
+	}
+
+	@Override
+	public int update(final String sql) {
+		LOG.debug("SQL: " + sql);
+		PreparedStatement statement;
+		try {
+			statement = connection.prepareStatement(sql);
+			addPreparedValues(statement);
+			int updateCount = statement.executeUpdate();
+			statement.close();
+			return updateCount;
+		} catch (SQLException e) {
+			LOG.error("failed to execute " + sql, e);
+			throw new SqlObjectStoreException("SQL error", e);
+		} finally {
+			clearPreparedValues();
+		}
+	}
+
+	private void clearPreparedValues() {
+		queryValues.clear();
+	}
+
+	private void addPreparedValues(PreparedStatement statement)
+			throws SQLException {
+		if (queryValues.size() > 0) {
+			int i = 1;
+			for (Object value : queryValues) {
+				statement.setObject(i++, value);
+			}
+		}
+	}
+
+	@Override
+	public boolean hasTable(final String tableName) {
+		try {
+			ResultSet set = connection.getMetaData().getTables(null, null,
+					tableName, null);
+			if (set.next()) {
+				LOG.debug("Found " + set.getString("TABLE_NAME"));
+				set.close();
+				return true;
+			} else {
+				set.close();
+				return false;
+			}
+		} catch (SQLException e) {
+			throw new SqlObjectStoreException(e);
+		}
+	}
+
+	@Override
+	public boolean hasColumn(final String tableName, final String columnName) {
+		try {
+			ResultSet set = connection.getMetaData().getColumns(null, null,
+					tableName, columnName);
+			if (set.next()) {
+				LOG.debug("Found " + set.getString("COLUMN_NAME") + " in "
+						+ set.getString("TABLE_NAME"));
+				set.close();
+				return true;
+			} else {
+				set.close();
+				return false;
+			}
+		} catch (SQLException e) {
+			throw new SqlObjectStoreException(e);
+		}
+	}
+
+	@Override
+	public void insert(final String sql) {
+		update(sql);
+	}
+
+	@Override
+	public void insert(final String sql, final Object oid) {
+		LOG.debug("SQL: " + sql);
+		PreparedStatement statement;
+		try {
+			statement = connection.prepareStatement(sql);
+			statement.executeUpdate();
+			/*
+			 * require 3.0 ResultSet rs = statement.getGeneratedKeys();
+			 * if(rs.next()) { int id = rs.getInt(1); }
+			 */statement.close();
+		} catch (SQLException e) {
+			throw new SqlObjectStoreException("SQL error", e);
+		}
+	}
+
+	public Connection getConnection() {
+		return connection;
+	}
+
+	@Override
+	public void commit() {
+		try {
+			LOG.debug("commit");
+			connection.commit();
+			connection.setAutoCommit(true);
+		} catch (SQLException e) {
+			throw new SqlObjectStoreException("Commit error", e);
+		}
+	}
+
+	@Override
+	public void begin() {
+		try {
+			LOG.debug("begin transaction");
+			connection.setAutoCommit(false);
+			clearPreparedValues();
+		} catch (SQLException e) {
+			throw new SqlObjectStoreException("Rollback error", e);
+		}
+
+	}
+
+	@Override
+	public void rollback() {
+		try {
+			LOG.debug("rollback");
+			connection.rollback();
+			connection.setAutoCommit(true);
+		} catch (SQLException e) {
+			throw new SqlObjectStoreException("Rollback error", e);
+		}
+	}
+
+	@Override
+	public SqlMetaData getMetaData() {
+		try {
+			DatabaseMetaData metaData = connection.getMetaData();
+			return new JdbcSqlMetaData(metaData);
+		} catch (SQLException e) {
+			throw new SqlObjectStoreException("Metadata error", e);
+		}
+	}
+
+	@Override
+	public void debug(DebugString debug) {
+		try {
+			DatabaseMetaData metaData = connection.getMetaData();
+			debug.appendln("Product", metaData.getDatabaseProductName() + "  "
+					+ metaData.getDatabaseProductVersion());
+			try {
+				debug.appendln(
+						"Product Version",
+						metaData.getDatabaseMajorVersion() + "."
+								+ metaData.getDatabaseMinorVersion());
+			} catch (AbstractMethodError ignore) {
+			}
+			debug.appendln(
+					"Drive",
+					metaData.getDriverName() + "  "
+							+ metaData.getDriverVersion());
+			debug.appendln("Driver Version", metaData.getDriverMajorVersion()
+					+ "." + metaData.getDriverMinorVersion());
+			debug.appendln("Keywords", metaData.getSQLKeywords());
+			debug.appendln("Date/Time functions",
+					metaData.getTimeDateFunctions());
+			debug.appendln("Date/Time functions",
+					metaData.getTimeDateFunctions());
+			debug.appendln("Mixed case identifiers",
+					metaData.supportsMixedCaseIdentifiers());
+			debug.appendln("Lower case identifiers",
+					metaData.storesLowerCaseIdentifiers());
+			debug.appendln("Lower case quoted",
+					metaData.storesLowerCaseQuotedIdentifiers());
+			debug.appendln("Mixed case identifiers",
+					metaData.storesMixedCaseIdentifiers());
+			debug.appendln("Mixed case quoted",
+					metaData.storesMixedCaseQuotedIdentifiers());
+			debug.appendln("Upper case identifiers",
+					metaData.storesUpperCaseIdentifiers());
+			debug.appendln("Upper case quoted",
+					metaData.storesUpperCaseQuotedIdentifiers());
+		} catch (SQLException e) {
+			throw new SqlObjectStoreException("Metadata error", e);
+		}
+	}
+
+	// TODO:KAM All insert/update call must add their values via this
+	private final List<Object> queryValues = new ArrayList<Object>();
+
+	@Override
+	public String addToQueryValues(int i) {
+		queryValues.add(i);
+		return "?";
+	}
+
+	@Override
+	public String addToQueryValues(String s) {
+		queryValues.add(s);
+		return "?";
+	}
+
+	@Override
+	public String addToQueryValues(Object o) {
+		queryValues.add(o);
+		return "?";
+	}
 }

Modified: incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/jdbc/JdbcObjectReferenceFieldMapping.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/jdbc/JdbcObjectReferenceFieldMapping.java?rev=1035054&r1=1035053&r2=1035054&view=diff
==============================================================================
--- incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/jdbc/JdbcObjectReferenceFieldMapping.java (original)
+++ incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/jdbc/JdbcObjectReferenceFieldMapping.java Sun Nov 14 19:38:08 2010
@@ -43,7 +43,7 @@ public class JdbcObjectReferenceFieldMap
 
     public void appendWhereClause(DatabaseConnector connector, StringBuffer sql, ObjectAdapter object) {
         ObjectAdapter fieldValue = field.get(object);
-        appendWhereClause(sql, fieldValue.getOid());
+        appendWhereClause(connector, sql, fieldValue.getOid());
     }
 
     public JdbcObjectReferenceFieldMapping(ObjectAssociation field) {

Modified: incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/jdbc/JdbcObjectReferenceMapping.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/jdbc/JdbcObjectReferenceMapping.java?rev=1035054&r1=1035053&r2=1035054&view=diff
==============================================================================
--- incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/jdbc/JdbcObjectReferenceMapping.java (original)
+++ incubator/isis/trunk/alternatives/objectstore/sql/persistor/src/main/java/org/apache/isis/extensions/sql/objectstore/jdbc/JdbcObjectReferenceMapping.java Sun Nov 14 19:38:08 2010
@@ -17,7 +17,6 @@
  *  under the License.
  */
 
-
 package org.apache.isis.extensions.sql.objectstore.jdbc;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -30,39 +29,42 @@ import org.apache.isis.extensions.sql.ob
 import org.apache.isis.extensions.sql.objectstore.SqlObjectStoreException;
 import org.apache.isis.extensions.sql.objectstore.mapping.ObjectReferenceMapping;
 
-
-public class JdbcObjectReferenceMapping extends IdMappingAbstract implements ObjectReferenceMapping {
-    private ObjectSpecification specification;
-
-    public JdbcObjectReferenceMapping(String columnName, ObjectSpecification specification) {
-        this.specification = specification;
-        String idColumn = Sql.sqlName("fk_" + columnName);
-        setColumn(idColumn);
-    }
-
-     public void appendUpdateValues(DatabaseConnector connector, StringBuffer sql, ObjectAdapter object) {
-        sql.append(getColumn());
-        if (object == null) {
-            sql.append("= NULL ");
-        } else {
-            sql.append("=");
-            sql.append(primaryKey(object.getOid()));
-        }
-    }
-
-    public ObjectAdapter initializeField(Results rs) {
-        Oid oid = recreateOid(rs, specification);
-        if (oid != null) {
-            if (specification.isAbstract()) {
-                throw new SqlObjectStoreException("NOT DEALING WITH POLYMORPHIC ASSOCIATIONS");
-            } else {
-                return getAdapter(specification, oid);
-            }
-        } else {
-            return null;
-        }
-    }
-
+public class JdbcObjectReferenceMapping extends IdMappingAbstract implements
+		ObjectReferenceMapping {
+	private final ObjectSpecification specification;
+
+	public JdbcObjectReferenceMapping(String columnName,
+			ObjectSpecification specification) {
+		this.specification = specification;
+		String idColumn = Sql.sqlName("fk_" + columnName);
+		setColumn(idColumn);
+	}
+
+	@Override
+	public void appendUpdateValues(DatabaseConnector connector,
+			StringBuffer sql, ObjectAdapter object) {
+		sql.append(getColumn());
+		if (object == null) {
+			sql.append("= NULL ");
+		} else {
+			sql.append("= ?");
+			// sql.append(primaryKey(object.getOid()));
+			connector.addToQueryValues(primaryKeyAsObject(object.getOid()));
+		}
+	}
+
+	public ObjectAdapter initializeField(Results rs) {
+		Oid oid = recreateOid(rs, specification);
+		if (oid != null) {
+			if (specification.isAbstract()) {
+				throw new SqlObjectStoreException(
+						"NOT DEALING WITH POLYMORPHIC ASSOCIATIONS");
+			} else {
+				return getAdapter(specification, oid);
+			}
+		} else {
+			return null;
+		}
+	}
 
 }
-