entries)
{
if (entries == null)
{
diff --git a/source/java/org/alfresco/repo/domain/hibernate/Store.hbm.xml b/source/java/org/alfresco/repo/domain/hibernate/Store.hbm.xml
index 07da354377..6691a9937a 100644
--- a/source/java/org/alfresco/repo/domain/hibernate/Store.hbm.xml
+++ b/source/java/org/alfresco/repo/domain/hibernate/Store.hbm.xml
@@ -23,9 +23,9 @@
+ fetch="select" >
diff --git a/source/java/org/alfresco/repo/domain/hibernate/StoreImpl.java b/source/java/org/alfresco/repo/domain/hibernate/StoreImpl.java
index 1a700a588e..c469858bd4 100644
--- a/source/java/org/alfresco/repo/domain/hibernate/StoreImpl.java
+++ b/source/java/org/alfresco/repo/domain/hibernate/StoreImpl.java
@@ -123,7 +123,7 @@ public class StoreImpl implements Store
return key;
}
- public synchronized void setKey(StoreKey key)
+ public void setKey(StoreKey key)
{
refWriteLock.lock();
try
diff --git a/source/java/org/alfresco/repo/importer/FileImporterTest.java b/source/java/org/alfresco/repo/importer/FileImporterTest.java
index 746e8a0ee4..30fa98a608 100644
--- a/source/java/org/alfresco/repo/importer/FileImporterTest.java
+++ b/source/java/org/alfresco/repo/importer/FileImporterTest.java
@@ -49,7 +49,6 @@ import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.transaction.TransactionService;
import org.alfresco.util.ApplicationContextHelper;
-import org.alfresco.util.TempFileProvider;
import org.alfresco.util.TestWithUserUtils;
import org.springframework.context.ApplicationContext;
@@ -196,10 +195,6 @@ public class FileImporterTest extends TestCase
String userPwd = args.length > 6 ? args[6] : "";
while (count < target)
{
- File directory = TempFileProvider.getTempDir();
- File[] files = directory.listFiles();
- System.out.println("Start temp file count = " + files.length);
-
count++;
FileImporterTest test = new FileImporterTest();
test.setUp();
@@ -268,15 +263,9 @@ public class FileImporterTest extends TestCase
System.out.println("Committed in: " + ((end - start) / 1000000.0) + "ms");
double total = ((first+second)/1000000.0);
System.out.println("Grand Total: "+ grandTotal);
- System.out.println("Count: "+ count + "ms");
System.out.println("Imported: " + importCount + " files or directories");
System.out.println("Average: " + (importCount / (total / 1000.0)) + " files per second");
- directory = TempFileProvider.getTempDir();
- files = directory.listFiles();
- System.out.println("End temp file count = " + files.length);
-
-
tx = transactionService.getUserTransaction();
tx.begin();
SearchParameters sp = new SearchParameters();
diff --git a/source/java/org/alfresco/repo/node/archive/ArchiveAndRestoreTest.java b/source/java/org/alfresco/repo/node/archive/ArchiveAndRestoreTest.java
index 9ba9c0640d..f74b8bfabe 100644
--- a/source/java/org/alfresco/repo/node/archive/ArchiveAndRestoreTest.java
+++ b/source/java/org/alfresco/repo/node/archive/ArchiveAndRestoreTest.java
@@ -165,11 +165,11 @@ public class ArchiveAndRestoreTest extends TestCase
* Create the following:
*
* root
- * / | \
- * / | \
- * / | \
- * / | \
- * A <-> B X
+ * / |
+ * / |
+ * / |
+ * / |
+ * A <-> B
* |\ /|
* | \ / |
* | \/ |
@@ -500,6 +500,17 @@ public class ArchiveAndRestoreTest extends TestCase
txn.begin();
}
+ public void testRestoreToMissingParent() throws Exception
+ {
+ nodeService.deleteNode(a);
+ nodeService.deleteNode(b);
+ commitAndBeginNewTransaction();
+
+ // attempt to restore b_ to a
+ RestoreNodeReport report = nodeArchiveService.restoreArchivedNode(b_, a, null, null);
+ assertEquals("Incorrect report status", RestoreStatus.FAILURE_INVALID_PARENT, report.getStatus());
+ }
+
public void testMassRestore() throws Exception
{
nodeService.deleteNode(a);
diff --git a/source/java/org/alfresco/repo/node/archive/NodeArchiveServiceImpl.java b/source/java/org/alfresco/repo/node/archive/NodeArchiveServiceImpl.java
index 40a3334b07..0fc0f48441 100644
--- a/source/java/org/alfresco/repo/node/archive/NodeArchiveServiceImpl.java
+++ b/source/java/org/alfresco/repo/node/archive/NodeArchiveServiceImpl.java
@@ -21,8 +21,10 @@ import java.util.List;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.node.archive.RestoreNodeReport.RestoreStatus;
+import org.alfresco.repo.security.permissions.AccessDeniedException;
import org.alfresco.repo.transaction.TransactionUtil;
import org.alfresco.repo.transaction.TransactionUtil.TransactionWork;
+import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.InvalidNodeRefException;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
@@ -133,13 +135,34 @@ public class NodeArchiveServiceImpl implements NodeArchiveService
{
report.setStatus(RestoreStatus.FAILURE_INVALID_PARENT);
}
+ else if (destinationNodeRef == null)
+ {
+ // get the original parent of the archived node
+ ChildAssociationRef originalParentAssocRef = (ChildAssociationRef) nodeService.getProperty(
+ archivedNodeRef,
+ ContentModel.PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC);
+ NodeRef originalParentNodeRef = originalParentAssocRef.getParentRef();
+ if (EqualsHelper.nullSafeEquals(originalParentNodeRef, invalidNodeRef))
+ {
+ report.setStatus(RestoreStatus.FAILURE_INVALID_PARENT);
+ }
+ else
+ {
+ // some other invalid node was detected
+ report.setStatus(RestoreStatus.FAILURE_OTHER);
+ }
+ }
else
{
// some other invalid node was detected
report.setStatus(RestoreStatus.FAILURE_OTHER);
}
}
- // TODO: Catch permission exceptions
+ catch (AccessDeniedException e)
+ {
+ report.setCause(e);
+ report.setStatus(RestoreStatus.FAILURE_PERMISSION);
+ }
catch (Throwable e)
{
report.setCause(e);
diff --git a/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java b/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java
index 998f60ab8c..53dbdefca2 100644
--- a/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java
+++ b/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java
@@ -409,19 +409,24 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
// get the old parent
Node oldParentNode = oldAssoc.getParent();
- // Invoke policy behaviour
- invokeBeforeDeleteChildAssociation(oldAssocRef);
- invokeBeforeCreateChildAssociation(newParentRef, nodeToMoveRef, assocTypeQName, assocQName);
- invokeBeforeUpdateNode(oldParentNode.getNodeRef()); // old parent will be updated
- invokeBeforeUpdateNode(newParentRef); // new parent ditto
+ boolean movingStore = !nodeToMoveRef.getStoreRef().equals(newParentRef.getStoreRef());
- // If the node is moving stores, then drag the node hierarchy with it
- if (!nodeToMoveRef.getStoreRef().equals(newParentRef.getStoreRef()))
+ // data needed for policy invocation
+ QName nodeToMoveTypeQName = nodeToMove.getTypeQName();
+ Set nodeToMoveAspects = nodeToMove.getAspects();
+
+ // Invoke policy behaviour
+ if (movingStore)
{
- Store newStore = newParentNode.getStore();
- moveNodeToStore(nodeToMove, newStore);
- // the node reference will have changed too
- nodeToMoveRef = nodeToMove.getNodeRef();
+ invokeBeforeDeleteNode(nodeToMoveRef);
+ invokeBeforeCreateNode(newParentRef, assocTypeQName, assocQName, nodeToMoveTypeQName);
+ }
+ else
+ {
+ invokeBeforeDeleteChildAssociation(oldAssocRef);
+ invokeBeforeCreateChildAssociation(newParentRef, nodeToMoveRef, assocTypeQName, assocQName);
+ invokeBeforeUpdateNode(oldParentNode.getNodeRef()); // old parent will be updated
+ invokeBeforeUpdateNode(newParentRef); // new parent ditto
}
// remove the child assoc from the old parent
@@ -430,14 +435,32 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
// create a new assoc
ChildAssoc newAssoc = nodeDaoService.newChildAssoc(newParentNode, nodeToMove, true, assocTypeQName, assocQName);
+ // If the node is moving stores, then drag the node hierarchy with it
+ if (movingStore)
+ {
+ // do the move
+ Store newStore = newParentNode.getStore();
+ moveNodeToStore(nodeToMove, newStore);
+ // the node reference will have changed too
+ nodeToMoveRef = nodeToMove.getNodeRef();
+ }
+
// check that no cyclic relationships have been created
getPaths(nodeToMoveRef, false);
-
+
// invoke policy behaviour
- invokeOnCreateChildAssociation(newAssoc.getChildAssocRef());
- invokeOnDeleteChildAssociation(oldAssoc.getChildAssocRef());
- invokeOnUpdateNode(oldParentNode.getNodeRef());
- invokeOnUpdateNode(newParentRef);
+ if (movingStore)
+ {
+ invokeOnDeleteNode(oldAssocRef, nodeToMoveTypeQName, nodeToMoveAspects);
+ invokeOnCreateNode(newAssoc.getChildAssocRef());
+ }
+ else
+ {
+ invokeOnCreateChildAssociation(newAssoc.getChildAssocRef());
+ invokeOnDeleteChildAssociation(oldAssoc.getChildAssocRef());
+ invokeOnUpdateNode(oldParentNode.getNodeRef());
+ invokeOnUpdateNode(newParentRef);
+ }
// update the node status
nodeDaoService.recordChangeId(nodeToMoveRef);
@@ -1342,11 +1365,12 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
nodeToMove.setStore(store);
NodeRef newNodeRef = nodeToMove.getNodeRef();
- // update change statuses
String txnId = AlfrescoTransactionSupport.getTransactionId();
+ // update old status
NodeStatus oldNodeStatus = nodeDaoService.getNodeStatus(oldNodeRef, true);
oldNodeStatus.setNode(null);
oldNodeStatus.setChangeTxnId(txnId);
+ // create the new status
NodeStatus newNodeStatus = nodeDaoService.getNodeStatus(newNodeRef, true);
newNodeStatus.setNode(nodeToMove);
newNodeStatus.setChangeTxnId(txnId);
diff --git a/source/java/org/alfresco/repo/security/permissions/impl/PermissionServiceTest.java b/source/java/org/alfresco/repo/security/permissions/impl/PermissionServiceTest.java
index 95d6d050fa..091e99c42d 100644
--- a/source/java/org/alfresco/repo/security/permissions/impl/PermissionServiceTest.java
+++ b/source/java/org/alfresco/repo/security/permissions/impl/PermissionServiceTest.java
@@ -181,6 +181,23 @@ public class PermissionServiceTest extends AbstractPermissionTest
testSetNodePermissionEntry();
testSetNodePermissionEntry2();
}
+
+ public void testDoubleSetAllowDeny()
+ {
+ Set extends PermissionEntry> permissionEntries = null;
+ // add-remove andy-all
+ permissionService.setPermission(rootNodeRef, "andy", permissionService.getAllPermission(), true);
+ permissionService.setPermission(rootNodeRef, "andy", permissionService.getAllPermission(), false);
+ permissionService.deletePermission(rootNodeRef, "andy", permissionService.getAllPermission());
+ permissionEntries = permissionService.getSetPermissions(rootNodeRef).getPermissionEntries();
+ assertEquals(0, permissionEntries.size());
+ // add-remove andy-read
+ permissionService.setPermission(rootNodeRef, "andy", PermissionService.READ, true);
+ permissionService.setPermission(rootNodeRef, "andy", PermissionService.READ, false);
+ permissionService.deletePermission(rootNodeRef, "andy", PermissionService.READ);
+ permissionEntries = permissionService.getSetPermissions(rootNodeRef).getPermissionEntries();
+ assertEquals(0, permissionEntries.size());
+ }
public void testSetPermissionEntryElements()
{
diff --git a/source/java/org/alfresco/repo/security/permissions/impl/hibernate/HibernatePermissionTest.java b/source/java/org/alfresco/repo/security/permissions/impl/hibernate/HibernatePermissionTest.java
index 4d84696c38..87933c23d7 100644
--- a/source/java/org/alfresco/repo/security/permissions/impl/hibernate/HibernatePermissionTest.java
+++ b/source/java/org/alfresco/repo/security/permissions/impl/hibernate/HibernatePermissionTest.java
@@ -119,13 +119,6 @@ public class HibernatePermissionTest extends BaseSpringTest
// throw the reference away and get the a new one for the id
permission = (DbPermission) getSession().load(DbPermissionImpl.class, id);
assertNotNull("Permission not found", permission);
- assertEquals("Test", permission.getName());
- assertEquals(qname, permission.getTypeQname());
-
- // Test key
- permission = (DbPermission) getSession().load(DbPermissionImpl.class, id);
- assertNotNull("Permission not found", permission);
- assertEquals("Test", permission.getName());
assertEquals(qname, permission.getTypeQname());
}
@@ -175,29 +168,29 @@ public class HibernatePermissionTest extends BaseSpringTest
DbAccessControlList accessControlList = new DbAccessControlListImpl();
accessControlList.setNode(node);
accessControlList.setInherits(true);
+ Serializable nodeAclId = getSession().save(accessControlList);
DbAuthority recipient = new DbAuthorityImpl();
recipient.setRecipient("Test");
recipient.getExternalKeys().add("One");
+ getSession().save(recipient);
DbPermission permission = new DbPermissionImpl();
permission.setTypeQname(qname);
permission.setName("Test");
-
- DbAccessControlEntry accessControlEntry = DbAccessControlEntryImpl.create(accessControlList, permission, recipient, true);
-
- Serializable nodeAclId = getSession().save(accessControlList);
- getSession().save(recipient);
getSession().save(permission);
- Serializable aceEntryId = getSession().save(accessControlEntry);
- accessControlEntry = (DbAccessControlEntry) getSession().load(DbAccessControlEntryImpl.class, aceEntryId);
+ DbAccessControlEntry accessControlEntry = accessControlList.newEntry(permission, recipient, true);
+ Long aceEntryId = accessControlEntry.getId();
+ assertNotNull("Entry is still transient", aceEntryId);
+
+ accessControlEntry = (DbAccessControlEntry) getSession().load(DbAccessControlEntryImpl.class, aceEntryId);
assertNotNull("Permission entry not found", accessControlEntry);
assertTrue(accessControlEntry.isAllowed());
assertNotNull(accessControlEntry.getAccessControlList());
assertTrue(accessControlEntry.getAccessControlList().getInherits());
assertNotNull(accessControlEntry.getPermission());
- assertEquals("Test", accessControlEntry.getPermission().getName());
+ assertEquals("Test", accessControlEntry.getPermission().getKey().getName());
assertNotNull(accessControlEntry.getAuthority());
assertEquals("Test", accessControlEntry.getAuthority().getRecipient());
assertEquals(1, accessControlEntry.getAuthority().getExternalKeys().size());
diff --git a/source/java/org/alfresco/repo/service/StoreRedirectorProxyFactory.java b/source/java/org/alfresco/repo/service/StoreRedirectorProxyFactory.java
index fe3fa2955f..d6fdfee7d2 100644
--- a/source/java/org/alfresco/repo/service/StoreRedirectorProxyFactory.java
+++ b/source/java/org/alfresco/repo/service/StoreRedirectorProxyFactory.java
@@ -253,11 +253,14 @@ public class StoreRedirectorProxyFactory implements FactoryBean, Initializing
// Only allow one store type
if (argStoreRef != null)
{
- if (storeRef != null && !storeRef.equals(argStoreRef))
- {
- throw new ServiceException("Multiple store types are not supported - types " + storeRef + " and " + argStoreRef + " passed");
- }
- storeRef = argStoreRef;
+ // TODO: put some thought into the ramifications of allowing cross-store moves
+ // TODO: The test here would only have checked storerefs adjacent to each other
+// if (storeRef != null && !storeRef.equals(argStoreRef))
+// {
+// throw new ServiceException("Multiple store types are not supported - types " + storeRef + " and " + argStoreRef + " passed");
+// }
+// storeRef = argStoreRef;
+ return argStoreRef;
}
}
diff --git a/source/java/org/alfresco/service/cmr/action/ActionDefinition.java b/source/java/org/alfresco/service/cmr/action/ActionDefinition.java
index 0c19c2b975..e5df61b3cf 100644
--- a/source/java/org/alfresco/service/cmr/action/ActionDefinition.java
+++ b/source/java/org/alfresco/service/cmr/action/ActionDefinition.java
@@ -16,6 +16,10 @@
*/
package org.alfresco.service.cmr.action;
+import java.util.List;
+
+import org.alfresco.service.namespace.QName;
+
/**
@@ -25,5 +29,10 @@ package org.alfresco.service.cmr.action;
*/
public interface ActionDefinition extends ParameterizedItemDefinition
{
-
+ /**
+ * Gets a list of the types that this action item is applicable for
+ *
+ * @return list of types
+ */
+ public List getApplicableTypes();
}
diff --git a/source/java/org/alfresco/service/cmr/action/ActionService.java b/source/java/org/alfresco/service/cmr/action/ActionService.java
index 7d2605c677..10ef0b641b 100644
--- a/source/java/org/alfresco/service/cmr/action/ActionService.java
+++ b/source/java/org/alfresco/service/cmr/action/ActionService.java
@@ -43,6 +43,15 @@ public interface ActionService
* @return the list action definitions
*/
List getActionDefinitions();
+
+ /**
+ * Get all the action definitions that are applicable for the given node, based on
+ * its type and aspects.
+ *
+ * @param nodeRef the node reference
+ * @return a list of applicable action definitions
+ */
+ List getActionDefinitions(NodeRef nodeRef);
/**
* Get a named action condition definition