diff --git a/config/alfresco-global.properties.sample b/config/alfresco-global.properties.sample
index 2f47e688f0..321b409b4a 100644
--- a/config/alfresco-global.properties.sample
+++ b/config/alfresco-global.properties.sample
@@ -162,6 +162,14 @@ virtual.folders.enabled=true
virtual.folders.model=alfresco/model/virtualization-model.xml
virtual.folders.model.labels=alfresco/messages/virtualization-model
+#Virtual reference config
+
+#virtual.reference.classpath.hash=${virtual.folders.config.vanilla.processor.classpath}->1,${virtual.folders.config.system.templates.classpath}->2
+
+#Virtual store config
+
+#Company home relative download associations of virtual entries
+#virtual.download.associations.folder=${spaces.dictionary.childname}/${spaces.virtualdownloads.childname}
#Generic virtualization methods config
@@ -174,17 +182,12 @@ virtual.folders.model.labels=alfresco/messages/virtualization-model
#System virtualization method aspect.
#virtual.folders.config.system.aspect=vm:system-virtualization
-
#System virtualization method aspect defined template location property.
#virtual.folders.config.system.aspect.template.location.property=vm:system-template-location
-
#Classpath to be explored for *.json entries defining system templates.
#virtual.folders.config.system.templates.classpath=/org/alfresco/repo/virtual/node
-
#A company home relative name or qname path location of repository system templates.
-#virtual.folders.config.system.templates.path=Data Dictionary/Virtual Folder Template
#virtual.folders.config.system.templates.path=${spaces.dictionary.childname}/${spaces.virtualfolders.childname}
-
#Content sub type of repository system templates.
#virtual.folders.config.system.templates.template.type=vm:virtualFolderTemplate
@@ -201,4 +204,4 @@ virtual.folders.model.labels=alfresco/messages/virtualization-model
#A company home relative name or qname path location of the type mapped templates.
#virtual.folders.config.type.templates.path=${spaces.dictionary.childname}/${spaces.virtualfolders.childname}
#Type and aspect qname regular expression filter.
-#virtual.folders.config.type.templates.qname.filter.regexp=\\{.*site/1\\.0\\}siteContainer|\\{.*claims_example/1.0\\}claimFolder
\ No newline at end of file
+#virtual.folders.config.type.templates.qname.filter.regexp=st:siteContainer,clex:claimFolder
\ No newline at end of file
diff --git a/config/alfresco/repository.properties b/config/alfresco/repository.properties
index 23cfea9748..5c9b1aad0c 100644
--- a/config/alfresco/repository.properties
+++ b/config/alfresco/repository.properties
@@ -1109,12 +1109,12 @@ cmis.disable.hidden.leading.period.files=false
#Virtual Folders Config Properties
-virtual.folders.enabled=false
+virtual.folders.enabled=true
virtual.folders.model=alfresco/model/virtualization-model.xml
virtual.folders.model.labels=alfresco/messages/virtualization-model
#Virtual reference config
-
+
virtual.reference.classpath.hash=${virtual.folders.config.vanilla.processor.classpath}->1,${virtual.folders.config.system.templates.classpath}->2
#Virtual store config
@@ -1155,4 +1155,4 @@ virtual.folders.config.custom.aspect.template.association=vm:custom-template-ass
#A company home relative name or qname path location of the type mapped templates.
virtual.folders.config.type.templates.path=${spaces.dictionary.childname}/${spaces.virtualfolders.childname}
#Type and aspect qname regular expression filter.
-virtual.folders.config.type.templates.qname.filter.regexp=\\{.*site/1\\.0\\}siteContainer
\ No newline at end of file
+virtual.folders.config.type.templates.qname.filter=none
\ No newline at end of file
diff --git a/config/alfresco/virtualization-context.xml b/config/alfresco/virtualization-context.xml
index 5de3200ebf..e1194d2524 100644
--- a/config/alfresco/virtualization-context.xml
+++ b/config/alfresco/virtualization-context.xml
@@ -115,7 +115,7 @@
-
+
diff --git a/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java b/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java
index 385071ad13..4a369dbd50 100644
--- a/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java
+++ b/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java
@@ -435,6 +435,8 @@ public class FileFolderServiceImpl extends AbstractBaseCopyService implements Fi
* @see org.alfresco.service.cmr.model.FileFolderService#list(org.alfresco.service.cmr.repository.NodeRef, boolean, boolean, java.util.Set, org.alfresco.service.cmr.model.PagingSortRequest)
*/
@Auditable(parameters = {"contextNodeRef", "files", "folders", "ignoreQNames", "sortProps", "pagingRequest"})
+ @Override
+ @Extend(traitAPI = FileFolderServiceTrait.class, extensionAPI = FileFolderServiceExtension.class)
public PagingResults list(NodeRef contextNodeRef,
boolean files,
boolean folders,
@@ -1251,7 +1253,7 @@ public class FileFolderServiceImpl extends AbstractBaseCopyService implements Fi
{
return createImpl(parentNodeRef, name, typeQName, assocQName);
}
-
+
private FileInfo createImpl(NodeRef parentNodeRef, String name, QName typeQName, QName assocQName) throws FileExistsException
{
// set up initial properties
@@ -1785,5 +1787,21 @@ public class FileFolderServiceImpl extends AbstractBaseCopyService implements Fi
return thisService.rename(sourceNodeRef, newName);
}
+
+
+ public PagingResults list(NodeRef contextNodeRef,
+ boolean files,
+ boolean folders,
+ Set ignoreQNames,
+ List> sortProps,
+ PagingRequest pagingRequest)
+ {
+ return thisService.list(contextNodeRef,
+ files,
+ folders,
+ ignoreQNames,
+ sortProps,
+ pagingRequest);
+ }
};
}
diff --git a/source/java/org/alfresco/repo/model/filefolder/traitextender/FileFolderServiceExtension.java b/source/java/org/alfresco/repo/model/filefolder/traitextender/FileFolderServiceExtension.java
index b86537b3c7..78591379d8 100644
--- a/source/java/org/alfresco/repo/model/filefolder/traitextender/FileFolderServiceExtension.java
+++ b/source/java/org/alfresco/repo/model/filefolder/traitextender/FileFolderServiceExtension.java
@@ -16,6 +16,7 @@
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see http://www.gnu.org/licenses/.
*/
+
package org.alfresco.repo.model.filefolder.traitextender;
import java.util.List;
@@ -37,6 +38,9 @@ public interface FileFolderServiceExtension
PagingResults list(NodeRef contextNodeRef, boolean files, boolean folders, String pattern,
Set ignoreQNames, List> sortProps, PagingRequest pagingRequest);
+ PagingResults list(NodeRef contextNodeRef, boolean files, boolean folders, Set ignoreQNames,
+ List> sortProps, PagingRequest pagingRequest);
+
PagingResults list(NodeRef rootNodeRef, Set searchTypeQNames, Set ignoreAspectQNames,
List> sortProps, PagingRequest pagingRequest);
diff --git a/source/java/org/alfresco/repo/model/filefolder/traitextender/FileFolderServiceTrait.java b/source/java/org/alfresco/repo/model/filefolder/traitextender/FileFolderServiceTrait.java
index 30d8651651..7b6c6b422b 100644
--- a/source/java/org/alfresco/repo/model/filefolder/traitextender/FileFolderServiceTrait.java
+++ b/source/java/org/alfresco/repo/model/filefolder/traitextender/FileFolderServiceTrait.java
@@ -47,6 +47,9 @@ public interface FileFolderServiceTrait extends Trait
PagingResults list(final NodeRef contextNodeRef, boolean files, boolean folders, String pattern,
Set ignoreQNames, List> sortProps, PagingRequest pagingRequest);
+ PagingResults list(NodeRef contextNodeRef, boolean files, boolean folders, Set ignoreQNames,
+ List> sortProps, PagingRequest pagingRequest);
+
PagingResults list(NodeRef rootNodeRef, Set searchTypeQNames, Set ignoreAspectQNames,
List> sortProps, PagingRequest pagingRequest);
@@ -55,6 +58,6 @@ public interface FileFolderServiceTrait extends Trait
Pair, Set> buildSearchTypesAndIgnoreAspects(boolean files, boolean folders,
Set ignoreQNameTypes);
-
+
FileInfo rename(NodeRef sourceNodeRef, String newName) throws FileExistsException, FileNotFoundException;
}
diff --git a/source/java/org/alfresco/repo/virtual/ActualEnvironment.java b/source/java/org/alfresco/repo/virtual/ActualEnvironment.java
index fddca06311..57c19ee5bf 100644
--- a/source/java/org/alfresco/repo/virtual/ActualEnvironment.java
+++ b/source/java/org/alfresco/repo/virtual/ActualEnvironment.java
@@ -91,7 +91,7 @@ public interface ActualEnvironment
Object createScriptVirtualContext(VirtualContext context) throws ActualEnvironmentException;
NodeRef findNodeRef(String referenceType, String[] reference);
-
+
NodeRef findQNamePath(String[] patheElements);
boolean exists(NodeRef nodeRef);
@@ -102,10 +102,9 @@ public interface ActualEnvironment
FileInfo create(NodeRef parentNodeRef, String name, QName typeQName) throws FileExistsException;
- ContentWriter getWriter(NodeRef nodeRef, QName propertyQName, boolean update) throws InvalidNodeRefException,
- InvalidTypeException;
+ ContentWriter getWriter(NodeRef nodeRef, QName propertyQName, boolean update)
+ throws InvalidNodeRefException, InvalidTypeException;
void addAspect(NodeRef nodeRef, QName aspectTypeQName, Map aspectProperties)
throws InvalidNodeRefException, InvalidAspectException;
-
}
diff --git a/source/java/org/alfresco/repo/virtual/AlfrescoEnviroment.java b/source/java/org/alfresco/repo/virtual/AlfrescoEnviroment.java
index 9029a15881..22d71a2d60 100644
--- a/source/java/org/alfresco/repo/virtual/AlfrescoEnviroment.java
+++ b/source/java/org/alfresco/repo/virtual/AlfrescoEnviroment.java
@@ -29,6 +29,7 @@ import org.alfresco.model.ContentModel;
import org.alfresco.repo.jscript.ClasspathScriptLocation;
import org.alfresco.repo.model.Repository;
import org.alfresco.repo.virtual.config.NodeRefResolver;
+import org.alfresco.repo.virtual.ref.Reference;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.dictionary.InvalidAspectException;
import org.alfresco.service.cmr.dictionary.InvalidTypeException;
diff --git a/source/java/org/alfresco/repo/virtual/AlfrescoScriptVirtualContext.java b/source/java/org/alfresco/repo/virtual/AlfrescoScriptVirtualContext.java
index 81a8035eee..f0ef8298a6 100644
--- a/source/java/org/alfresco/repo/virtual/AlfrescoScriptVirtualContext.java
+++ b/source/java/org/alfresco/repo/virtual/AlfrescoScriptVirtualContext.java
@@ -19,6 +19,7 @@
package org.alfresco.repo.virtual;
+import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
@@ -26,6 +27,10 @@ import org.alfresco.repo.jscript.BaseScopableProcessorExtension;
import org.alfresco.repo.jscript.ScriptNode;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.service.ServiceRegistry;
+import org.alfresco.service.cmr.repository.Path;
+import org.alfresco.service.namespace.NamespaceService;
+import org.alfresco.service.namespace.QName;
+import org.alfresco.util.ISO9075;
/**
* JavaScript API {@link VirtualContext} adapter.
@@ -40,6 +45,8 @@ public class AlfrescoScriptVirtualContext extends BaseScopableProcessorExtension
public static final String ACTUAL_PATH_PH = "ACTUAL_PATH";
+ public static final String ACTUAL_ISO9075_PATH_PH = "ACTUAL_ISO9075_PATH";
+
private VirtualContext context;
private ServiceRegistry serviceRegistry;
@@ -54,18 +61,70 @@ public class AlfrescoScriptVirtualContext extends BaseScopableProcessorExtension
this.placeholders = createPlaceHolders();
}
+ /**
+ * @return an array containing the plain qname path at index 0 and the
+ * ISO9075 element-encoded qname path at index 1
+ */
+ private String[] createQNamePaths()
+ {
+ final NamespaceService ns = serviceRegistry.getNamespaceService();
+ final Map cache = new HashMap();
+ final StringBuilder bufPlain = new StringBuilder(128);
+ final StringBuilder bufISO9075 = new StringBuilder(128);
+
+ final Path path = serviceRegistry.getNodeService().getPath(context.getActualNodeRef());
+ for (final Path.Element e : path)
+ {
+ if (e instanceof Path.ChildAssocElement)
+ {
+ final QName qname = ((Path.ChildAssocElement) e).getRef().getQName();
+ if (qname != null)
+ {
+ String prefix = cache.get(qname.getNamespaceURI());
+ if (prefix == null)
+ {
+ // first request for this namespace prefix, get and
+ // cache result
+ Collection prefixes = ns.getPrefixes(qname.getNamespaceURI());
+ prefix = prefixes.size() != 0 ? prefixes.iterator().next() : "";
+ cache.put(qname.getNamespaceURI(),
+ prefix);
+ }
+ bufISO9075.append('/').append(prefix).append(':').append(ISO9075.encode(qname.getLocalName()));
+ bufPlain.append('/').append(prefix).append(':').append(qname.getLocalName());
+ }
+ }
+ else
+ {
+ bufISO9075.append('/').append(e.toString());
+ bufPlain.append('/').append(e.toString());
+ }
+ }
+ String[] qnamePaths = new String[] { bufPlain.toString(), bufISO9075.toString() };
+
+ return qnamePaths;
+ }
+
// TODO: extract placeholder interface. make placeholders configurable.
+ // TODO: extract open-close-configurable placeholders
private Map createPlaceHolders()
{
Map newPlaceholders = new HashMap<>();
String user = AuthenticationUtil.getFullyAuthenticatedUser();
- // TODO: extract open-close-configurable placeholders
newPlaceholders.put(CURRENT_USER_PH,
user);
- // TODO: can we replace getQnamePath usage
+
+ String[] paths = createQNamePaths();
+
+ // the actual path will contain the ISO9075 encoded qname path
+ // this was reverted from a dual placeholder implementation (see CM-523)
newPlaceholders.put(ACTUAL_PATH_PH,
- getActualNode().getQnamePath());
+ paths[1]);
+
+ // newPlaceholders.put(ACTUAL_ISO9075_PATH_PH,
+ // paths[1]);
+
return newPlaceholders;
}
diff --git a/source/java/org/alfresco/repo/virtual/bundle/VirtualFileFolderServiceExtension.java b/source/java/org/alfresco/repo/virtual/bundle/VirtualFileFolderServiceExtension.java
index 6a8852b352..c3fda6642f 100644
--- a/source/java/org/alfresco/repo/virtual/bundle/VirtualFileFolderServiceExtension.java
+++ b/source/java/org/alfresco/repo/virtual/bundle/VirtualFileFolderServiceExtension.java
@@ -48,10 +48,10 @@ import org.alfresco.service.cmr.model.FileInfo;
import org.alfresco.service.cmr.model.FileNotFoundException;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.QName;
-import org.alfresco.traitextender.SpringBeanExtension;
import org.alfresco.util.Pair;
-public class VirtualFileFolderServiceExtension extends SpringBeanExtension
+public class VirtualFileFolderServiceExtension
+ extends VirtualSpringBeanExtension
implements FileFolderServiceExtension
{
private VirtualStore virtualStore;
@@ -154,17 +154,16 @@ public class VirtualFileFolderServiceExtension extends SpringBeanExtension[] searchAndIgnore = (Set[]) Array.newInstance(Set.class,
3);
- Pair, Set> searchTypesAndIgnoreAspects = getTrait()
- .buildSearchTypesAndIgnoreAspects(files,
- folders,
- ignoreQNames);
+ Pair, Set> searchTypesAndIgnoreAspects = getTrait().buildSearchTypesAndIgnoreAspects(files,
+ folders,
+ ignoreQNames);
if (searchTypesAndIgnoreAspects != null)
{
Set searchTypesQNames = searchTypesAndIgnoreAspects.getFirst();
Set ignoreAspectsQNames = searchTypesAndIgnoreAspects.getSecond();
Set ignoreTypesQNames = null;
- if ((searchTypesQNames != null || ignoreAspectsQNames != null) && ignoreQNames!=null)
+ if ((searchTypesQNames != null || ignoreAspectsQNames != null) && ignoreQNames != null)
{
ignoreTypesQNames = new HashSet<>(ignoreQNames);
if (searchTypesQNames != null)
@@ -235,8 +234,8 @@ public class VirtualFileFolderServiceExtension extends SpringBeanExtension asFileInfoResults(ActualEnvironment environment,
- final PagingResults results, VirtualStore store) throws ReferenceEncodingException,
- VirtualizationException
+ final PagingResults results, VirtualStore store)
+ throws ReferenceEncodingException, VirtualizationException
{
List virtualPage = results.getPage();
@@ -487,10 +486,23 @@ public class VirtualFileFolderServiceExtension extends SpringBeanExtension list(NodeRef contextNodeRef, boolean files, boolean folders, Set ignoreQNames,
+ List> sortProps, PagingRequest pagingRequest)
+ {
+
+ return VirtualFileFolderServiceExtension.this.list(contextNodeRef,
+ files,
+ folders,
+ null,
+ ignoreQNames,
+ sortProps,
+ pagingRequest);
+ }
}
diff --git a/source/java/org/alfresco/repo/virtual/bundle/VirtualNodeServiceExtension.java b/source/java/org/alfresco/repo/virtual/bundle/VirtualNodeServiceExtension.java
index 34171b5393..06d644f3ae 100644
--- a/source/java/org/alfresco/repo/virtual/bundle/VirtualNodeServiceExtension.java
+++ b/source/java/org/alfresco/repo/virtual/bundle/VirtualNodeServiceExtension.java
@@ -66,12 +66,11 @@ import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.QNamePattern;
import org.alfresco.service.namespace.RegexQNamePattern;
-import org.alfresco.traitextender.SpringBeanExtension;
import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-public class VirtualNodeServiceExtension extends SpringBeanExtension
+public class VirtualNodeServiceExtension extends VirtualSpringBeanExtension
implements NodeServiceExtension
{
private static Log logger = LogFactory.getLog(VirtualNodeServiceExtension.class);
@@ -102,13 +101,14 @@ public class VirtualNodeServiceExtension extends SpringBeanExtension properties)
{
NodeServiceTrait theTrait = getTrait();
- if (Reference.isReference(parentRef) && !isVirtualContextFolder(parentRef))
+ if (Reference.isReference(parentRef) && !isVirtualContextFolder(parentRef,
+ environment))
{
// CM-533 Suppress options to create folders in a virtual folder
// (repo)
@@ -357,8 +348,10 @@ public class VirtualNodeServiceExtension extends SpringBeanExtension extends SpringBeanExtension
+{
+ public VirtualSpringBeanExtension(Class traitClass)
+ {
+ super(traitClass);
+ }
+
+ public boolean isVirtualContextFolder(NodeRef nodeRef, ActualEnvironment environment)
+ {
+ boolean isReference=Reference.isReference(nodeRef);
+ boolean isFolder=environment.isSubClass(environment.getType(nodeRef),
+ ContentModel.TYPE_FOLDER);
+ boolean virtualContext=environment.hasAspect(nodeRef,VirtualContentModel.ASPECT_VIRTUAL_DOCUMENT);
+ return isReference && isFolder && virtualContext;
+ }
+}
diff --git a/source/java/org/alfresco/repo/virtual/store/TypeVirtualizationMethod.java b/source/java/org/alfresco/repo/virtual/store/TypeVirtualizationMethod.java
index 0092aa0fa7..8d237e3722 100644
--- a/source/java/org/alfresco/repo/virtual/store/TypeVirtualizationMethod.java
+++ b/source/java/org/alfresco/repo/virtual/store/TypeVirtualizationMethod.java
@@ -19,7 +19,10 @@
package org.alfresco.repo.virtual.store;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Set;
+import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import org.alfresco.model.ContentModel;
@@ -30,10 +33,12 @@ import org.alfresco.repo.virtual.config.NodeRefExpression;
import org.alfresco.repo.virtual.ref.Protocols;
import org.alfresco.repo.virtual.ref.Reference;
import org.alfresco.service.cmr.repository.NodeRef;
+import org.alfresco.service.namespace.NamespaceException;
import org.alfresco.service.namespace.NamespacePrefixResolver;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.QNamePattern;
import org.alfresco.service.namespace.RegexQNamePattern;
+import org.alfresco.util.ParameterCheck;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -64,7 +69,20 @@ public class TypeVirtualizationMethod extends TemplateVirtualizationMethod
private NodeRefExpression templatesPath;
- private QNamePattern qnamePattern = RegexQNamePattern.MATCH_ALL;
+ private QNamePattern[] qnamePatternFilters = new QNamePattern[] { RegexQNamePattern.MATCH_ALL };
+
+ private static final QNamePattern MATCH_NONE = new QNamePattern()
+ {
+
+ @Override
+ public boolean isMatch(QName qname)
+ {
+ return false;
+ }
+
+ };
+
+ private String filters;
/**
* Thread local solving template in process indicator.
@@ -81,12 +99,120 @@ public class TypeVirtualizationMethod extends TemplateVirtualizationMethod
public void init()
{
- //void
+ resetFilters();
}
-
- public void setQnameFilterRegexp(String regexp)
+
+ private synchronized void resetFilters()
{
- this.qnamePattern = new RegexQNamePattern(regexp);
+ if (namespacePrefixResolver != null && filters != null)
+ {
+ this.qnamePatternFilters = asRegExpQNamePatternFilters(filters);
+ if (logger.isDebugEnabled())
+ {
+ String regExpFilters = "";
+ for (int i = 0; i < qnamePatternFilters.length; i++)
+ {
+ regExpFilters += qnamePatternFilters[i].toString() + " | ";
+ }
+ logger.debug("Reset type regexp filters to : " + regExpFilters);
+ }
+ }
+ else
+ {
+ logger.debug("Could not reset qName filters with NameSpacePrefixResolver=" + namespacePrefixResolver
+ + " and filters=" + filters);
+ }
+
+ }
+
+ private QNamePattern[] asRegExpQNamePatternFilters(String filtersString)
+ {
+ String[] filters = filtersString.split(",");
+ List patterns = new ArrayList<>(3);
+ for (int i = 0; i < filters.length; i++)
+ {
+ String trimmedFilters = filters[i].trim();
+ if (!trimmedFilters.isEmpty())
+ {
+ if ("*".equals(trimmedFilters))
+ {
+ patterns.clear();
+ patterns.add(RegexQNamePattern.MATCH_ALL);
+ break;
+ }
+
+ if ("none".equals(trimmedFilters))
+ {
+ patterns.clear();
+ patterns.add(MATCH_NONE);
+ break;
+ }
+
+ String[] components = filters[i].split(":");
+ if (components == null || components.length != 2 || components[0].trim().isEmpty()
+ || components[1].trim().isEmpty())
+ {
+ throw new IllegalArgumentException("Illegal filters string " + filtersString
+ + ". Expected : | :'*' instead of " + filters[i]);
+ }
+ try
+ {
+ String uri = namespacePrefixResolver.getNamespaceURI(components[0]);
+
+ if (uri == null)
+ {
+ // replicate expected resolver behavior
+ throw new NamespaceException("Unregistrered prefix " + components[0]);
+ }
+
+ String localName = components[1];
+
+ if ("*".equals(localName.trim()))
+ {
+ localName = ".*";
+ }
+
+ Pattern.compile(uri);
+ Pattern.compile(localName);
+
+ RegexQNamePattern qNamePattern = new RegexQNamePattern(uri,
+ localName);
+
+ if (!qNamePattern.isMatch(QName.createQName(uri,
+ components[1])))
+ {
+ throw new IllegalArgumentException("Illegal filters string " + filtersString
+ + " due to invalid regexp translatrion in " + filters[i] + " as " + qNamePattern);
+
+ }
+ patterns.add(qNamePattern);
+ }
+ catch (NamespaceException e)
+ {
+ throw new IllegalArgumentException("Illegal filters string " + filtersString
+ + " due to unregistered name space in " + filters[i],
+ e);
+ }
+ catch (PatternSyntaxException e)
+ {
+ throw new IllegalArgumentException("Illegal filters string " + filtersString
+ + " due to invalid regexp translatrion in " + filters[i],
+ e);
+ }
+ }
+
+ }
+
+ return patterns.toArray(new QNamePattern[] {});
+ }
+
+ public void setQnameFilters(String filters)
+ {
+ ParameterCheck.mandatoryString("filters",
+ filters);
+ this.filters = filters;
+
+ resetFilters();
}
public void setTemplatesPath(NodeRefExpression templatesPath)
@@ -97,6 +223,8 @@ public class TypeVirtualizationMethod extends TemplateVirtualizationMethod
public void setNamespacePrefixResolver(NamespacePrefixResolver resolver)
{
this.namespacePrefixResolver = resolver;
+
+ resetFilters();
}
@Override
@@ -129,6 +257,19 @@ public class TypeVirtualizationMethod extends TemplateVirtualizationMethod
return typeTemplateContentName + extension;
}
+ private boolean isAnyFilterMatch(QName qname)
+ {
+ for (int i = 0; i < qnamePatternFilters.length; i++)
+ {
+ if (qnamePatternFilters[i].isMatch(qname))
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
private NodeRef templateNodeFor(ActualEnvironment env, NodeRef nodeRef)
{
try
@@ -140,7 +281,7 @@ public class TypeVirtualizationMethod extends TemplateVirtualizationMethod
}
NodeRef templateNode = null;
QName nodeType = env.getType(nodeRef);
- if (qnamePattern.isMatch(nodeType))
+ if (isAnyFilterMatch(nodeType))
{
String typeTemplateNodeName = templateNodeNameForType(nodeType);
@@ -155,7 +296,7 @@ public class TypeVirtualizationMethod extends TemplateVirtualizationMethod
for (QName aspect : aspects)
{
- if (qnamePattern.isMatch(aspect))
+ if (isAnyFilterMatch(aspect))
{
String aspectTemplateNodeName = templateNodeNameForType(aspect);
templateNode = env.getChildByName(templatesContainerNode,
@@ -175,7 +316,8 @@ public class TypeVirtualizationMethod extends TemplateVirtualizationMethod
}
catch (PatternSyntaxException e)
{
- logger.error("Invalid type methof type and aspect qName regexp pattern " + qnamePattern.toString());
+ logger.error("Invalid type method type and aspect in qName filter ",
+ e);
return null;
}
catch (Exception e)
diff --git a/source/java/org/alfresco/repo/virtual/store/VirtualStoreImpl.java b/source/java/org/alfresco/repo/virtual/store/VirtualStoreImpl.java
index 91834c6208..4a5a14bc9b 100644
--- a/source/java/org/alfresco/repo/virtual/store/VirtualStoreImpl.java
+++ b/source/java/org/alfresco/repo/virtual/store/VirtualStoreImpl.java
@@ -61,6 +61,7 @@ import org.alfresco.repo.virtual.template.FilesFoldersConstraint;
import org.alfresco.repo.virtual.template.FilingData;
import org.alfresco.repo.virtual.template.FilingParameters;
import org.alfresco.repo.virtual.template.FilingRule;
+import org.alfresco.repo.virtual.template.NamePatternPropertyValueConstraint;
import org.alfresco.repo.virtual.template.PropertyValueConstraint;
import org.alfresco.repo.virtual.template.NullFilingRule;
import org.alfresco.repo.virtual.template.VirtualFolderDefinition;
@@ -548,7 +549,7 @@ public class VirtualStoreImpl implements VirtualStore, VirtualFolderDefinitionRe
}
else
{
- vqConstraint = new PropertyValueConstraint(new FilesFoldersConstraint(BasicConstraint.INSTANCE,
+ vqConstraint = new NamePatternPropertyValueConstraint(new FilesFoldersConstraint(BasicConstraint.INSTANCE,
true,
true),
ContentModel.PROP_NAME,
diff --git a/source/java/org/alfresco/repo/virtual/template/NamePatternPropertyValueConstraint.java b/source/java/org/alfresco/repo/virtual/template/NamePatternPropertyValueConstraint.java
new file mode 100644
index 0000000000..8ebd4b5d0e
--- /dev/null
+++ b/source/java/org/alfresco/repo/virtual/template/NamePatternPropertyValueConstraint.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2005-2015 Alfresco Software Limited.
+ *
+ * This file is part of Alfresco
+ *
+ * Alfresco is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Alfresco is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Alfresco. If not, see http://www.gnu.org/licenses/.
+ */
+
+package org.alfresco.repo.virtual.template;
+
+import java.io.Serializable;
+
+import org.alfresco.service.cmr.search.SearchParameters;
+import org.alfresco.service.namespace.NamespacePrefixResolver;
+import org.alfresco.service.namespace.QName;
+import org.alfresco.util.SearchLanguageConversion;
+
+/**
+ * Specifies a constraint on a property value, as for e.g.
+ * ContentModel.PROP_NAME, to be applied as name pattern to queries given in the virtual folder
+ * template.
+ *
+ *@author sdinuta
+ */
+public class NamePatternPropertyValueConstraint extends PropertyValueConstraint
+{
+ private QName property;
+
+ private Serializable value;
+
+ private NamespacePrefixResolver nspResolver;
+
+ public NamePatternPropertyValueConstraint(VirtualQueryConstraint decoratedConstraint, QName property,
+ Serializable value, NamespacePrefixResolver nspResolver)
+ {
+ super(decoratedConstraint,
+ property,
+ value,
+ nspResolver);
+ this.property = property;
+ this.value = value;
+ this.nspResolver = nspResolver;
+ }
+
+ @Override
+ protected SearchParameters applyFTS(SearchParameters searchParameters)
+ {
+ String filePattern;
+ StringBuffer luceneReserved = new StringBuffer();
+ for(int i=0;i properties = new HashMap();
- properties.put(ContentModel.PROP_NAME,
- "testfile.txt");
- QName assocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
- QName.createValidLocalName("testfile.txt"));
-
- nodeService.createNode(node1,
- ContentModel.ASSOC_CONTAINS,
- assocQName,
- ContentModel.TYPE_CONTENT,
- properties);
- nodeService.createNode(node2,
- ContentModel.ASSOC_CONTAINS,
- assocQName,
- ContentModel.TYPE_CONTENT,
- properties);
+ String fileName="testfile.txt";
+ fileAndFolderService.create(node1, fileName, ContentModel.TYPE_CONTENT);
+ fileAndFolderService.create(node2, fileName, ContentModel.TYPE_CONTENT);
List search = fileAndFolderService.search(virtualFolder1NodeRef,
"testfile.txt",
@@ -298,14 +289,14 @@ public class VirtualFileFolderServiceExtensionTest extends VirtualizationIntegra
contentName);
{
- PagingResults folderChildren = fileAndFolderService
- .list(node2,
- false,
- true,
- "*",
- Collections. emptySet(),
- Collections.> emptyList(),
- new PagingRequest(100));
+ PagingResults folderChildren = fileAndFolderService.list(node2,
+ false,
+ true,
+ "*",
+ Collections. emptySet(),
+ Collections
+ .> emptyList(),
+ new PagingRequest(100));
List page = folderChildren.getPage();
assertContainsNames(page,
folderName);
@@ -314,14 +305,14 @@ public class VirtualFileFolderServiceExtensionTest extends VirtualizationIntegra
}
{
- PagingResults contentChildren = fileAndFolderService
- .list(node2,
- true,
- false,
- "*",
- Collections. emptySet(),
- Collections.> emptyList(),
- new PagingRequest(100));
+ PagingResults contentChildren = fileAndFolderService.list(node2,
+ true,
+ false,
+ "*",
+ Collections. emptySet(),
+ Collections
+ .> emptyList(),
+ new PagingRequest(100));
List page = contentChildren.getPage();
assertMissesNames(page,
folderName);
@@ -403,7 +394,7 @@ public class VirtualFileFolderServiceExtensionTest extends VirtualizationIntegra
NodeRef childByName = nodeService.getChildByName(node2,
ContentModel.ASSOC_CONTAINS,
contentName);
- //rename file in virtual context
+ // rename file in virtual context
FileInfo renamedFileInfo = fileAndFolderService.rename(childByName,
NEW_FILE_NAME_1);
assertNotNull(renamedFileInfo);
@@ -417,13 +408,13 @@ public class VirtualFileFolderServiceExtensionTest extends VirtualizationIntegra
ContentModel.ASSOC_CONTAINS,
contentName));
assertNotNull(nodeService.getChildByName(node2,
- ContentModel.ASSOC_CONTAINS,
- NEW_FILE_NAME_1));
+ ContentModel.ASSOC_CONTAINS,
+ NEW_FILE_NAME_1));
assertNotNull(nodeService.getChildByName(vf,
- ContentModel.ASSOC_CONTAINS,
- NEW_FILE_NAME_1));
+ ContentModel.ASSOC_CONTAINS,
+ NEW_FILE_NAME_1));
- //rename physical file
+ // rename physical file
childByName = nodeService.getChildByName(vf,
ContentModel.ASSOC_CONTAINS,
NEW_FILE_NAME_1);
@@ -447,4 +438,181 @@ public class VirtualFileFolderServiceExtensionTest extends VirtualizationIntegra
NEW_FILE_NAME_2));
}
+
+ @Test
+ public void testListNamePattern() throws Exception
+ {
+ List> sortProps = new ArrayList>(1);
+ sortProps.add(new Pair(ContentModel.PROP_NAME,
+ false));
+ String name = "A N.&ame.txt";
+ String name1 = "A N.&ame-1.txt";
+ String nameAfter = "XXName.txt";
+
+ NodeRef vf = createVirtualizedFolder(testRootFolder.getNodeRef(),
+ "TestVirtualFileFolderService_testVirtualFolderVirtualChild",
+ TEST_TEMPLATE_3_JSON_SYS_PATH);
+ NodeRef node1 = nodeService.getChildByName(vf,
+ ContentModel.ASSOC_CONTAINS,
+ "Node1");
+ createContent(node1,
+ name,
+ "0",
+ MimetypeMap.MIMETYPE_TEXT_PLAIN,
+ "UTF-8");
+
+ createContent(node1,
+ name1,
+ "01",
+ MimetypeMap.MIMETYPE_TEXT_PLAIN,
+ "UTF-8");
+
+ createContent(node1,
+ nameAfter,
+ "1",
+ MimetypeMap.MIMETYPE_TEXT_PLAIN,
+ "UTF-8");
+
+ String namePattern = "A N.&ame*.txt";
+ PagingResults results = fileAndFolderService.list(node1,
+ true,
+ false,
+ namePattern,
+ null,
+ sortProps,
+ new PagingRequest(CannedQueryPageDetails.DEFAULT_PAGE_SIZE));
+
+ List page = results.getPage();
+ assertEquals(2,
+ page.size());
+ assertEquals(page.get(0).getName(),
+ name1);
+ assertEquals(page.get(1).getName(),
+ name);
+ }
+
+ @Test
+ public void testLastDuplicate() throws Exception
+ {
+ NodeRef lastDup = null;
+ List> sortProps = new ArrayList>(1);
+ sortProps.add(new Pair(ContentModel.PROP_NAME,
+ false));
+ String name = "AName.txt";
+ String nameAfter = "XXName.txt";
+
+ NodeRef vf = createVirtualizedFolder(testRootFolder.getNodeRef(),
+ "TestVirtualFileFolderService_testVirtualFolderVirtualChild",
+ TEST_TEMPLATE_3_JSON_SYS_PATH);
+ NodeRef node1 = nodeService.getChildByName(vf,
+ ContentModel.ASSOC_CONTAINS,
+ "Node1");
+ createContent(node1,
+ name,
+ "0",
+ MimetypeMap.MIMETYPE_TEXT_PLAIN,
+ "UTF-8");
+ NodeRef aNameNodeRef = nodeService.getChildByName(node1,
+ ContentModel.ASSOC_CHILDREN,
+ name);
+
+ createContent(node1,
+ nameAfter,
+ "1",
+ MimetypeMap.MIMETYPE_TEXT_PLAIN,
+ "UTF-8");
+ NodeRef nameAfterNodeRef = nodeService.getChildByName(node1,
+ ContentModel.ASSOC_CHILDREN,
+ nameAfter);
+
+ String namePattern = addWildCardInName(name,
+ fileAndFolderService
+ .getFileInfo(aNameNodeRef)
+ .getContentData()
+ .getMimetype());
+ PagingResults results = fileAndFolderService
+ .list(nodeService.getPrimaryParent(aNameNodeRef).getParentRef(),
+ true,
+ false,
+ namePattern,
+ null,
+ sortProps,
+ new PagingRequest(CannedQueryPageDetails.DEFAULT_PAGE_SIZE));
+
+ List page = results.getPage();
+ FileInfo fileInfo = null;
+ if (page.size() > 0)
+ {
+ fileInfo = page.get(0);
+ lastDup = fileInfo.getNodeRef();
+ }
+ assertFalse(lastDup.equals(nameAfterNodeRef));
+ }
+
+ private String addWildCardInName(String name, String mimetype)
+ {
+ MimetypeService mimetypeService = ctx.getBean("mimetypeService",
+ MimetypeService.class);
+ String extension = mimetypeService.getExtension(mimetype);
+ return name.substring(0,
+ name.length() - (extension.length() + 1))
+ .concat("*." + extension);
+ }
+
+ @Test
+ public void testListUsedWithCMIS() throws Exception
+ {
+ NodeRef vf = createVirtualizedFolder(testRootFolder.getNodeRef(),
+ "TestVirtualFileFolderService_testVirtualFolderVirtualChild",
+ TEST_TEMPLATE_3_JSON_SYS_PATH);
+ NodeRef node2 = nodeService.getChildByName(vf,
+ ContentModel.ASSOC_CONTAINS,
+ "Node2");
+ String contentName = "ContentVirtualChild";
+ createContent(node2,
+ contentName);
+
+ NodeRef childByName = nodeService.getChildByName(node2,
+ ContentModel.ASSOC_CONTAINS,
+ contentName);
+
+ FileInfo renamedFileInfo = fileAndFolderService.rename(childByName,
+ NEW_FILE_NAME_1);
+ assertNotNull(renamedFileInfo);
+ assertEquals(NEW_FILE_NAME_1,
+ nodeService.getProperty(childByName,
+ ContentModel.PROP_NAME));
+
+ List> sortProps = Collections.> emptyList();
+ PagingRequest pagingRequest = new PagingRequest(100);
+
+ PagingResults results = fileAndFolderService.list(vf,
+ true,
+ true,
+ null,
+ sortProps,
+ pagingRequest);
+
+ assertNotNull(results);
+
+ assertEquals(3,
+ results.getPage().size());
+
+ String contentName1 = "ContentVirtualChild";
+ createContent(node2,
+ contentName1);
+
+ results = fileAndFolderService.list(vf,
+ true,
+ true,
+ null,
+ sortProps,
+ pagingRequest);
+
+ assertNotNull(results);
+
+ assertEquals(4,
+ results.getPage().size());
+
+ }
}
diff --git a/source/test-java/org/alfresco/repo/virtual/bundle/VirtualNodeServiceExtensionTest.java b/source/test-java/org/alfresco/repo/virtual/bundle/VirtualNodeServiceExtensionTest.java
index 2472fd54e5..f3a438093a 100644
--- a/source/test-java/org/alfresco/repo/virtual/bundle/VirtualNodeServiceExtensionTest.java
+++ b/source/test-java/org/alfresco/repo/virtual/bundle/VirtualNodeServiceExtensionTest.java
@@ -19,8 +19,6 @@
package org.alfresco.repo.virtual.bundle;
-import static org.junit.Assert.*;
-
import java.io.Serializable;
import java.util.Arrays;
import java.util.HashMap;
@@ -36,6 +34,7 @@ import org.alfresco.repo.download.DownloadModel;
import org.alfresco.repo.download.DownloadStorage;
import org.alfresco.repo.node.integrity.IntegrityChecker;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
+import org.alfresco.repo.security.permissions.AccessDeniedException;
import org.alfresco.repo.virtual.VirtualContentModel;
import org.alfresco.repo.virtual.VirtualizationIntegrationTest;
import org.alfresco.repo.virtual.config.NodeRefExpression;
@@ -49,7 +48,6 @@ import org.alfresco.repo.virtual.store.VirtualStore;
import org.alfresco.service.cmr.repository.AssociationRef;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.CopyService;
-import org.alfresco.service.cmr.repository.InvalidNodeRefException;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.Path;
import org.alfresco.service.namespace.NamespaceService;
@@ -127,9 +125,9 @@ public class VirtualNodeServiceExtensionTest extends VirtualizationIntegrationTe
"shouldNotBeCreated");
fail("Should not be able to create node in a readonly context.");
}
- catch (InvalidNodeRefException e)
+ catch (AccessDeniedException e)
{
- logger.info("Succesfully denied creation in readonl",
+ logger.info("Succesfully denied creation in readonly",
e);
}
}
@@ -210,37 +208,29 @@ public class VirtualNodeServiceExtensionTest extends VirtualizationIntegrationTe
"Node2");
assertNotNull(secondChild);
- HashMap properties = new HashMap();
- properties.put(ContentModel.PROP_NAME,
- "testfile.txt");
- QName assocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
- QName.createValidLocalName("testfile.txt"));
authenticationComponent.setCurrentUser(AuthenticationUtil.getAdminUserName());
// add testfile.txt to first virtual child
- createNode(firstChild,
- assocQName,
- properties);
+ String fileName="testfile.txt";
+ uploadNode(firstChild,
+ fileName);
assertNotNull(nodeService.getChildByName(firstChild.toNodeRef(),
ContentModel.ASSOC_CONTAINS,
"testfile.txt"));
- createNode(firstChild,
- assocQName,
- properties);
+ uploadNode(firstChild,
+ fileName);
assertNotNull(nodeService.getChildByName(firstChild.toNodeRef(),
ContentModel.ASSOC_CONTAINS,
"testfile-1.txt"));
// add testfile.txt to second virtual child
- createNode(secondChild,
- assocQName,
- properties);
+ uploadNode(secondChild,
+ fileName);
assertNotNull(nodeService.getChildByName(secondChild.toNodeRef(),
ContentModel.ASSOC_CONTAINS,
"testfile-2.txt"));
- createNode(secondChild,
- assocQName,
- properties);
+ uploadNode(secondChild,
+ fileName);
assertNotNull(nodeService.getChildByName(secondChild.toNodeRef(),
ContentModel.ASSOC_CONTAINS,
"testfile-3.txt"));
@@ -248,13 +238,9 @@ public class VirtualNodeServiceExtensionTest extends VirtualizationIntegrationTe
// add again to first virtual child starting from the last index found
// (this is the index that comes from
// upload-post.js)
- properties.put(ContentModel.PROP_NAME,
- "testfile-2.txt");
- assocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
- QName.createValidLocalName("testfile-2.txt"));
- createNode(firstChild,
- assocQName,
- properties);
+ fileName="testfile-2.txt";
+ uploadNode(firstChild,
+ fileName);
assertNotNull(nodeService.getChildByName(firstChild.toNodeRef(),
ContentModel.ASSOC_CONTAINS,
"testfile-4.txt"));
@@ -262,28 +248,14 @@ public class VirtualNodeServiceExtensionTest extends VirtualizationIntegrationTe
// test create node for actual node starting from the last index found
// (this is the index that comes from
// upload-post.js)
- properties.put(ContentModel.PROP_NAME,
- "testfile-5.txt");
- assocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
- QName.createValidLocalName("testfile-5.txt"));
- nodeService.createNode(virtualFolder1NodeRef,
- ContentModel.ASSOC_CONTAINS,
- assocQName,
- ContentModel.TYPE_CONTENT,
- properties).getChildRef();
+ fileName="testfile-5.txt";
+ fileAndFolderService.create(virtualFolder1NodeRef, fileName, ContentModel.TYPE_CONTENT);
assertNotNull(nodeService.getChildByName(virtualFolder1NodeRef,
ContentModel.ASSOC_CONTAINS,
"testfile-5.txt"));
- properties.put(ContentModel.PROP_NAME,
- "testfile-6.txt");
- assocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
- QName.createValidLocalName("testfile-6.txt"));
- nodeService.createNode(virtualFolder1NodeRef,
- ContentModel.ASSOC_CONTAINS,
- assocQName,
- ContentModel.TYPE_CONTENT,
- properties).getChildRef();
+ fileName="testfile-6.txt";
+ fileAndFolderService.create(virtualFolder1NodeRef, fileName, ContentModel.TYPE_CONTENT);
assertNotNull(nodeService.getChildByName(virtualFolder1NodeRef,
ContentModel.ASSOC_CONTAINS,
"testfile-6.txt"));
@@ -291,38 +263,20 @@ public class VirtualNodeServiceExtensionTest extends VirtualizationIntegrationTe
// add again to second child starting from the last index found (this is
// the index that comes from
// upload-post.js)
- properties.put(ContentModel.PROP_NAME,
- "testfile-4.txt");
- assocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
- QName.createValidLocalName("testfile-4.txt"));
- nodeService.createNode(secondChild.toNodeRef(),
- ContentModel.ASSOC_CONTAINS,
- assocQName,
- ContentModel.TYPE_CONTENT,
- properties).getChildRef();
+ fileName="testfile-4.txt";
+ uploadNode(secondChild,
+ fileName);
assertNotNull(nodeService.getChildByName(secondChild.toNodeRef(),
ContentModel.ASSOC_CONTAINS,
"testfile-7.txt"));
// test situation when file name is of form testfile1-1.txt
- properties.put(ContentModel.PROP_NAME,
- "testfile1-1.txt");
- assocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
- QName.createValidLocalName("testfile1-1.txt"));
- nodeService.createNode(secondChild.toNodeRef(),
- ContentModel.ASSOC_CONTAINS,
- assocQName,
- ContentModel.TYPE_CONTENT,
- properties).getChildRef();
+ fileName="testfile1-1.txt";
+ fileAndFolderService.create(secondChild.toNodeRef(), fileName, ContentModel.TYPE_CONTENT);
assertNotNull(nodeService.getChildByName(secondChild.toNodeRef(),
ContentModel.ASSOC_CONTAINS,
"testfile1-1.txt"));
-
- nodeService.createNode(secondChild.toNodeRef(),
- ContentModel.ASSOC_CONTAINS,
- assocQName,
- ContentModel.TYPE_CONTENT,
- properties).getChildRef();
+ fileAndFolderService.create(secondChild.toNodeRef(), fileName, ContentModel.TYPE_CONTENT);
assertNotNull(nodeService.getChildByName(secondChild.toNodeRef(),
ContentModel.ASSOC_CONTAINS,
"testfile1-1-1.txt"));
@@ -393,6 +347,13 @@ public class VirtualNodeServiceExtensionTest extends VirtualizationIntegrationTe
childAssocsRef);
}
+ private void uploadNode(Reference reference, String name)
+ {
+ fileAndFolderService.create(reference.toNodeRef(),
+ name,
+ ContentModel.TYPE_CONTENT);
+ }
+
/**
* Assets that the given {@link ChildAssociationRef} was created within the
* given virtualizable nodeRef container reference.
@@ -452,18 +413,10 @@ public class VirtualNodeServiceExtensionTest extends VirtualizationIntegrationTe
ContentModel.ASSOC_CONTAINS,
"Node2");
- HashMap properties = new HashMap();
- properties.put(ContentModel.PROP_NAME,
- "testfile.txt");
- QName assocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
- QName.createValidLocalName("testfile.txt"));
+ String fileName="testfile.txt";
// add testfile.txt to first virtual child
- nodeService.createNode(node2,
- ContentModel.ASSOC_CONTAINS,
- assocQName,
- ContentModel.TYPE_CONTENT,
- properties);
+ fileAndFolderService.create(node2, fileName, ContentModel.TYPE_CONTENT);
NodeRef childRef = nodeService.getChildByName(node2,
ContentModel.ASSOC_CONTAINS,
@@ -487,11 +440,7 @@ public class VirtualNodeServiceExtensionTest extends VirtualizationIntegrationTe
"Node2_1");
assertNotNull(node2_1);
- nodeService.createNode(node2_1,
- ContentModel.ASSOC_CONTAINS,
- assocQName,
- ContentModel.TYPE_CONTENT,
- properties);
+ fileAndFolderService.create(node2_1, fileName, ContentModel.TYPE_CONTENT);
NodeRef childRef_1 = nodeService.getChildByName(node2_1,
ContentModel.ASSOC_CONTAINS,
@@ -1200,6 +1149,110 @@ public class VirtualNodeServiceExtensionTest extends VirtualizationIntegrationTe
assertNotNull(childFolderNodeRef);
}
+ public void testChildByName_ACE_4700() throws Exception
+ {
+ NodeRef node1 = nodeService.getChildByName(virtualFolder1NodeRef,
+ ContentModel.ASSOC_CONTAINS,
+ "Node1");
+ assertNotNull(node1);
+ String filename = "2015-11_11_1557_folder_empty_space.txt";
+ fileAndFolderService.create(node1,
+ filename,
+ ContentModel.TYPE_CONTENT);
+ fileAndFolderService.create(node1,
+ filename,
+ ContentModel.TYPE_CONTENT);
+ assertNotNull(nodeService.getChildByName(node1,
+ ContentModel.ASSOC_CONTAINS,
+ "2015-11_11_1557_folder_empty_space.txt"));
+ assertNotNull(nodeService.getChildByName(node1,
+ ContentModel.ASSOC_CONTAINS,
+ "2015-11_11_1557_folder_empty_space-1.txt"));
+ assertNull(nodeService.getChildByName(node1,
+ ContentModel.ASSOC_CONTAINS,
+ "2015-11_11_1557_folder_empty_space-2.txt"));
+
+ String suportedCharsFileName = "file~!@#$%^&-=+][';.,.txt";
+ String suportedCharsFileName1 = "file~!@#$%^&-=+][';.,-1.txt";
+ String suportedCharsFileName2 = "file~!@#$%^&-=+][';.,-2.txt";
+ fileAndFolderService.create(node1,
+ suportedCharsFileName,
+ ContentModel.TYPE_CONTENT);
+ fileAndFolderService.create(node1,
+ suportedCharsFileName,
+ ContentModel.TYPE_CONTENT);
+ assertNotNull(nodeService.getChildByName(node1,
+ ContentModel.ASSOC_CONTAINS,
+ suportedCharsFileName));
+ assertNotNull(nodeService.getChildByName(node1,
+ ContentModel.ASSOC_CONTAINS,
+ suportedCharsFileName1));
+ assertNull(nodeService.getChildByName(node1,
+ ContentModel.ASSOC_CONTAINS,
+ suportedCharsFileName2));
+ }
+
+ public void testHasAspect() throws Exception
+ {
+ // test for virtual folder
+ NodeRef node1 = nodeService.getChildByName(virtualFolder1NodeRef,
+ ContentModel.ASSOC_CONTAINS,
+ "Node1");
+ assertNotNull(node1);
+ assertTrue(nodeService.hasAspect(node1,
+ VirtualContentModel.ASPECT_VIRTUAL));
+ assertFalse(nodeService.hasAspect(node1,
+ VirtualContentModel.ASPECT_VIRTUAL_DOCUMENT));
+
+ // test for document in virtual context
+ String filename = "testName.txt";
+ NodeRef fileNodeRef = fileAndFolderService.create(node1,
+ filename,
+ ContentModel.TYPE_CONTENT).getNodeRef();
+ assertFalse(nodeService.hasAspect(fileNodeRef,
+ VirtualContentModel.ASPECT_VIRTUAL));
+ assertTrue(nodeService.hasAspect(fileNodeRef,
+ VirtualContentModel.ASPECT_VIRTUAL_DOCUMENT));
+
+ // test for folder in virtual context
+ createFolder(testRootFolder.getNodeRef(),
+ "FOLDER").getChildRef();
+ NodeRef virtualFolder = createVirtualizedFolder(testRootFolder.getNodeRef(),
+ VIRTUAL_FOLDER_2_NAME,
+ TEST_TEMPLATE_6_JSON_SYS_PATH);
+ NodeRef node1_1 = nodeService.getChildByName(virtualFolder,
+ ContentModel.ASSOC_CONTAINS,
+ "Node1");
+ assertNotNull(node1_1);
+
+ NodeRef physicalFolderInVirtualContext = nodeService.getChildByName(node1_1,
+ ContentModel.ASSOC_CONTAINS,
+ "FOLDER");
+ assertNotNull(physicalFolderInVirtualContext);
+
+ assertFalse(nodeService.hasAspect(physicalFolderInVirtualContext,
+ VirtualContentModel.ASPECT_VIRTUAL));
+ assertTrue(nodeService.hasAspect(physicalFolderInVirtualContext,
+ VirtualContentModel.ASPECT_VIRTUAL_DOCUMENT));
+
+ //test the document created in a folder in virtual context
+ createContent(physicalFolderInVirtualContext,
+ "testFile1",
+ "0",
+ MimetypeMap.MIMETYPE_TEXT_PLAIN,
+ "UTF-8");
+
+ NodeRef childFileNodeRef = nodeService.getChildByName(physicalFolderInVirtualContext,
+ ContentModel.ASSOC_CONTAINS,
+ "testFile1");
+ assertNotNull(childFileNodeRef);
+ assertFalse(nodeService.hasAspect(childFileNodeRef,
+ VirtualContentModel.ASPECT_VIRTUAL));
+ assertFalse(nodeService.hasAspect(childFileNodeRef,
+ VirtualContentModel.ASPECT_VIRTUAL_DOCUMENT));
+
+ }
+
private NodeRef createDownloadNode()
{
NodeRef createDownloadNode = downloadStorage.createDownloadNode(true);
diff --git a/source/test-java/org/alfresco/repo/virtual/store/TypeVirtualizationMethodTest.java b/source/test-java/org/alfresco/repo/virtual/store/TypeVirtualizationMethodTest.java
index 265358ad4d..2da6d70494 100644
--- a/source/test-java/org/alfresco/repo/virtual/store/TypeVirtualizationMethodTest.java
+++ b/source/test-java/org/alfresco/repo/virtual/store/TypeVirtualizationMethodTest.java
@@ -1,11 +1,35 @@
+/*
+ * Copyright (C) 2005-2015 Alfresco Software Limited.
+ *
+ * This file is part of Alfresco
+ *
+ * Alfresco is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Alfresco is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Alfresco. If not, see http://www.gnu.org/licenses/.
+ */
package org.alfresco.repo.virtual.store;
import java.io.InputStream;
import java.io.Serializable;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import junit.framework.JUnit4TestAdapter;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
import org.alfresco.model.ContentModel;
import org.alfresco.repo.site.SiteModel;
import org.alfresco.repo.virtual.VirtualizationIntegrationTest;
@@ -23,218 +47,348 @@ import org.alfresco.repo.virtual.ref.ResourceProcessor;
import org.alfresco.repo.virtual.ref.VanillaProtocol;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
+import org.alfresco.service.namespace.NamespaceException;
+import org.alfresco.service.namespace.NamespacePrefixResolver;
+import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
-import org.junit.Test;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.mockito.Mockito;
+import org.mockito.internal.stubbing.answers.ThrowsException;
-public class TypeVirtualizationMethodTest extends VirtualizationIntegrationTest
+public class TypeVirtualizationMethodTest extends TestSuite
{
+ private static Log logger = LogFactory.getLog(TypeVirtualizationMethodTest.class);
+
private static final QName TEST_FOLDER_TYPE = SiteModel.TYPE_SITE;
private static final QName TEST_ASPECT = SiteModel.ASPECT_SITE_CONTAINER;
- private TypeVirtualizationMethod typeVirtualizationMethod;
-
- @Override
- protected void setUp() throws Exception
+ public static class Integration extends VirtualizationIntegrationTest
{
- super.setUp();
- typeVirtualizationMethod = ctx.getBean("typeVirtualizationMethod",
- TypeVirtualizationMethod.class);
- }
+ private TypeVirtualizationMethod typeVirtualizationMethod;
- @Override
- public void tearDown() throws Exception
- {
- super.tearDown();
- typeVirtualizationMethod.setQnameFilterRegexp(virtualizationConfigTestBootstrap
- .getTypeTemplatesQNameFilterRegexp());
- }
-
- @Test
- public void testRegExpFiltering() throws Exception
- {
- typeVirtualizationMethod.setQnameFilterRegexp("\\{.*site/1\\.0\\}site");
-
- ChildAssociationRef typedNodeAssocRef = createTypedNode(testRootFolder.getNodeRef(),
- "TypeVirtualized",
- TEST_FOLDER_TYPE);
- assertFalse(typeVirtualizationMethod.canVirtualize(environment,
- typedNodeAssocRef.getChildRef()));
-
- addTypeTemplate(TEST_FOLDER_TYPE,
- TEST_TEMPLATE_1_JS_CLASSPATH);
-
- assertTrue(typeVirtualizationMethod.canVirtualize(environment,
- typedNodeAssocRef.getChildRef()));
-
-
- typeVirtualizationMethod.setQnameFilterRegexp("\\{.*site/2\\.0\\}site");
-
- assertFalse(typeVirtualizationMethod.canVirtualize(environment,
- typedNodeAssocRef.getChildRef()));
-
- //invalid regexp
- typeVirtualizationMethod.setQnameFilterRegexp("{.*site/1\\.0\\}site");
-
- assertFalse(typeVirtualizationMethod.canVirtualize(environment,
- typedNodeAssocRef.getChildRef()));
-
- }
-
- public void testVirtualizeCmFolder_recusive() throws Exception
- {
- ChildAssociationRef templateContentChildRef = addTypeTemplate(ContentModel.TYPE_FOLDER,
- TEST_TEMPLATE_1_JS_CLASSPATH);
- virtualize(templateContentChildRef.getChildRef(),
- ContentModel.TYPE_FOLDER);
- }
-
- public void testCanVirtualize() throws Exception
- {
- ChildAssociationRef typedNodeAssocRef = createTypedNode(testRootFolder.getNodeRef(),
- "TypeVirtualized",
- TEST_FOLDER_TYPE);
- NodeRef typeNode = typedNodeAssocRef.getChildRef();
-
- assertFalse(typeVirtualizationMethod.canVirtualize(environment,
- typeNode));
-
- addTypeTemplate(TEST_FOLDER_TYPE,
- TEST_TEMPLATE_1_JS_CLASSPATH);
-
- assertTrue(typeVirtualizationMethod.canVirtualize(environment,
- typeNode));
-
- }
-
- public void testCanVirtualizeAspect() throws Exception
- {
- ChildAssociationRef aspectNodeAssocRef = createTypedNode(testRootFolder.getNodeRef(),
- "TypeVirtualized",
- ContentModel.TYPE_FOLDER);
- NodeRef aspectNode = aspectNodeAssocRef.getChildRef();
-
- nodeService.addAspect(aspectNode,
- TEST_ASPECT,
- Collections. emptyMap());
-
- assertFalse(typeVirtualizationMethod.canVirtualize(environment,
- aspectNode));
-
- addTypeTemplate(TEST_ASPECT,
- TEST_TEMPLATE_1_JS_CLASSPATH);
-
- assertTrue(typeVirtualizationMethod.canVirtualize(environment,
- aspectNode));
-
- }
-
- public void testVirtualizeAspect() throws Exception
- {
- ChildAssociationRef templateContentChildRef = addTypeTemplate(TEST_ASPECT,
- TEST_TEMPLATE_1_JS_CLASSPATH);
- virtualize(templateContentChildRef.getChildRef(),
- ContentModel.TYPE_FOLDER,
- TEST_ASPECT);
- }
-
- public void testVirtualizeType() throws Exception
- {
- ChildAssociationRef templateContentChildRef = addTypeTemplate(TEST_FOLDER_TYPE,
- TEST_TEMPLATE_1_JS_CLASSPATH);
-
- virtualize(templateContentChildRef.getChildRef(),
- TEST_FOLDER_TYPE);
- }
-
- private void virtualize(NodeRef expectedTemplateNodeRef, QName fodlerType, QName... aspects) throws Exception
- {
-
- ChildAssociationRef typedNodeAssocRef = createTypedNode(testRootFolder.getNodeRef(),
- "TypeVirtualized",
- fodlerType);
- NodeRef typeNode = typedNodeAssocRef.getChildRef();
-
- for (QName aspect : aspects)
+ @Override
+ protected void setUp() throws Exception
{
- nodeService.addAspect(typeNode,
- aspect,
- Collections. emptyMap());
+ super.setUp();
+ typeVirtualizationMethod = ctx.getBean("typeVirtualizationMethod",
+ TypeVirtualizationMethod.class);
}
- assertTrue(typeVirtualizationMethod.canVirtualize(environment,
- typeNode));
+ @Override
+ public void tearDown() throws Exception
+ {
+ super.tearDown();
+ typeVirtualizationMethod.setQnameFilters(virtualizationConfigTestBootstrap.getTypeTemplatesQNameFilter());
+ }
- Reference theVirtualizedNode = typeVirtualizationMethod.virtualize(environment,
- typeNode);
- assertEquals(Protocols.VANILLA.protocol,
- theVirtualizedNode.getProtocol());
+ public void testFiltering() throws Exception
+ {
+ typeVirtualizationMethod.setQnameFilters("st:site");
- List parameters = theVirtualizedNode.getParameters();
- ResourceParameter vanillaResourceParameter = (ResourceParameter) parameters
- .get(VanillaProtocol.VANILLA_TEMPLATE_PARAM_INDEX);
- Resource vanillaResource = vanillaResourceParameter.getValue();
+ ChildAssociationRef typedNodeAssocRef = createTypedNode(testRootFolder.getNodeRef(),
+ "TypeVirtualized",
+ TEST_FOLDER_TYPE);
+ NodeRef virtuaChildRef = typedNodeAssocRef.getChildRef();
+ assertFalse(typeVirtualizationMethod.canVirtualize(environment,
+ virtuaChildRef));
- NodeRef resourceNodeRef = vanillaResource.processWith(new ResourceProcessor()
+ addTypeTemplate(TEST_FOLDER_TYPE,
+ TEST_TEMPLATE_1_JS_CLASSPATH);
+
+ assertTrue(typeVirtualizationMethod.canVirtualize(environment,
+ virtuaChildRef));
+
+ try
+ {
+ // invalid prefix
+ typeVirtualizationMethod.setQnameFilters("invalid:site");
+ fail("Should not be able to se invalib filters.");
+ }
+ catch (IllegalArgumentException e)
+ {
+ // as expected
+ }
+
+ assertTrue(typeVirtualizationMethod.canVirtualize(environment,
+ virtuaChildRef));
+
+ typeVirtualizationMethod.setQnameFilters("alf:site");
+
+ assertFalse(typeVirtualizationMethod.canVirtualize(environment,
+ virtuaChildRef));
+
+ typeVirtualizationMethod.setQnameFilters("st:*");
+
+ assertTrue(typeVirtualizationMethod.canVirtualize(environment,
+ virtuaChildRef));
+
+ typeVirtualizationMethod.setQnameFilters("alf:site");
+
+ assertFalse(typeVirtualizationMethod.canVirtualize(environment,
+ virtuaChildRef));
+
+ typeVirtualizationMethod.setQnameFilters("*");
+
+ assertTrue(typeVirtualizationMethod.canVirtualize(environment,
+ virtuaChildRef));
+
+ typeVirtualizationMethod.setQnameFilters("none");
+
+ assertFalse(typeVirtualizationMethod.canVirtualize(environment,
+ virtuaChildRef));
+
+ }
+
+ public void testVirtualizeCmFolder_recusive() throws Exception
+ {
+ ChildAssociationRef templateContentChildRef = addTypeTemplate(ContentModel.TYPE_FOLDER,
+ TEST_TEMPLATE_1_JS_CLASSPATH);
+ virtualize(templateContentChildRef.getChildRef(),
+ ContentModel.TYPE_FOLDER);
+ }
+
+ public void testCanVirtualize() throws Exception
+ {
+ ChildAssociationRef typedNodeAssocRef = createTypedNode(testRootFolder.getNodeRef(),
+ "TypeVirtualized",
+ TEST_FOLDER_TYPE);
+ NodeRef typeNode = typedNodeAssocRef.getChildRef();
+
+ assertFalse(typeVirtualizationMethod.canVirtualize(environment,
+ typeNode));
+
+ addTypeTemplate(TEST_FOLDER_TYPE,
+ TEST_TEMPLATE_1_JS_CLASSPATH);
+
+ assertTrue(typeVirtualizationMethod.canVirtualize(environment,
+ typeNode));
+
+ }
+
+ public void testCanVirtualizeAspect() throws Exception
+ {
+ ChildAssociationRef aspectNodeAssocRef = createTypedNode(testRootFolder.getNodeRef(),
+ "TypeVirtualized",
+ ContentModel.TYPE_FOLDER);
+ NodeRef aspectNode = aspectNodeAssocRef.getChildRef();
+
+ nodeService.addAspect(aspectNode,
+ TEST_ASPECT,
+ Collections. emptyMap());
+
+ assertFalse(typeVirtualizationMethod.canVirtualize(environment,
+ aspectNode));
+
+ addTypeTemplate(TEST_ASPECT,
+ TEST_TEMPLATE_1_JS_CLASSPATH);
+
+ assertTrue(typeVirtualizationMethod.canVirtualize(environment,
+ aspectNode));
+
+ }
+
+ public void testVirtualizeAspect() throws Exception
+ {
+ ChildAssociationRef templateContentChildRef = addTypeTemplate(TEST_ASPECT,
+ TEST_TEMPLATE_1_JS_CLASSPATH);
+ virtualize(templateContentChildRef.getChildRef(),
+ ContentModel.TYPE_FOLDER,
+ TEST_ASPECT);
+ }
+
+ public void testVirtualizeType() throws Exception
+ {
+ ChildAssociationRef templateContentChildRef = addTypeTemplate(TEST_FOLDER_TYPE,
+ TEST_TEMPLATE_1_JS_CLASSPATH);
+
+ virtualize(templateContentChildRef.getChildRef(),
+ TEST_FOLDER_TYPE);
+ }
+
+ private void virtualize(NodeRef expectedTemplateNodeRef, QName fodlerType, QName... aspects) throws Exception
{
- @Override
- public NodeRef process(Resource resource) throws ResourceProcessingError
+ ChildAssociationRef typedNodeAssocRef = createTypedNode(testRootFolder.getNodeRef(),
+ "TypeVirtualized",
+ fodlerType);
+ NodeRef typeNode = typedNodeAssocRef.getChildRef();
+
+ for (QName aspect : aspects)
{
- fail("Inavlid resource type");
- return null;
+ nodeService.addAspect(typeNode,
+ aspect,
+ Collections. emptyMap());
}
- @Override
- public NodeRef process(ClasspathResource classpath) throws ResourceProcessingError
- {
- fail("Inavlid resource type");
- return null;
- }
+ assertTrue(typeVirtualizationMethod.canVirtualize(environment,
+ typeNode));
- @Override
- public NodeRef process(RepositoryResource repository) throws ResourceProcessingError
- {
- RepositoryLocation location = repository.getLocation();
- return location.asNodeRef(environment);
- }
- });
+ Reference theVirtualizedNode = typeVirtualizationMethod.virtualize(environment,
+ typeNode);
+ assertEquals(Protocols.VANILLA.protocol,
+ theVirtualizedNode.getProtocol());
- assertEquals(expectedTemplateNodeRef,
- resourceNodeRef);
+ List parameters = theVirtualizedNode.getParameters();
+ ResourceParameter vanillaResourceParameter = (ResourceParameter) parameters
+ .get(VanillaProtocol.VANILLA_TEMPLATE_PARAM_INDEX);
+ Resource vanillaResource = vanillaResourceParameter.getValue();
+
+ NodeRef resourceNodeRef = vanillaResource.processWith(new ResourceProcessor()
+ {
+
+ @Override
+ public NodeRef process(Resource resource) throws ResourceProcessingError
+ {
+ fail("Inavlid resource type");
+ return null;
+ }
+
+ @Override
+ public NodeRef process(ClasspathResource classpath) throws ResourceProcessingError
+ {
+ fail("Inavlid resource type");
+ return null;
+ }
+
+ @Override
+ public NodeRef process(RepositoryResource repository) throws ResourceProcessingError
+ {
+ RepositoryLocation location = repository.getLocation();
+ return location.asNodeRef(environment);
+ }
+ });
+
+ assertEquals(expectedTemplateNodeRef,
+ resourceNodeRef);
+ }
+
+ private synchronized ChildAssociationRef addTypeTemplate(QName theType, String cp)
+ {
+ NodeRefExpression templatesLocationExpr = virtualizationConfigTestBootstrap.getTypeTemplatesPath();
+ NodeRef templatesLocation = templatesLocationExpr.resolve();
+
+ assertNotNull(templatesLocation);
+
+ final String prefixedType = theType.toPrefixString(environment.getNamespacePrefixResolver());
+ String contentName = prefixedType;
+ contentName = contentName.replaceAll(":",
+ "_")
+ + ".json";
+
+ InputStream testTemplsteJsonIS = getClass().getResourceAsStream(cp);
+ ChildAssociationRef templateContentChildRef = createContent(templatesLocation,
+ contentName,
+ testTemplsteJsonIS,
+ "application/json",
+ "UTF-8",
+ ContentModel.TYPE_CONTENT);
+
+ typeVirtualizationMethod.setQnameFilters(prefixedType);
+
+ return templateContentChildRef;
+ }
}
- private synchronized ChildAssociationRef addTypeTemplate(QName theType, String cp)
+ public static class Unit extends TestCase
{
- NodeRefExpression templatesLocationExpr = virtualizationConfigTestBootstrap.getTypeTemplatesPath();
- NodeRef templatesLocation = templatesLocationExpr.resolve();
+ public void testQNameFiltersSetter_invalidFilters() throws Exception
+ {
+ assertIllegalQNameFilters(null,
+ this);
+ assertIllegalQNameFilters("",
+ this);
+ assertIllegalQNameFilters(":",
+ this);
+ assertIllegalQNameFilters("vm:",
+ this);
+ assertIllegalQNameFilters(":vm",
+ this);
+ assertIllegalQNameFilters("vm:fooBar,vm:",
+ this);
+ // undefined prefix
+ assertIllegalQNameFilters("vm:anAspect",
+ this);
+ }
- assertNotNull(templatesLocation);
+ public void testQNameFiltersSetter_validFilters() throws Exception
+ {
+ assertQNameFilters("st:site",
+ this);
+ assertQNameFilters("st:site,cm:folder",
+ this);
+ assertQNameFilters("st:site,cm:test-folder",
+ this);
+ assertQNameFilters("st:*",
+ this);
+ assertQNameFilters("st:*,cm:*",
+ this);
- final String prefixedType = theType.toPrefixString(environment.getNamespacePrefixResolver());
- String contentName = prefixedType;
- contentName = contentName.replaceAll(":",
- "_") + ".json";
+ assertQNameFilters("*",
+ this);
- InputStream testTemplsteJsonIS = getClass().getResourceAsStream(cp);
- ChildAssociationRef templateContentChildRef = createContent(templatesLocation,
- contentName,
- testTemplsteJsonIS,
- "application/json",
- "UTF-8",
- ContentModel.TYPE_CONTENT);
+ assertQNameFilters("none",
+ this);
- String regexp = theType.toString();
- regexp = regexp.replaceAll("\\{",
- "\\\\{");
- regexp = regexp.replaceAll("\\}",
- "\\\\}");
- regexp = regexp.replaceAll("\\:",
- "\\\\:");
- regexp = regexp.replaceAll("\\.",
- "\\\\.");
- typeVirtualizationMethod.setQnameFilterRegexp(regexp);
+ }
+ }
- return templateContentChildRef;
+ private static NamespacePrefixResolver mockNamespacePrefixResolver()
+ {
+ NamespacePrefixResolver mockNamespacePrefixResolver = Mockito.mock(NamespacePrefixResolver.class,
+
+ new ThrowsException(new NamespaceException("Mock exception ")));
+
+ Mockito
+ .doReturn(Arrays. asList(SiteModel.SITE_MODEL_PREFIX))
+ .when(mockNamespacePrefixResolver)
+ .getPrefixes(SiteModel.SITE_MODEL_URL);
+ Mockito.doReturn(SiteModel.SITE_MODEL_URL).when(mockNamespacePrefixResolver).getNamespaceURI(
+ SiteModel.SITE_MODEL_PREFIX);
+
+ Mockito
+ .doReturn(Arrays. asList(NamespaceService.CONTENT_MODEL_PREFIX))
+ .when(mockNamespacePrefixResolver)
+ .getPrefixes(NamespaceService.CONTENT_MODEL_1_0_URI);
+ Mockito.doReturn(NamespaceService.CONTENT_MODEL_1_0_URI).when(mockNamespacePrefixResolver).getNamespaceURI(
+ NamespaceService.CONTENT_MODEL_PREFIX);
+
+ Mockito
+ .doReturn("mock(NamespacePrefixResolver)@" + TypeVirtualizationMethod.class.toString())
+ .when(mockNamespacePrefixResolver)
+ .toString();
+ return mockNamespacePrefixResolver;
+ }
+
+ private static void assertIllegalQNameFilters(String filters, TestCase test)
+ {
+ TypeVirtualizationMethod tvm = new TypeVirtualizationMethod();
+ try
+ {
+ tvm.setNamespacePrefixResolver(mockNamespacePrefixResolver());
+ tvm.setQnameFilters(filters);
+ TestCase.fail("Should not be able to set filters string " + filters);
+ }
+ catch (IllegalArgumentException e)
+ {
+ // void as expected
+ logger.info(e.getMessage());
+ }
+ }
+
+ private static void assertQNameFilters(String filters, TestCase test)
+ {
+ TypeVirtualizationMethod tvm = new TypeVirtualizationMethod();
+ tvm.setNamespacePrefixResolver(mockNamespacePrefixResolver());
+ tvm.setQnameFilters(filters);
+ }
+
+ public static Test suite()
+ {
+ TestSuite suite = new TestSuite();
+ suite.addTest(new JUnit4TestAdapter(Integration.class));
+ suite.addTest(new JUnit4TestAdapter(Unit.class));
+ return suite;
}
}
diff --git a/source/test-java/org/alfresco/repo/virtual/template/ApplyTemplateMethodTest.java b/source/test-java/org/alfresco/repo/virtual/template/ApplyTemplateMethodTest.java
index 769f415c6d..c970f510aa 100644
--- a/source/test-java/org/alfresco/repo/virtual/template/ApplyTemplateMethodTest.java
+++ b/source/test-java/org/alfresco/repo/virtual/template/ApplyTemplateMethodTest.java
@@ -22,19 +22,69 @@ package org.alfresco.repo.virtual.template;
import java.nio.charset.StandardCharsets;
import java.util.List;
+import org.alfresco.model.ContentModel;
import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.virtual.VirtualizationIntegrationTest;
import org.alfresco.repo.virtual.ref.NewVirtualReferenceMethod;
import org.alfresco.repo.virtual.ref.Protocols;
import org.alfresco.repo.virtual.ref.Reference;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
+import org.alfresco.service.cmr.repository.NodeRef;
+import org.alfresco.service.cmr.repository.StoreRef;
+import org.alfresco.service.cmr.search.ResultSet;
+import org.alfresco.service.cmr.search.SearchParameters;
import org.junit.Test;
public class ApplyTemplateMethodTest extends VirtualizationIntegrationTest
{
+ @Test
+ public void testExecute_vanillaISO9075ActualPath() throws Exception
+ {
+ ChildAssociationRef iso9075FolderAssoc = createFolder(testRootFolder.getNodeRef(),
+ "Acutal ISO9075 Node");
+ NodeRef iso9075Folder = iso9075FolderAssoc.getChildRef();
+
+ NewVirtualReferenceMethod newVirtualReferenceMethod = new NewVirtualReferenceMethod(TEST_TEMPLATE_5_JSON_SYS_PATH,
+ "/",
+ iso9075Folder,
+ VANILLA_PROCESSOR_JS_CLASSPATH);
+
+ ApplyTemplateMethod applyTemplateMethod = new ApplyTemplateMethod(environment);
+
+ Reference ref = Protocols.VANILLA.protocol.dispatch(newVirtualReferenceMethod,
+ null);
+ VirtualFolderDefinition structure = ref.execute(applyTemplateMethod);
+
+ VirtualFolderDefinition sfp5 = structure.findChildByName("SpecialFilingPath5");
+ VirtualQuery query = sfp5.getQuery();
+
+ assertEquals("(PATH:'/app:company_home/cm:TestFolder/cm:Acutal_x0020_ISO9075_x0020_Node/cm:Space_x0020_Sub_x0020_Folder/*') and =cm:description:'SpecialFilingPath_5'",
+ query.getQueryString());
+
+ ChildAssociationRef iso9075SubFolderAssoc = createFolder(iso9075Folder,
+ "Space Sub Folder");
+
+ ChildAssociationRef someContentAssoc = createContent(iso9075SubFolderAssoc.getChildRef(),
+ "someContent");
+
+ nodeService.setProperty(someContentAssoc.getChildRef(),
+ ContentModel.PROP_DESCRIPTION,
+ "SpecialFilingPath_5");
+
+ // check query for validity
+ SearchParameters searchParameters = new SearchParameters();
+
+ searchParameters.setQuery(query.getQueryString());
+ searchParameters.addStore(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE);
+ searchParameters.setLanguage(query.getLanguage());
+ ResultSet qresult = searchService.query(searchParameters);
+ assertEquals(1,
+ qresult.getNumberFound());
+
+ }
@Test
- public void testExecuteSysClasspath() throws Exception
+ public void testExecute_virtualSysClasspath() throws Exception
{
ApplyTemplateMethod applyTemplateMethod = new ApplyTemplateMethod(environment);
@@ -66,7 +116,7 @@ public class ApplyTemplateMethodTest extends VirtualizationIntegrationTest
}
@Test
- public void testExecuteRepositoryJSON() throws Exception
+ public void testExecute_vanillaRepositoryJSON() throws Exception
{
ChildAssociationRef templateAssoc = createContent(testRootFolder.getNodeRef(),
"template1.json",
diff --git a/source/test-java/org/alfresco/repo/virtual/template/TemplateFilingRuleTest.java b/source/test-java/org/alfresco/repo/virtual/template/TemplateFilingRuleTest.java
index cf282a392f..468ee5d580 100644
--- a/source/test-java/org/alfresco/repo/virtual/template/TemplateFilingRuleTest.java
+++ b/source/test-java/org/alfresco/repo/virtual/template/TemplateFilingRuleTest.java
@@ -28,7 +28,7 @@ import org.junit.Test;
public class TemplateFilingRuleTest extends VirtualizationIntegrationTest
{
@Test
- public void testISO9075FilingSubPath() throws Exception
+ public void testFilingSubPath_specialCharacters() throws Exception
{
NodeRef vfNodeRef = createVirtualizedFolder(testRootFolder.getNodeRef(),
"Template 6 With Spaces",
@@ -56,7 +56,7 @@ public class TemplateFilingRuleTest extends VirtualizationIntegrationTest
}
@Test
- public void testISO9075FilingPath() throws Exception
+ public void testFilingPath_specialCharacters() throws Exception
{
NodeRef vfNodeRef = createVirtualizedFolder(testRootFolder.getNodeRef(),
"Template 6 With Spaces",
diff --git a/source/test-resources/org/alfresco/repo/virtual/template/testTemplate5.json b/source/test-resources/org/alfresco/repo/virtual/template/testTemplate5.json
index 34f702a6f7..caff443cb6 100644
--- a/source/test-resources/org/alfresco/repo/virtual/template/testTemplate5.json
+++ b/source/test-resources/org/alfresco/repo/virtual/template/testTemplate5.json
@@ -81,7 +81,7 @@
"description":"SpecialFilingPath5",
"search":{
"language":"fts-alfresco",
- "query":"=cm:description:'SpecialFilingPath_5'"
+ "query":"(PATH:'%ACTUAL_PATH%/cm:Space_x0020_Sub_x0020_Folder/*') and =cm:description:'SpecialFilingPath_5'"
},
"filing":{
"path":"%ACTUAL_PATH%/cm:Space_x0020_Sub_x0020_Folder",
diff --git a/source/test-resources/virtualization-test-context.xml b/source/test-resources/virtualization-test-context.xml
index 3abdf94d02..88290680fa 100644
--- a/source/test-resources/virtualization-test-context.xml
+++ b/source/test-resources/virtualization-test-context.xml
@@ -32,7 +32,7 @@
-
+