diff --git a/config/alfresco/linkvalidation-service-context.xml b/config/alfresco/linkvalidation-service-context.xml
index 0a9170759e..f1fe27a0f0 100644
--- a/config/alfresco/linkvalidation-service-context.xml
+++ b/config/alfresco/linkvalidation-service-context.xml
@@ -220,6 +220,10 @@
class="org.alfresco.linkvalidation.LinkValidationServiceImpl"
lazy-init="true"
init-method="register">
+
+
+
+
diff --git a/source/java/org/alfresco/filesys/avm/AVMContext.java b/source/java/org/alfresco/filesys/avm/AVMContext.java
index fdf3804a9e..81113d3278 100644
--- a/source/java/org/alfresco/filesys/avm/AVMContext.java
+++ b/source/java/org/alfresco/filesys/avm/AVMContext.java
@@ -23,8 +23,6 @@
package org.alfresco.filesys.avm;
-import java.util.Map;
-
import org.alfresco.filesys.alfresco.AlfrescoContext;
import org.alfresco.filesys.alfresco.IOControlHandler;
import org.alfresco.filesys.state.FileState;
@@ -37,9 +35,6 @@ import org.alfresco.repo.avm.CreateStoreCallback;
import org.alfresco.repo.avm.CreateVersionCallback;
import org.alfresco.repo.avm.PurgeStoreCallback;
import org.alfresco.repo.avm.PurgeVersionCallback;
-import org.alfresco.repo.domain.PropertyValue;
-import org.alfresco.sandbox.SandboxConstants;
-import org.alfresco.service.namespace.QName;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -58,7 +53,7 @@ public class AVMContext extends AlfrescoContext
private static final Log logger = LogFactory.getLog(AVMContext.class);
// Constants
- //
+ //
// Version id that indicates the head version
public static final int VERSION_HEAD = -1;
@@ -246,6 +241,7 @@ public class AVMContext extends AlfrescoContext
return showStore;
}
+
/**
* Close the filesystem context
*/
diff --git a/source/java/org/alfresco/filesys/avm/AVMDiskDriver.java b/source/java/org/alfresco/filesys/avm/AVMDiskDriver.java
index 5c821a7694..11a129abdd 100644
--- a/source/java/org/alfresco/filesys/avm/AVMDiskDriver.java
+++ b/source/java/org/alfresco/filesys/avm/AVMDiskDriver.java
@@ -868,6 +868,14 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface
{
throw new FileNotFoundException(params.getPath());
}
+ catch (AVMLockingException ex)
+ {
+ throw new AccessDeniedException(params.getPath());
+ }
+ catch ( org.alfresco.repo.security.permissions.AccessDeniedException ex)
+ {
+ throw new AccessDeniedException(params.getPath());
+ }
}
/**
@@ -967,6 +975,10 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface
{
throw new AccessDeniedException(params.getPath());
}
+ catch ( org.alfresco.repo.security.permissions.AccessDeniedException ex)
+ {
+ throw new AccessDeniedException(params.getPath());
+ }
// Return the file
@@ -1039,6 +1051,10 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface
{
throw new IOException("Invalid path, " + dir);
}
+ catch ( org.alfresco.repo.security.permissions.AccessDeniedException ex)
+ {
+ throw new AccessDeniedException("Access denied, " + dir);
+ }
}
/**
@@ -1105,6 +1121,10 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface
{
throw new AccessDeniedException("File locked, " + name);
}
+ catch ( org.alfresco.repo.security.permissions.AccessDeniedException ex)
+ {
+ throw new AccessDeniedException("Access denied, " + name);
+ }
}
/**
@@ -1493,6 +1513,10 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface
{
throw new FileNotFoundException(params.getPath());
}
+ catch ( org.alfresco.repo.security.permissions.AccessDeniedException ex)
+ {
+ throw new FileNotFoundException(params.getPath());
+ }
// Return the file
@@ -1615,6 +1639,10 @@ public class AVMDiskDriver extends AlfrescoDiskDriver implements DiskInterface
{
throw new FileExistsException("Destination exists, " + newName);
}
+ catch ( org.alfresco.repo.security.permissions.AccessDeniedException ex)
+ {
+ throw new AccessDeniedException("Access denied, " + oldName);
+ }
}
/**
diff --git a/source/java/org/alfresco/linkvalidation/LinkValidationService.java b/source/java/org/alfresco/linkvalidation/LinkValidationService.java
index 6ce9ca34a5..b503542b45 100644
--- a/source/java/org/alfresco/linkvalidation/LinkValidationService.java
+++ b/source/java/org/alfresco/linkvalidation/LinkValidationService.java
@@ -27,12 +27,11 @@
package org.alfresco.linkvalidation;
+import java.net.SocketException;
import java.util.List;
-
+import javax.net.ssl.SSLException;
import org.alfresco.service.cmr.avm.AVMNotFoundException;
import org.alfresco.util.NameMatcher;
-import java.net.SocketException;
-import javax.net.ssl.SSLException;
public interface LinkValidationService
{
diff --git a/source/java/org/alfresco/repo/avm/AVMServiceTest.java b/source/java/org/alfresco/repo/avm/AVMServiceTest.java
index 43400c9fdd..35241bf502 100644
--- a/source/java/org/alfresco/repo/avm/AVMServiceTest.java
+++ b/source/java/org/alfresco/repo/avm/AVMServiceTest.java
@@ -535,7 +535,7 @@ public class AVMServiceTest extends AVMServiceTestBase
{
try
{
- // layers are not ye indexed
+ // layers are not yet indexed
setupBasicTree();
fService.createStore("layer");
fService.createDirectory("layer:/", "root");
diff --git a/source/java/org/alfresco/repo/avm/AVMStoreImpl.java b/source/java/org/alfresco/repo/avm/AVMStoreImpl.java
index 9610231256..560c6685fa 100644
--- a/source/java/org/alfresco/repo/avm/AVMStoreImpl.java
+++ b/source/java/org/alfresco/repo/avm/AVMStoreImpl.java
@@ -258,71 +258,81 @@ public class AVMStoreImpl implements AVMStore, Serializable
*/
}
// Clear out the new nodes.
- List allLayeredNodeIDs = AVMDAOs.Instance().fAVMNodeDAO.getNewLayeredInStoreIDs(me);
- AVMDAOs.Instance().fAVMNodeDAO.clearNewInStore(me);
- AVMDAOs.Instance().fAVMNodeDAO.clear();
- List layeredNodeIDs = new ArrayList();
- for (Long layeredID : allLayeredNodeIDs)
+ try
{
- Layered layered = (Layered)AVMDAOs.Instance().fAVMNodeDAO.getByID(layeredID);
- String indirection = layered.getIndirection();
- if (indirection == null)
+ // attempt to clear only AVMNodes from cache, to allow direct batch update of them
+ AVMDAOs.Instance().fAVMNodeDAO.flush();
+ AVMDAOs.Instance().fAVMNodeDAO.noCache();
+ AVMDAOs.Instance().fAVMNodeDAO.clearNewInStore(me);
+
+ List allLayeredNodeIDs = AVMDAOs.Instance().fAVMNodeDAO.getNewLayeredInStoreIDs(me);
+ List layeredNodeIDs = new ArrayList();
+ for (Long layeredID : allLayeredNodeIDs)
{
- continue;
- }
- layeredNodeIDs.add(layeredID);
- String storeName = indirection.substring(0, indirection.indexOf(':'));
- if (!snapShotMap.containsKey(storeName))
- {
- AVMStore store = AVMDAOs.Instance().fAVMStoreDAO.getByName(storeName);
- if (store == null)
+ Layered layered = (Layered)AVMDAOs.Instance().fAVMNodeDAO.getByID(layeredID);
+ String indirection = layered.getIndirection();
+ if (indirection == null)
{
- layered.setIndirectionVersion(-1);
+ continue;
+ }
+ layeredNodeIDs.add(layeredID);
+ String storeName = indirection.substring(0, indirection.indexOf(':'));
+ if (!snapShotMap.containsKey(storeName))
+ {
+ AVMStore store = AVMDAOs.Instance().fAVMStoreDAO.getByName(storeName);
+ if (store == null)
+ {
+ layered.setIndirectionVersion(-1);
+ }
+ else
+ {
+ store.createSnapshot(null, null, snapShotMap);
+ layered = (Layered)AVMDAOs.Instance().fAVMNodeDAO.getByID(layeredID);
+ layered.setIndirectionVersion(snapShotMap.get(storeName));
+ }
}
else
{
- store.createSnapshot(null, null, snapShotMap);
- layered = (Layered)AVMDAOs.Instance().fAVMNodeDAO.getByID(layeredID);
layered.setIndirectionVersion(snapShotMap.get(storeName));
}
}
- else
+ AVMDAOs.Instance().fAVMNodeDAO.flush();
+ // Make up a new version record.
+ String user = RawServices.Instance().getAuthenticationComponent().getCurrentUserName();
+ if (user == null)
{
- layered.setIndirectionVersion(snapShotMap.get(storeName));
+ user = RawServices.Instance().getAuthenticationComponent().getSystemUserName();
+ }
+ me = (AVMStoreImpl)AVMDAOs.Instance().fAVMStoreDAO.getByID(fID);
+ VersionRoot versionRoot = new VersionRootImpl(me,
+ me.fRoot,
+ me.fNextVersionID++,
+ System.currentTimeMillis(),
+ user,
+ tag,
+ description);
+ // Another embarassing flush needed.
+ AVMDAOs.Instance().fAVMNodeDAO.flush();
+ AVMDAOs.Instance().fVersionRootDAO.save(versionRoot);
+ for (Long nodeID : layeredNodeIDs)
+ {
+ AVMNode node = AVMDAOs.Instance().fAVMNodeDAO.getByID(nodeID);
+ List paths = fAVMRepository.getVersionPaths(versionRoot, node);
+ for (String path : paths)
+ {
+ VersionLayeredNodeEntry entry =
+ new VersionLayeredNodeEntryImpl(versionRoot, path);
+ AVMDAOs.Instance().fVersionLayeredNodeEntryDAO.save(entry);
+ }
}
}
- AVMDAOs.Instance().fAVMNodeDAO.flush();
- // Make up a new version record.
- String user = RawServices.Instance().getAuthenticationComponent().getCurrentUserName();
- if (user == null)
+ finally
{
- user = RawServices.Instance().getAuthenticationComponent().getSystemUserName();
- }
- me = (AVMStoreImpl)AVMDAOs.Instance().fAVMStoreDAO.getByID(fID);
- VersionRoot versionRoot = new VersionRootImpl(me,
- me.fRoot,
- me.fNextVersionID++,
- System.currentTimeMillis(),
- user,
- tag,
- description);
- // Another embarassing flush needed.
- AVMDAOs.Instance().fAVMNodeDAO.flush();
- AVMDAOs.Instance().fVersionRootDAO.save(versionRoot);
- for (Long nodeID : layeredNodeIDs)
- {
- AVMNode node = AVMDAOs.Instance().fAVMNodeDAO.getByID(nodeID);
- List paths = fAVMRepository.getVersionPaths(versionRoot, node);
- for (String path : paths)
- {
- VersionLayeredNodeEntry entry =
- new VersionLayeredNodeEntryImpl(versionRoot, path);
- AVMDAOs.Instance().fVersionLayeredNodeEntryDAO.save(entry);
- }
+ AVMDAOs.Instance().fAVMNodeDAO.yesCache();
}
return snapShotMap;
+
}
-
/**
* Create a new directory.
* @param path The path to the containing directory.
diff --git a/source/java/org/alfresco/repo/domain/hibernate/SessionSizeResourceManager.java b/source/java/org/alfresco/repo/domain/hibernate/SessionSizeResourceManager.java
index 4b619b7799..9428a155dc 100644
--- a/source/java/org/alfresco/repo/domain/hibernate/SessionSizeResourceManager.java
+++ b/source/java/org/alfresco/repo/domain/hibernate/SessionSizeResourceManager.java
@@ -24,8 +24,11 @@
*/
package org.alfresco.repo.domain.hibernate;
+import java.io.Serializable;
import java.lang.reflect.Method;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
import org.alfresco.repo.avm.hibernate.SessionCacheChecker;
import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
@@ -33,6 +36,8 @@ import org.alfresco.util.resource.MethodResourceManager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Session;
+import org.hibernate.engine.CollectionKey;
+import org.hibernate.engine.EntityKey;
import org.hibernate.stat.SessionStatistics;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
@@ -133,7 +138,8 @@ public class SessionSizeResourceManager extends HibernateDaoSupport implements M
if ((entityCount + collectionCount) > threshold)
{
session.flush();
- session.clear();
+ selectivelyClear(session, stats);
+ // session.clear();
if (logger.isDebugEnabled())
{
String msg = String.format(
@@ -144,4 +150,28 @@ public class SessionSizeResourceManager extends HibernateDaoSupport implements M
}
}
}
+
+ @SuppressWarnings("unchecked")
+ private void selectivelyClear(Session session, SessionStatistics stats)
+ {
+ if (logger.isDebugEnabled())
+ {
+ logger.error(stats);
+ }
+ Set keys = new HashSet((Set)stats.getEntityKeys());
+ for (EntityKey key : keys)
+ {
+ // This should probably be configurable but frankly the nauseous extrusion of Gavin King's
+ // programmatic alimentary tract (hibernate) will go away before this could make a difference.
+ if (!key.getEntityName().startsWith("org.alfresco"))
+ {
+ continue;
+ }
+ Object val = session.get(key.getEntityName(), key.getIdentifier());
+ if (val != null)
+ {
+ session.evict(val);
+ }
+ }
+ }
}
diff --git a/source/java/org/alfresco/repo/transaction/RetryingTransactionHelper.java b/source/java/org/alfresco/repo/transaction/RetryingTransactionHelper.java
index 6de802d775..4f5e15efb2 100644
--- a/source/java/org/alfresco/repo/transaction/RetryingTransactionHelper.java
+++ b/source/java/org/alfresco/repo/transaction/RetryingTransactionHelper.java
@@ -254,9 +254,11 @@ public class RetryingTransactionHelper
{
if (count != 0)
{
- logger.debug(
- "Transaction succeeded after " + count +
- " retries on thread " + Thread.currentThread().getName());
+ logger.debug("\n" +
+ "Transaction succeeded: \n" +
+ " Thread: " + Thread.currentThread().getName() + "\n" +
+ " Txn: " + txn + "\n" +
+ " Iteration: " + count);
}
}
return result;
@@ -277,6 +279,16 @@ public class RetryingTransactionHelper
e);
}
}
+ if (logger.isDebugEnabled())
+ {
+ logger.debug("\n" +
+ "Transaction commit failed: \n" +
+ " Thread: " + Thread.currentThread().getName() + "\n" +
+ " Txn: " + txn + "\n" +
+ " Iteration: " + count + "\n" +
+ " Exception follows:",
+ e);
+ }
// Rollback if we can.
if (txn != null)
{
diff --git a/source/java/org/alfresco/repo/workflow/jbpm/JBPMTransactionTemplate.java b/source/java/org/alfresco/repo/workflow/jbpm/JBPMTransactionTemplate.java
index e3ac7a5546..2a50908baa 100644
--- a/source/java/org/alfresco/repo/workflow/jbpm/JBPMTransactionTemplate.java
+++ b/source/java/org/alfresco/repo/workflow/jbpm/JBPMTransactionTemplate.java
@@ -24,6 +24,7 @@
*/
package org.alfresco.repo.workflow.jbpm;
+import org.alfresco.repo.domain.hibernate.SessionSizeResourceManager;
import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
import org.alfresco.repo.transaction.TransactionListener;
import org.alfresco.util.GUID;
@@ -115,6 +116,7 @@ public class JBPMTransactionTemplate extends JbpmTemplate
if (context == null)
{
context = super.getContext();
+ SessionSizeResourceManager.setDisableInTransaction();
AlfrescoTransactionSupport.bindResource(JBPM_CONTEXT_KEY, context);
AlfrescoTransactionSupport.bindListener(this);
@@ -155,24 +157,6 @@ public class JBPMTransactionTemplate extends JbpmTemplate
* @see org.alfresco.repo.transaction.TransactionListener#beforeCommit(boolean)
*/
public void beforeCommit(boolean readOnly)
- {
- }
-
-
- /* (non-Javadoc)
- * @see org.alfresco.repo.transaction.TransactionListener#beforeCompletion()
- */
- public void beforeCompletion()
- {
- // TODO Auto-generated method stub
-
- }
-
-
- /* (non-Javadoc)
- * @see org.alfresco.repo.transaction.TransactionListener#afterCommit()
- */
- public void afterCommit()
{
JbpmContext context = (JbpmContext)AlfrescoTransactionSupport.getResource(JBPM_CONTEXT_KEY);
if (context != null)
@@ -185,6 +169,22 @@ public class JBPMTransactionTemplate extends JbpmTemplate
}
+ /* (non-Javadoc)
+ * @see org.alfresco.repo.transaction.TransactionListener#beforeCompletion()
+ */
+ public void beforeCompletion()
+ {
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.alfresco.repo.transaction.TransactionListener#afterCommit()
+ */
+ public void afterCommit()
+ {
+ }
+
+
/* (non-Javadoc)
* @see org.alfresco.repo.transaction.TransactionListener#afterRollback()
*/