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

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

Author: kevin
Date: Mon Apr  4 16:29:52 2011
New Revision: 1088678

URL: http://svn.apache.org/viewvc?rev=1088678&view=rev
Log:
Added support for multi-column value definitions.
Added support for Money as a value + currency definition.

Added:
    incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/AbstractJdbcMultiFieldMapping.java   (with props)
    incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcMoneyValueMapper.java   (with props)
Modified:
    incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/Results.java
    incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/auto/AutoMapper.java
    incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/AbstractJdbcFieldMapping.java
    incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcResults.java
    incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/installer/JdbcFieldMappingFactoryInstaller.java
    incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/common/SqlIntegrationTestCommon.java

Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/Results.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/Results.java?rev=1088678&r1=1088677&r2=1088678&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/Results.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/Results.java Mon Apr  4 16:29:52 2011
@@ -35,6 +35,8 @@ public interface Results {
 
     long getLong(String columnName);
 
+    double getDouble(String columnName);
+
     String getString(String columnName);
 
     boolean next();

Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/auto/AutoMapper.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/auto/AutoMapper.java?rev=1088678&r1=1088677&r2=1088678&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/auto/AutoMapper.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/auto/AutoMapper.java Mon Apr  4 16:29:52 2011
@@ -21,6 +21,16 @@ package org.apache.isis.runtimes.dflt.ob
 
 import java.util.Vector;
 
+import org.apache.log4j.Logger;
+
+import org.apache.isis.core.commons.debug.DebugBuilder;
+import org.apache.isis.core.commons.debug.DebuggableWithTitle;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.ResolveState;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
+import org.apache.isis.core.metamodel.adapter.version.SerialNumberVersion;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.runtimes.dflt.objectstores.sql.CollectionMapper;
 import org.apache.isis.runtimes.dflt.objectstores.sql.DatabaseConnector;
 import org.apache.isis.runtimes.dflt.objectstores.sql.FieldMappingLookup;
@@ -32,19 +42,10 @@ import org.apache.isis.runtimes.dflt.obj
 import org.apache.isis.runtimes.dflt.objectstores.sql.TitleMapping;
 import org.apache.isis.runtimes.dflt.objectstores.sql.VersionMapping;
 import org.apache.isis.runtimes.dflt.objectstores.sql.mapping.FieldMapping;
-import org.apache.isis.core.commons.debug.DebugBuilder;
-import org.apache.isis.core.commons.debug.DebuggableWithTitle;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.ResolveState;
-import org.apache.isis.core.metamodel.adapter.oid.Oid;
-import org.apache.isis.core.metamodel.adapter.version.SerialNumberVersion;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.runtimes.dflt.runtime.persistence.ConcurrencyException;
 import org.apache.isis.runtimes.dflt.runtime.persistence.ObjectNotFoundException;
 import org.apache.isis.runtimes.dflt.runtime.persistence.PersistorUtil;
 import org.apache.isis.runtimes.dflt.runtime.persistence.query.PersistenceQueryFindByPattern;
-import org.apache.log4j.Logger;
 
 public class AutoMapper extends AbstractAutoMapper implements ObjectMapping,
 		DebuggableWithTitle {
@@ -128,9 +129,9 @@ public class AutoMapper extends Abstract
 	public void destroyObject(final DatabaseConnector connector,
 			final ObjectAdapter object) {
 		StringBuffer sql = new StringBuffer();
-		sql.append("delete from " + table + " where ");
+        sql.append("delete from " + table + " WHERE ");
 		idMapping.appendWhereClause(connector, sql, object.getOid());
-		sql.append(" and ");
+        sql.append(" AND ");
 		sql.append(versionMapping.whereClause(connector, (SerialNumberVersion) object
 				.getVersion()));
 		int updateCount = connector.update(sql.toString());
@@ -153,7 +154,7 @@ public class AutoMapper extends Abstract
 			final ObjectSpecification spec,
 			final PersistenceQueryFindByPattern query) {
 		StringBuffer sql = createSelectStatement();
-		sql.append(" where ");
+        sql.append(" WHERE ");
 
 		int initialLength = sql.length();
 		ObjectAdapter pattern = query.getPattern();
@@ -163,7 +164,7 @@ public class AutoMapper extends Abstract
 				FieldMapping fieldMapping = fieldMappingFor(assoc);
 				if (fieldMapping != null) {
 					if (sql.length() > initialLength) {
-						sql.append(" and ");
+                        sql.append(" AND ");
 					}
 					fieldMapping.appendWhereClause(connector, sql, pattern);
 				}
@@ -176,7 +177,7 @@ public class AutoMapper extends Abstract
 	public ObjectAdapter[] getInstances(final DatabaseConnector connector,
 			final ObjectSpecification spec, final String title) {
 		StringBuffer sql = createSelectStatement();
-		sql.append(" where ");
+        sql.append(" WHERE ");
 		titleMapping.appendWhereClause(sql, title);
 		return loadInstances(connector, spec, completeSelectStatement(sql));
 	}
@@ -185,7 +186,7 @@ public class AutoMapper extends Abstract
 	public ObjectAdapter getObject(final DatabaseConnector connector,
 			final Oid oid, final ObjectSpecification hint) {
 		StringBuffer sql = createSelectStatement();
-		sql.append(" where ");
+        sql.append(" WHERE ");
 		idMapping.appendWhereClause(connector, sql, oid);
 		Results rs = connector.select(completeSelectStatement(sql));
 		if (rs.next()) {
@@ -218,10 +219,9 @@ public class AutoMapper extends Abstract
 		sql.append(" from " + table);
 		return sql;
 	} /*
-	 * if (whereClause != null) { sql.append(" where ");
-	 * sql.append(whereClause); } else if (whereClause != null) {
-	 * sql.append(" where "); idMapping.appendWhereClause(sql, oid); }
-	 */
+       * if (whereClause != null) { sql.append(" WHERE "); sql.append(whereClause); } else if (whereClause != null) {
+       * sql.append(" WHERE "); idMapping.appendWhereClause(sql, oid); }
+       */
 
 	private String completeSelectStatement(final StringBuffer sql) {
 		sql.append(" order by ");
@@ -295,7 +295,7 @@ public class AutoMapper extends Abstract
 		sql.append(columnList());
 		sql.append(",");
 		sql.append(versionMapping.appendSelectColumns());
-		sql.append(" from " + table + " where ");
+        sql.append(" from " + table + " WHERE ");
 		idMapping.appendWhereClause(connector, sql, object.getOid());
 
 		Results rs = connector.select(sql.toString());
@@ -343,7 +343,7 @@ public class AutoMapper extends Abstract
 		long nextSequence = version.getSequence() + 1;
 
 		StringBuffer sql = new StringBuffer();
-		sql.append("update " + table + " set ");
+        sql.append("UPDATE " + table + " SET ");
 		for (FieldMapping mapping : fieldMappings) {
 			mapping.appendUpdateValues(connector, sql, object);
 			sql.append(", ");
@@ -351,9 +351,9 @@ public class AutoMapper extends Abstract
 		sql.append(versionMapping.updateAssigment(connector, nextSequence));
 		sql.append(", ");
 		titleMapping.appendUpdateAssignment(connector, sql, object);
-		sql.append(" where ");
+        sql.append(" WHERE ");
 		idMapping.appendWhereClause(connector, sql, object.getOid());
-		sql.append(" and ");
+        sql.append(" AND ");
 		sql.append(versionMapping.whereClause(connector, (SerialNumberVersion) object
 				.getVersion()));
 

Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/AbstractJdbcFieldMapping.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/AbstractJdbcFieldMapping.java?rev=1088678&r1=1088677&r2=1088678&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/AbstractJdbcFieldMapping.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/AbstractJdbcFieldMapping.java Mon Apr  4 16:29:52 2011
@@ -20,18 +20,18 @@
 
 package org.apache.isis.runtimes.dflt.objectstores.sql.jdbc;
 
-import org.apache.isis.runtimes.dflt.objectstores.sql.DatabaseConnector;
-import org.apache.isis.runtimes.dflt.objectstores.sql.Results;
-import org.apache.isis.runtimes.dflt.objectstores.sql.Sql;
-import org.apache.isis.runtimes.dflt.objectstores.sql.mapping.FieldMapping;
 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.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.runtimes.dflt.objectstores.sql.DatabaseConnector;
+import org.apache.isis.runtimes.dflt.objectstores.sql.Results;
+import org.apache.isis.runtimes.dflt.objectstores.sql.Sql;
+import org.apache.isis.runtimes.dflt.objectstores.sql.mapping.FieldMapping;
 
 
 public abstract class AbstractJdbcFieldMapping implements FieldMapping {
-    private String columnName;
+    private final String columnName;
     protected final ObjectAssociation field;
         
     public AbstractJdbcFieldMapping(ObjectAssociation field) {
@@ -39,35 +39,41 @@ public abstract class AbstractJdbcFieldM
         columnName = Sql.sqlFieldName(field.getId());
     }
 
+    @Override
     public void appendColumnDefinitions(StringBuffer sql) {
         sql.append(columnName);
         sql.append(" ");
         sql.append(columnType());
     }
 
+    @Override
     public void appendColumnNames(StringBuffer sql) {
         sql.append(columnName);
     }
 
+    @Override
     public void appendInsertValues(DatabaseConnector connector, StringBuffer sql, ObjectAdapter object) {
         ObjectAdapter fieldValue = field.get(object);
         if (fieldValue == null) {
             sql.append("NULL");
         } else {
         	sql.append("?");
-        	connector.addToQueryValues(preparedStatementObject(fieldValue));
+            connector.addToQueryValues(preparedStatementObject(fieldValue));
         }
     }
 
+    @Override
     public void appendUpdateValues(DatabaseConnector connector, StringBuffer sql, ObjectAdapter object) {
         appendEqualsClause(connector, sql, object, "=");
     }
 
+    @Override
     public void appendWhereClause(DatabaseConnector connector, StringBuffer sql, ObjectAdapter object) {
         appendEqualsClause(connector, sql, object, "=");
     }
 
-    private void appendEqualsClause(DatabaseConnector connector, StringBuffer sql, ObjectAdapter object, String condition) {
+    protected void appendEqualsClause(DatabaseConnector connector, StringBuffer sql, ObjectAdapter object,
+        String condition) {
         sql.append(Sql.sqlFieldName(field.getId()));
         sql.append(condition);
         ObjectAdapter fieldValue = field.get(object);
@@ -75,9 +81,10 @@ public abstract class AbstractJdbcFieldM
         connector.addToQueryValues(preparedStatementObject(fieldValue));
     }
     
+    @Override
     public void initializeField(ObjectAdapter object, Results rs) {
         String columnName = Sql.sqlFieldName(field.getId());
-        String encodedValue = (String) rs.getString(columnName);
+        String encodedValue = rs.getString(columnName);
         ObjectAdapter restoredValue;
         if (encodedValue == null) {
             restoredValue = null;
@@ -88,6 +95,7 @@ public abstract class AbstractJdbcFieldM
         ((OneToOneAssociation) field).initAssociation(object, restoredValue);
     }
     
+    @Override
     public void debugData(DebugBuilder debug) {
         debug.appendln(field.getId(), columnName + "/" + columnType());
     }
@@ -96,7 +104,9 @@ public abstract class AbstractJdbcFieldM
 
     protected abstract Object preparedStatementObject(ObjectAdapter value);
 
-    protected abstract ObjectAdapter setFromDBColumn(Results results, String encodeValue, String columnName, ObjectAssociation field);
+    protected abstract ObjectAdapter setFromDBColumn(Results results, String encodeValue, String columnName,
+        ObjectAssociation field);
+
 
 }
 

Added: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/AbstractJdbcMultiFieldMapping.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/AbstractJdbcMultiFieldMapping.java?rev=1088678&view=auto
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/AbstractJdbcMultiFieldMapping.java (added)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/AbstractJdbcMultiFieldMapping.java Mon Apr  4 16:29:52 2011
@@ -0,0 +1,143 @@
+package org.apache.isis.runtimes.dflt.objectstores.sql.jdbc;
+
+import org.apache.isis.applib.ApplicationException;
+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.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.runtimes.dflt.objectstores.sql.DatabaseConnector;
+import org.apache.isis.runtimes.dflt.objectstores.sql.Results;
+import org.apache.isis.runtimes.dflt.runtime.context.IsisContext;
+
+public abstract class AbstractJdbcMultiFieldMapping extends AbstractJdbcFieldMapping {
+    private final int columnCount;
+
+    public AbstractJdbcMultiFieldMapping(ObjectAssociation field, int columnCount) {
+        super(field);
+        this.columnCount = columnCount;
+    }
+
+    @Override
+    public void appendColumnDefinitions(StringBuffer sql) {
+        for (int i = 0; i < columnCount; i++) {
+            sql.append(columnName(i) + " " + columnType(i));
+            if (i < columnCount - 1) {
+                sql.append(", ");
+            }
+        }
+    }
+
+    @Override
+    public void appendColumnNames(StringBuffer sql) {
+        for (int i = 0; i < columnCount; i++) {
+            sql.append(columnName(i));
+            if (i < columnCount - 1) {
+                sql.append(", ");
+            }
+        }
+    }
+
+
+    @Override
+    public void appendInsertValues(DatabaseConnector connector, StringBuffer sql, ObjectAdapter object) {
+        ObjectAdapter fieldValue = field.get(object);
+
+        for (int i = 0; i < columnCount; i++) {
+            if (fieldValue == null) {
+                sql.append("NULL");
+            } else {
+                sql.append("?");
+                if (i < columnCount - 1) {
+                    sql.append(", ");
+                }
+                connector.addToQueryValues(preparedStatementObject(i, fieldValue));
+            }
+        }
+    }
+
+
+    @Override
+    public void appendUpdateValues(DatabaseConnector connector, StringBuffer sql, ObjectAdapter object) {
+        for (int i = 0; i < columnCount; i++) {
+            appendEqualsClause(connector, i, sql, object, "=");
+        }
+    }
+
+    @Override
+    public void appendWhereClause(DatabaseConnector connector, StringBuffer sql, ObjectAdapter object) {
+        for (int i = 0; i < columnCount; i++) {
+            appendEqualsClause(connector, i, sql, object, "=");
+        }
+    }
+
+    protected void appendEqualsClause(DatabaseConnector connector, int index, StringBuffer sql, ObjectAdapter object,
+        String condition) {
+
+        ObjectAdapter fieldValue = field.get(object);
+
+        for (int i = 0; i < columnCount; i++) {
+            sql.append(columnName(i) + condition + "?");
+            if (i < columnCount - 1) {
+                sql.append(", ");
+            }
+
+            connector.addToQueryValues(preparedStatementObject(i, fieldValue));
+        }
+    }
+
+    @Override
+    public void initializeField(ObjectAdapter object, Results rs) {
+        // TODO: remove this definition when encodedValue is no longer passed to setFromDBColumn
+        String columnName = columnName(0);
+        String encodedValue = rs.getString(columnName);
+
+        ObjectAdapter restoredValue;
+        if (encodedValue == null) {
+            restoredValue = null;
+        } else {
+            restoredValue = setFromDBColumn(rs, encodedValue, columnName, field);
+
+        }
+        ((OneToOneAssociation) field).initAssociation(object, restoredValue);
+    }
+
+
+    @Override
+    public ObjectAdapter setFromDBColumn(Results results, final String encodedValue, String columnName,
+        final ObjectAssociation field) {
+
+        ObjectAdapter restoredValue;
+        Object objectValue = getObjectFromResults(results);
+        restoredValue = IsisContext.getPersistenceSession().getAdapterManager().adapterFor(objectValue);
+
+        return restoredValue;
+
+    }
+
+
+
+    @Override
+    public void debugData(DebugBuilder debug) {
+        for (int i = 0; i < columnCount; i++) {
+            debug.appendln(field.getId(), columnName(i) + "/" + columnType(i));
+        }
+    }
+
+    @Override
+    protected String columnType() {
+        throw new ApplicationException("Should never be called");
+    }
+
+    @Override
+    protected Object preparedStatementObject(ObjectAdapter value) {
+        throw new ApplicationException("Should never be called");
+    }
+
+    protected abstract String columnName(int i);
+
+    protected abstract String columnType(int i);
+
+    protected abstract Object preparedStatementObject(int i, ObjectAdapter fieldValue);
+
+    protected abstract Object getObjectFromResults(Results results);
+}

Propchange: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/AbstractJdbcMultiFieldMapping.java
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcMoneyValueMapper.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcMoneyValueMapper.java?rev=1088678&view=auto
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcMoneyValueMapper.java (added)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcMoneyValueMapper.java Mon Apr  4 16:29:52 2011
@@ -0,0 +1,111 @@
+/*
+ *  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.runtimes.dflt.objectstores.sql.jdbc;
+
+import org.apache.isis.applib.PersistFailedException;
+import org.apache.isis.applib.value.Money;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.runtimes.dflt.objectstores.sql.Results;
+import org.apache.isis.runtimes.dflt.objectstores.sql.Sql;
+import org.apache.isis.runtimes.dflt.objectstores.sql.mapping.FieldMapping;
+import org.apache.isis.runtimes.dflt.objectstores.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(String type1, String type2) {
+            this.type1 = type1;
+            this.type2 = type2;
+        }
+
+        @Override
+		public FieldMapping createFieldMapping(final ObjectAssociation field) {
+            return new JdbcMoneyValueMapper(field, type1, type2);
+		}
+	}
+
+    private final String[] types = new String[2];
+    private final String[] columnNames = new String[2];
+
+
+    public JdbcMoneyValueMapper(ObjectAssociation field, String type1, String type2) {
+        super(field, 2);
+        this.types[0] = type1;
+        this.types[1] = type2;
+
+        String fieldName = field.getId();
+        columnNames[0] = Sql.sqlFieldName(fieldName + "1");
+        columnNames[1] = Sql.sqlFieldName(fieldName + "2");
+    }
+
+    @Override
+    protected Object preparedStatementObject(int index, ObjectAdapter value){
+        if (value == null) return null;
+        
+        Object o = value.getObject();
+        
+        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 String columnType(int index) {
+        return types[index];
+	}
+
+    @Override
+    protected String columnName(int index) {
+        return columnNames[index];
+    }
+
+
+    @Override
+    protected Object getObjectFromResults(Results results) {
+        double doubleValue = results.getDouble(columnName(0));
+        String currencyValue = results.getString(columnName(1));
+
+        Money moneyObject = new Money(doubleValue, currencyValue);
+
+        return moneyObject;
+    }
+
+
+
+
+
+}

Propchange: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcMoneyValueMapper.java
------------------------------------------------------------------------------
    svn:executable = *

Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcResults.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcResults.java?rev=1088678&r1=1088677&r2=1088678&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcResults.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcResults.java Mon Apr  4 16:29:52 2011
@@ -168,4 +168,12 @@ public class JdbcResults implements Resu
             throw new SqlObjectStoreException(e);
         }
     }
+
+    public double getDouble(String columnName) {
+        try {
+            return set.getDouble(columnName);
+        } catch (SQLException e) {
+            throw new SqlObjectStoreException(e);
+        }
+    }
 }

Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/installer/JdbcFieldMappingFactoryInstaller.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/installer/JdbcFieldMappingFactoryInstaller.java?rev=1088678&r1=1088677&r2=1088678&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/installer/JdbcFieldMappingFactoryInstaller.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/installer/JdbcFieldMappingFactoryInstaller.java Mon Apr  4 16:29:52 2011
@@ -20,28 +20,29 @@
 
 package org.apache.isis.runtimes.dflt.objectstores.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.runtimes.dflt.objectstores.sql.FieldMappingFactoryInstaller;
 import org.apache.isis.runtimes.dflt.objectstores.sql.FieldMappingLookup;
 import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcDateMapper;
 import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcDateTimeMapper;
 import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcGeneralValueMapper;
+import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcMoneyValueMapper;
 import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcObjectReferenceFieldMapping;
 import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcObjectReferenceMappingFactory;
 import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcTimeMapper;
 import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcTimestampMapper;
-import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcDateTimeMapper.Factory;
-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;
 
 
 public class JdbcFieldMappingFactoryInstaller implements FieldMappingFactoryInstaller {
 
+    @Override
     public void load(FieldMappingLookup lookup) {
         lookup.addFieldMappingFactory(boolean.class, new JdbcGeneralValueMapper.Factory("CHAR(1)"));
         lookup.addFieldMappingFactory(short.class, new JdbcGeneralValueMapper.Factory("INT"));
@@ -51,7 +52,7 @@ public class JdbcFieldMappingFactoryInst
         lookup.addFieldMappingFactory(double.class, new JdbcGeneralValueMapper.Factory("FLOAT"));
         lookup.addFieldMappingFactory(char.class, new JdbcGeneralValueMapper.Factory("CHAR(2)"));
 
-        lookup.addFieldMappingFactory(Money.class, new JdbcGeneralValueMapper.Factory("FLOAT"));
+        lookup.addFieldMappingFactory(Money.class, new JdbcMoneyValueMapper.Factory("FLOAT", "VARCHAR(3)"));
         lookup.addFieldMappingFactory(Percentage.class, new JdbcGeneralValueMapper.Factory("FLOAT"));
         lookup.addFieldMappingFactory(Password.class, new JdbcGeneralValueMapper.Factory("VARCHAR(12)"));
         lookup.addFieldMappingFactory(Color.class, new JdbcGeneralValueMapper.Factory("INT"));

Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/common/SqlIntegrationTestCommon.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/common/SqlIntegrationTestCommon.java?rev=1088678&r1=1088677&r2=1088678&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/common/SqlIntegrationTestCommon.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/common/SqlIntegrationTestCommon.java Mon Apr  4 16:29:52 2011
@@ -41,6 +41,7 @@ import org.apache.isis.applib.value.Colo
 import org.apache.isis.applib.value.Date;
 import org.apache.isis.applib.value.DateTime;
 import org.apache.isis.applib.value.Image;
+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;
@@ -118,7 +119,7 @@ public abstract class SqlIntegrationTest
 			{ 4, 5, 6 }, { 7, 8, 9 } });
 	private static final Password password = new Password("password");
 	private static final Percentage percentage = new Percentage(42);
-    // private static final Money money = new Money(99.99, "GBP");
+    private static final Money money = new Money(99.99, "ZAR");
 	
 	// Collection mapper tests
 	private static final List<String> stringList1 = Arrays.asList("Baking",
@@ -246,7 +247,7 @@ public abstract class SqlIntegrationTest
 		sqlDataClass.setString("Test String");
 		sqlDataClass.setDate(applibDate);
 		sqlDataClass.setSqlDate(sqlDate);
-		// sqlDataClass.setMoney(money); // TODO: Money is broken
+        sqlDataClass.setMoney(money); // TODO: Money is broken
 		sqlDataClass.setDateTime(dateTime);
 		sqlDataClass.setTimeStamp(timeStamp);
 		sqlDataClass.setTime(time);
@@ -423,13 +424,13 @@ public abstract class SqlIntegrationTest
 	/**
 	 * Test {@link Money} type.
 	 */
-	/*
-	 * public void testMoney(){ SqlDataClass sqlDataClass =
-	 * SqlIntegrationTestSingleton.getPerson();
-	 * assertTrue("Money "+money.toString
-	 * ()+" is not equal to "+sqlDataClass.getMoney().toString(),
-	 * money.equals(sqlDataClass.getMoney())); }
-	 */
+
+    public void testMoney() {
+        SqlDataClass sqlDataClass = SqlIntegrationTestSingleton.getPerson();
+        assertEquals(money, sqlDataClass.getMoney());
+        // assertTrue("Money " + money.toString() + " is not equal to " + sqlDataClass.getMoney().toString(),
+        // money.equals(sqlDataClass.getMoney()));
+    }
 
 	/**
 	 * Test {@link DateTime} type.