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() */