Revision: 2698
http://datanucleus.svn.sourceforge.net/datanucleus/?rev=2698&view=rev
Author: andy_jefferson
Date: 2008-08-21 14:38:00 +0000 (Thu, 21 Aug 2008)
Log Message:
-----------
[NUCEXCEL-14] Retrieval of version column value and setting in object. Storing of version in object version cell
Modified Paths:
--------------
platform/store.excel/trunk/src/java/org/datanucleus/store/excel/ExcelPersistenceHandler.java
Modified: platform/store.excel/trunk/src/java/org/datanucleus/store/excel/ExcelPersistenceHandler.java
===================================================================
--- platform/store.excel/trunk/src/java/org/datanucleus/store/excel/ExcelPersistenceHandler.java 2008-08-20 20:43:30 UTC (rev 2697)
+++ platform/store.excel/trunk/src/java/org/datanucleus/store/excel/ExcelPersistenceHandler.java 2008-08-21 14:38:00 UTC (rev 2698)
@@ -39,7 +39,9 @@
import org.datanucleus.exceptions.NucleusUserException;
import org.datanucleus.identity.OID;
import org.datanucleus.metadata.AbstractClassMetaData;
+import org.datanucleus.metadata.AbstractMemberMetaData;
import org.datanucleus.metadata.IdentityType;
+import org.datanucleus.metadata.VersionMetaData;
import org.datanucleus.metadata.VersionStrategy;
import org.datanucleus.state.StateManagerFactory;
import org.datanucleus.store.StoreManager;
@@ -234,11 +236,42 @@
final HSSFSheet sheet = ExcelUtils.getSheetForClass(sm, wb);
// TODO Add optimistic checks
+ Object currentVersion = sm.getTransactionalVersion(sm.getObject());
+ Object nextVersion = null;
+ AbstractClassMetaData acmd = sm.getClassMetaData();
+ if (acmd.hasVersionStrategy())
+ {
+ // Version object so calculate version to store with
+ VersionMetaData vermd = acmd.getVersionMetaData();
+ if (acmd.getVersionMetaData().getFieldName() != null)
+ {
+ // Version field
+ AbstractMemberMetaData verfmd = acmd.getMetaDataForMember(vermd.getFieldName());
+ if (currentVersion instanceof Integer)
+ {
+ // Cater for Integer-based versions TODO Generalise this
+ currentVersion = new Long(((Integer)currentVersion).longValue());
+ }
+ nextVersion = acmd.getVersionMetaData().getNextVersion(currentVersion);
+ if (verfmd.getType() == Integer.class || verfmd.getType() == int.class)
+ {
+ // Cater for Integer-based versions TODO Generalise this
+ nextVersion = new Integer(((Long)nextVersion).intValue());
+ }
+ sm.replaceField(verfmd.getAbsoluteFieldNumber(), nextVersion, false);
+ }
+ else
+ {
+ // Surrogate version column
+ nextVersion = vermd.getNextVersion(currentVersion);
+ }
+ sm.setTransactionalVersion(nextVersion);
+ }
+
long startTime = System.currentTimeMillis();
if (NucleusLogger.DATASTORE_PERSIST.isDebugEnabled())
{
- AbstractClassMetaData cmd = sm.getClassMetaData();
StringBuffer fieldStr = new StringBuffer();
for (int i=0;i<fieldNumbers.length;i++)
{
@@ -246,7 +279,7 @@
{
fieldStr.append(",");
}
- fieldStr.append(cmd.getMetaDataForManagedMemberAtAbsolutePosition(fieldNumbers[i]).getName());
+ fieldStr.append(acmd.getMetaDataForManagedMemberAtAbsolutePosition(fieldNumbers[i]).getName());
}
NucleusLogger.DATASTORE_PERSIST.debug(LOCALISER.msg("Excel.Update.Start",
StringUtils.toJVMIDString(sm.getObject()), sm.getInternalObjectId(), fieldStr.toString()));
@@ -262,7 +295,36 @@
}
sm.provideFields(fieldNumbers, new StoreFieldManager(sm, row));
- // TODO Update the version in the datastore
+ if (acmd.hasVersionStrategy())
+ {
+ // Versioned object so set version cell in spreadsheet
+ int verCellNum = (int)ExcelUtils.getColumnIndexForFieldOfClass(acmd, -2);
+ HSSFCell verCell = row.getCell(verCellNum);
+ if (acmd.getVersionMetaData().getVersionStrategy() == VersionStrategy.VERSION_NUMBER)
+ {
+ sm.setTransactionalVersion(nextVersion);
+ if (NucleusLogger.DATASTORE.isDebugEnabled())
+ {
+ NucleusLogger.DATASTORE.debug(LOCALISER.msg("Excel.Insert.ObjectPersistedWithVersion",
+ StringUtils.toJVMIDString(sm.getObject()), sm.getInternalObjectId(),
+ "" + nextVersion));
+ }
+ verCell.setCellValue(((Long)nextVersion).longValue());
+ }
+ else if (acmd.getVersionMetaData().getVersionStrategy() == VersionStrategy.DATE_TIME)
+ {
+ sm.setTransactionalVersion(nextVersion);
+ if (NucleusLogger.DATASTORE.isDebugEnabled())
+ {
+ NucleusLogger.DATASTORE.debug(LOCALISER.msg("Excel.Insert.ObjectPersistedWithVersion",
+ StringUtils.toJVMIDString(sm.getObject()), sm.getInternalObjectId(), "" + nextVersion));
+ }
+ Timestamp ts = (Timestamp)nextVersion;
+ Date date = new Date();
+ date.setTime(ts.getTime());
+ verCell.setCellValue(ts);
+ }
+ }
if (NucleusLogger.DATASTORE_PERSIST.isDebugEnabled())
{
@@ -368,7 +430,7 @@
*/
public void fetchObject(final StateManager sm, int[] fieldNumbers)
{
- AbstractClassMetaData cmd = sm.getClassMetaData();
+ AbstractClassMetaData acmd = sm.getClassMetaData();
if (NucleusLogger.PERSISTENCE.isDebugEnabled())
{
// Debug information about what we are retrieving
@@ -381,7 +443,7 @@
{
str.append(",");
}
- str.append(cmd.getMetaDataForManagedMemberAtAbsolutePosition(fieldNumbers[i]).getName());
+ str.append(acmd.getMetaDataForManagedMemberAtAbsolutePosition(fieldNumbers[i]).getName());
}
str.append("]");
NucleusLogger.PERSISTENCE.debug(str);
@@ -417,22 +479,34 @@
storeMgr.getRuntimeManager().incrementFetchCount();
}
- if (cmd.getVersionMetaData() != null && sm.getTransactionalVersion(sm.getObject()) == null)
+ if (acmd.getVersionMetaData() != null && sm.getTransactionalVersion(sm.getObject()) == null)
{
// Object has no version set so update it from this fetch
- Object datastoreVersion = null;
- if (cmd.getVersionMetaData().getFieldName() == null)
+ long verColNo = -1;
+ if (acmd.getVersionMetaData().getFieldName() == null)
{
// Surrogate version
- /*long verColNo =*/ ExcelUtils.getColumnIndexForFieldOfClass(cmd, -2);
- // TODO Retrieve version from column
+ verColNo = ExcelUtils.getColumnIndexForFieldOfClass(acmd, -2);
}
else
{
// Field-based version
- // TODO Retrieve version from field
+ verColNo = ExcelUtils.getColumnIndexForFieldOfClass(acmd,
+ acmd.getAbsolutePositionOfMember(acmd.getVersionMetaData().getFieldName()));
}
- sm.setVersion(datastoreVersion);
+
+ HSSFRow row = sheet.getRow(rowNumber);
+ HSSFCell cell = row.getCell((int)verColNo);
+ if (acmd.getVersionMetaData().getVersionStrategy() == VersionStrategy.VERSION_NUMBER)
+ {
+ long val = (long)cell.getNumericCellValue();
+ sm.setVersion(new Long(val));
+ }
+ else if (acmd.getVersionMetaData().getVersionStrategy() == VersionStrategy.DATE_TIME)
+ {
+ Date val = cell.getDateCellValue();
+ sm.setVersion(val);
+ }
}
}
finally
@@ -445,8 +519,9 @@
{
ClassLoaderResolver clr = om.getClassLoaderResolver();
String className = storeMgr.getClassNameForObjectID(id, clr, om);
- AbstractClassMetaData cmd = om.getMetaDataManager().getMetaDataForClass(className, clr);
- if (cmd.getIdentityType() == IdentityType.APPLICATION || cmd.getIdentityType() == IdentityType.DATASTORE)
+ AbstractClassMetaData acmd = om.getMetaDataManager().getMetaDataForClass(className, clr);
+ if (acmd.getIdentityType() == IdentityType.APPLICATION ||
+ acmd.getIdentityType() == IdentityType.DATASTORE)
{
// Generate a template object for this identity
Class pcClass = clr.classForName(className,
@@ -464,13 +539,13 @@
/**
* Method to locate if an object exists in the datastore.
- * Goes through the rows in the worksheet and finds a row with the required PK field values.
- * Doesn't currently support datastore-identity.
+ * Goes through the rows in the worksheet and finds a row with the required identity.
*/
public void locateObject(StateManager sm)
{
- final AbstractClassMetaData cmd = sm.getClassMetaData();
- if (cmd.getIdentityType() == IdentityType.APPLICATION || cmd.getIdentityType() == IdentityType.DATASTORE)
+ final AbstractClassMetaData acmd = sm.getClassMetaData();
+ if (acmd.getIdentityType() == IdentityType.APPLICATION ||
+ acmd.getIdentityType() == IdentityType.DATASTORE)
{
ManagedConnection mconn = storeMgr.getConnection(sm.getObjectManager());
try
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|