You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2012/12/13 01:01:07 UTC

[26/52] [partial] ISIS-188: renaming packages in line with groupId:artifactId

http://git-wip-us.apache.org/repos/asf/isis/blob/951a0fe4/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcConnector.java
----------------------------------------------------------------------
diff --git a/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcConnector.java b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcConnector.java
new file mode 100644
index 0000000..054b81d
--- /dev/null
+++ b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcConnector.java
@@ -0,0 +1,405 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.objectstore.sql.jdbc;
+
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+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.core.runtime.system.context.IsisContext;
+import org.apache.isis.objectstore.sql.AbstractDatabaseConnector;
+import org.apache.isis.objectstore.sql.Results;
+import org.apache.isis.objectstore.sql.SqlMetaData;
+import org.apache.isis.objectstore.sql.SqlObjectStore;
+import org.apache.isis.objectstore.sql.SqlObjectStoreException;
+
+public class JdbcConnector extends AbstractDatabaseConnector {
+    private static final Logger LOG = Logger.getLogger(JdbcConnector.class);
+    private Connection connection;
+    private final String baseName;
+
+    public JdbcConnector() {
+        baseName = SqlObjectStore.BASE_NAME;
+    }
+
+    public JdbcConnector(final String propertyBase) {
+        baseName = propertyBase;
+    }
+
+    @Override
+    public void close() {
+        try {
+            if (connection != null) {
+                LOG.info("close");
+                connection.close();
+                connection = null;
+
+            }
+        } catch (final 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);
+            final ResultSet result = statement.executeQuery();
+            result.next();
+            final int count = result.getInt(1);
+            statement.close();
+            return count;
+        } catch (final SQLException e) {
+            throw new SqlObjectStoreException("Failed count", e);
+        }
+    }
+
+    @Override
+    public void delete(final String sql) {
+        update(sql);
+    }
+
+    public void open() {
+        final String BASE = baseName + ".jdbc.";
+        final IsisConfiguration params = IsisContext.getConfiguration().getProperties(BASE);
+
+        try {
+            final String driver = params.getString(BASE + "driver");
+            final String url = params.getString(BASE + "connection");
+            final String user = params.getString(BASE + "user");
+            final 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) {
+                LOG.info("No user specified; will attempt to login with no credentials");
+            } else {
+                if (password == null) {
+                    throw new SqlObjectStoreException("No password specified for database connection");
+                }
+            }
+
+            Class.forName(driver);
+            connection = getConnection(url, user, password);
+            if (connection == null) {
+                throw new SqlObjectStoreException("No connection established to " + url);
+            }
+        } catch (final SQLException e) {
+            throw new SqlObjectStoreException("Failed to start", e);
+        } catch (final ClassNotFoundException e) {
+            throw new SqlObjectStoreException("Could not find database driver", e);
+        }
+
+    }
+
+    private static Connection getConnection(final String url, final String user, final String password) throws SQLException {
+        if(user != null) {
+            LOG.info("Connecting to " + url + " as " + user);
+            return DriverManager.getConnection(url, user, password);
+        } else {
+            LOG.info("Connecting to " + url + " with no credentials");
+            return DriverManager.getConnection(url);
+        }
+    }
+
+    /*
+     * 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 (final 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);
+            final int updateCount = statement.executeUpdate();
+            statement.close();
+            return updateCount;
+        } catch (final SQLException e) {
+            LOG.error("failed to execute " + sql, e);
+            throw new SqlObjectStoreException("SQL error: " + e.toString(), e);
+        } finally {
+            clearPreparedValues();
+        }
+    }
+
+    private void clearPreparedValues() {
+        queryValues.clear();
+    }
+
+    private void addPreparedValues(final PreparedStatement statement) throws SQLException {
+        if (queryValues.size() > 0) {
+            int i = 1;
+            try {
+                for (final Object value : queryValues) {
+                    if (value instanceof LocalDate) {
+                        try {
+                            statement.setObject(i, value, java.sql.Types.DATE);
+                        } catch (final SQLException e) {
+                            // TODO This daft catch is required my MySQL, which
+                            // also requires the TimeZone offset to be
+                            // "undone"
+                            final LocalDate localDate = (LocalDate) value;
+                            final int millisOffset = -DateTimeZone.getDefault().getOffset(null);
+                            final java.util.Date javaDate = localDate.toDateTimeAtStartOfDay(DateTimeZone.forOffsetMillis(millisOffset)).toDate();
+
+                            statement.setObject(i, javaDate, java.sql.Types.DATE);
+                        }
+                    } else {
+                        statement.setObject(i, value);
+                    }
+                    i++;
+                }
+            } catch (final SQLException e) {
+                LOG.error("Error adding prepared value " + i + " of type " + queryValues.get(i - 1).getClass().getSimpleName(), e);
+                throw e;
+            }
+        }
+    }
+
+    @Override
+    public boolean hasTable(final String tableName) {
+        try {
+            final 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 (final SQLException e) {
+            throw new SqlObjectStoreException(e);
+        }
+    }
+
+    @Override
+    public boolean hasColumn(final String tableName, final String columnName) {
+        try {
+            final 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 (final 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 (final 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 (final SQLException e) {
+            throw new SqlObjectStoreException("Commit error", e);
+        }
+    }
+
+    @Override
+    public void begin() {
+        try {
+            LOG.debug("begin transaction");
+            connection.setAutoCommit(false);
+            clearPreparedValues();
+        } catch (final SQLException e) {
+            throw new SqlObjectStoreException("Rollback error", e);
+        }
+
+    }
+
+    @Override
+    public void rollback() {
+        try {
+            LOG.debug("rollback");
+            connection.rollback();
+            connection.setAutoCommit(true);
+        } catch (final SQLException e) {
+            throw new SqlObjectStoreException("Rollback error", e);
+        }
+    }
+
+    @Override
+    public SqlMetaData getMetaData() {
+        try {
+            final DatabaseMetaData metaData = connection.getMetaData();
+            return new JdbcSqlMetaData(metaData);
+        } catch (final SQLException e) {
+            throw new SqlObjectStoreException("Metadata error", e);
+        }
+    }
+
+    @Override
+    public void debug(final DebugBuilder debug) {
+        try {
+            final DatabaseMetaData metaData = connection.getMetaData();
+            debug.appendln("Product", metaData.getDatabaseProductName() + "  " + metaData.getDatabaseProductVersion());
+            try {
+                debug.appendln("Product Version", metaData.getDatabaseMajorVersion() + "." + metaData.getDatabaseMinorVersion());
+            } catch (final 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("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());
+            debug.appendln("Max table name length", metaData.getMaxTableNameLength());
+            debug.appendln("Max column name length", metaData.getMaxColumnNameLength());
+
+        } catch (final SQLException e) {
+            throw new SqlObjectStoreException("Metadata error", e);
+        }
+    }
+
+    private final List<Object> queryValues = new ArrayList<Object>();
+
+    @Override
+    public String addToQueryValues(final int i) {
+        queryValues.add(i);
+        return "?";
+    }
+
+    @Override
+    public String addToQueryValues(final String s) {
+        queryValues.add(s);
+        return "?";
+    }
+
+    @Override
+    public String addToQueryValues(final Object o) {
+        queryValues.add(o);
+        return "?";
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/951a0fe4/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcConnectorFactory.java
----------------------------------------------------------------------
diff --git a/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcConnectorFactory.java b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcConnectorFactory.java
new file mode 100644
index 0000000..fcb6a72
--- /dev/null
+++ b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcConnectorFactory.java
@@ -0,0 +1,34 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.objectstore.sql.jdbc;
+
+import org.apache.isis.objectstore.sql.DatabaseConnector;
+import org.apache.isis.objectstore.sql.DatabaseConnectorFactory;
+
+public class JdbcConnectorFactory implements DatabaseConnectorFactory {
+
+    @Override
+    public DatabaseConnector createConnector() {
+        final JdbcConnector connection = new JdbcConnector();
+        connection.open();
+        return connection;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/951a0fe4/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcDateMapper.java
----------------------------------------------------------------------
diff --git a/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcDateMapper.java b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcDateMapper.java
new file mode 100644
index 0000000..20592b3
--- /dev/null
+++ b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcDateMapper.java
@@ -0,0 +1,108 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.objectstore.sql.jdbc;
+
+import org.joda.time.LocalDate;
+
+import org.apache.isis.applib.PersistFailedException;
+import org.apache.isis.applib.value.Date;
+import org.apache.isis.core.commons.exceptions.IsisApplicationException;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.objectstore.sql.AbstractFieldMappingFactory;
+import org.apache.isis.objectstore.sql.Defaults;
+import org.apache.isis.objectstore.sql.Results;
+import org.apache.isis.objectstore.sql.mapping.FieldMapping;
+
+/**
+ * Handles reading and writing java.sql.Date and org.apache.isis.applib.value.Date values to and from the data store.
+ * 
+ * 
+ * @version $Rev$ $Date$
+ */
+public class JdbcDateMapper extends AbstractJdbcFieldMapping {
+
+    private final String dataType;
+
+    public static class Factory extends AbstractFieldMappingFactory {
+        @Override
+        public FieldMapping createFieldMapping(final ObjectSpecification object, final ObjectAssociation field) {
+            final String dataType = getTypeOverride(object, field, Defaults.TYPE_DATE());
+            return new JdbcDateMapper(field, dataType);
+        }
+    }
+
+    protected JdbcDateMapper(final ObjectAssociation field, final String dataType) {
+        super(field);
+        this.dataType = dataType;
+    }
+
+    @Override
+    protected Object preparedStatementObject(final ObjectAdapter value) {
+        final Object o = value.getObject();
+        if (o instanceof java.sql.Date) {
+            final java.sql.Date javaSqlDate = (java.sql.Date) value.getObject();
+            final long millisSinceEpoch = javaSqlDate.getTime();
+            return new LocalDate(millisSinceEpoch);
+        } else if (o instanceof Date) {
+            final Date asDate = (Date) value.getObject();
+            return new LocalDate(asDate.getMillisSinceEpoch());
+        } else {
+            throw new IsisApplicationException("Unimplemented JdbcDateMapper instance type: "
+                + value.getClass().toString());
+        }
+    }
+
+    @Override
+    public ObjectAdapter setFromDBColumn(final Results results, final String columnName, final ObjectAssociation field) {
+        ObjectAdapter restoredValue;
+        final java.util.Date javaDateValue = results.getJavaDateOnly(columnName);
+        final Class<?> correspondingClass = field.getSpecification().getCorrespondingClass();
+        if (correspondingClass == java.util.Date.class || correspondingClass == java.sql.Date.class) {
+            // 2011-04-08 = 1270684800000
+            restoredValue = getAdapterManager().adapterFor(javaDateValue);
+        } else if (correspondingClass == Date.class) {
+            // 2010-03-05 = 1267747200000
+            Date dateValue;
+            dateValue = new Date(javaDateValue);
+            restoredValue = getAdapterManager().adapterFor(dateValue);
+        } else {
+            throw new PersistFailedException("Unhandled date type: " + correspondingClass.getCanonicalName());
+        }
+        return restoredValue;
+    }
+
+    @Override
+    public String columnType() {
+        return dataType;
+    }
+
+    protected PersistenceSession getPersistenceSession() {
+        return IsisContext.getPersistenceSession();
+    }
+
+    protected AdapterManager getAdapterManager() {
+        return getPersistenceSession().getAdapterManager();
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/951a0fe4/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcDateTimeMapper.java
----------------------------------------------------------------------
diff --git a/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcDateTimeMapper.java b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcDateTimeMapper.java
new file mode 100644
index 0000000..19c2c96
--- /dev/null
+++ b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcDateTimeMapper.java
@@ -0,0 +1,77 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.objectstore.sql.jdbc;
+
+import org.apache.isis.applib.PersistFailedException;
+import org.apache.isis.applib.value.DateTime;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.objectstore.sql.AbstractFieldMappingFactory;
+import org.apache.isis.objectstore.sql.Defaults;
+import org.apache.isis.objectstore.sql.Results;
+import org.apache.isis.objectstore.sql.mapping.FieldMapping;
+
+public class JdbcDateTimeMapper extends AbstractJdbcFieldMapping {
+
+    private final String dataType;
+
+    public static class Factory extends AbstractFieldMappingFactory {
+        @Override
+        public FieldMapping createFieldMapping(final ObjectSpecification object, final ObjectAssociation field) {
+            final String dataType = getTypeOverride(object, field, Defaults.TYPE_DATETIME());
+            return new JdbcDateTimeMapper(field, dataType);
+        }
+    }
+
+    protected JdbcDateTimeMapper(final ObjectAssociation field, final String dataType) {
+        super(field);
+        this.dataType = dataType;
+    }
+
+    @Override
+    protected Object preparedStatementObject(final ObjectAdapter value) {
+        final DateTime asDate = (DateTime) value.getObject();
+        final java.sql.Timestamp dateTime = new java.sql.Timestamp(asDate.millisSinceEpoch());
+        return dateTime;
+    }
+
+    @Override
+    public ObjectAdapter setFromDBColumn(final Results results, final String columnName, final ObjectAssociation field) {
+
+        ObjectAdapter restoredValue;
+        final Class<?> correspondingClass = field.getSpecification().getCorrespondingClass();
+        if (correspondingClass == DateTime.class) {
+            final java.sql.Timestamp o = (java.sql.Timestamp) results.getObject(columnName);
+            final DateTime timeValue = new DateTime(o.getTime());
+            restoredValue = IsisContext.getPersistenceSession().getAdapterManager().adapterFor(timeValue);
+        } else {
+            throw new PersistFailedException("Unhandled time type: " + correspondingClass.getCanonicalName());
+        }
+        return restoredValue;
+    }
+
+    @Override
+    public String columnType() {
+        return dataType;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/951a0fe4/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcGeneralValueMapper.java
----------------------------------------------------------------------
diff --git a/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcGeneralValueMapper.java b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcGeneralValueMapper.java
new file mode 100644
index 0000000..0129ddc
--- /dev/null
+++ b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcGeneralValueMapper.java
@@ -0,0 +1,101 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.objectstore.sql.jdbc;
+
+import org.apache.isis.applib.value.Money;
+import org.apache.isis.applib.value.Password;
+import org.apache.isis.applib.value.Percentage;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.objectstore.sql.AbstractFieldMappingFactory;
+import org.apache.isis.objectstore.sql.Results;
+import org.apache.isis.objectstore.sql.mapping.FieldMapping;
+
+public class JdbcGeneralValueMapper extends AbstractJdbcFieldMapping {
+
+    public static class Factory extends AbstractFieldMappingFactory {
+        private final String type;
+
+        public Factory(final String type) {
+            super();
+            this.type = type;
+        }
+
+        @Override
+        public FieldMapping createFieldMapping(final ObjectSpecification object, final ObjectAssociation field) {
+            final String dataType = getTypeOverride(object, field, type);
+            return new JdbcGeneralValueMapper(field, dataType);
+        }
+    }
+
+    private final String type;
+
+    public JdbcGeneralValueMapper(final ObjectAssociation field, final String type) {
+        super(field);
+        this.type = type;
+    }
+
+    @Override
+    protected Object preparedStatementObject(final ObjectAdapter value) {
+        if (value == null) {
+            return null;
+        }
+
+        final Object o = value.getObject();
+
+        if (o instanceof Money) {
+            return ((Money) o).floatValue();
+        } else if (o instanceof Percentage) {
+            return ((Percentage) o).floatValue();
+        } else if (o instanceof Password) {
+            return ((Password) o).getPassword();
+        } else if (o instanceof String) {
+            return o;
+        } else if (o instanceof Boolean) {
+            return o;
+        } else {
+            if (columnType().contains("CHAR")) {
+                final EncodableFacet facet = value.getSpecification().getFacet(EncodableFacet.class);
+                final String encodedString = facet.toEncodedString(value);
+                return encodedString;
+            } else {
+                return o;
+            }
+        }
+    }
+
+    @Override
+    public ObjectAdapter setFromDBColumn(final Results results, final String columnName, final ObjectAssociation field) {
+        final String encodedValue = results.getString(columnName);
+        if (encodedValue == null) {
+            return null;
+        }
+        final EncodableFacet facet = field.getSpecification().getFacet(EncodableFacet.class);
+        return facet.fromEncodedString(encodedValue);
+    }
+
+    @Override
+    public String columnType() {
+        return type;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/951a0fe4/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcMoneyValueMapper.java
----------------------------------------------------------------------
diff --git a/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcMoneyValueMapper.java b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcMoneyValueMapper.java
new file mode 100755
index 0000000..1821795
--- /dev/null
+++ b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcMoneyValueMapper.java
@@ -0,0 +1,81 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.objectstore.sql.jdbc;
+
+import org.apache.isis.applib.PersistFailedException;
+import org.apache.isis.applib.value.Money;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.objectstore.sql.Results;
+import org.apache.isis.objectstore.sql.mapping.FieldMapping;
+import org.apache.isis.objectstore.sql.mapping.FieldMappingFactory;
+
+/**
+ * Money needs to implement a two-column persistence, 1 for amount, 1 for
+ * 3-digit currency
+ * 
+ * @version $Rev$ $Date$
+ */
+public class JdbcMoneyValueMapper extends AbstractJdbcMultiFieldMapping {
+
+    public static class Factory implements FieldMappingFactory {
+        private final String type1;
+        private final String type2;
+
+        public Factory(final String type1, final String type2) {
+            this.type1 = type1;
+            this.type2 = type2;
+        }
+
+        @Override
+        public FieldMapping createFieldMapping(final ObjectSpecification object, final ObjectAssociation field) {
+            return new JdbcMoneyValueMapper(field, type1, type2);
+        }
+    }
+
+    public JdbcMoneyValueMapper(final ObjectAssociation field, final String type1, final String type2) {
+        super(field, 2, type1, type2);
+    }
+
+    @Override
+    protected Object preparedStatementObject(final int index, final Object o) {
+
+        if (o instanceof Money) {
+            if (index == 0) {
+                return ((Money) o).doubleValue();
+            } else {
+                return ((Money) o).getCurrency();
+            }
+        } else {
+            throw new PersistFailedException("Invalid object type " + o.getClass().getCanonicalName() + " for MoneyValueMapper");
+        }
+    }
+
+    @Override
+    protected Object getObjectFromResults(final Results results) {
+        final double doubleValue = results.getDouble(columnName(0));
+        final String currencyValue = results.getString(columnName(1));
+
+        final Money moneyObject = new Money(doubleValue, currencyValue);
+
+        return moneyObject;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/951a0fe4/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcObjectReferenceFieldMapping.java
----------------------------------------------------------------------
diff --git a/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcObjectReferenceFieldMapping.java b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcObjectReferenceFieldMapping.java
new file mode 100644
index 0000000..db826c4
--- /dev/null
+++ b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcObjectReferenceFieldMapping.java
@@ -0,0 +1,101 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.objectstore.sql.jdbc;
+
+import org.apache.isis.core.commons.debug.DebugBuilder;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.objectstore.sql.AbstractFieldMappingFactory;
+import org.apache.isis.objectstore.sql.DatabaseConnector;
+import org.apache.isis.objectstore.sql.Defaults;
+import org.apache.isis.objectstore.sql.Results;
+import org.apache.isis.objectstore.sql.Sql;
+import org.apache.isis.objectstore.sql.mapping.FieldMapping;
+
+public class JdbcObjectReferenceFieldMapping extends JdbcObjectReferenceMapping implements FieldMapping {
+
+    public static class Factory extends AbstractFieldMappingFactory {
+        @Override
+        public FieldMapping createFieldMapping(final ObjectSpecification object, final ObjectAssociation field) {
+            if (field.getSpecification().isAbstract()) {
+                final String dataType = getTypeOverride(object, field, Defaults.TYPE_LONG_STRING());
+                return new JdbcAbstractReferenceFieldMapping(field, dataType);
+            }
+            return new JdbcObjectReferenceFieldMapping(field);
+        }
+    }
+
+    protected final ObjectAssociation field;
+
+    @Override
+    public ObjectAssociation getField() {
+        return field;
+    }
+
+    @Override
+    public void appendWhereClause(final DatabaseConnector connector, final StringBuffer sql, final ObjectAdapter object) {
+        final ObjectAdapter fieldValue = field.get(object);
+        final RootOid oid = (RootOid) fieldValue.getOid();
+        appendWhereClause(connector, sql, oid);
+    }
+
+    @Override
+    public void appendWhereObject(final DatabaseConnector connector, final ObjectAdapter objectAdapter) {
+        final ObjectAdapter fieldValue = field.get(objectAdapter);
+        final RootOid oid = (RootOid) fieldValue.getOid();
+        connector.addToQueryValues(primaryKey(oid));
+    }
+
+    public JdbcObjectReferenceFieldMapping(final ObjectAssociation field) {
+        super(columnName(field), field.getSpecification());
+        this.field = field;
+    }
+
+    private static String columnName(final ObjectAssociation field) {
+        return Sql.sqlFieldName(field.getId());
+    }
+
+    @Override
+    public void appendInsertValues(final DatabaseConnector connector, final StringBuffer sb, final ObjectAdapter object) {
+        final ObjectAdapter fieldValue = field.get(object);
+        super.appendInsertValues(connector, sb, fieldValue);
+    }
+
+    @Override
+    public void appendUpdateValues(final DatabaseConnector connector, final StringBuffer sql, final ObjectAdapter object) {
+        final ObjectAdapter fieldValue = field.get(object);
+        super.appendUpdateValues(connector, sql, fieldValue);
+    }
+
+    @Override
+    public void initializeField(final ObjectAdapter object, final Results rs) {
+        final ObjectAdapter reference = initializeField(rs);
+        ((OneToOneAssociation) field).initAssociation(object, reference);
+    }
+
+    @Override
+    public void debugData(final DebugBuilder debug) {
+        debug.appendln(field.getId(), getColumn());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/951a0fe4/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcObjectReferenceMapping.java
----------------------------------------------------------------------
diff --git a/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcObjectReferenceMapping.java b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcObjectReferenceMapping.java
new file mode 100644
index 0000000..95a02b5
--- /dev/null
+++ b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcObjectReferenceMapping.java
@@ -0,0 +1,68 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.objectstore.sql.jdbc;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.objectstore.sql.DatabaseConnector;
+import org.apache.isis.objectstore.sql.IdMappingAbstract;
+import org.apache.isis.objectstore.sql.Results;
+import org.apache.isis.objectstore.sql.Sql;
+import org.apache.isis.objectstore.sql.SqlObjectStoreException;
+import org.apache.isis.objectstore.sql.mapping.ObjectReferenceMapping;
+
+public class JdbcObjectReferenceMapping extends IdMappingAbstract implements ObjectReferenceMapping {
+    private final ObjectSpecification specification;
+
+    public JdbcObjectReferenceMapping(final String columnName, final ObjectSpecification specification) {
+        this.specification = specification;
+        final String idColumn = Sql.sqlName("fk_" + columnName);
+        setColumn(idColumn);
+    }
+
+    @Override
+    public void appendUpdateValues(final DatabaseConnector connector, final StringBuffer sql, final ObjectAdapter adapter) {
+        sql.append(getColumn());
+        if (adapter == null) {
+            sql.append("= NULL ");
+        } else {
+            sql.append("= ?");
+            // sql.append(primaryKey(object.getOid()));
+            final RootOid oid = (RootOid) adapter.getOid();
+            connector.addToQueryValues(primaryKey(oid));
+        }
+    }
+
+    public ObjectAdapter initializeField(final Results rs) {
+        final 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;
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/951a0fe4/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcObjectReferenceMappingFactory.java
----------------------------------------------------------------------
diff --git a/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcObjectReferenceMappingFactory.java b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcObjectReferenceMappingFactory.java
new file mode 100644
index 0000000..e2e1d23
--- /dev/null
+++ b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcObjectReferenceMappingFactory.java
@@ -0,0 +1,33 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.objectstore.sql.jdbc;
+
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.objectstore.sql.mapping.ObjectReferenceMapping;
+import org.apache.isis.objectstore.sql.mapping.ObjectReferenceMappingFactory;
+
+public class JdbcObjectReferenceMappingFactory implements ObjectReferenceMappingFactory {
+
+    @Override
+    public ObjectReferenceMapping createReferenceMapping(final String columnName, final ObjectSpecification specification) {
+        return new JdbcObjectReferenceMapping(columnName, specification);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/951a0fe4/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcPasswordValueMapper.java
----------------------------------------------------------------------
diff --git a/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcPasswordValueMapper.java b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcPasswordValueMapper.java
new file mode 100644
index 0000000..0c2bd4e
--- /dev/null
+++ b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcPasswordValueMapper.java
@@ -0,0 +1,106 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.isis.objectstore.sql.jdbc;
+
+import org.apache.isis.applib.value.Password;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.objectstore.sql.AbstractFieldMappingFactory;
+import org.apache.isis.objectstore.sql.Results;
+import org.apache.isis.objectstore.sql.jdbc.helpers.SimplePasswordEncoderDecoder;
+import org.apache.isis.objectstore.sql.mapping.FieldMapping;
+
+/**
+ * Implements a Password string type that stores the passwords with a simple encoding in the database.
+ * 
+ * @version $Rev$ $Date$
+ */
+public class JdbcPasswordValueMapper extends AbstractJdbcFieldMapping {
+
+    public static class Factory extends AbstractFieldMappingFactory {
+        private final String type;
+        private final String passwordSeed;
+        private final Integer encLength;
+
+        public Factory(final String type, final String passwordSeed, final Integer encLength) {
+            super();
+            this.type = type;
+            this.passwordSeed = passwordSeed;
+            this.encLength = encLength;
+        }
+
+        @Override
+        public FieldMapping createFieldMapping(final ObjectSpecification object, final ObjectAssociation field) {
+            final String dataType = getTypeOverride(object, field, type);
+            return new JdbcPasswordValueMapper(field, dataType, passwordSeed, encLength);
+        }
+    }
+
+    private final String type;
+
+    private final SimplePasswordEncoderDecoder simplePasswordEncoderDecoder;
+
+    public JdbcPasswordValueMapper(final ObjectAssociation field, final String type, final String passwordSeed,
+        final Integer encLength) {
+        super(field);
+        this.type = type;
+
+        simplePasswordEncoderDecoder = new SimplePasswordEncoderDecoder(passwordSeed, encLength);
+    }
+
+    /*
+     * @see org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.AbstractJdbcFieldMapping#columnType()
+     */
+    @Override
+    protected String columnType() {
+        return type;
+    }
+
+    /*
+     * @see
+     * org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.AbstractJdbcFieldMapping#preparedStatementObject(org.apache
+     * .isis.core.metamodel.adapter.ObjectAdapter)
+     */
+    @Override
+    protected Object preparedStatementObject(ObjectAdapter value) {
+        if (value == null) {
+            return null;
+        }
+        final Object o = value.getObject();
+        final String rawPassword = ((Password) o).getPassword();
+        return simplePasswordEncoderDecoder.encodeRawValueIntoEncodedString(rawPassword);
+    }
+
+    /*
+     * @see
+     * org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.AbstractJdbcFieldMapping#setFromDBColumn(org.apache.isis.
+     * runtimes.dflt.objectstores.sql.Results, java.lang.String,
+     * org.apache.isis.core.metamodel.spec.feature.ObjectAssociation)
+     */
+    @Override
+    protected ObjectAdapter setFromDBColumn(Results results, String columnName, ObjectAssociation field) {
+        final String encodedValue = results.getString(columnName);
+        if (encodedValue == null) {
+            return null;
+        }
+        final EncodableFacet facet = field.getSpecification().getFacet(EncodableFacet.class);
+        return facet.fromEncodedString(simplePasswordEncoderDecoder.decodeEncodedValueIntoRawString(encodedValue));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/951a0fe4/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcPolymorphicObjectReferenceMapping.java
----------------------------------------------------------------------
diff --git a/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcPolymorphicObjectReferenceMapping.java b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcPolymorphicObjectReferenceMapping.java
new file mode 100755
index 0000000..cf6c419
--- /dev/null
+++ b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcPolymorphicObjectReferenceMapping.java
@@ -0,0 +1,71 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.objectstore.sql.jdbc;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.objectstore.sql.DatabaseConnector;
+import org.apache.isis.objectstore.sql.IdMappingAbstract;
+import org.apache.isis.objectstore.sql.Results;
+import org.apache.isis.objectstore.sql.Sql;
+import org.apache.isis.objectstore.sql.SqlObjectStoreException;
+import org.apache.isis.objectstore.sql.mapping.ObjectReferenceMapping;
+
+public class JdbcPolymorphicObjectReferenceMapping extends IdMappingAbstract implements ObjectReferenceMapping {
+    private ObjectSpecification specification;
+
+    public JdbcPolymorphicObjectReferenceMapping(final String columnName) {
+        final String idColumn = Sql.sqlName(columnName);
+        setColumn(idColumn);
+    }
+
+    public void setObjectSpecification(final ObjectSpecification specification) {
+        this.specification = specification;
+    }
+
+    @Override
+    public void appendUpdateValues(final DatabaseConnector connector, final StringBuffer sql, final ObjectAdapter adapter) {
+        sql.append(getColumn());
+        if (adapter == null) {
+            sql.append("= NULL ");
+        } else {
+            sql.append("= ?");
+            // sql.append(primaryKey(object.getOid()));
+            final RootOid oid = (RootOid) adapter.getOid();
+            connector.addToQueryValues(primaryKey(oid));
+        }
+    }
+
+    public ObjectAdapter initializeField(final Results rs) {
+        final 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;
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/951a0fe4/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcResults.java
----------------------------------------------------------------------
diff --git a/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcResults.java b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcResults.java
new file mode 100644
index 0000000..1980a8a
--- /dev/null
+++ b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcResults.java
@@ -0,0 +1,222 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.objectstore.sql.jdbc;
+
+import java.sql.CallableStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Calendar;
+import java.util.HashMap;
+
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.DateTimeFormatter;
+
+import org.apache.isis.applib.value.Date;
+import org.apache.isis.applib.value.Time;
+import org.apache.isis.objectstore.sql.Defaults;
+import org.apache.isis.objectstore.sql.Results;
+import org.apache.isis.objectstore.sql.SqlObjectStoreException;
+
+public class JdbcResults implements Results {
+    ResultSet set;
+
+    public JdbcResults(final CallableStatement statement) {
+    }
+
+    public JdbcResults(final ResultSet set) {
+        this.set = set;
+    }
+
+    @Override
+    public void close() {
+        try {
+            set.close();
+        } catch (final SQLException e) {
+            throw new SqlObjectStoreException(e);
+        }
+    }
+
+    @Override
+    public int getInt(final String columnName) {
+        try {
+            return set.getInt(columnName);
+        } catch (final SQLException e) {
+            throw new SqlObjectStoreException(e);
+        }
+    }
+
+    @Override
+    public long getLong(final String columnName) {
+        try {
+            return set.getLong(columnName);
+        } catch (final SQLException e) {
+            throw new SqlObjectStoreException(e);
+        }
+    }
+
+    @Override
+    public String getString(final String columnName) {
+        try {
+            return set.getString(columnName);
+        } catch (final SQLException e) {
+            throw new SqlObjectStoreException(e);
+        }
+    }
+
+    @Override
+    public boolean next() {
+        try {
+            return set.next();
+        } catch (final SQLException e) {
+            throw new SqlObjectStoreException(e);
+        }
+    }
+
+    @Override
+    public java.sql.Date getJavaDateOnly(final String columnName) {
+        try {
+            // 2010-03-05 = 1267747200000
+            // 2010-04-08 = 1270684800000
+            // This is really painful! Java refuses to create java.util.Date in
+            // UTC!
+            // It creates java.util.Dates in Local time-zone, but assumes the DB
+            // date is UTC.
+            final String string = set.getString(columnName);
+            final DateTime utcDate = new DateTime(string, Defaults.getTimeZone());
+            final java.sql.Date date = new java.sql.Date(utcDate.getMillis());
+            return date;
+        } catch (final SQLException e) {
+            throw new SqlObjectStoreException(e);
+        }
+    }
+
+    @Override
+    public java.sql.Time getJavaTimeOnly(final String columnName) {
+        try {
+            final String string = set.getString(columnName);
+
+            final DateTimeFormatter formatter = DateTimeFormat.forPattern("HH:mm:ss");
+
+            final DateTime utcDate = formatter.withZone(Defaults.getTimeZone()).parseDateTime(string);
+            final java.sql.Time time = new java.sql.Time(utcDate.getMillis());
+
+            return time;
+        } catch (final SQLException e) {
+            throw new SqlObjectStoreException(e);
+        }
+    }
+
+    @Override
+    public java.util.Date getJavaDateTime(final String columnName, final Calendar calendar) {
+        try {
+            return set.getDate(columnName, calendar);
+        } catch (final SQLException e) {
+            throw new SqlObjectStoreException(e);
+        }
+    }
+
+    @Override
+    public Object getObject(final String columnName) {
+        try {
+            return set.getObject(columnName);
+        } catch (final SQLException e) {
+            throw new SqlObjectStoreException(e);
+        }
+    }
+
+    @Override
+    public Date getDate(final String columnName) {
+        try {
+            // 2010-03-05 = 1267747200000
+            // 2010-04-08 = 1270684800000
+            // This is really painful! Java refuses to create java.util.Date in
+            // UTC!
+            // It creates java.util.Dates in Local time-zone, but assumes the DB
+            // date is UTC.
+            final String string = set.getString(columnName);
+            final DateTime utcDate = new DateTime(string, Defaults.getTimeZone());
+            return new Date(utcDate);
+        } catch (final SQLException e) {
+            throw new SqlObjectStoreException(e);
+        }
+    }
+
+    @Override
+    public Time getTime(final String columnName) {
+        try {
+            final String string = set.getString(columnName);
+            final DateTimeFormatter formatter = DateTimeFormat.forPattern("HH:mm:ss");
+            final DateTimeZone defaultTimeZone = Defaults.getTimeZone();
+            final DateTime utcDate = formatter.withZone(defaultTimeZone).parseDateTime(string);
+            return new Time(utcDate);
+        } catch (final SQLException e) {
+            throw new SqlObjectStoreException(e);
+        }
+    }
+
+    @Override
+    public double getDouble(final String columnName) {
+        try {
+            return set.getDouble(columnName);
+        } catch (final SQLException e) {
+            throw new SqlObjectStoreException(e);
+        }
+    }
+
+    @Override
+    public Object getAsType(final String columnName, final Class<?> clazz) {
+        try {
+            final HashMap<String, Class<?>> map = new HashMap<String, Class<?>>();
+            map.put("FLOAT", float.class);
+            return set.getObject(columnName, map);
+        } catch (final SQLException e) {
+            throw new SqlObjectStoreException(e);
+        }
+    }
+
+    @Override
+    public Float getFloat(final String columnName) {
+        try {
+            return set.getFloat(columnName);
+        } catch (final SQLException e) {
+            throw new SqlObjectStoreException(e);
+        }
+    }
+
+    @Override
+    public Short getShort(final String columnName) {
+        try {
+            return set.getShort(columnName);
+        } catch (final SQLException e) {
+            throw new SqlObjectStoreException(e);
+        }
+    }
+
+    @Override
+    public Boolean getBoolean(final String columnName) {
+        try {
+            return set.getBoolean(columnName);
+        } catch (final SQLException e) {
+            throw new SqlObjectStoreException(e);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/951a0fe4/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcSqlMetaData.java
----------------------------------------------------------------------
diff --git a/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcSqlMetaData.java b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcSqlMetaData.java
new file mode 100644
index 0000000..0efd9fe
--- /dev/null
+++ b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcSqlMetaData.java
@@ -0,0 +1,86 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.objectstore.sql.jdbc;
+
+import java.sql.DatabaseMetaData;
+import java.sql.SQLException;
+
+import org.apache.isis.objectstore.sql.SqlMetaData;
+
+public class JdbcSqlMetaData implements SqlMetaData {
+
+    private final boolean hasQuoteString;
+    private final String quoteString;
+    private final String keywords;
+    private final String timeDateFunctions;
+    private final boolean storesLowerCaseIdentifiers;
+    private final boolean storesMixedCaseIdentifiers;
+    private final boolean storesUpperCaseIdentifiers;
+
+    public JdbcSqlMetaData(final DatabaseMetaData metaData) throws SQLException {
+        keywords = metaData.getSQLKeywords();
+        timeDateFunctions = metaData.getTimeDateFunctions();
+        quoteString = metaData.getIdentifierQuoteString();
+        hasQuoteString = (quoteString != " ");
+        storesLowerCaseIdentifiers = metaData.storesLowerCaseIdentifiers();
+        storesMixedCaseIdentifiers = metaData.storesMixedCaseIdentifiers();
+        storesUpperCaseIdentifiers = metaData.storesUpperCaseIdentifiers();
+
+    }
+
+    @Override
+    public String getKeywords() {
+        return keywords;
+    }
+
+    @Override
+    public String getTimeDateFunctions() {
+        return timeDateFunctions;
+    }
+
+    @Override
+    public String getQuoteString() {
+        return quoteString;
+    }
+
+    @Override
+    public boolean isStoresLowerCaseIdentifiers() {
+        return storesLowerCaseIdentifiers;
+    }
+
+    @Override
+    public boolean isStoresMixedCaseIdentifiers() {
+        return storesMixedCaseIdentifiers;
+    }
+
+    @Override
+    public boolean isStoresUpperCaseIdentifiers() {
+        return storesUpperCaseIdentifiers;
+    }
+
+    @Override
+    public String quoteIdentifier(final String identifier) {
+        if (hasQuoteString) {
+            return quoteString + identifier + quoteString;
+        } else {
+            return identifier;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/951a0fe4/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcTimeMapper.java
----------------------------------------------------------------------
diff --git a/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcTimeMapper.java b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcTimeMapper.java
new file mode 100644
index 0000000..3b76abc
--- /dev/null
+++ b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcTimeMapper.java
@@ -0,0 +1,84 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.objectstore.sql.jdbc;
+
+import org.apache.isis.applib.PersistFailedException;
+import org.apache.isis.applib.value.Time;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.objectstore.sql.AbstractFieldMappingFactory;
+import org.apache.isis.objectstore.sql.Defaults;
+import org.apache.isis.objectstore.sql.Results;
+import org.apache.isis.objectstore.sql.mapping.FieldMapping;
+
+public class JdbcTimeMapper extends AbstractJdbcFieldMapping {
+
+    private final String dataType;
+
+    public static class Factory extends AbstractFieldMappingFactory {
+
+        @Override
+        public FieldMapping createFieldMapping(final ObjectSpecification object, final ObjectAssociation field) {
+            final String dataType = getTypeOverride(object, field, Defaults.TYPE_TIME());
+            return new JdbcTimeMapper(field, dataType);
+        }
+    }
+
+    protected JdbcTimeMapper(final ObjectAssociation field, final String dataType) {
+        super(field);
+        this.dataType = dataType;
+    }
+
+    @Override
+    protected Object preparedStatementObject(final ObjectAdapter value) {
+        final Time asTime = (Time) value.getObject();
+        return asTime.asJavaTime();
+    }
+
+    @Override
+    public ObjectAdapter setFromDBColumn(final Results results, final String columnName, final ObjectAssociation field) {
+        /*
+         * Long hour = Long.decode(encodedValue.substring(0, 2)); Long minute =
+         * Long.decode(encodedValue.substring(3, 5)); Long millis = (minute +
+         * hour * 60) * 60 * 1000; String valueString = "T" +
+         * Long.toString(millis); return
+         * field.getSpecification().getFacet(EncodableFacet.class)
+         * .fromEncodedString(valueString);
+         */
+        ObjectAdapter restoredValue;
+        final Class<?> correspondingClass = field.getSpecification().getCorrespondingClass();
+        if (correspondingClass == Time.class) {
+            final Time timeValue = results.getTime(columnName);
+            restoredValue = IsisContext.getPersistenceSession().getAdapterManager().adapterFor(timeValue);
+        } else {
+            throw new PersistFailedException("Unhandled time type: " + correspondingClass.getCanonicalName());
+        }
+        return restoredValue;
+
+    }
+
+    @Override
+    public String columnType() {
+        return dataType;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/951a0fe4/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcTimestampMapper.java
----------------------------------------------------------------------
diff --git a/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcTimestampMapper.java b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcTimestampMapper.java
new file mode 100644
index 0000000..73e6906
--- /dev/null
+++ b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/JdbcTimestampMapper.java
@@ -0,0 +1,78 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.objectstore.sql.jdbc;
+
+import org.apache.isis.applib.PersistFailedException;
+import org.apache.isis.applib.value.TimeStamp;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.objectstore.sql.AbstractFieldMappingFactory;
+import org.apache.isis.objectstore.sql.Defaults;
+import org.apache.isis.objectstore.sql.Results;
+import org.apache.isis.objectstore.sql.mapping.FieldMapping;
+
+public class JdbcTimestampMapper extends AbstractJdbcFieldMapping {
+
+    private final String dataType;
+
+    public static class Factory extends AbstractFieldMappingFactory {
+
+        @Override
+        public FieldMapping createFieldMapping(final ObjectSpecification object, final ObjectAssociation field) {
+            final String dataType = getTypeOverride(object, field, Defaults.TYPE_TIMESTAMP());
+            return new JdbcTimestampMapper(field, dataType);
+        }
+    }
+
+    protected JdbcTimestampMapper(final ObjectAssociation field, final String dataType) {
+        super(field);
+        this.dataType = dataType;
+    }
+
+    @Override
+    protected Object preparedStatementObject(final ObjectAdapter value) {
+        final TimeStamp asDate = (TimeStamp) value.getObject();
+        final java.sql.Timestamp timeStamp = new java.sql.Timestamp(asDate.longValue());
+        return timeStamp;
+    }
+
+    @Override
+    public ObjectAdapter setFromDBColumn(final Results results, final String columnName, final ObjectAssociation field) {
+
+        ObjectAdapter restoredValue;
+        final Class<?> correspondingClass = field.getSpecification().getCorrespondingClass();
+        if (correspondingClass == TimeStamp.class) {
+            final java.sql.Timestamp o = (java.sql.Timestamp) results.getObject(columnName);
+            final TimeStamp timeValue = new TimeStamp(o.getTime());
+            restoredValue = IsisContext.getPersistenceSession().getAdapterManager().adapterFor(timeValue);
+        } else {
+            throw new PersistFailedException("Unhandled time type: " + correspondingClass.getCanonicalName());
+        }
+        return restoredValue;
+    }
+
+    @Override
+    public String columnType() {
+        return dataType;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/951a0fe4/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/helpers/SimplePasswordEncoderDecoder.java
----------------------------------------------------------------------
diff --git a/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/helpers/SimplePasswordEncoderDecoder.java b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/helpers/SimplePasswordEncoderDecoder.java
new file mode 100644
index 0000000..8f6c797
--- /dev/null
+++ b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/helpers/SimplePasswordEncoderDecoder.java
@@ -0,0 +1,115 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.isis.objectstore.sql.jdbc.helpers;
+
+/**
+ * 
+ * 
+ * @version $Rev$ $Date$
+ */
+public class SimplePasswordEncoderDecoder {
+    private final String passwordSeed;
+    private final int seedLength;
+    private final Integer valueOfZero = Integer.valueOf('0');
+    private final int dbLength;
+
+    public SimplePasswordEncoderDecoder(String passwordSeed, Integer encLength) {
+        this.passwordSeed = passwordSeed;
+        if (passwordSeed == null) {
+            seedLength = 0;
+        } else {
+            seedLength = passwordSeed.length();
+        }
+        dbLength = encLength;
+    }
+
+    /**
+     * Use a simple algorithm to encode the given value into an encoded String
+     * 
+     * @param String
+     *            raw value
+     * @return encoded String
+     */
+    public final String encodeRawValueIntoEncodedString(final String value) {
+        if (passwordSeed == null) {
+            return value;
+        }
+        final int rawLength = value.length();
+        String length = Integer.toHexString(rawLength);
+        if (length.length() == 1) {
+            length = "0" + length;
+        }
+        String encodePart1 = length + value;
+        String encoded = "";
+        for (int i = 0; i < rawLength + 2; i++) {
+            int thisSeed = passwordSeed.charAt(i % seedLength);
+            int thisPassword = encodePart1.charAt(i);
+            int nextValue = (thisSeed + thisPassword) % 255;
+            encoded = encoded.concat(String.format("%2h", nextValue));
+
+        }
+        for (int i = rawLength; i < (dbLength / 2) - 2; i++) {
+            int thisSeed = passwordSeed.charAt(i % seedLength);
+            int thisPassword = passwordSeed.charAt((i - 2) % seedLength);
+            int nextValue = (thisSeed + thisPassword + i) % 255;
+            encoded = encoded.concat(String.format("%2h", nextValue));
+        }
+
+        return encoded;
+    }
+
+    /**
+     * Use a simple algorithm to decode the given encoded String into a raw String
+     * 
+     * @param String
+     *            encoded value
+     * @return decoded raw String
+     */
+    public final String decodeEncodedValueIntoRawString(final String encodedValue) {
+        if (passwordSeed == null) {
+            return encodedValue;
+        }
+        int passwordLength = extractIndexedValueAsInt(encodedValue, 0);
+
+        String decodedValue = "";
+        for (int i = 0; i < passwordLength; i++) {
+            char extracted = extractIndexedValueAsChar(encodedValue, i + 2);
+            decodedValue = decodedValue + (extracted);
+        }
+        return decodedValue;
+    }
+
+    private int extractIndexedValueAsInt(final String encodedValue, int index) {
+        int value1 = decodeIndexedValue(encodedValue, index) - valueOfZero;
+        int value2 = decodeIndexedValue(encodedValue, index + 1) - valueOfZero;
+        return value1 * 16 + value2;
+    }
+
+    private char extractIndexedValueAsChar(final String encodedValue, int index) {
+        int value1 = decodeIndexedValue(encodedValue, index);
+        return (char) value1;
+    }
+
+    private int decodeIndexedValue(final String encodedValue, int index) {
+        String s = encodedValue.substring((index) * 2, (index) * 2 + 2);
+        int hex = Integer.valueOf(s, 16);
+        int thisSeed = passwordSeed.charAt(index % seedLength);
+        int passwordValue = hex - thisSeed;
+        return passwordValue;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/951a0fe4/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/installer/JdbcFieldMappingFactoryInstaller.java
----------------------------------------------------------------------
diff --git a/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/installer/JdbcFieldMappingFactoryInstaller.java b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/installer/JdbcFieldMappingFactoryInstaller.java
new file mode 100644
index 0000000..1cbbf24
--- /dev/null
+++ b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/jdbc/installer/JdbcFieldMappingFactoryInstaller.java
@@ -0,0 +1,87 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.objectstore.sql.jdbc.installer;
+
+import org.apache.isis.applib.value.Color;
+import org.apache.isis.applib.value.Date;
+import org.apache.isis.applib.value.DateTime;
+import org.apache.isis.applib.value.Money;
+import org.apache.isis.applib.value.Password;
+import org.apache.isis.applib.value.Percentage;
+import org.apache.isis.applib.value.Time;
+import org.apache.isis.applib.value.TimeStamp;
+import org.apache.isis.objectstore.sql.Defaults;
+import org.apache.isis.objectstore.sql.FieldMappingFactoryInstaller;
+import org.apache.isis.objectstore.sql.FieldMappingLookup;
+import org.apache.isis.objectstore.sql.jdbc.JdbcBinaryValueMapper;
+import org.apache.isis.objectstore.sql.jdbc.JdbcColorValueMapper;
+import org.apache.isis.objectstore.sql.jdbc.JdbcDateMapper;
+import org.apache.isis.objectstore.sql.jdbc.JdbcDateTimeMapper;
+import org.apache.isis.objectstore.sql.jdbc.JdbcGeneralValueMapper;
+import org.apache.isis.objectstore.sql.jdbc.JdbcMoneyValueMapper;
+import org.apache.isis.objectstore.sql.jdbc.JdbcObjectReferenceFieldMapping;
+import org.apache.isis.objectstore.sql.jdbc.JdbcObjectReferenceMappingFactory;
+import org.apache.isis.objectstore.sql.jdbc.JdbcPasswordValueMapper;
+import org.apache.isis.objectstore.sql.jdbc.JdbcTimeMapper;
+import org.apache.isis.objectstore.sql.jdbc.JdbcTimestampMapper;
+
+public class JdbcFieldMappingFactoryInstaller implements FieldMappingFactoryInstaller {
+
+    @Override
+    public void load(final FieldMappingLookup lookup) {
+        lookup.addFieldMappingFactory(Boolean.class, new JdbcBinaryValueMapper.Factory(Defaults.TYPE_BOOLEAN()));
+        lookup.addFieldMappingFactory(Short.class, new JdbcBinaryValueMapper.Factory(Defaults.TYPE_SHORT()));
+        lookup.addFieldMappingFactory(Integer.class, new JdbcBinaryValueMapper.Factory(Defaults.TYPE_INT()));
+        lookup.addFieldMappingFactory(Long.class, new JdbcBinaryValueMapper.Factory(Defaults.TYPE_LONG()));
+        lookup.addFieldMappingFactory(Float.class, new JdbcBinaryValueMapper.Factory(Defaults.TYPE_FLOAT()));
+        lookup.addFieldMappingFactory(Double.class, new JdbcBinaryValueMapper.Factory(Defaults.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 JdbcPasswordValueMapper.Factory(Defaults.TYPE_PASSWORD(),
+            Defaults.PASSWORD_SEED(), Defaults.PASSWORD_ENC_LENGTH()));
+        lookup.addFieldMappingFactory(Color.class, new JdbcColorValueMapper.Factory(Defaults.TYPE_LONG()));
+        lookup.addFieldMappingFactory(String.class, new JdbcGeneralValueMapper.Factory(Defaults.TYPE_STRING()));
+
+        lookup.addFieldMappingFactory(Date.class, new JdbcDateMapper.Factory());
+        lookup.addFieldMappingFactory(Time.class, new JdbcTimeMapper.Factory());
+        lookup.addFieldMappingFactory(DateTime.class, new JdbcDateTimeMapper.Factory());
+        lookup.addFieldMappingFactory(TimeStamp.class, new JdbcTimestampMapper.Factory());
+
+        lookup.addFieldMappingFactory(java.sql.Date.class, new JdbcDateMapper.Factory());
+        lookup.addFieldMappingFactory(java.sql.Time.class, new JdbcTimeMapper.Factory());
+        lookup.addFieldMappingFactory(java.util.Date.class, new JdbcDateTimeMapper.Factory());
+        lookup.addFieldMappingFactory(java.sql.Timestamp.class, new JdbcTimestampMapper.Factory());
+
+        lookup.addFieldMappingFactory(boolean.class, new JdbcBinaryValueMapper.Factory(Defaults.TYPE_BOOLEAN()));
+        lookup.addFieldMappingFactory(short.class, new JdbcBinaryValueMapper.Factory(Defaults.TYPE_SHORT()));
+        lookup.addFieldMappingFactory(int.class, new JdbcBinaryValueMapper.Factory(Defaults.TYPE_INT()));
+        lookup.addFieldMappingFactory(long.class, new JdbcBinaryValueMapper.Factory(Defaults.TYPE_LONG()));
+        lookup.addFieldMappingFactory(float.class, new JdbcBinaryValueMapper.Factory(Defaults.TYPE_FLOAT()));
+        lookup.addFieldMappingFactory(double.class, new JdbcBinaryValueMapper.Factory(Defaults.TYPE_DOUBLE()));
+
+        lookup.setReferenceFieldMappingFactory(new JdbcObjectReferenceFieldMapping.Factory());
+
+        lookup.setObjectReferenceMappingfactory(new JdbcObjectReferenceMappingFactory());
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/951a0fe4/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/mapping/FieldMapping.java
----------------------------------------------------------------------
diff --git a/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/mapping/FieldMapping.java b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/mapping/FieldMapping.java
new file mode 100644
index 0000000..0cc664e
--- /dev/null
+++ b/component/objectstore/sql/sql-impl/src/main/java/org/apache/isis/objectstore/sql/mapping/FieldMapping.java
@@ -0,0 +1,48 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.objectstore.sql.mapping;
+
+import org.apache.isis.core.commons.debug.DebugBuilder;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.objectstore.sql.DatabaseConnector;
+import org.apache.isis.objectstore.sql.Results;
+
+public interface FieldMapping {
+	
+    public ObjectAssociation getField();
+
+    void appendColumnDefinitions(StringBuffer sql);
+
+    void appendColumnNames(StringBuffer sql);
+
+    void appendInsertValues(DatabaseConnector connector, StringBuffer sql, ObjectAdapter object);
+
+    void appendUpdateValues(DatabaseConnector connector, StringBuffer sql, ObjectAdapter object);
+
+    void initializeField(ObjectAdapter object, Results rs);
+
+    void appendWhereClause(DatabaseConnector connector, StringBuffer sql, ObjectAdapter object);
+
+    void debugData(DebugBuilder debug);
+
+    void appendWhereObject(DatabaseConnector connector, ObjectAdapter objectAdapter);
+
+}