You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ke...@apache.org on 2011/04/21 22:48:54 UTC
svn commit: r1095816 - in
/incubator/isis/trunk/runtimes/dflt/objectstores/sql:
impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/
impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/
impl/src/main/java/org/apache/isi...
Author: kevin
Date: Thu Apr 21 20:48:54 2011
New Revision: 1095816
URL: http://svn.apache.org/viewvc?rev=1095816&view=rev
Log:
Redefined SQL dataclasses as replaceable variables, defined and initialised in JdbcConnector and used by JdbcFieldMappingFactoryInstaller.
Updated documentation.
Modified:
incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/FieldMappingLookup.java
incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/IdMappingAbstract.java
incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/VersionMapping.java
incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcConnector.java
incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcGeneralValueMapper.java
incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/installer/JdbcFieldMappingFactoryInstaller.java
incubator/isis/trunk/runtimes/dflt/objectstores/sql/src/docbkx/guide/isis-sql-objectstore.xml
incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/testsystem/dataclasses/SimpleClassTwo.java
incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/test/config/hsql.properties
Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/FieldMappingLookup.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/FieldMappingLookup.java?rev=1095816&r1=1095815&r2=1095816&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/FieldMappingLookup.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/FieldMappingLookup.java Thu Apr 21 20:48:54 2011
@@ -17,7 +17,6 @@
* under the License.
*/
-
package org.apache.isis.runtimes.dflt.objectstores.sql;
import java.util.HashMap;
@@ -28,6 +27,7 @@ import org.apache.log4j.Logger;
import org.apache.isis.core.commons.exceptions.NotYetImplementedException;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcConnector;
import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcGeneralValueMapper;
import org.apache.isis.runtimes.dflt.objectstores.sql.mapping.FieldMapping;
import org.apache.isis.runtimes.dflt.objectstores.sql.mapping.FieldMappingFactory;
@@ -35,11 +35,12 @@ import org.apache.isis.runtimes.dflt.obj
import org.apache.isis.runtimes.dflt.objectstores.sql.mapping.ObjectReferenceMappingFactory;
import org.apache.isis.runtimes.dflt.runtime.context.IsisContext;
-
public class FieldMappingLookup {
private static final Logger LOG = Logger.getLogger(FieldMappingLookup.class);
- private final Map<ObjectSpecification, FieldMappingFactory> fieldMappings = new HashMap<ObjectSpecification, FieldMappingFactory>();
- private final Map<ObjectSpecification, ObjectReferenceMappingFactory> referenceMappings = new HashMap<ObjectSpecification, ObjectReferenceMappingFactory>();
+ private final Map<ObjectSpecification, FieldMappingFactory> fieldMappings =
+ new HashMap<ObjectSpecification, FieldMappingFactory>();
+ private final Map<ObjectSpecification, ObjectReferenceMappingFactory> referenceMappings =
+ new HashMap<ObjectSpecification, ObjectReferenceMappingFactory>();
private FieldMappingFactory referenceFieldMappingfactory;
private ObjectReferenceMappingFactory objectReferenceMappingfactory;
@@ -49,22 +50,22 @@ public class FieldMappingLookup {
if (factory != null) {
return factory.createFieldMapping(field);
} else if (spec.isEncodeable()) {
- factory = new JdbcGeneralValueMapper.Factory("VARCHAR(65)");
+ factory = new JdbcGeneralValueMapper.Factory(JdbcConnector.TYPE_DEFAULT());
addFieldMappingFactory(spec, factory);
return factory.createFieldMapping(field);
- } else {//if (true /* TODO test for reference */) {
+ } else {// if (true /* TODO test for reference */) {
factory = referenceFieldMappingfactory;
addFieldMappingFactory(spec, factory);
return factory.createFieldMapping(field);
- //} else {
- //throw new IsisException("No mapper for " + spec + " (no default mapper)");
+ // } else {
+ // throw new IsisException("No mapper for " + spec + " (no default mapper)");
}
}
public ObjectReferenceMapping createMapping(ObjectSpecification spec) {
return createMapping(spec.getShortIdentifier(), spec);
}
-
+
public ObjectReferenceMapping createMapping(String columnName, ObjectSpecification spec) {
ObjectReferenceMappingFactory factory = referenceMappings.get(spec);
if (factory != null) {
@@ -74,13 +75,13 @@ public class FieldMappingLookup {
throw new NotYetImplementedException();
} else {// if (true /* TODO test for reference */) {
factory = objectReferenceMappingfactory;
- // add(spec, factory);
+ // add(spec, factory);
return factory.createReferenceMapping(columnName, spec); // TODO: here
- //} else {
- // throw new IsisException("No mapper for " + spec + " (no default mapper)");
+ // } else {
+ // throw new IsisException("No mapper for " + spec + " (no default mapper)");
}
}
-
+
public void addFieldMappingFactory(final Class<?> valueType, final FieldMappingFactory mapper) {
ObjectSpecification spec = IsisContext.getSpecificationLoader().loadSpecification(valueType);
addFieldMappingFactory(spec, mapper);
@@ -91,13 +92,14 @@ public class FieldMappingLookup {
fieldMappings.put(specification, mapper);
}
- public void addReferenceMappingFactory(final ObjectSpecification specification, final ObjectReferenceMappingFactory mapper) {
- LOG.debug("add mapper " + mapper + " for " + specification);
- referenceMappings.put(specification, mapper);
+ public void addReferenceMappingFactory(final ObjectSpecification specification,
+ final ObjectReferenceMappingFactory mapper) {
+ LOG.debug("add mapper " + mapper + " for " + specification);
+ referenceMappings.put(specification, mapper);
}
public void init() {
- // fieldMappingFactory.load(this);
+ // fieldMappingFactory.load(this);
}
public IdMapping createIdMapping() {
Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/IdMappingAbstract.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/IdMappingAbstract.java?rev=1095816&r1=1095815&r2=1095816&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/IdMappingAbstract.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/IdMappingAbstract.java Thu Apr 21 20:48:54 2011
@@ -19,101 +19,95 @@
package org.apache.isis.runtimes.dflt.objectstores.sql;
-import org.apache.isis.runtimes.dflt.objectstores.sql.SqlOid.State;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.adapter.oid.Oid;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.runtimes.dflt.objectstores.sql.SqlOid.State;
+import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcConnector;
import org.apache.isis.runtimes.dflt.runtime.context.IsisContext;
import org.apache.isis.runtimes.dflt.runtime.persistence.adaptermanager.AdapterManager;
import org.apache.isis.runtimes.dflt.runtime.persistence.oidgenerator.simple.SerialOid;
public class IdMappingAbstract {
- private String column;
+ private String column;
- protected void setColumn(String column) {
- this.column = Sql.identifier(column);
- }
-
- protected String getColumn() {
- return column;
- }
-
- public void appendWhereClause(DatabaseConnector connector,
- StringBuffer sql, Oid oid) {
- sql.append(column);
- connector.addToQueryValues(primaryKeyAsObject(oid));
- sql.append(" = ?");
- }
-
- public void appendCreateColumnDefinitions(StringBuffer sql) {
- sql.append(column);
- sql.append(" ");
- sql.append("INTEGER NOT NULL PRIMARY KEY");
- }
-
- public void appendColumnDefinitions(StringBuffer sql) {
- sql.append(column);
- sql.append(" ");
- sql.append("INTEGER");
- }
-
- public void appendColumnNames(StringBuffer sql) {
- sql.append(column);
- }
-
- public void appendInsertValues(DatabaseConnector connector,
- StringBuffer sql, ObjectAdapter object) {
- if (object == null) {
- sql.append("NULL");
- } else {
- sql.append(connector.addToQueryValues(primaryKeyAsObject(object
- .getOid())));
- }
- }
-
- /*
- * This doesn't have to be an Int, it should be any object.
- */
- public Object primaryKeyAsObject(final Oid oid) {
- if (oid instanceof SqlOid) {
- PrimaryKey pk = ((SqlOid) oid).getPrimaryKey();
- return pk.naturalValue();
- } else
- return ((SerialOid) oid).getSerialNo();
- }
-
- public String primaryKey(final Oid oid) {
- if (oid instanceof SqlOid)
- return "" + ((SqlOid) oid).getPrimaryKey().stringValue() + "";
- else
- return "" + ((SerialOid) oid).getSerialNo();
- }
-
- public Oid recreateOid(final Results rs,
- final ObjectSpecification specification) {
- PrimaryKey key;
- Object object = rs.getObject(column);
- if (object == null) {
- return null;
- } else {
- int id = ((Integer) object).intValue();
- key = new IntegerPrimaryKey(id);
- }
- Oid oid = new SqlOid(specification.getFullIdentifier(), key, State.PERSISTENT);
- return oid;
- }
-
- protected ObjectAdapter getAdapter(final ObjectSpecification specification,
- final Oid oid) {
- AdapterManager objectLoader = IsisContext.getPersistenceSession()
- .getAdapterManager();
- ObjectAdapter adapter = objectLoader.getAdapterFor(oid);
- if (adapter != null) {
- return adapter;
- } else {
- return IsisContext.getPersistenceSession().recreateAdapter(oid,
- specification);
- }
- }
+ protected void setColumn(String column) {
+ this.column = Sql.identifier(column);
+ }
+
+ protected String getColumn() {
+ return column;
+ }
+
+ public void appendWhereClause(DatabaseConnector connector, StringBuffer sql, Oid oid) {
+ sql.append(column);
+ connector.addToQueryValues(primaryKeyAsObject(oid));
+ sql.append(" = ?");
+ }
+
+ public void appendCreateColumnDefinitions(StringBuffer sql) {
+ sql.append(column);
+ sql.append(" ");
+ sql.append(JdbcConnector.TYPE_PK() + " NOT NULL PRIMARY KEY");
+ }
+
+ public void appendColumnDefinitions(StringBuffer sql) {
+ sql.append(column);
+ sql.append(" ");
+ sql.append(JdbcConnector.TYPE_PK());
+ }
+
+ public void appendColumnNames(StringBuffer sql) {
+ sql.append(column);
+ }
+
+ public void appendInsertValues(DatabaseConnector connector, StringBuffer sql, ObjectAdapter object) {
+ if (object == null) {
+ sql.append("NULL");
+ } else {
+ sql.append(connector.addToQueryValues(primaryKeyAsObject(object.getOid())));
+ }
+ }
+
+ /*
+ * This doesn't have to be an Int, it should be any object.
+ */
+ public Object primaryKeyAsObject(final Oid oid) {
+ if (oid instanceof SqlOid) {
+ PrimaryKey pk = ((SqlOid) oid).getPrimaryKey();
+ return pk.naturalValue();
+ } else
+ return ((SerialOid) oid).getSerialNo();
+ }
+
+ public String primaryKey(final Oid oid) {
+ if (oid instanceof SqlOid)
+ return "" + ((SqlOid) oid).getPrimaryKey().stringValue() + "";
+ else
+ return "" + ((SerialOid) oid).getSerialNo();
+ }
+
+ public Oid recreateOid(final Results rs, final ObjectSpecification specification) {
+ PrimaryKey key;
+ Object object = rs.getObject(column);
+ if (object == null) {
+ return null;
+ } else {
+ int id = ((Integer) object).intValue();
+ key = new IntegerPrimaryKey(id);
+ }
+ Oid oid = new SqlOid(specification.getFullIdentifier(), key, State.PERSISTENT);
+ return oid;
+ }
+
+ protected ObjectAdapter getAdapter(final ObjectSpecification specification, final Oid oid) {
+ AdapterManager objectLoader = IsisContext.getPersistenceSession().getAdapterManager();
+ ObjectAdapter adapter = objectLoader.getAdapterFor(oid);
+ if (adapter != null) {
+ return adapter;
+ } else {
+ return IsisContext.getPersistenceSession().recreateAdapter(oid, specification);
+ }
+ }
}
Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/VersionMapping.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/VersionMapping.java?rev=1095816&r1=1095815&r2=1095816&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/VersionMapping.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/VersionMapping.java Thu Apr 21 20:48:54 2011
@@ -84,7 +84,7 @@ public class VersionMapping {
sql.append(",");
sql.append(lastActivityDateColumn);
- sql.append(" " + JdbcConnector.timeStampType());
+ sql.append(" " + JdbcConnector.TYPE_TIMESTAMP());
return sql.toString();
}
Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcConnector.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcConnector.java?rev=1095816&r1=1095815&r2=1095816&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcConnector.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcConnector.java Thu Apr 21 20:48:54 2011
@@ -29,17 +29,18 @@ import java.util.ArrayList;
import java.util.Date;
import java.util.List;
+import org.apache.log4j.Logger;
+import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
+
+import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.commons.debug.DebugBuilder;
import org.apache.isis.runtimes.dflt.objectstores.sql.AbstractDatabaseConnector;
import org.apache.isis.runtimes.dflt.objectstores.sql.Results;
import org.apache.isis.runtimes.dflt.objectstores.sql.SqlMetaData;
import org.apache.isis.runtimes.dflt.objectstores.sql.SqlObjectStore;
import org.apache.isis.runtimes.dflt.objectstores.sql.SqlObjectStoreException;
-import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.commons.debug.DebugBuilder;
import org.apache.isis.runtimes.dflt.runtime.context.IsisContext;
-import org.apache.log4j.Logger;
-import org.joda.time.DateTimeZone;
-import org.joda.time.LocalDate;
public class JdbcConnector extends AbstractDatabaseConnector {
private static final Logger LOG = Logger.getLogger(JdbcConnector.class);
@@ -155,17 +156,26 @@ public class JdbcConnector extends Abstr
* return new JdbcResults(statement); } catch (SQLException e) { throw new ObjectAdapterRuntimeException(e); } }
*/
- // static String TYPE_BOOLEAN;
+ static String TYPE_BOOLEAN;
static String TYPE_TIMESTAMP;
static String TYPE_DATETIME;
static String TYPE_DATE;
static String TYPE_TIME;
+ static String TYPE_SHORT;
+ static String TYPE_DOUBLE;
+ static String TYPE_FLOAT;
+ static String TYPE_LONG;
+ static String TYPE_INT;
+ static String TYPE_PK;
+ static String TYPE_STRING;
+ static String TYPE_PASSWORD;
+ static String TYPE_DEFAULT;
/**
* Default SQL data types used to define the fields in the database. By providing this method, we allow the user an
- * opportunity to override these types by specifying alternatives in sql.properties (or which ever).
- * For example, Postgresql does not know about DATETIME, but can use TIMESTAMP instead.
- *
+ * opportunity to override these types by specifying alternatives in sql.properties (or which ever). For example,
+ * Postgresql does not know about DATETIME, but can use TIMESTAMP instead.
+ *
* @param dataTypes
* @param baseName
*/
@@ -174,12 +184,62 @@ public class JdbcConnector extends Abstr
TYPE_DATETIME = dataTypes.getString(baseName + "datetime", "DATETIME");
TYPE_DATE = dataTypes.getString(baseName + "date", "DATE");
TYPE_TIME = dataTypes.getString(baseName + "time", "TIME");
+ TYPE_DOUBLE = dataTypes.getString(baseName + "double", "FLOAT");
+ TYPE_FLOAT = dataTypes.getString(baseName + "float", "FLOAT");
+ TYPE_SHORT = dataTypes.getString(baseName + "short", "INT");
+ TYPE_LONG = dataTypes.getString(baseName + "long", "INT");
+ TYPE_INT = dataTypes.getString(baseName + "int", "INT");
+ TYPE_BOOLEAN = dataTypes.getString(baseName + "boolean", "CHAR(1)");
+ TYPE_PK = dataTypes.getString(baseName + "primarykey", "INTEGER");
+ TYPE_STRING = dataTypes.getString(baseName + "string", "VARCHAR(65)");
+ TYPE_PASSWORD = dataTypes.getString(baseName + "password", "VARCHAR(12)");
+ TYPE_DEFAULT = dataTypes.getString(baseName + "default", "VARCHAR(65)");
}
- public static String timeStampType() {
+ public static String TYPE_TIMESTAMP() {
return TYPE_TIMESTAMP;
}
+ public static String TYPE_SHORT() {
+ return TYPE_SHORT;
+ }
+
+ public static String TYPE_INT() {
+ return TYPE_INT;
+ }
+
+ public static String TYPE_LONG() {
+ return TYPE_LONG;
+ }
+
+ public static String TYPE_FLOAT() {
+ return TYPE_FLOAT;
+ }
+
+ public static String TYPE_DOUBLE() {
+ return TYPE_DOUBLE;
+ }
+
+ public static String TYPE_BOOLEAN() {
+ return TYPE_BOOLEAN;
+ }
+
+ public static String TYPE_PK() {
+ return TYPE_PK;
+ }
+
+ public static String TYPE_STRING() {
+ return TYPE_STRING;
+ }
+
+ public static String TYPE_PASSWORD() {
+ return TYPE_PASSWORD;
+ }
+
+ public static String TYPE_DEFAULT() {
+ return TYPE_DEFAULT;
+ }
+
@Override
public Results select(final String sql) {
LOG.debug("SQL: " + sql);
@@ -222,14 +282,16 @@ public class JdbcConnector extends Abstr
int i = 1;
try {
for (final Object value : queryValues) {
- if (value instanceof LocalDate){
- try{
+ if (value instanceof LocalDate) {
+ try {
statement.setObject(i, value, java.sql.Types.DATE);
- } catch (SQLException e){
- // This daft catch is required my MySQL, which also requires the TimeZone offset to be "undone"
+ } catch (SQLException e) {
+ // This daft catch is required my MySQL, which also requires the TimeZone offset to be
+ // "undone"
LocalDate localDate = (LocalDate) value;
int millisOffset = -DateTimeZone.getDefault().getOffset(null);
- final Date javaDate = localDate.toDateTimeAtStartOfDay(DateTimeZone.forOffsetMillis(millisOffset)).toDate();
+ final Date javaDate =
+ localDate.toDateTimeAtStartOfDay(DateTimeZone.forOffsetMillis(millisOffset)).toDate();
statement.setObject(i, javaDate, java.sql.Types.DATE);
}
@@ -396,4 +458,5 @@ public class JdbcConnector extends Abstr
queryValues.add(o);
return "?";
}
+
}
Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcGeneralValueMapper.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcGeneralValueMapper.java?rev=1095816&r1=1095815&r2=1095816&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcGeneralValueMapper.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/JdbcGeneralValueMapper.java Thu Apr 21 20:48:54 2011
@@ -52,8 +52,6 @@ public class JdbcGeneralValueMapper exte
this.type = type;
}
- // TODO:KAM: here X
-
@Override
protected Object preparedStatementObject(ObjectAdapter value) {
if (value == null)
Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/installer/JdbcFieldMappingFactoryInstaller.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/installer/JdbcFieldMappingFactoryInstaller.java?rev=1095816&r1=1095815&r2=1095816&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/installer/JdbcFieldMappingFactoryInstaller.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/jdbc/installer/JdbcFieldMappingFactoryInstaller.java Thu Apr 21 20:48:54 2011
@@ -17,7 +17,6 @@
* under the License.
*/
-
package org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.installer;
import org.apache.isis.applib.value.Color;
@@ -30,6 +29,7 @@ import org.apache.isis.applib.value.Time
import org.apache.isis.applib.value.TimeStamp;
import org.apache.isis.runtimes.dflt.objectstores.sql.FieldMappingFactoryInstaller;
import org.apache.isis.runtimes.dflt.objectstores.sql.FieldMappingLookup;
+import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcConnector;
import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcDateMapper;
import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcDateTimeMapper;
import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcGeneralValueMapper;
@@ -39,24 +39,24 @@ import org.apache.isis.runtimes.dflt.obj
import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcTimeMapper;
import org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.JdbcTimestampMapper;
-
public class JdbcFieldMappingFactoryInstaller implements FieldMappingFactoryInstaller {
@Override
public void load(FieldMappingLookup lookup) {
- lookup.addFieldMappingFactory(boolean.class, new JdbcGeneralValueMapper.Factory("CHAR(1)"));
- lookup.addFieldMappingFactory(short.class, new JdbcGeneralValueMapper.Factory("INT"));
- lookup.addFieldMappingFactory(int.class, new JdbcGeneralValueMapper.Factory("INT"));
- lookup.addFieldMappingFactory(long.class, new JdbcGeneralValueMapper.Factory("INT"));
- lookup.addFieldMappingFactory(float.class, new JdbcGeneralValueMapper.Factory("FLOAT"));
- lookup.addFieldMappingFactory(double.class, new JdbcGeneralValueMapper.Factory("FLOAT"));
+ lookup.addFieldMappingFactory(boolean.class, new JdbcGeneralValueMapper.Factory(JdbcConnector.TYPE_BOOLEAN()));
+ lookup.addFieldMappingFactory(short.class, new JdbcGeneralValueMapper.Factory(JdbcConnector.TYPE_SHORT()));
+ lookup.addFieldMappingFactory(int.class, new JdbcGeneralValueMapper.Factory(JdbcConnector.TYPE_INT()));
+ lookup.addFieldMappingFactory(long.class, new JdbcGeneralValueMapper.Factory(JdbcConnector.TYPE_LONG()));
+ lookup.addFieldMappingFactory(float.class, new JdbcGeneralValueMapper.Factory(JdbcConnector.TYPE_FLOAT()));
+ lookup.addFieldMappingFactory(double.class, new JdbcGeneralValueMapper.Factory(JdbcConnector.TYPE_DOUBLE()));
lookup.addFieldMappingFactory(char.class, new JdbcGeneralValueMapper.Factory("CHAR(2)"));
lookup.addFieldMappingFactory(Money.class, new JdbcMoneyValueMapper.Factory("FLOAT", "VARCHAR(3)"));
lookup.addFieldMappingFactory(Percentage.class, new JdbcGeneralValueMapper.Factory("FLOAT"));
- lookup.addFieldMappingFactory(Password.class, new JdbcGeneralValueMapper.Factory("VARCHAR(12)"));
- lookup.addFieldMappingFactory(Color.class, new JdbcGeneralValueMapper.Factory("INT"));
- lookup.addFieldMappingFactory(String.class, new JdbcGeneralValueMapper.Factory("VARCHAR(65)"));
+ lookup
+ .addFieldMappingFactory(Password.class, new JdbcGeneralValueMapper.Factory(JdbcConnector.TYPE_PASSWORD()));
+ lookup.addFieldMappingFactory(Color.class, new JdbcGeneralValueMapper.Factory(JdbcConnector.TYPE_SHORT()));
+ lookup.addFieldMappingFactory(String.class, new JdbcGeneralValueMapper.Factory(JdbcConnector.TYPE_STRING()));
lookup.addFieldMappingFactory(Date.class, new JdbcDateMapper.Factory());
lookup.addFieldMappingFactory(Time.class, new JdbcTimeMapper.Factory());
@@ -69,10 +69,9 @@ public class JdbcFieldMappingFactoryInst
lookup.addFieldMappingFactory(java.sql.Timestamp.class, new JdbcTimestampMapper.Factory());
lookup.setReferenceFieldMappingFactory(new JdbcObjectReferenceFieldMapping.Factory());
-
- lookup .setObjectReferenceMappingfactory(new JdbcObjectReferenceMappingFactory());
+
+ lookup.setObjectReferenceMappingfactory(new JdbcObjectReferenceMappingFactory());
}
}
-
Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/src/docbkx/guide/isis-sql-objectstore.xml
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/src/docbkx/guide/isis-sql-objectstore.xml?rev=1095816&r1=1095815&r2=1095816&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/src/docbkx/guide/isis-sql-objectstore.xml (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/src/docbkx/guide/isis-sql-objectstore.xml Thu Apr 21 20:48:54 2011
@@ -83,6 +83,23 @@
</abstract>
<sect1>
+ <title>Background</title>
+
+ <para>The SQL objectstore provides a fully-automatic object store that
+ uses a SQL-compatible database server.</para>
+
+ <para>All domain objects (entities) are introspected during
+ initialisation, and have a 1-to-1 mapping onto a database table. All
+ properties (values) are mapped onto one or more columns with each
+ database table.</para>
+
+ <para>Domain object classes are introspected and all properties
+ recursively introspected to value types. Thus, if a property stores a
+ reference to a class, that class's properties are introspected,
+ etc.</para>
+ </sect1>
+
+ <sect1>
<title>Setup</title>
<sect2>
@@ -105,28 +122,192 @@
<para>The driver property must contain the name of the jdbc driver
class that provides access to your SQL server. Known examples are
given below in <xref linkend="sec.servers.tested" />.</para>
+ </sect2>
- <para></para>
+ <sect2>
+ <title>Table Creation</title>
+
+ <para>Missing database tables are automatically created when the SQL
+ objectstore is initialised.</para>
+
+ <para>Please note that changes to domain classes such as renaming
+ fields (properties) or the classes themselves, are
+ <emphasis>not</emphasis> automatically detected. If you rename a
+ property after a table has been created, you should use the
+ appropriate database administration tool to rename the column in the
+ containing table.</para>
+
+ <para>If you rename a domain class (entity), you must also rename the
+ appropriate table.</para>
</sect2>
</sect1>
<sect1>
<title>Mappers</title>
- <para>For persistance, classes are introspected and all properties
- recursively introspected to value types. Thus, if a property stores a
- reference to a class, that class's properties are introspected,
- etc.</para>
+ <para>The mappers take care of mapping a value type onto a SQL data
+ type. Default mappers are provided by JdbcFieldMappingFactoryInstaller.
+ </para>
- <para>By default, the value types are mapped onto SQL data types, as
- determined by the mappers. Default mappers are provided by
- AutoMapperFactory.</para>
+ <sect2>
+ <title>Modifiable values</title>
+
+ <para>The following SQL datatypes can be overridden, if specified in
+ the properties file (the default value is given in parenthesis), [the
+ mapped value classes are given in square brackets]:<simplelist>
+ <member>isis.persistor.sql.datatypes.timestamp (DATETIME)
+ [TimeStamp, java.sql.Timestamp]</member>
+ </simplelist></para>
+
+ <para><simplelist>
+ <member>isis.persistor.sql.datatypes.datetime (DATETIME)
+ [DateTime]</member>
+ </simplelist></para>
+
+ <para><simplelist>
+ <member>isis.persistor.sql.datatypes.date (DATE) [Date,
+ java.sql.Date, java.util.Date]</member>
+ </simplelist></para>
+
+ <para><simplelist>
+ <member>isis.persistor.sql.datatypes.time (TIME) [Time]</member>
+ </simplelist></para>
+
+ <para><simplelist>
+ <member>isis.persistor.sql.datatypes.double (FLOAT)
+ [double]</member>
+ </simplelist></para>
+
+ <para><simplelist>
+ <member>isis.persistor.sql.datatypes.float (FLOAT)
+ [float]</member>
+ </simplelist></para>
+
+ <para><simplelist>
+ <member>isis.persistor.sql.datatypes.short (INT) [short,
+ Color]</member>
+ </simplelist></para>
+
+ <para><simplelist>
+ <member>isis.persistor.sql.datatypes.long (INT) [long]</member>
+ </simplelist></para>
+
+ <para><simplelist>
+ <member>isis.persistor.sql.datatypes.int (INT) [int]</member>
+ </simplelist></para>
+
+ <para><simplelist>
+ <member>isis.persistor.sql.datatypes.boolean (CHAR(1))
+ [boolean]</member>
+ </simplelist></para>
+
+ <para><simplelist>
+ <member>isis.persistor.sql.datatypes.string (VARCHAR(65))
+ [String]</member>
+ </simplelist></para>
+
+ <para><simplelist>
+ <member>isis.persistor.sql.datatypes.password (VARCHAR(12))
+ [Password]</member>
+ </simplelist></para>
+
+ <para><simplelist>
+ <member>isis.persistor.sql.datatypes.default (VARCHAR(65))
+ [Everything else, e.g. Image]</member>
+ </simplelist></para>
+
+ <para><simplelist>
+ <member>isis.persistor.sql.datatypes.primarykey (INTEGER)
+ [IdMappingAbstract -> JdbcObjectReferenceMapping ->
+ JdbcObjectReferenceFieldMapping]</member>
+ </simplelist></para>
+
+ <para>The final value, primarykey, is a special value.</para>
+
+ <para>In general, be very careful about changing the SQL data type, as
+ the default value mappers are written assuming the default values.
+ Data parsing uses prepared statements and reads/writes values as
+ objects.</para>
+ </sect2>
+
+ <sect2>
+ <title>Fixed values</title>
+
+ <para>The following classes are not modifiable:</para>
+
+ <para>[char] is set to CHAR(1)</para>
+
+ <para>[Money] value is FLOAT, currency is VARCHAR(3)</para>
+
+ <para>[Percentage] is FLOAT</para>
+ </sect2>
</sect1>
<sect1>
- <title></title>
+ <title>Naming Conventions</title>
- <para></para>
+ <para>While case is determined by the capabilities of the database
+ driver, all SQL names will be written in UPPER CASE, below.</para>
+
+ <sect2>
+ <title>Tables</title>
+
+ <para>By default, all Isis tables are preceded with "ISIS_".</para>
+
+ <sect3>
+ <title>Internal Tables</title>
+
+ <para>ISIS_ADMIN_SERIAL_ID ISIS_ADMIN_SERVICES</para>
+ </sect3>
+
+ <sect3>
+ <title>Domain Tables</title>
+
+ <para>Only the "class" part of the package name is used. Thus a
+ domain class called "some.package.Client", will be mapped onto a
+ table "ISIS_CLIENT".</para>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>Columns</title>
+
+ <sect3>
+ <title>Internal columns</title>
+
+ <para>ID column: PK_ID</para>
+
+ <para>VERSION BIGINT,</para>
+
+ <para>MODIFIED_BY VARCHAR(32),</para>
+
+ <para>MODIFIED_ON TIMESTAMP</para>
+ </sect3>
+
+ <sect3>
+ <title>Properties</title>
+
+ <para>Most properties are named as per the class property. This
+ means you must take care not to use SQL reserved labels are property
+ names. The exceptions are collections and multi-field values (e.g.
+ Money).</para>
+ </sect3>
+
+ <sect3>
+ <title>Collections</title>
+
+ <para>Collections are mapped onto the child class:</para>
+
+ <para>If a parent class (some.package.Parent) has a collection of
+ (some.other.package.Child) named "children", the child table
+ (ISIS_CHILD) gets a column labeled "FK_PARENT_CHILDREN" of type
+ primarykey. The child property is assigned the ID of the parent
+ class.</para>
+
+ <para>This means that a given child can only appear in one parent's
+ collection of the same name.</para>
+ </sect3>
+ </sect2>
</sect1>
</chapter>
@@ -179,7 +360,39 @@
<para><property>isis.persistor.sql.jdbc.user=sa</property></para>
<para><property>isis.persistor.sql.jdbc.password=</property></para>
- </blockquote></para>
+ </blockquote>The default TimeStamp and DateTime SQL data class is
+ DATETIME, which does not work on Postgresql. Here, the default must be
+ replaced with the following properties file entries:</para>
+
+ <blockquote>
+ <para>isis.persistor.sql.datatypes.timestamp=TIMESTAMP </para>
+
+ <para>isis.persistor.sql.datatypes.datetime=TIMESTAMP</para>
+ </blockquote>
+
+ <para></para>
+ </sect2>
+
+ <sect2>
+ <title>MySQL</title>
+
+ <para>There was an issue with storing and correctly retrieving date
+ (time) values - a special "try .. catch" has been used to ensure that
+ UTC temporal values are correctly retrieved.</para>
+ </sect2>
+
+ <sect2>
+ <title>Microsoft SQL Server 2008</title>
+
+ <para></para>
+ </sect2>
+
+ <sect2>
+ <title>IBM DB2 (v8)</title>
+
+ <para>Beware! This version of DB2 has a very small limit on table and
+ column names. You will have to keep your domain class and property
+ names short to suite, especially collections (see ..).</para>
</sect2>
</sect1>
@@ -196,8 +409,9 @@
</listitem>
<listitem>
- <para>standard classes: Money ([does not work]), Percentage (FLOAT),
- Password (VARCHAR(12)), Color (INT), String (VARCHAR (65)).</para>
+ <para>standard classes: Money (FLOAT and VARCHAR(3)), Percentage
+ (FLOAT), Password (VARCHAR(12)), Color (INT), String (VARCHAR
+ (65)).</para>
</listitem>
<listitem>
@@ -211,8 +425,9 @@
</listitem>
<listitem>
- <para>blah Time, DateTime, java.sql.Time, java.util.Date,
- java.sql.Timestamp blah</para>
+ <para>blah Time, DateTime (DATETIME), java.sql.Time,
+ java.util.Date, java.sql.Timestamp (DATETIME), TimeStamp
+ (DATETIME) blah</para>
</listitem>
</itemizedlist>
</listitem>
@@ -226,6 +441,9 @@
<code>org.apache.isis.alternatives.objectstore.sql.FieldMappingFactoryInstaller</code>
..</para>
+ <para>Default automapper is
+ <code>org.apache.isis.runtimes.dflt.objectstores.sql.jdbc.installer.JdbcFieldMappingFactoryInstaller</code></para>
+
<para></para>
</sect1>
</chapter>
@@ -329,7 +547,7 @@
<sect1>
<title>Edit History</title>
- <para>Last editted: Kevin, 31/01/2011.<!--dd/mm/yyyy--></para>
+ <para>Last editted: Kevin, 21/04/2011.<!--dd/mm/yyyy--></para>
</sect1>
</appendix>
</book>
Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/testsystem/dataclasses/SimpleClassTwo.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/testsystem/dataclasses/SimpleClassTwo.java?rev=1095816&r1=1095815&r2=1095816&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/testsystem/dataclasses/SimpleClassTwo.java (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/testsystem/dataclasses/SimpleClassTwo.java Thu Apr 21 20:48:54 2011
@@ -29,33 +29,33 @@ import org.apache.isis.applib.AbstractDo
*
*/
public class SimpleClassTwo extends AbstractDomainObject {
- public String title() {
- return text;
- }
-
- // {{ String type
- public String text;
-
- public String getText() {
- return text;
- }
-
- public void setText(final String text) {
- this.text = text;
- }
-
- // }}
-
- // {{ Value
- private Integer integer;
-
- public Integer getValue() {
- return integer;
- }
-
- public void setValue(final Integer integer) {
- this.integer = integer;
- }
- // }}
+ public String title() {
+ return text;
+ }
+
+ // {{ String type
+ public String text;
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(final String text) {
+ this.text = text;
+ }
+
+ // }}
+
+ // {{ Value
+ private int integer;
+
+ public int getValue() {
+ return integer;
+ }
+
+ public void setValue(final int integer) {
+ this.integer = integer;
+ }
+ // }}
}
Modified: incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/test/config/hsql.properties
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/test/config/hsql.properties?rev=1095816&r1=1095815&r2=1095816&view=diff
==============================================================================
--- incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/test/config/hsql.properties (original)
+++ incubator/isis/trunk/runtimes/dflt/objectstores/sql/tests-common/src/test/config/hsql.properties Thu Apr 21 20:48:54 2011
@@ -4,3 +4,6 @@ isis.persistor.sql.jdbc.driver=org.hsqld
isis.persistor.sql.jdbc.connection=jdbc:hsqldb:file:hsql-db/tests
isis.persistor.sql.jdbc.user=sa
isis.persistor.sql.jdbc.password=
+
+# testing
+isis.persistor.sql.datatypes.string=VARCHAR(70)