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 @@
- +