diff --git a/config/alfresco/bootstrap/spaces.xml b/config/alfresco/bootstrap/spaces.xml
index 25edba6c30..18809f7e9a 100644
--- a/config/alfresco/bootstrap/spaces.xml
+++ b/config/alfresco/bootstrap/spaces.xml
@@ -97,6 +97,19 @@
${spaces.guest_home.name}
${spaces.guest_home.description}
+
+
+
+ GROUP_EVERYONE
+ Consumer
+
+
+
+ WCM
+ space-icon-default
+ WCM
+ Web Content Management Spaces
+
diff --git a/config/alfresco/model/contentModel.xml b/config/alfresco/model/contentModel.xml
index 0f38776be5..ae488986f9 100644
--- a/config/alfresco/model/contentModel.xml
+++ b/config/alfresco/model/contentModel.xml
@@ -683,6 +683,16 @@
+
+ Mounted
+
+
+ Mountpoint
+ d:noderef
+
+
+
+
diff --git a/source/java/org/alfresco/model/ContentModel.java b/source/java/org/alfresco/model/ContentModel.java
index 2048326cbf..4c53e07d22 100644
--- a/source/java/org/alfresco/model/ContentModel.java
+++ b/source/java/org/alfresco/model/ContentModel.java
@@ -185,6 +185,10 @@ public interface ContentModel
public static final QName PROP_ADDRESSEES = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "addressees");
public static final QName PROP_SUBJECT = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "subjectline");
+ // mounted aspect
+ public static final QName ASPECT_MOUNTED = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "mounted");
+ public static final QName PROP_MOUNTPOINT = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "mountpoint");
+
//
// Application Model Definitions
//
diff --git a/source/java/org/alfresco/repo/avm/AVMContext.java b/source/java/org/alfresco/repo/avm/AVMContext.java
index f1307bdfb1..c36e949517 100644
--- a/source/java/org/alfresco/repo/avm/AVMContext.java
+++ b/source/java/org/alfresco/repo/avm/AVMContext.java
@@ -7,6 +7,8 @@ import org.alfresco.repo.content.ContentStore;
import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.MimetypeService;
+import org.alfresco.service.cmr.repository.NodeService;
+import org.alfresco.service.cmr.security.AuthenticationService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
@@ -111,6 +113,13 @@ public class AVMContext implements ApplicationContextAware
* The DictionaryService
*/
private DictionaryService fDictionaryService;
+
+ /**
+ * The Node Service.
+ */
+ private NodeService fNodeService;
+
+ private AuthenticationService fAuthenticationService;
/**
* The application context.
@@ -274,4 +283,26 @@ public class AVMContext implements ApplicationContextAware
}
return fDictionaryService;
}
+
+ /**
+ * Get the NodeService
+ * @return The Node service.
+ */
+ public NodeService getNodeService()
+ {
+ if (fNodeService == null)
+ {
+ fNodeService = (NodeService)fAppContext.getBean("NodeService");
+ }
+ return fNodeService;
+ }
+
+ public AuthenticationService getAuthenticationService()
+ {
+ if (fAuthenticationService == null)
+ {
+ fAuthenticationService = (AuthenticationService)fAppContext.getBean("AuthenticationService");
+ }
+ return fAuthenticationService;
+ }
}
diff --git a/source/java/org/alfresco/repo/avm/AVMInterpreter.java b/source/java/org/alfresco/repo/avm/AVMInterpreter.java
index 830861f587..e759a68a69 100644
--- a/source/java/org/alfresco/repo/avm/AVMInterpreter.java
+++ b/source/java/org/alfresco/repo/avm/AVMInterpreter.java
@@ -24,11 +24,21 @@ import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.InputStream;
import java.io.OutputStream;
+import java.io.Serializable;
import java.util.Date;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import org.alfresco.model.ContentModel;
import org.alfresco.repo.avm.util.BulkLoader;
+import org.alfresco.service.cmr.repository.ChildAssociationRef;
+import org.alfresco.service.cmr.repository.NodeRef;
+import org.alfresco.service.cmr.repository.NodeService;
+import org.alfresco.service.cmr.repository.StoreRef;
+import org.alfresco.service.namespace.NamespaceService;
+import org.alfresco.service.namespace.QName;
+import org.apache.log4j.Logger;
import org.springframework.context.support.FileSystemXmlApplicationContext;
/**
@@ -37,11 +47,18 @@ import org.springframework.context.support.FileSystemXmlApplicationContext;
*/
public class AVMInterpreter
{
+ private static Logger fgLogger = Logger.getLogger(AVMInterpreter.class);
+
/**
* The service interface.
*/
private AVMService fService;
-
+
+ /**
+ * The Node service.
+ */
+ private NodeService fNodeService;
+
/**
* The reader for interaction.
*/
@@ -91,6 +108,11 @@ public class AVMInterpreter
fLoader = loader;
}
+ public void setNodeService(NodeService service)
+ {
+ fNodeService = service;
+ }
+
/**
* A Read-Eval-Print loop.
*/
@@ -124,7 +146,7 @@ public class AVMInterpreter
*/
public String interpretCommand(String line, BufferedReader in)
{
- String[] command = line.split("\\s+");
+ String[] command = line.split(",\\s+");
if (command.length == 0)
{
command = new String[1];
@@ -411,6 +433,48 @@ public class AVMInterpreter
AVMNodeDescriptor ca = fService.getCommonAncestor(left, right);
out.println(ca);
}
+ else if (command[0].equals("mount"))
+ {
+ if (command.length != 5)
+ {
+ return "Syntax Error.";
+ }
+ int version = Integer.parseInt(command[1]);
+ String avmPath = command[2];
+ String alfPath = command[3];
+ String mountName = command[4];
+ String [] components = alfPath.split("/");
+ NodeRef nodeRef = fNodeService.getRootNode(new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore"));
+ for (String name : components)
+ {
+ fgLogger.error(name);
+ List children =
+ fNodeService.getChildAssocs(nodeRef);
+ for (ChildAssociationRef child : children)
+ {
+ fgLogger.error(" " + child.getQName());
+ if (child.getQName().getLocalName().equals(name))
+ {
+ nodeRef = child.getChildRef();
+ break;
+ }
+ }
+ }
+ Map properties =
+ new HashMap();
+ properties.put(ContentModel.PROP_NAME, mountName);
+ ChildAssociationRef childRef =
+ fNodeService.createNode(nodeRef, ContentModel.ASSOC_CONTAINS,
+ QName.createQName(NamespaceService.APP_MODEL_1_0_URI, mountName),
+ ContentModel.TYPE_FOLDER,
+ properties);
+ properties.clear();
+ properties.put(ContentModel.PROP_MOUNTPOINT,
+ AVMNodeConverter.ToNodeRef(version, avmPath));
+ fNodeService.addAspect(childRef.getChildRef(),
+ ContentModel.ASPECT_MOUNTED,
+ properties);
+ }
else
{
return "Syntax Error.";
diff --git a/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java b/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java
index bfb145c78c..9972e889a2 100644
--- a/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java
+++ b/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java
@@ -31,6 +31,7 @@ import java.util.Stack;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
+import org.alfresco.repo.avm.AVMContext;
import org.alfresco.repo.domain.ChildAssoc;
import org.alfresco.repo.domain.Node;
import org.alfresco.repo.domain.NodeAssoc;
@@ -252,6 +253,20 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
Assert.notNull(assocTypeQName);
Assert.notNull(assocQName);
+ // get the parent node
+ Node parentNode = getNodeNotNull(parentRef);
+
+ if (parentNode.getAspects().contains(ContentModel.ASPECT_MOUNTED))
+ {
+ NodeRef mounted = (NodeRef)parentNode.getProperties().get(ContentModel.PROP_MOUNTPOINT).
+ getValue(DataTypeDefinition.NODE_REF);
+ return AVMContext.fgInstance.getNodeService().createNode(mounted,
+ assocTypeQName,
+ assocQName,
+ nodeTypeQName,
+ properties);
+ }
+
// null property map is allowed
if (properties == null)
{
@@ -288,9 +303,6 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
// create the node instance
Node childNode = nodeDaoService.newNode(store, newId, nodeTypeQName);
- // get the parent node
- Node parentNode = getNodeNotNull(parentRef);
-
// Set the default property values
addDefaultPropertyValues(nodeTypeDef, properties);
@@ -711,6 +723,16 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
public void removeChild(NodeRef parentRef, NodeRef childRef) throws InvalidNodeRefException
{
Node parentNode = getNodeNotNull(parentRef);
+
+ if (parentNode.getAspects().contains(ContentModel.ASPECT_MOUNTED))
+ {
+ NodeRef mounted =
+ (NodeRef)parentNode.getProperties().get(ContentModel.PROP_MOUNTPOINT).
+ getValue(DataTypeDefinition.NODE_REF);
+ AVMContext.fgInstance.getNodeService().removeChild(mounted, childRef);
+ return;
+ }
+
Node childNode = getNodeNotNull(childRef);
Long childNodeId = childNode.getId();
@@ -995,6 +1017,14 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
public List getChildAssocs(NodeRef nodeRef, QNamePattern typeQNamePattern, QNamePattern qnamePattern)
{
Node node = getNodeNotNull(nodeRef);
+ if (node.getAspects().contains(ContentModel.ASPECT_MOUNTED))
+ {
+ NodeRef mounted = (NodeRef)node.getProperties().get(ContentModel.PROP_MOUNTPOINT).
+ getValue(DataTypeDefinition.NODE_REF);
+ return AVMContext.fgInstance.getNodeService().getChildAssocs(mounted,
+ typeQNamePattern,
+ qnamePattern);
+ }
// get the assocs pointing from it
Collection childAssocRefs = nodeDaoService.getChildAssocRefs(node);
// shortcut if there are no assocs
@@ -1031,6 +1061,14 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
public NodeRef getChildByName(NodeRef nodeRef, QName assocTypeQName, String childName)
{
Node node = getNodeNotNull(nodeRef);
+ if (node.getAspects().contains(ContentModel.ASPECT_MOUNTED))
+ {
+ NodeRef mounted = (NodeRef)node.getProperties().get(ContentModel.PROP_MOUNTPOINT).
+ getValue(DataTypeDefinition.NODE_REF);
+ return AVMContext.fgInstance.getNodeService().getChildByName(mounted,
+ assocTypeQName,
+ childName);
+ }
ChildAssoc childAssoc = nodeDaoService.getChildAssoc(node, assocTypeQName, childName);
if (childAssoc != null)
{