Author: tolusha
Date: 2011-05-23 08:42:27 -0400 (Mon, 23 May 2011)
New Revision: 4408
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/TestMultipleListenersNotifying.java
Log:
EXOJCR-480: Managed transactions support
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java 2011-05-23
09:50:30 UTC (rev 4407)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java 2011-05-23
12:42:27 UTC (rev 4408)
@@ -713,19 +713,21 @@
private void doSave(final ItemStateChangesLog changesLog) throws RepositoryException
{
+ ChangesLogWrapper logWrapper = new ChangesLogWrapper(changesLog);
+
if (isTxAware())
{
if (txResourceManager != null && txResourceManager.isGlobalTxActive())
{
- super.save(changesLog);
- registerListener(changesLog);
+ super.save(logWrapper);
+ registerListener(logWrapper);
}
else
{
doBegin();
try
{
- super.save(changesLog);
+ super.save(logWrapper);
}
catch (Exception e)
{
@@ -741,16 +743,16 @@
}
doCommit();
// notify listeners after storage commit
- notifySaveItems(changesLog, false);
+ notifySaveItems(logWrapper.getChangesLog(), false);
}
}
else
{
// save normally
- super.save(changesLog);
+ super.save(logWrapper);
// notify listeners after storage commit
- notifySaveItems(changesLog, false);
+ notifySaveItems(logWrapper.getChangesLog(), false);
}
}
@@ -800,13 +802,13 @@
LOG.error("Rollback error ", e);
}
}
-
+
/**
* This will allow to notify listeners that are not TxAware once the Tx is committed
- * @param changesLog
+ * @param logWrapper
* @throws RepositoryException if any error occurs
*/
- private void registerListener(final ItemStateChangesLog changesLog) throws
RepositoryException
+ private void registerListener(final ChangesLogWrapper logWrapper) throws
RepositoryException
{
try
{
@@ -842,7 +844,7 @@
// The listeners will need to be executed outside the current tx so we
suspend
// the current tx we can face enlistment issues on product like ISPN
transactionManager.suspend();
- notifySaveItems(changesLog, false);
+ notifySaveItems(logWrapper.getChangesLog(), false);
// Since the resume method could cause issue with some TM at this
stage, we don't resume the tx
}
}
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java 2011-05-23
09:50:30 UTC (rev 4407)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java 2011-05-23
12:42:27 UTC (rev 4408)
@@ -99,7 +99,7 @@
protected final List<MandatoryItemsPersistenceListener> mandatoryListeners;
/**
- * Persistent level liesteners filters.
+ * Persistent level listeners filters.
*/
protected final List<ItemsPersistenceListenerFilter> liestenerFilters;
@@ -112,8 +112,60 @@
* The resource manager
*/
private final TransactionableResourceManager txResourceManager;
-
+
/**
+ * Changes log wrapper adds possibility to replace changes log.
+ * Changes log contains transient data on save but listeners should be notifyed
+ * with persisted data only.
+ */
+ protected class ChangesLogWrapper implements ItemStateChangesLog
+ {
+ private ItemStateChangesLog log;
+
+ ChangesLogWrapper(ItemStateChangesLog log)
+ {
+ this.log = log;
+ }
+
+ /**
+ * Replace log with persisted data only.
+ */
+ protected void setLog(ItemStateChangesLog log)
+ {
+ this.log = log;
+ }
+
+ protected ItemStateChangesLog getChangesLog()
+ {
+ return log;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public List<ItemState> getAllStates()
+ {
+ return log.getAllStates();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public int getSize()
+ {
+ return log.getSize();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String dump()
+ {
+ return log.dump();
+ }
+ }
+
+ /**
* WorkspacePersistentDataManager constructor.
*
* @param dataContainer
@@ -152,8 +204,10 @@
/**
* {@inheritDoc}
*/
- public void save(final ItemStateChangesLog changesLog) throws RepositoryException
+ public void save(final ChangesLogWrapper logWrapper) throws RepositoryException
{
+ final ItemStateChangesLog changesLog = logWrapper.getChangesLog();
+
// check if this workspace container is not read-only
if (readOnly && !(changesLog instanceof ReadOnlyThroughChanges))
{
@@ -191,6 +245,9 @@
// we don't support other types now... i.e. add else-if for that type
here
throw new RepositoryException("Unsupported changes log class " +
changesLog.getClass());
}
+ // replace log with persisted data only
+ logWrapper.setLog(persistedLog);
+
notifySaveItems(persistedLog, true);
onCommit(persister, mode);
failed = false;
Modified:
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/TestMultipleListenersNotifying.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/TestMultipleListenersNotifying.java 2011-05-23
09:50:30 UTC (rev 4407)
+++
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/TestMultipleListenersNotifying.java 2011-05-23
12:42:27 UTC (rev 4408)
@@ -22,6 +22,9 @@
import org.exoplatform.services.jcr.dataflow.persistent.ItemsPersistenceListener;
import org.exoplatform.services.jcr.impl.storage.SystemDataContainerHolder;
+import javax.jcr.InvalidItemStateException;
+import javax.jcr.RepositoryException;
+
/**
* Created by The eXo Platform SAS.
*
@@ -39,6 +42,13 @@
{
super(null, new SystemDataContainerHolder(null));
}
+
+ @Override
+ public void save(ItemStateChangesLog changes) throws InvalidItemStateException,
UnsupportedOperationException,
+ RepositoryException
+ {
+ super.save(new ChangesLogWrapper(changes));
+ }
}
class Counter
Show replies by date