diff --git a/config/alfresco/bootstrap-context.xml b/config/alfresco/bootstrap-context.xml
index ece34a4f5c..69668b63c4 100644
--- a/config/alfresco/bootstrap-context.xml
+++ b/config/alfresco/bootstrap-context.xml
@@ -409,6 +409,15 @@
+
+
+
+
+
+ false
+
+
+
diff --git a/config/alfresco/content-services-context.xml b/config/alfresco/content-services-context.xml
index 8a6d7c982d..127cda5071 100644
--- a/config/alfresco/content-services-context.xml
+++ b/config/alfresco/content-services-context.xml
@@ -121,14 +121,6 @@
-
-
-
-
-
- false
-
-
diff --git a/config/alfresco/public-services-context.xml b/config/alfresco/public-services-context.xml
index 2a9a35f464..0fc7ce3680 100644
--- a/config/alfresco/public-services-context.xml
+++ b/config/alfresco/public-services-context.xml
@@ -1365,9 +1365,6 @@
-
-
-
-
+
diff --git a/source/java/org/alfresco/filesys/smb/server/SMBSrvPacket.java b/source/java/org/alfresco/filesys/smb/server/SMBSrvPacket.java
index e491d0b97d..adc28501e3 100644
--- a/source/java/org/alfresco/filesys/smb/server/SMBSrvPacket.java
+++ b/source/java/org/alfresco/filesys/smb/server/SMBSrvPacket.java
@@ -266,6 +266,25 @@ public class SMBSrvPacket
return false;
}
+ /**
+ * Check if the SMB packet has an SMB2 signature.
+ *
+ * @return boolean True if the packet has an SMB2 signature, else false.
+ */
+ public final boolean isSMB2()
+ {
+
+ // Check for the SMB2 signature block
+
+ if (m_smbbuf[SIGNATURE] == (byte) 0xFE && m_smbbuf[SIGNATURE + 1] == 'S' && m_smbbuf[SIGNATURE + 2] == 'M'
+ && m_smbbuf[SIGNATURE + 3] == 'B')
+ return true;
+
+ // Not an SMB2 packet
+
+ return false;
+ }
+
/**
* Clear the data byte count
*/
diff --git a/source/java/org/alfresco/filesys/smb/server/SMBSrvSession.java b/source/java/org/alfresco/filesys/smb/server/SMBSrvSession.java
index 60428451aa..53aa5a6cbd 100644
--- a/source/java/org/alfresco/filesys/smb/server/SMBSrvSession.java
+++ b/source/java/org/alfresco/filesys/smb/server/SMBSrvSession.java
@@ -1321,6 +1321,35 @@ public class SMBSrvSession extends SrvSession implements Runnable
continue;
}
+ // Check the packet signature if we are in an SMB state
+
+ if ( m_state > SMBSrvSessionState.NBSESSREQ)
+ {
+ // Check for an SMB2 packet signature
+
+ if ( m_smbPkt.isSMB2())
+ {
+ // Debug
+
+ if ( logger.isDebugEnabled() && hasDebug(DBG_PKTTYPE))
+ logger.debug("SMB2 request received, ignoring");
+
+ continue;
+ }
+
+ // Check the packet signature
+
+ if ( m_smbPkt.checkPacketSignature() == false)
+ {
+ // Debug
+
+ if ( logger.isDebugEnabled() && hasDebug(DBG_PKTTYPE))
+ logger.debug("Invalid SMB packet signature received, packet ignored");
+
+ continue;
+ }
+ }
+
// Store the received data length
m_smbPkt.setReceivedLength(m_rxlen);
diff --git a/source/java/org/alfresco/repo/avm/AVMRepository.java b/source/java/org/alfresco/repo/avm/AVMRepository.java
index 7be35373f7..5e89be0eab 100644
--- a/source/java/org/alfresco/repo/avm/AVMRepository.java
+++ b/source/java/org/alfresco/repo/avm/AVMRepository.java
@@ -1616,7 +1616,7 @@ public class AVMRepository
{
throw new AVMNotFoundException("Store not found.");
}
- Lookup lookup = store.lookup(version, pathParts[1], false, false);
+ Lookup lookup = store.lookup(version, pathParts[1], false, true);
if (lookup == null)
{
throw new AVMNotFoundException("Path not found.");
diff --git a/source/java/org/alfresco/repo/avm/AVMServiceTest.java b/source/java/org/alfresco/repo/avm/AVMServiceTest.java
index 2e37892c83..be342a431a 100644
--- a/source/java/org/alfresco/repo/avm/AVMServiceTest.java
+++ b/source/java/org/alfresco/repo/avm/AVMServiceTest.java
@@ -101,6 +101,34 @@ import org.alfresco.util.Pair;
*/
public class AVMServiceTest extends AVMServiceTestBase
{
+ public void testHeadPathsInLayers()
+ {
+ try
+ {
+ setupBasicTree();
+ fService.createStore("user");
+ fService.createLayeredDirectory("main:/a", "user:/", "a");
+ fService.createStore("sandbox");
+ fService.createLayeredDirectory("main:/a", "sandbox:/", "a");
+ fService.createDirectory("user:/a/b", "newdir");
+ fService.createFile("user:/a/b/newdir", "bibble.txt").close();
+ List diffs = fSyncService.compare(-1, "user:/a", -1, "sandbox:/a", null);
+ System.out.println(diffs);
+ fSyncService.update(diffs, null, false, false, false, false, null, null);
+ AVMNodeDescriptor dir = fService.lookup(-1, "user:/a/b/newdir");
+ List> paths = fService.getHeadPaths(dir);
+ System.out.println(paths);
+ AVMNodeDescriptor file = fService.lookup(-1, "user:/a/b/newdir/bibble.txt");
+ paths = fService.getHeadPaths(file);
+ System.out.println(paths);
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
/**
* Minimal testing of Locking Aware service.
*/
diff --git a/source/java/org/alfresco/repo/avm/wf/AVMSubmitPackageHandler.java b/source/java/org/alfresco/repo/avm/wf/AVMSubmitPackageHandler.java
index 184c0f5ab1..e5a52366ff 100644
--- a/source/java/org/alfresco/repo/avm/wf/AVMSubmitPackageHandler.java
+++ b/source/java/org/alfresco/repo/avm/wf/AVMSubmitPackageHandler.java
@@ -154,17 +154,28 @@ public class AVMSubmitPackageHandler
private void recursivelyRemoveLocks(final String webProject, final int version, final String path)
{
LOGGER.debug("removing lock on " + path);
- final AVMNodeDescriptor desc = fAVMService.lookup(version, path, true);
+ AVMNodeDescriptor desc = fAVMService.lookup(version, path, true);
if (desc.isFile() || desc.isDeletedFile())
{
fAVMLockingService.removeLock(webProject, path.substring(path.indexOf(":") + 1));
}
- else
+ else
{
- for (final AVMNodeDescriptor child : fAVMService.getDirectoryListingArray(version, path, true))
- {
- this.recursivelyRemoveLocks(webProject, version, child.getPath());
- }
+ if (desc.isDeletedDirectory())
+ {
+ // lookup the previous child and get its contents
+ final List history = fAVMService.getHistory(desc, 2);
+ if (history.size() == 1)
+ {
+ return;
+ }
+ desc = history.get(1);
+ }
+
+ for (final AVMNodeDescriptor child : fAVMService.getDirectoryListingArray(desc.getVersionID(), desc.getPath(), true))
+ {
+ this.recursivelyRemoveLocks(webProject, child.getVersionID(), child.getPath());
+ }
}
}
}
diff --git a/source/java/org/alfresco/repo/node/index/AVMFullIndexRecoveryComponent.java b/source/java/org/alfresco/repo/node/index/AVMFullIndexRecoveryComponent.java
index c47b872852..e0e10b65c4 100644
--- a/source/java/org/alfresco/repo/node/index/AVMFullIndexRecoveryComponent.java
+++ b/source/java/org/alfresco/repo/node/index/AVMFullIndexRecoveryComponent.java
@@ -210,7 +210,7 @@ public class AVMFullIndexRecoveryComponent extends AbstractReindexComponent
return null;
}
};
- transactionService.getRetryingTransactionHelper().doInTransaction(reindexWork, true);
+ transactionService.getRetryingTransactionHelper().doInTransaction(reindexWork, true, true);
// done
}
diff --git a/source/java/org/alfresco/repo/node/index/FullIndexRecoveryComponent.java b/source/java/org/alfresco/repo/node/index/FullIndexRecoveryComponent.java
index f4b725127d..da09492a73 100644
--- a/source/java/org/alfresco/repo/node/index/FullIndexRecoveryComponent.java
+++ b/source/java/org/alfresco/repo/node/index/FullIndexRecoveryComponent.java
@@ -277,7 +277,7 @@ public class FullIndexRecoveryComponent extends AbstractReindexComponent
return null;
}
};
- transactionService.getRetryingTransactionHelper().doInTransaction(reindexWork, true);
+ transactionService.getRetryingTransactionHelper().doInTransaction(reindexWork, true, true);
// done
}
}
\ No newline at end of file
diff --git a/source/java/org/alfresco/repo/transaction/RetryingTransactionHelper.java b/source/java/org/alfresco/repo/transaction/RetryingTransactionHelper.java
index 5797358c30..62a0f3fedd 100644
--- a/source/java/org/alfresco/repo/transaction/RetryingTransactionHelper.java
+++ b/source/java/org/alfresco/repo/transaction/RetryingTransactionHelper.java
@@ -27,6 +27,7 @@ package org.alfresco.repo.transaction;
import java.sql.BatchUpdateException;
import java.util.Random;
+import javax.transaction.RollbackException;
import javax.transaction.Status;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;
@@ -297,8 +298,16 @@ public class RetryingTransactionHelper
throw new AlfrescoRuntimeException("Failure during rollback: " + cb, e1);
}
}
- lastException = (e instanceof RuntimeException) ?
- (RuntimeException)e : new AlfrescoRuntimeException("Unknown Exception in Transaction.", e);
+ if (e instanceof RollbackException)
+ {
+ lastException = (e.getCause() instanceof RuntimeException) ?
+ (RuntimeException)e.getCause() : new AlfrescoRuntimeException("Exception in Transaction.", e.getCause());
+ }
+ else
+ {
+ lastException = (e instanceof RuntimeException) ?
+ (RuntimeException)e : new AlfrescoRuntimeException("Exception in Transaction.", e);
+ }
// Check if there is a cause for retrying
Throwable retryCause = extractRetryCause(e);
if (retryCause != null)
diff --git a/source/java/org/alfresco/util/OpenOfficeConnectionTester.java b/source/java/org/alfresco/util/OpenOfficeConnectionTester.java
index c20b2d4bba..65a57b15e3 100644
--- a/source/java/org/alfresco/util/OpenOfficeConnectionTester.java
+++ b/source/java/org/alfresco/util/OpenOfficeConnectionTester.java
@@ -32,15 +32,15 @@ import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.i18n.I18NUtil;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.springframework.context.ApplicationEvent;
/**
- * Simple class that checks for the presence of a valid OpenOffice
- * connection, as provided by the
+ * A bootstrap class that checks for the presence of a valid OpenOffice connection, as provided by the
* net.sf.jooreports.openoffice.connection.OpenOfficeConnection
implementations.
*
* @author Derek Hulley
*/
-public class OpenOfficeConnectionTester
+public class OpenOfficeConnectionTester extends AbstractLifecycleBean
{
private static final String INFO_CONNECTION_VERIFIED = "system.openoffice.info.connection_verified";
private static final String ERR_CONNECTION_FAILED = "system.openoffice.err.connection_failed";
@@ -73,12 +73,29 @@ public class OpenOfficeConnectionTester
this.strict = strict;
}
+ /**
+ * @see #checkConnection()
+ */
+ @Override
+ protected void onBootstrap(ApplicationEvent event)
+ {
+ checkConnection();
+ }
+
+ /**
+ * Does nothing.
+ */
+ @Override
+ protected void onShutdown(ApplicationEvent event)
+ {
+ }
+
/**
* Perform the actual connection check. If this component is {@link #setStrict(boolean) strict},
* then a disconnected {@link #setConnection(OpenOfficeConnection) connection} will result in a
* runtime exception being generated.
*/
- public synchronized void checkConnection()
+ private synchronized void checkConnection()
{
PropertyCheck.mandatory(this, "connection", connection);
String connectedMessage = I18NUtil.getMessage(INFO_CONNECTION_VERIFIED);