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.