mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-10-15 15:02:20 +00:00
Merged BRANCHES/DEV/VF_REP_INT_51 to HEAD
ACE-4716 Can't rename a document in a virtual context from CMIS ACE-4752 Type virtualization method does not work ACE-4717 Document name is renamed when making "Check in" for a document edited in Google Docs ACE-4700 Can't upload to a virtual folder when filename starts with a number and includes dashes git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@119450 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -162,6 +162,14 @@ virtual.folders.enabled=true
|
|||||||
virtual.folders.model=alfresco/model/virtualization-model.xml
|
virtual.folders.model=alfresco/model/virtualization-model.xml
|
||||||
virtual.folders.model.labels=alfresco/messages/virtualization-model
|
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
|
#Generic virtualization methods config
|
||||||
|
|
||||||
@@ -174,17 +182,12 @@ virtual.folders.model.labels=alfresco/messages/virtualization-model
|
|||||||
|
|
||||||
#System virtualization method aspect.
|
#System virtualization method aspect.
|
||||||
#virtual.folders.config.system.aspect=vm:system-virtualization
|
#virtual.folders.config.system.aspect=vm:system-virtualization
|
||||||
|
|
||||||
#System virtualization method aspect defined template location property.
|
#System virtualization method aspect defined template location property.
|
||||||
#virtual.folders.config.system.aspect.template.location.property=vm:system-template-location
|
#virtual.folders.config.system.aspect.template.location.property=vm:system-template-location
|
||||||
|
|
||||||
#Classpath to be explored for *.json entries defining system templates.
|
#Classpath to be explored for *.json entries defining system templates.
|
||||||
#virtual.folders.config.system.templates.classpath=/org/alfresco/repo/virtual/node
|
#virtual.folders.config.system.templates.classpath=/org/alfresco/repo/virtual/node
|
||||||
|
|
||||||
#A company home relative name or qname path location of repository system templates.
|
#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}
|
#virtual.folders.config.system.templates.path=${spaces.dictionary.childname}/${spaces.virtualfolders.childname}
|
||||||
|
|
||||||
#Content sub type of repository system templates.
|
#Content sub type of repository system templates.
|
||||||
#virtual.folders.config.system.templates.template.type=vm:virtualFolderTemplate
|
#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.
|
#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}
|
#virtual.folders.config.type.templates.path=${spaces.dictionary.childname}/${spaces.virtualfolders.childname}
|
||||||
#Type and aspect qname regular expression filter.
|
#Type and aspect qname regular expression filter.
|
||||||
#virtual.folders.config.type.templates.qname.filter.regexp=\\{.*site/1\\.0\\}siteContainer|\\{.*claims_example/1.0\\}claimFolder
|
#virtual.folders.config.type.templates.qname.filter.regexp=st:siteContainer,clex:claimFolder
|
@@ -1109,7 +1109,7 @@ cmis.disable.hidden.leading.period.files=false
|
|||||||
|
|
||||||
#Virtual Folders Config Properties
|
#Virtual Folders Config Properties
|
||||||
|
|
||||||
virtual.folders.enabled=false
|
virtual.folders.enabled=true
|
||||||
virtual.folders.model=alfresco/model/virtualization-model.xml
|
virtual.folders.model=alfresco/model/virtualization-model.xml
|
||||||
virtual.folders.model.labels=alfresco/messages/virtualization-model
|
virtual.folders.model.labels=alfresco/messages/virtualization-model
|
||||||
|
|
||||||
@@ -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.
|
#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}
|
virtual.folders.config.type.templates.path=${spaces.dictionary.childname}/${spaces.virtualfolders.childname}
|
||||||
#Type and aspect qname regular expression filter.
|
#Type and aspect qname regular expression filter.
|
||||||
virtual.folders.config.type.templates.qname.filter.regexp=\\{.*site/1\\.0\\}siteContainer
|
virtual.folders.config.type.templates.qname.filter=none
|
@@ -115,7 +115,7 @@
|
|||||||
<property name="path" value="${virtual.folders.config.type.templates.path}" />
|
<property name="path" value="${virtual.folders.config.type.templates.path}" />
|
||||||
</bean>
|
</bean>
|
||||||
</property>
|
</property>
|
||||||
<property name="qnameFilterRegexp" value="${virtual.folders.config.type.templates.qname.filter.regexp}" />
|
<property name="qnameFilters" value="${virtual.folders.config.type.templates.qname.filter}" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="virtualStore" class="org.alfresco.repo.virtual.store.VirtualStoreImpl">
|
<bean id="virtualStore" class="org.alfresco.repo.virtual.store.VirtualStoreImpl">
|
||||||
|
@@ -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)
|
* @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"})
|
@Auditable(parameters = {"contextNodeRef", "files", "folders", "ignoreQNames", "sortProps", "pagingRequest"})
|
||||||
|
@Override
|
||||||
|
@Extend(traitAPI = FileFolderServiceTrait.class, extensionAPI = FileFolderServiceExtension.class)
|
||||||
public PagingResults<FileInfo> list(NodeRef contextNodeRef,
|
public PagingResults<FileInfo> list(NodeRef contextNodeRef,
|
||||||
boolean files,
|
boolean files,
|
||||||
boolean folders,
|
boolean folders,
|
||||||
@@ -1785,5 +1787,21 @@ public class FileFolderServiceImpl extends AbstractBaseCopyService implements Fi
|
|||||||
return thisService.rename(sourceNodeRef, newName);
|
return thisService.rename(sourceNodeRef, newName);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public PagingResults<FileInfo> list(NodeRef contextNodeRef,
|
||||||
|
boolean files,
|
||||||
|
boolean folders,
|
||||||
|
Set<QName> ignoreQNames,
|
||||||
|
List<Pair<QName, Boolean>> sortProps,
|
||||||
|
PagingRequest pagingRequest)
|
||||||
|
{
|
||||||
|
return thisService.list(contextNodeRef,
|
||||||
|
files,
|
||||||
|
folders,
|
||||||
|
ignoreQNames,
|
||||||
|
sortProps,
|
||||||
|
pagingRequest);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
* You should have received a copy of the GNU Lesser General Public License
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
* along with Alfresco. If not, see http://www.gnu.org/licenses/.
|
* along with Alfresco. If not, see http://www.gnu.org/licenses/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.alfresco.repo.model.filefolder.traitextender;
|
package org.alfresco.repo.model.filefolder.traitextender;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -37,6 +38,9 @@ public interface FileFolderServiceExtension
|
|||||||
PagingResults<FileInfo> list(NodeRef contextNodeRef, boolean files, boolean folders, String pattern,
|
PagingResults<FileInfo> list(NodeRef contextNodeRef, boolean files, boolean folders, String pattern,
|
||||||
Set<QName> ignoreQNames, List<Pair<QName, Boolean>> sortProps, PagingRequest pagingRequest);
|
Set<QName> ignoreQNames, List<Pair<QName, Boolean>> sortProps, PagingRequest pagingRequest);
|
||||||
|
|
||||||
|
PagingResults<FileInfo> list(NodeRef contextNodeRef, boolean files, boolean folders, Set<QName> ignoreQNames,
|
||||||
|
List<Pair<QName, Boolean>> sortProps, PagingRequest pagingRequest);
|
||||||
|
|
||||||
PagingResults<FileInfo> list(NodeRef rootNodeRef, Set<QName> searchTypeQNames, Set<QName> ignoreAspectQNames,
|
PagingResults<FileInfo> list(NodeRef rootNodeRef, Set<QName> searchTypeQNames, Set<QName> ignoreAspectQNames,
|
||||||
List<Pair<QName, Boolean>> sortProps, PagingRequest pagingRequest);
|
List<Pair<QName, Boolean>> sortProps, PagingRequest pagingRequest);
|
||||||
|
|
||||||
|
@@ -47,6 +47,9 @@ public interface FileFolderServiceTrait extends Trait
|
|||||||
PagingResults<FileInfo> list(final NodeRef contextNodeRef, boolean files, boolean folders, String pattern,
|
PagingResults<FileInfo> list(final NodeRef contextNodeRef, boolean files, boolean folders, String pattern,
|
||||||
Set<QName> ignoreQNames, List<Pair<QName, Boolean>> sortProps, PagingRequest pagingRequest);
|
Set<QName> ignoreQNames, List<Pair<QName, Boolean>> sortProps, PagingRequest pagingRequest);
|
||||||
|
|
||||||
|
PagingResults<FileInfo> list(NodeRef contextNodeRef, boolean files, boolean folders, Set<QName> ignoreQNames,
|
||||||
|
List<Pair<QName, Boolean>> sortProps, PagingRequest pagingRequest);
|
||||||
|
|
||||||
PagingResults<FileInfo> list(NodeRef rootNodeRef, Set<QName> searchTypeQNames, Set<QName> ignoreAspectQNames,
|
PagingResults<FileInfo> list(NodeRef rootNodeRef, Set<QName> searchTypeQNames, Set<QName> ignoreAspectQNames,
|
||||||
List<Pair<QName, Boolean>> sortProps, PagingRequest pagingRequest);
|
List<Pair<QName, Boolean>> sortProps, PagingRequest pagingRequest);
|
||||||
|
|
||||||
|
@@ -102,10 +102,9 @@ public interface ActualEnvironment
|
|||||||
|
|
||||||
FileInfo create(NodeRef parentNodeRef, String name, QName typeQName) throws FileExistsException;
|
FileInfo create(NodeRef parentNodeRef, String name, QName typeQName) throws FileExistsException;
|
||||||
|
|
||||||
ContentWriter getWriter(NodeRef nodeRef, QName propertyQName, boolean update) throws InvalidNodeRefException,
|
ContentWriter getWriter(NodeRef nodeRef, QName propertyQName, boolean update)
|
||||||
InvalidTypeException;
|
throws InvalidNodeRefException, InvalidTypeException;
|
||||||
|
|
||||||
void addAspect(NodeRef nodeRef, QName aspectTypeQName, Map<QName, Serializable> aspectProperties)
|
void addAspect(NodeRef nodeRef, QName aspectTypeQName, Map<QName, Serializable> aspectProperties)
|
||||||
throws InvalidNodeRefException, InvalidAspectException;
|
throws InvalidNodeRefException, InvalidAspectException;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -29,6 +29,7 @@ import org.alfresco.model.ContentModel;
|
|||||||
import org.alfresco.repo.jscript.ClasspathScriptLocation;
|
import org.alfresco.repo.jscript.ClasspathScriptLocation;
|
||||||
import org.alfresco.repo.model.Repository;
|
import org.alfresco.repo.model.Repository;
|
||||||
import org.alfresco.repo.virtual.config.NodeRefResolver;
|
import org.alfresco.repo.virtual.config.NodeRefResolver;
|
||||||
|
import org.alfresco.repo.virtual.ref.Reference;
|
||||||
import org.alfresco.service.ServiceRegistry;
|
import org.alfresco.service.ServiceRegistry;
|
||||||
import org.alfresco.service.cmr.dictionary.InvalidAspectException;
|
import org.alfresco.service.cmr.dictionary.InvalidAspectException;
|
||||||
import org.alfresco.service.cmr.dictionary.InvalidTypeException;
|
import org.alfresco.service.cmr.dictionary.InvalidTypeException;
|
||||||
|
@@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
package org.alfresco.repo.virtual;
|
package org.alfresco.repo.virtual;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@@ -26,6 +27,10 @@ import org.alfresco.repo.jscript.BaseScopableProcessorExtension;
|
|||||||
import org.alfresco.repo.jscript.ScriptNode;
|
import org.alfresco.repo.jscript.ScriptNode;
|
||||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||||
import org.alfresco.service.ServiceRegistry;
|
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.
|
* 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_PATH_PH = "ACTUAL_PATH";
|
||||||
|
|
||||||
|
public static final String ACTUAL_ISO9075_PATH_PH = "ACTUAL_ISO9075_PATH";
|
||||||
|
|
||||||
private VirtualContext context;
|
private VirtualContext context;
|
||||||
|
|
||||||
private ServiceRegistry serviceRegistry;
|
private ServiceRegistry serviceRegistry;
|
||||||
@@ -54,18 +61,70 @@ public class AlfrescoScriptVirtualContext extends BaseScopableProcessorExtension
|
|||||||
this.placeholders = createPlaceHolders();
|
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<String, String> cache = new HashMap<String, String>();
|
||||||
|
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<String> 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 placeholder interface. make placeholders configurable.
|
||||||
|
// TODO: extract open-close-configurable placeholders
|
||||||
private Map<String, String> createPlaceHolders()
|
private Map<String, String> createPlaceHolders()
|
||||||
{
|
{
|
||||||
Map<String, String> newPlaceholders = new HashMap<>();
|
Map<String, String> newPlaceholders = new HashMap<>();
|
||||||
String user = AuthenticationUtil.getFullyAuthenticatedUser();
|
String user = AuthenticationUtil.getFullyAuthenticatedUser();
|
||||||
|
|
||||||
// TODO: extract open-close-configurable placeholders
|
|
||||||
newPlaceholders.put(CURRENT_USER_PH,
|
newPlaceholders.put(CURRENT_USER_PH,
|
||||||
user);
|
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,
|
newPlaceholders.put(ACTUAL_PATH_PH,
|
||||||
getActualNode().getQnamePath());
|
paths[1]);
|
||||||
|
|
||||||
|
// newPlaceholders.put(ACTUAL_ISO9075_PATH_PH,
|
||||||
|
// paths[1]);
|
||||||
|
|
||||||
return newPlaceholders;
|
return newPlaceholders;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -48,10 +48,10 @@ import org.alfresco.service.cmr.model.FileInfo;
|
|||||||
import org.alfresco.service.cmr.model.FileNotFoundException;
|
import org.alfresco.service.cmr.model.FileNotFoundException;
|
||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
import org.alfresco.service.namespace.QName;
|
import org.alfresco.service.namespace.QName;
|
||||||
import org.alfresco.traitextender.SpringBeanExtension;
|
|
||||||
import org.alfresco.util.Pair;
|
import org.alfresco.util.Pair;
|
||||||
|
|
||||||
public class VirtualFileFolderServiceExtension extends SpringBeanExtension<FileFolderServiceExtension, FileFolderServiceTrait>
|
public class VirtualFileFolderServiceExtension
|
||||||
|
extends VirtualSpringBeanExtension<FileFolderServiceExtension, FileFolderServiceTrait>
|
||||||
implements FileFolderServiceExtension
|
implements FileFolderServiceExtension
|
||||||
{
|
{
|
||||||
private VirtualStore virtualStore;
|
private VirtualStore virtualStore;
|
||||||
@@ -154,8 +154,7 @@ public class VirtualFileFolderServiceExtension extends SpringBeanExtension<FileF
|
|||||||
Set<QName>[] searchAndIgnore = (Set<QName>[]) Array.newInstance(Set.class,
|
Set<QName>[] searchAndIgnore = (Set<QName>[]) Array.newInstance(Set.class,
|
||||||
3);
|
3);
|
||||||
|
|
||||||
Pair<Set<QName>, Set<QName>> searchTypesAndIgnoreAspects = getTrait()
|
Pair<Set<QName>, Set<QName>> searchTypesAndIgnoreAspects = getTrait().buildSearchTypesAndIgnoreAspects(files,
|
||||||
.buildSearchTypesAndIgnoreAspects(files,
|
|
||||||
folders,
|
folders,
|
||||||
ignoreQNames);
|
ignoreQNames);
|
||||||
if (searchTypesAndIgnoreAspects != null)
|
if (searchTypesAndIgnoreAspects != null)
|
||||||
@@ -235,8 +234,8 @@ public class VirtualFileFolderServiceExtension extends SpringBeanExtension<FileF
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
FileInfoPropsComparator comparator = (sortProps != null && !sortProps.isEmpty()) ? new FileInfoPropsComparator(sortProps)
|
FileInfoPropsComparator comparator = (sortProps != null && !sortProps.isEmpty())
|
||||||
: null;
|
? new FileInfoPropsComparator(sortProps) : null;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -287,8 +286,8 @@ public class VirtualFileFolderServiceExtension extends SpringBeanExtension<FileF
|
|||||||
}
|
}
|
||||||
|
|
||||||
public PagingResults<FileInfo> asFileInfoResults(ActualEnvironment environment,
|
public PagingResults<FileInfo> asFileInfoResults(ActualEnvironment environment,
|
||||||
final PagingResults<Reference> results, VirtualStore store) throws ReferenceEncodingException,
|
final PagingResults<Reference> results, VirtualStore store)
|
||||||
VirtualizationException
|
throws ReferenceEncodingException, VirtualizationException
|
||||||
{
|
{
|
||||||
|
|
||||||
List<Reference> virtualPage = results.getPage();
|
List<Reference> virtualPage = results.getPage();
|
||||||
@@ -493,4 +492,17 @@ public class VirtualFileFolderServiceExtension extends SpringBeanExtension<FileF
|
|||||||
newName);
|
newName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PagingResults<FileInfo> list(NodeRef contextNodeRef, boolean files, boolean folders, Set<QName> ignoreQNames,
|
||||||
|
List<Pair<QName, Boolean>> sortProps, PagingRequest pagingRequest)
|
||||||
|
{
|
||||||
|
|
||||||
|
return VirtualFileFolderServiceExtension.this.list(contextNodeRef,
|
||||||
|
files,
|
||||||
|
folders,
|
||||||
|
null,
|
||||||
|
ignoreQNames,
|
||||||
|
sortProps,
|
||||||
|
pagingRequest);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -66,12 +66,11 @@ import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter;
|
|||||||
import org.alfresco.service.namespace.QName;
|
import org.alfresco.service.namespace.QName;
|
||||||
import org.alfresco.service.namespace.QNamePattern;
|
import org.alfresco.service.namespace.QNamePattern;
|
||||||
import org.alfresco.service.namespace.RegexQNamePattern;
|
import org.alfresco.service.namespace.RegexQNamePattern;
|
||||||
import org.alfresco.traitextender.SpringBeanExtension;
|
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
|
||||||
public class VirtualNodeServiceExtension extends SpringBeanExtension<NodeServiceExtension, NodeServiceTrait>
|
public class VirtualNodeServiceExtension extends VirtualSpringBeanExtension<NodeServiceExtension, NodeServiceTrait>
|
||||||
implements NodeServiceExtension
|
implements NodeServiceExtension
|
||||||
{
|
{
|
||||||
private static Log logger = LogFactory.getLog(VirtualNodeServiceExtension.class);
|
private static Log logger = LogFactory.getLog(VirtualNodeServiceExtension.class);
|
||||||
@@ -102,13 +101,14 @@ public class VirtualNodeServiceExtension extends SpringBeanExtension<NodeService
|
|||||||
{
|
{
|
||||||
if (Reference.isReference(nodeRef))
|
if (Reference.isReference(nodeRef))
|
||||||
{
|
{
|
||||||
|
boolean isNodeProtocol = Reference.fromNodeRef(nodeRef).getProtocol().equals(Protocols.NODE.protocol);
|
||||||
if (VirtualContentModel.ASPECT_VIRTUAL.equals(aspectQName))
|
if (VirtualContentModel.ASPECT_VIRTUAL.equals(aspectQName))
|
||||||
{
|
{
|
||||||
return true;
|
return !isNodeProtocol;
|
||||||
}
|
}
|
||||||
else if (VirtualContentModel.ASPECT_VIRTUAL_DOCUMENT.equals(aspectQName) && Reference.fromNodeRef(nodeRef).getProtocol().equals(Protocols.NODE.protocol))
|
else if (VirtualContentModel.ASPECT_VIRTUAL_DOCUMENT.equals(aspectQName))
|
||||||
{
|
{
|
||||||
return true;
|
return isNodeProtocol;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -258,22 +258,13 @@ public class VirtualNodeServiceExtension extends SpringBeanExtension<NodeService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isVirtualContextFolder(NodeRef nodeRef)
|
|
||||||
{
|
|
||||||
|
|
||||||
boolean isReference=Reference.isReference(nodeRef);
|
|
||||||
boolean isFolder=environment.isSubClass(environment.getType(nodeRef),
|
|
||||||
ContentModel.TYPE_FOLDER);
|
|
||||||
boolean virtualContext=hasAspect(nodeRef,VirtualContentModel.ASPECT_VIRTUAL_DOCUMENT);
|
|
||||||
return isReference && isFolder && virtualContext;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ChildAssociationRef createNode(NodeRef parentRef, QName assocTypeQName, QName assocQName,
|
public ChildAssociationRef createNode(NodeRef parentRef, QName assocTypeQName, QName assocQName,
|
||||||
QName nodeTypeQName, Map<QName, Serializable> properties)
|
QName nodeTypeQName, Map<QName, Serializable> properties)
|
||||||
{
|
{
|
||||||
NodeServiceTrait theTrait = getTrait();
|
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
|
// CM-533 Suppress options to create folders in a virtual folder
|
||||||
// (repo)
|
// (repo)
|
||||||
@@ -357,7 +348,9 @@ public class VirtualNodeServiceExtension extends SpringBeanExtension<NodeService
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
QName materialAssocQName = materializeAssocQName(assocQName);
|
QName materialAssocQName = materializeAssocQName(assocQName);
|
||||||
if(isVirtualContextFolder(parentRef)){
|
if (isVirtualContextFolder(parentRef,
|
||||||
|
environment))
|
||||||
|
{
|
||||||
parentRef = virtualStore.materializeIfPossible(parentRef);
|
parentRef = virtualStore.materializeIfPossible(parentRef);
|
||||||
}
|
}
|
||||||
return theTrait.createNode(parentRef,
|
return theTrait.createNode(parentRef,
|
||||||
|
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* 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.bundle;
|
||||||
|
|
||||||
|
import org.alfresco.model.ContentModel;
|
||||||
|
import org.alfresco.repo.virtual.ActualEnvironment;
|
||||||
|
import org.alfresco.repo.virtual.VirtualContentModel;
|
||||||
|
import org.alfresco.repo.virtual.ref.Reference;
|
||||||
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
|
import org.alfresco.traitextender.SpringBeanExtension;
|
||||||
|
import org.alfresco.traitextender.Trait;
|
||||||
|
|
||||||
|
public abstract class VirtualSpringBeanExtension<E, T extends Trait> extends SpringBeanExtension<E, T>
|
||||||
|
{
|
||||||
|
public VirtualSpringBeanExtension(Class<T> 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;
|
||||||
|
}
|
||||||
|
}
|
@@ -19,7 +19,10 @@
|
|||||||
|
|
||||||
package org.alfresco.repo.virtual.store;
|
package org.alfresco.repo.virtual.store;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
import java.util.regex.PatternSyntaxException;
|
import java.util.regex.PatternSyntaxException;
|
||||||
|
|
||||||
import org.alfresco.model.ContentModel;
|
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.Protocols;
|
||||||
import org.alfresco.repo.virtual.ref.Reference;
|
import org.alfresco.repo.virtual.ref.Reference;
|
||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
|
import org.alfresco.service.namespace.NamespaceException;
|
||||||
import org.alfresco.service.namespace.NamespacePrefixResolver;
|
import org.alfresco.service.namespace.NamespacePrefixResolver;
|
||||||
import org.alfresco.service.namespace.QName;
|
import org.alfresco.service.namespace.QName;
|
||||||
import org.alfresco.service.namespace.QNamePattern;
|
import org.alfresco.service.namespace.QNamePattern;
|
||||||
import org.alfresco.service.namespace.RegexQNamePattern;
|
import org.alfresco.service.namespace.RegexQNamePattern;
|
||||||
|
import org.alfresco.util.ParameterCheck;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
|
||||||
@@ -64,7 +69,20 @@ public class TypeVirtualizationMethod extends TemplateVirtualizationMethod
|
|||||||
|
|
||||||
private NodeRefExpression templatesPath;
|
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.<br>
|
* Thread local solving template in process indicator.<br>
|
||||||
@@ -81,12 +99,120 @@ public class TypeVirtualizationMethod extends TemplateVirtualizationMethod
|
|||||||
|
|
||||||
public void init()
|
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<QNamePattern> 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 <prefix>:<name> | <prefix>:'*' 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)
|
public void setTemplatesPath(NodeRefExpression templatesPath)
|
||||||
@@ -97,6 +223,8 @@ public class TypeVirtualizationMethod extends TemplateVirtualizationMethod
|
|||||||
public void setNamespacePrefixResolver(NamespacePrefixResolver resolver)
|
public void setNamespacePrefixResolver(NamespacePrefixResolver resolver)
|
||||||
{
|
{
|
||||||
this.namespacePrefixResolver = resolver;
|
this.namespacePrefixResolver = resolver;
|
||||||
|
|
||||||
|
resetFilters();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -129,6 +257,19 @@ public class TypeVirtualizationMethod extends TemplateVirtualizationMethod
|
|||||||
return typeTemplateContentName + extension;
|
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)
|
private NodeRef templateNodeFor(ActualEnvironment env, NodeRef nodeRef)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -140,7 +281,7 @@ public class TypeVirtualizationMethod extends TemplateVirtualizationMethod
|
|||||||
}
|
}
|
||||||
NodeRef templateNode = null;
|
NodeRef templateNode = null;
|
||||||
QName nodeType = env.getType(nodeRef);
|
QName nodeType = env.getType(nodeRef);
|
||||||
if (qnamePattern.isMatch(nodeType))
|
if (isAnyFilterMatch(nodeType))
|
||||||
{
|
{
|
||||||
String typeTemplateNodeName = templateNodeNameForType(nodeType);
|
String typeTemplateNodeName = templateNodeNameForType(nodeType);
|
||||||
|
|
||||||
@@ -155,7 +296,7 @@ public class TypeVirtualizationMethod extends TemplateVirtualizationMethod
|
|||||||
for (QName aspect : aspects)
|
for (QName aspect : aspects)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (qnamePattern.isMatch(aspect))
|
if (isAnyFilterMatch(aspect))
|
||||||
{
|
{
|
||||||
String aspectTemplateNodeName = templateNodeNameForType(aspect);
|
String aspectTemplateNodeName = templateNodeNameForType(aspect);
|
||||||
templateNode = env.getChildByName(templatesContainerNode,
|
templateNode = env.getChildByName(templatesContainerNode,
|
||||||
@@ -175,7 +316,8 @@ public class TypeVirtualizationMethod extends TemplateVirtualizationMethod
|
|||||||
}
|
}
|
||||||
catch (PatternSyntaxException e)
|
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;
|
return null;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
@@ -61,6 +61,7 @@ import org.alfresco.repo.virtual.template.FilesFoldersConstraint;
|
|||||||
import org.alfresco.repo.virtual.template.FilingData;
|
import org.alfresco.repo.virtual.template.FilingData;
|
||||||
import org.alfresco.repo.virtual.template.FilingParameters;
|
import org.alfresco.repo.virtual.template.FilingParameters;
|
||||||
import org.alfresco.repo.virtual.template.FilingRule;
|
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.PropertyValueConstraint;
|
||||||
import org.alfresco.repo.virtual.template.NullFilingRule;
|
import org.alfresco.repo.virtual.template.NullFilingRule;
|
||||||
import org.alfresco.repo.virtual.template.VirtualFolderDefinition;
|
import org.alfresco.repo.virtual.template.VirtualFolderDefinition;
|
||||||
@@ -548,7 +549,7 @@ public class VirtualStoreImpl implements VirtualStore, VirtualFolderDefinitionRe
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
vqConstraint = new PropertyValueConstraint(new FilesFoldersConstraint(BasicConstraint.INSTANCE,
|
vqConstraint = new NamePatternPropertyValueConstraint(new FilesFoldersConstraint(BasicConstraint.INSTANCE,
|
||||||
true,
|
true,
|
||||||
true),
|
true),
|
||||||
ContentModel.PROP_NAME,
|
ContentModel.PROP_NAME,
|
||||||
|
@@ -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<value.toString().length();i++){
|
||||||
|
if(SearchLanguageConversion.DEF_LUCENE.isReserved(value.toString().charAt(i))){
|
||||||
|
luceneReserved.append(value.toString().charAt(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String luceneReservedStr=luceneReserved.toString();
|
||||||
|
String pattern =org.alfresco.util.ISO9075.encode(value.toString());
|
||||||
|
for (int i = 0; i < luceneReservedStr.length(); i++)
|
||||||
|
{
|
||||||
|
pattern = pattern.replace(org.alfresco.util.ISO9075.encode(luceneReservedStr.substring(i,i + 1)),
|
||||||
|
luceneReservedStr.substring(i,i + 1));
|
||||||
|
}
|
||||||
|
filePattern=SearchLanguageConversion.escapeForLucene(pattern);
|
||||||
|
|
||||||
|
SearchParameters constrainedParameters = searchParameters.copy();
|
||||||
|
String theQuery = constrainedParameters.getQuery();
|
||||||
|
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append("(" + theQuery + ")");
|
||||||
|
sb.append(" and (");
|
||||||
|
sb.append("TEXT:(").append(filePattern).append(") ");
|
||||||
|
sb.append("or (");
|
||||||
|
sb.append(" =").append(property.toPrefixString(this.nspResolver));
|
||||||
|
sb.append(":").append(filePattern);
|
||||||
|
sb.append(" ) ");
|
||||||
|
sb.append(")");
|
||||||
|
theQuery = sb.toString();
|
||||||
|
constrainedParameters.setQuery(theQuery);
|
||||||
|
|
||||||
|
return constrainedParameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -72,7 +72,7 @@ public class PropertyValueConstraint extends VirtualQueryConstraintDecorator
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private SearchParameters applyFTS(SearchParameters searchParameters)
|
protected SearchParameters applyFTS(SearchParameters searchParameters)
|
||||||
{
|
{
|
||||||
SearchParameters constrainedParameters = searchParameters.copy();
|
SearchParameters constrainedParameters = searchParameters.copy();
|
||||||
String theQuery = constrainedParameters.getQuery();
|
String theQuery = constrainedParameters.getQuery();
|
||||||
@@ -80,7 +80,7 @@ public class PropertyValueConstraint extends VirtualQueryConstraintDecorator
|
|||||||
// TODO: introduce and use operator
|
// TODO: introduce and use operator
|
||||||
|
|
||||||
theQuery = "(" + theQuery + ")" + " and " + "( " + "=" + property.toPrefixString(this.nspResolver) + ":"
|
theQuery = "(" + theQuery + ")" + " and " + "( " + "=" + property.toPrefixString(this.nspResolver) + ":"
|
||||||
+ org.alfresco.util.ISO9075.encode(value.toString()) + " )";
|
+"\""+value.toString() + "\" )";
|
||||||
|
|
||||||
constrainedParameters.setQuery(theQuery);
|
constrainedParameters.setQuery(theQuery);
|
||||||
|
|
||||||
|
@@ -19,8 +19,6 @@
|
|||||||
|
|
||||||
package org.alfresco.repo.virtual.template;
|
package org.alfresco.repo.virtual.template;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@@ -23,6 +23,7 @@ import java.util.LinkedList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.alfresco.model.ContentModel;
|
||||||
import org.alfresco.query.PagingRequest;
|
import org.alfresco.query.PagingRequest;
|
||||||
import org.alfresco.query.PagingResults;
|
import org.alfresco.query.PagingResults;
|
||||||
import org.alfresco.repo.search.EmptyResultSet;
|
import org.alfresco.repo.search.EmptyResultSet;
|
||||||
@@ -109,6 +110,12 @@ public class VirtualQueryImpl implements VirtualQuery
|
|||||||
constraint = new FilesFoldersConstraint(constraint,
|
constraint = new FilesFoldersConstraint(constraint,
|
||||||
files,
|
files,
|
||||||
folders);
|
folders);
|
||||||
|
if(pattern != null){
|
||||||
|
constraint = new NamePatternPropertyValueConstraint(constraint,
|
||||||
|
ContentModel.PROP_NAME,
|
||||||
|
pattern,
|
||||||
|
environment.getNamespacePrefixResolver());
|
||||||
|
}
|
||||||
constraint = new IgnoreConstraint(constraint,
|
constraint = new IgnoreConstraint(constraint,
|
||||||
ignoreTypeQNames,
|
ignoreTypeQNames,
|
||||||
ignoreAspectQNames);
|
ignoreAspectQNames);
|
||||||
|
@@ -34,16 +34,16 @@ public class VirtualizationConfigTestBootstrap
|
|||||||
private NodeRefExpression downloadAssocaiationsFolder;
|
private NodeRefExpression downloadAssocaiationsFolder;
|
||||||
|
|
||||||
|
|
||||||
private String typeTemplatesQNameFilterRegexp;
|
private String typeTemplatesQNameFilter;
|
||||||
|
|
||||||
public void setTypeTemplatesQNameFilterRegexp(String typeTemplatesQNameFilterRegexp)
|
public void setTypeTemplatesQNameFilter(String typeTemplatesQNameFilterRegexp)
|
||||||
{
|
{
|
||||||
this.typeTemplatesQNameFilterRegexp = typeTemplatesQNameFilterRegexp;
|
this.typeTemplatesQNameFilter = typeTemplatesQNameFilterRegexp;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getTypeTemplatesQNameFilterRegexp()
|
public String getTypeTemplatesQNameFilter()
|
||||||
{
|
{
|
||||||
return this.typeTemplatesQNameFilterRegexp;
|
return this.typeTemplatesQNameFilter;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTypeTemplatesPath(NodeRefExpression typeTemplatesPath)
|
public void setTypeTemplatesPath(NodeRefExpression typeTemplatesPath)
|
||||||
|
@@ -38,7 +38,6 @@ import org.alfresco.model.ContentModel;
|
|||||||
import org.alfresco.repo.forms.FormData;
|
import org.alfresco.repo.forms.FormData;
|
||||||
import org.alfresco.repo.forms.Item;
|
import org.alfresco.repo.forms.Item;
|
||||||
import org.alfresco.repo.model.Repository;
|
import org.alfresco.repo.model.Repository;
|
||||||
import org.alfresco.repo.node.integrity.IntegrityChecker;
|
|
||||||
import org.alfresco.repo.security.authentication.AuthenticationComponent;
|
import org.alfresco.repo.security.authentication.AuthenticationComponent;
|
||||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||||
import org.alfresco.repo.transaction.RetryingTransactionHelper;
|
import org.alfresco.repo.transaction.RetryingTransactionHelper;
|
||||||
@@ -53,6 +52,7 @@ import org.alfresco.service.cmr.repository.ContentWriter;
|
|||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
import org.alfresco.service.cmr.repository.NodeService;
|
import org.alfresco.service.cmr.repository.NodeService;
|
||||||
import org.alfresco.service.cmr.repository.StoreRef;
|
import org.alfresco.service.cmr.repository.StoreRef;
|
||||||
|
import org.alfresco.service.cmr.search.SearchService;
|
||||||
import org.alfresco.service.cmr.security.PermissionService;
|
import org.alfresco.service.cmr.security.PermissionService;
|
||||||
import org.alfresco.service.namespace.NamespaceService;
|
import org.alfresco.service.namespace.NamespaceService;
|
||||||
import org.alfresco.service.namespace.QName;
|
import org.alfresco.service.namespace.QName;
|
||||||
@@ -129,45 +129,73 @@ public abstract class VirtualizationIntegrationTest extends TestCase implements
|
|||||||
|
|
||||||
protected static final ApplicationContext ctx = ApplicationContextHelper.getApplicationContext(CONFIG_LOCATIONS);
|
protected static final ApplicationContext ctx = ApplicationContextHelper.getApplicationContext(CONFIG_LOCATIONS);
|
||||||
|
|
||||||
protected ContentService contentService;
|
|
||||||
|
|
||||||
private TransactionService transactionService;
|
|
||||||
|
|
||||||
protected FileInfo testRootFolder;
|
|
||||||
|
|
||||||
protected FileFolderService fileAndFolderService;
|
protected FileFolderService fileAndFolderService;
|
||||||
|
|
||||||
protected ActualEnvironment environment;
|
protected ContentService contentService;
|
||||||
|
|
||||||
protected NodeRef virtualFolder1NodeRef;
|
protected TransactionService transactionService;
|
||||||
|
|
||||||
protected NodeService nodeService;
|
protected NodeService nodeService;
|
||||||
|
|
||||||
|
protected PermissionService permissionService;
|
||||||
|
|
||||||
|
protected SearchService searchService;
|
||||||
|
|
||||||
protected RetryingTransactionHelper retryingTransactionHelper;
|
protected RetryingTransactionHelper retryingTransactionHelper;
|
||||||
|
|
||||||
|
protected FileInfo testRootFolder;
|
||||||
|
|
||||||
|
protected NodeRef virtualFolder1NodeRef;
|
||||||
|
|
||||||
|
protected NodeRef rootNodeRef;
|
||||||
|
|
||||||
|
protected ActualEnvironment environment;
|
||||||
|
|
||||||
protected TypeAndAspectsFormProcessor typeAndAspectsFormProcessor;
|
protected TypeAndAspectsFormProcessor typeAndAspectsFormProcessor;
|
||||||
|
|
||||||
private UserTransaction txn;
|
private UserTransaction txn;
|
||||||
|
|
||||||
protected AuthenticationComponent authenticationComponent;
|
protected AuthenticationComponent authenticationComponent;
|
||||||
|
|
||||||
protected PermissionService permissionService;
|
|
||||||
|
|
||||||
/** The root node reference */
|
|
||||||
protected NodeRef rootNodeRef;
|
|
||||||
|
|
||||||
protected VirtualizationConfigTestBootstrap virtualizationConfigTestBootstrap;
|
protected VirtualizationConfigTestBootstrap virtualizationConfigTestBootstrap;
|
||||||
|
|
||||||
protected String configuredTemplatesClassPath = null;
|
|
||||||
|
|
||||||
protected SystemTemplateLocationsConstraint constraints;
|
protected SystemTemplateLocationsConstraint constraints;
|
||||||
|
|
||||||
|
/** when set to a not-null value will be restored up[on {@link #tearDown()} */
|
||||||
|
protected String configuredTemplatesClassPath = null;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void setUp() throws Exception
|
protected void setUp() throws Exception
|
||||||
{
|
{
|
||||||
virtualizationConfigTestBootstrap = ctx.getBean(VIRTUALIZATION_CONFIG_TEST_BOOTSTRAP_BEAN_ID,
|
virtualizationConfigTestBootstrap = ctx.getBean(VIRTUALIZATION_CONFIG_TEST_BOOTSTRAP_BEAN_ID,
|
||||||
VirtualizationConfigTestBootstrap.class);
|
VirtualizationConfigTestBootstrap.class);
|
||||||
|
|
||||||
|
// Get the required services
|
||||||
|
ServiceRegistry serviceRegistry = (ServiceRegistry) ctx.getBean("ServiceRegistry");
|
||||||
|
|
||||||
|
transactionService = serviceRegistry.getTransactionService();
|
||||||
|
retryingTransactionHelper = serviceRegistry.getRetryingTransactionHelper();
|
||||||
|
nodeService = serviceRegistry.getNodeService();
|
||||||
|
contentService = serviceRegistry.getContentService();
|
||||||
|
fileAndFolderService = serviceRegistry.getFileFolderService();
|
||||||
|
permissionService = serviceRegistry.getPermissionService();
|
||||||
|
searchService=serviceRegistry.getSearchService();
|
||||||
|
|
||||||
|
authenticationComponent = ctx.getBean("authenticationComponent",
|
||||||
|
AuthenticationComponent.class);
|
||||||
|
|
||||||
|
environment = ctx.getBean("actualEnvironment",
|
||||||
|
ActualEnvironment.class);
|
||||||
|
|
||||||
|
typeAndAspectsFormProcessor = ctx.getBean("typeAndAspectsFormProcessor",
|
||||||
|
TypeAndAspectsFormProcessor.class);
|
||||||
|
|
||||||
|
constraints = ctx.getBean("systemTemplateLocations",
|
||||||
|
SystemTemplateLocationsConstraint.class);
|
||||||
|
|
||||||
|
Repository repository = ctx.getBean("repositoryHelper",
|
||||||
|
Repository.class);
|
||||||
|
|
||||||
if (!virtualizationConfigTestBootstrap.areVirtualFoldersEnabled())
|
if (!virtualizationConfigTestBootstrap.areVirtualFoldersEnabled())
|
||||||
{
|
{
|
||||||
// "use the force" and enable virtual folders
|
// "use the force" and enable virtual folders
|
||||||
@@ -180,23 +208,7 @@ public abstract class VirtualizationIntegrationTest extends TestCase implements
|
|||||||
logger.info("Virtual folders are spring-enabled.");
|
logger.info("Virtual folders are spring-enabled.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the required services
|
|
||||||
ServiceRegistry serviceRegistry = (ServiceRegistry) ctx.getBean("ServiceRegistry");
|
|
||||||
transactionService = serviceRegistry.getTransactionService();
|
|
||||||
authenticationComponent = (AuthenticationComponent) ctx.getBean("authenticationComponent");
|
|
||||||
retryingTransactionHelper = (RetryingTransactionHelper) ctx.getBean("retryingTransactionHelper");
|
|
||||||
this.authenticationComponent.setSystemUserAsCurrentUser();
|
this.authenticationComponent.setSystemUserAsCurrentUser();
|
||||||
permissionService = (PermissionService) ctx.getBean("PermissionService");
|
|
||||||
|
|
||||||
contentService = ctx.getBean("contentService",
|
|
||||||
ContentService.class);
|
|
||||||
environment = ctx.getBean("actualEnvironment",
|
|
||||||
ActualEnvironment.class);
|
|
||||||
|
|
||||||
fileAndFolderService = serviceRegistry.getFileFolderService();
|
|
||||||
|
|
||||||
Repository repository = ctx.getBean("repositoryHelper",
|
|
||||||
Repository.class);
|
|
||||||
|
|
||||||
// start the transaction
|
// start the transaction
|
||||||
txn = transactionService.getUserTransaction();
|
txn = transactionService.getUserTransaction();
|
||||||
@@ -207,12 +219,6 @@ public abstract class VirtualizationIntegrationTest extends TestCase implements
|
|||||||
testRootFolder = fileAndFolderService.create(root,
|
testRootFolder = fileAndFolderService.create(root,
|
||||||
TEST_ROOT_FOLDER_NAME,
|
TEST_ROOT_FOLDER_NAME,
|
||||||
ContentModel.TYPE_FOLDER);
|
ContentModel.TYPE_FOLDER);
|
||||||
nodeService = ctx.getBean("nodeService",
|
|
||||||
NodeService.class);
|
|
||||||
typeAndAspectsFormProcessor = ctx.getBean("typeAndAspectsFormProcessor",
|
|
||||||
TypeAndAspectsFormProcessor.class);
|
|
||||||
constraints = ctx.getBean("systemTemplateLocations",
|
|
||||||
SystemTemplateLocationsConstraint.class);
|
|
||||||
|
|
||||||
virtualFolder1NodeRef = createVirtualizedFolder(testRootFolder.getNodeRef(),
|
virtualFolder1NodeRef = createVirtualizedFolder(testRootFolder.getNodeRef(),
|
||||||
VIRTUAL_FOLDER_1_NAME,
|
VIRTUAL_FOLDER_1_NAME,
|
||||||
|
@@ -38,15 +38,12 @@ import org.alfresco.repo.virtual.store.VirtualStoreImplTest;
|
|||||||
import org.alfresco.repo.virtual.template.ApplyTemplateMethodTest;
|
import org.alfresco.repo.virtual.template.ApplyTemplateMethodTest;
|
||||||
import org.alfresco.repo.virtual.template.TemplateFilingRuleTest;
|
import org.alfresco.repo.virtual.template.TemplateFilingRuleTest;
|
||||||
import org.alfresco.repo.virtual.template.TemplateResourceProcessorTest;
|
import org.alfresco.repo.virtual.template.TemplateResourceProcessorTest;
|
||||||
import org.alfresco.util.ApplicationContextHelper;
|
|
||||||
import org.springframework.context.ApplicationContext;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Bogdan Horje
|
* @author Bogdan Horje
|
||||||
*/
|
*/
|
||||||
public class VirtualizationIntegrationTestSuite extends TestSuite implements VirtualizationTest
|
public class VirtualizationIntegrationTestSuite extends TestSuite implements VirtualizationTest
|
||||||
{
|
{
|
||||||
protected static final ApplicationContext ctx = ApplicationContextHelper.getApplicationContext(CONFIG_LOCATIONS);
|
|
||||||
|
|
||||||
public static Test suite()
|
public static Test suite()
|
||||||
{
|
{
|
||||||
@@ -62,7 +59,7 @@ public class VirtualizationIntegrationTestSuite extends TestSuite implements Vir
|
|||||||
suite.addTest(new JUnit4TestAdapter(ApplyTemplateMethodTest.class));
|
suite.addTest(new JUnit4TestAdapter(ApplyTemplateMethodTest.class));
|
||||||
suite.addTest(new JUnit4TestAdapter(SystemTemplateLocationsConstraintTest.class));
|
suite.addTest(new JUnit4TestAdapter(SystemTemplateLocationsConstraintTest.class));
|
||||||
suite.addTest(new JUnit4TestAdapter(SystemVirtualizationMethodTest.class));
|
suite.addTest(new JUnit4TestAdapter(SystemVirtualizationMethodTest.class));
|
||||||
suite.addTest(new JUnit4TestAdapter(TypeVirtualizationMethodTest.class));
|
suite.addTest(new JUnit4TestAdapter(TypeVirtualizationMethodTest.Integration.class));
|
||||||
suite.addTest(new JUnit4TestAdapter(TemplateResourceProcessorTest.class));
|
suite.addTest(new JUnit4TestAdapter(TemplateResourceProcessorTest.class));
|
||||||
suite.addTest(new JUnit4TestAdapter(VirtualStoreImplTest.class));
|
suite.addTest(new JUnit4TestAdapter(VirtualStoreImplTest.class));
|
||||||
suite.addTest(new JUnit4TestAdapter(NodeRefPathExpressionTest.class));
|
suite.addTest(new JUnit4TestAdapter(NodeRefPathExpressionTest.class));
|
||||||
|
@@ -43,5 +43,6 @@ public class VirtualizationUnitTestSuite
|
|||||||
suite.addTest(new JUnit4TestAdapter(org.alfresco.repo.virtual.ref.StoredPathHasherTest.class));
|
suite.addTest(new JUnit4TestAdapter(org.alfresco.repo.virtual.ref.StoredPathHasherTest.class));
|
||||||
|
|
||||||
suite.addTest(new JUnit4TestAdapter(org.alfresco.repo.virtual.template.VirtualQueryImplTest.class));
|
suite.addTest(new JUnit4TestAdapter(org.alfresco.repo.virtual.template.VirtualQueryImplTest.class));
|
||||||
|
suite.addTest(new JUnit4TestAdapter(org.alfresco.repo.virtual.store.TypeVirtualizationMethodTest.Unit.class));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -29,11 +29,14 @@ import java.util.List;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.alfresco.model.ContentModel;
|
import org.alfresco.model.ContentModel;
|
||||||
|
import org.alfresco.query.CannedQueryPageDetails;
|
||||||
import org.alfresco.query.PagingRequest;
|
import org.alfresco.query.PagingRequest;
|
||||||
import org.alfresco.query.PagingResults;
|
import org.alfresco.query.PagingResults;
|
||||||
|
import org.alfresco.repo.content.MimetypeMap;
|
||||||
import org.alfresco.repo.virtual.VirtualizationIntegrationTest;
|
import org.alfresco.repo.virtual.VirtualizationIntegrationTest;
|
||||||
import org.alfresco.service.cmr.coci.CheckOutCheckInService;
|
import org.alfresco.service.cmr.coci.CheckOutCheckInService;
|
||||||
import org.alfresco.service.cmr.model.FileInfo;
|
import org.alfresco.service.cmr.model.FileInfo;
|
||||||
|
import org.alfresco.service.cmr.repository.MimetypeService;
|
||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
import org.alfresco.service.namespace.NamespaceService;
|
import org.alfresco.service.namespace.NamespaceService;
|
||||||
import org.alfresco.service.namespace.QName;
|
import org.alfresco.service.namespace.QName;
|
||||||
@@ -45,6 +48,7 @@ public class VirtualFileFolderServiceExtensionTest extends VirtualizationIntegra
|
|||||||
{
|
{
|
||||||
|
|
||||||
private static final String NEW_FILE_NAME_2 = "RenameTest2";
|
private static final String NEW_FILE_NAME_2 = "RenameTest2";
|
||||||
|
|
||||||
private static final String NEW_FILE_NAME_1 = "RenamedTest";
|
private static final String NEW_FILE_NAME_1 = "RenamedTest";
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -126,22 +130,9 @@ public class VirtualFileFolderServiceExtensionTest extends VirtualizationIntegra
|
|||||||
ContentModel.ASSOC_CONTAINS,
|
ContentModel.ASSOC_CONTAINS,
|
||||||
"Node2");
|
"Node2");
|
||||||
|
|
||||||
HashMap<QName, Serializable> properties = new HashMap<QName, Serializable>();
|
String fileName="testfile.txt";
|
||||||
properties.put(ContentModel.PROP_NAME,
|
fileAndFolderService.create(node1, fileName, ContentModel.TYPE_CONTENT);
|
||||||
"testfile.txt");
|
fileAndFolderService.create(node2, fileName, ContentModel.TYPE_CONTENT);
|
||||||
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);
|
|
||||||
|
|
||||||
List<FileInfo> search = fileAndFolderService.search(virtualFolder1NodeRef,
|
List<FileInfo> search = fileAndFolderService.search(virtualFolder1NodeRef,
|
||||||
"testfile.txt",
|
"testfile.txt",
|
||||||
@@ -298,13 +289,13 @@ public class VirtualFileFolderServiceExtensionTest extends VirtualizationIntegra
|
|||||||
contentName);
|
contentName);
|
||||||
|
|
||||||
{
|
{
|
||||||
PagingResults<FileInfo> folderChildren = fileAndFolderService
|
PagingResults<FileInfo> folderChildren = fileAndFolderService.list(node2,
|
||||||
.list(node2,
|
|
||||||
false,
|
false,
|
||||||
true,
|
true,
|
||||||
"*",
|
"*",
|
||||||
Collections.<QName> emptySet(),
|
Collections.<QName> emptySet(),
|
||||||
Collections.<Pair<QName, Boolean>> emptyList(),
|
Collections
|
||||||
|
.<Pair<QName, Boolean>> emptyList(),
|
||||||
new PagingRequest(100));
|
new PagingRequest(100));
|
||||||
List<FileInfo> page = folderChildren.getPage();
|
List<FileInfo> page = folderChildren.getPage();
|
||||||
assertContainsNames(page,
|
assertContainsNames(page,
|
||||||
@@ -314,13 +305,13 @@ public class VirtualFileFolderServiceExtensionTest extends VirtualizationIntegra
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
PagingResults<FileInfo> contentChildren = fileAndFolderService
|
PagingResults<FileInfo> contentChildren = fileAndFolderService.list(node2,
|
||||||
.list(node2,
|
|
||||||
true,
|
true,
|
||||||
false,
|
false,
|
||||||
"*",
|
"*",
|
||||||
Collections.<QName> emptySet(),
|
Collections.<QName> emptySet(),
|
||||||
Collections.<Pair<QName, Boolean>> emptyList(),
|
Collections
|
||||||
|
.<Pair<QName, Boolean>> emptyList(),
|
||||||
new PagingRequest(100));
|
new PagingRequest(100));
|
||||||
List<FileInfo> page = contentChildren.getPage();
|
List<FileInfo> page = contentChildren.getPage();
|
||||||
assertMissesNames(page,
|
assertMissesNames(page,
|
||||||
@@ -447,4 +438,181 @@ public class VirtualFileFolderServiceExtensionTest extends VirtualizationIntegra
|
|||||||
NEW_FILE_NAME_2));
|
NEW_FILE_NAME_2));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testListNamePattern() throws Exception
|
||||||
|
{
|
||||||
|
List<Pair<QName, Boolean>> sortProps = new ArrayList<Pair<QName, Boolean>>(1);
|
||||||
|
sortProps.add(new Pair<QName, Boolean>(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<FileInfo> results = fileAndFolderService.list(node1,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
namePattern,
|
||||||
|
null,
|
||||||
|
sortProps,
|
||||||
|
new PagingRequest(CannedQueryPageDetails.DEFAULT_PAGE_SIZE));
|
||||||
|
|
||||||
|
List<FileInfo> 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<Pair<QName, Boolean>> sortProps = new ArrayList<Pair<QName, Boolean>>(1);
|
||||||
|
sortProps.add(new Pair<QName, Boolean>(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<FileInfo> results = fileAndFolderService
|
||||||
|
.list(nodeService.getPrimaryParent(aNameNodeRef).getParentRef(),
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
namePattern,
|
||||||
|
null,
|
||||||
|
sortProps,
|
||||||
|
new PagingRequest(CannedQueryPageDetails.DEFAULT_PAGE_SIZE));
|
||||||
|
|
||||||
|
List<FileInfo> 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<Pair<QName, Boolean>> sortProps = Collections.<Pair<QName, Boolean>> emptyList();
|
||||||
|
PagingRequest pagingRequest = new PagingRequest(100);
|
||||||
|
|
||||||
|
PagingResults<FileInfo> 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());
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -19,8 +19,6 @@
|
|||||||
|
|
||||||
package org.alfresco.repo.virtual.bundle;
|
package org.alfresco.repo.virtual.bundle;
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@@ -36,6 +34,7 @@ import org.alfresco.repo.download.DownloadModel;
|
|||||||
import org.alfresco.repo.download.DownloadStorage;
|
import org.alfresco.repo.download.DownloadStorage;
|
||||||
import org.alfresco.repo.node.integrity.IntegrityChecker;
|
import org.alfresco.repo.node.integrity.IntegrityChecker;
|
||||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
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.VirtualContentModel;
|
||||||
import org.alfresco.repo.virtual.VirtualizationIntegrationTest;
|
import org.alfresco.repo.virtual.VirtualizationIntegrationTest;
|
||||||
import org.alfresco.repo.virtual.config.NodeRefExpression;
|
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.AssociationRef;
|
||||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||||
import org.alfresco.service.cmr.repository.CopyService;
|
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.NodeRef;
|
||||||
import org.alfresco.service.cmr.repository.Path;
|
import org.alfresco.service.cmr.repository.Path;
|
||||||
import org.alfresco.service.namespace.NamespaceService;
|
import org.alfresco.service.namespace.NamespaceService;
|
||||||
@@ -127,9 +125,9 @@ public class VirtualNodeServiceExtensionTest extends VirtualizationIntegrationTe
|
|||||||
"shouldNotBeCreated");
|
"shouldNotBeCreated");
|
||||||
fail("Should not be able to create node in a readonly context.");
|
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);
|
e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -210,37 +208,29 @@ public class VirtualNodeServiceExtensionTest extends VirtualizationIntegrationTe
|
|||||||
"Node2");
|
"Node2");
|
||||||
assertNotNull(secondChild);
|
assertNotNull(secondChild);
|
||||||
|
|
||||||
HashMap<QName, Serializable> properties = new HashMap<QName, Serializable>();
|
|
||||||
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());
|
authenticationComponent.setCurrentUser(AuthenticationUtil.getAdminUserName());
|
||||||
// add testfile.txt to first virtual child
|
// add testfile.txt to first virtual child
|
||||||
|
|
||||||
createNode(firstChild,
|
String fileName="testfile.txt";
|
||||||
assocQName,
|
uploadNode(firstChild,
|
||||||
properties);
|
fileName);
|
||||||
assertNotNull(nodeService.getChildByName(firstChild.toNodeRef(),
|
assertNotNull(nodeService.getChildByName(firstChild.toNodeRef(),
|
||||||
ContentModel.ASSOC_CONTAINS,
|
ContentModel.ASSOC_CONTAINS,
|
||||||
"testfile.txt"));
|
"testfile.txt"));
|
||||||
createNode(firstChild,
|
uploadNode(firstChild,
|
||||||
assocQName,
|
fileName);
|
||||||
properties);
|
|
||||||
assertNotNull(nodeService.getChildByName(firstChild.toNodeRef(),
|
assertNotNull(nodeService.getChildByName(firstChild.toNodeRef(),
|
||||||
ContentModel.ASSOC_CONTAINS,
|
ContentModel.ASSOC_CONTAINS,
|
||||||
"testfile-1.txt"));
|
"testfile-1.txt"));
|
||||||
|
|
||||||
// add testfile.txt to second virtual child
|
// add testfile.txt to second virtual child
|
||||||
createNode(secondChild,
|
uploadNode(secondChild,
|
||||||
assocQName,
|
fileName);
|
||||||
properties);
|
|
||||||
assertNotNull(nodeService.getChildByName(secondChild.toNodeRef(),
|
assertNotNull(nodeService.getChildByName(secondChild.toNodeRef(),
|
||||||
ContentModel.ASSOC_CONTAINS,
|
ContentModel.ASSOC_CONTAINS,
|
||||||
"testfile-2.txt"));
|
"testfile-2.txt"));
|
||||||
createNode(secondChild,
|
uploadNode(secondChild,
|
||||||
assocQName,
|
fileName);
|
||||||
properties);
|
|
||||||
assertNotNull(nodeService.getChildByName(secondChild.toNodeRef(),
|
assertNotNull(nodeService.getChildByName(secondChild.toNodeRef(),
|
||||||
ContentModel.ASSOC_CONTAINS,
|
ContentModel.ASSOC_CONTAINS,
|
||||||
"testfile-3.txt"));
|
"testfile-3.txt"));
|
||||||
@@ -248,13 +238,9 @@ public class VirtualNodeServiceExtensionTest extends VirtualizationIntegrationTe
|
|||||||
// add again to first virtual child starting from the last index found
|
// add again to first virtual child starting from the last index found
|
||||||
// (this is the index that comes from
|
// (this is the index that comes from
|
||||||
// upload-post.js)
|
// upload-post.js)
|
||||||
properties.put(ContentModel.PROP_NAME,
|
fileName="testfile-2.txt";
|
||||||
"testfile-2.txt");
|
uploadNode(firstChild,
|
||||||
assocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
|
fileName);
|
||||||
QName.createValidLocalName("testfile-2.txt"));
|
|
||||||
createNode(firstChild,
|
|
||||||
assocQName,
|
|
||||||
properties);
|
|
||||||
assertNotNull(nodeService.getChildByName(firstChild.toNodeRef(),
|
assertNotNull(nodeService.getChildByName(firstChild.toNodeRef(),
|
||||||
ContentModel.ASSOC_CONTAINS,
|
ContentModel.ASSOC_CONTAINS,
|
||||||
"testfile-4.txt"));
|
"testfile-4.txt"));
|
||||||
@@ -262,28 +248,14 @@ public class VirtualNodeServiceExtensionTest extends VirtualizationIntegrationTe
|
|||||||
// test create node for actual node starting from the last index found
|
// test create node for actual node starting from the last index found
|
||||||
// (this is the index that comes from
|
// (this is the index that comes from
|
||||||
// upload-post.js)
|
// upload-post.js)
|
||||||
properties.put(ContentModel.PROP_NAME,
|
fileName="testfile-5.txt";
|
||||||
"testfile-5.txt");
|
fileAndFolderService.create(virtualFolder1NodeRef, fileName, ContentModel.TYPE_CONTENT);
|
||||||
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();
|
|
||||||
assertNotNull(nodeService.getChildByName(virtualFolder1NodeRef,
|
assertNotNull(nodeService.getChildByName(virtualFolder1NodeRef,
|
||||||
ContentModel.ASSOC_CONTAINS,
|
ContentModel.ASSOC_CONTAINS,
|
||||||
"testfile-5.txt"));
|
"testfile-5.txt"));
|
||||||
|
|
||||||
properties.put(ContentModel.PROP_NAME,
|
fileName="testfile-6.txt";
|
||||||
"testfile-6.txt");
|
fileAndFolderService.create(virtualFolder1NodeRef, fileName, ContentModel.TYPE_CONTENT);
|
||||||
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();
|
|
||||||
assertNotNull(nodeService.getChildByName(virtualFolder1NodeRef,
|
assertNotNull(nodeService.getChildByName(virtualFolder1NodeRef,
|
||||||
ContentModel.ASSOC_CONTAINS,
|
ContentModel.ASSOC_CONTAINS,
|
||||||
"testfile-6.txt"));
|
"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
|
// add again to second child starting from the last index found (this is
|
||||||
// the index that comes from
|
// the index that comes from
|
||||||
// upload-post.js)
|
// upload-post.js)
|
||||||
properties.put(ContentModel.PROP_NAME,
|
fileName="testfile-4.txt";
|
||||||
"testfile-4.txt");
|
uploadNode(secondChild,
|
||||||
assocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
|
fileName);
|
||||||
QName.createValidLocalName("testfile-4.txt"));
|
|
||||||
nodeService.createNode(secondChild.toNodeRef(),
|
|
||||||
ContentModel.ASSOC_CONTAINS,
|
|
||||||
assocQName,
|
|
||||||
ContentModel.TYPE_CONTENT,
|
|
||||||
properties).getChildRef();
|
|
||||||
assertNotNull(nodeService.getChildByName(secondChild.toNodeRef(),
|
assertNotNull(nodeService.getChildByName(secondChild.toNodeRef(),
|
||||||
ContentModel.ASSOC_CONTAINS,
|
ContentModel.ASSOC_CONTAINS,
|
||||||
"testfile-7.txt"));
|
"testfile-7.txt"));
|
||||||
|
|
||||||
// test situation when file name is of form testfile1-1.txt
|
// test situation when file name is of form testfile1-1.txt
|
||||||
properties.put(ContentModel.PROP_NAME,
|
fileName="testfile1-1.txt";
|
||||||
"testfile1-1.txt");
|
fileAndFolderService.create(secondChild.toNodeRef(), fileName, ContentModel.TYPE_CONTENT);
|
||||||
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();
|
|
||||||
assertNotNull(nodeService.getChildByName(secondChild.toNodeRef(),
|
assertNotNull(nodeService.getChildByName(secondChild.toNodeRef(),
|
||||||
ContentModel.ASSOC_CONTAINS,
|
ContentModel.ASSOC_CONTAINS,
|
||||||
"testfile1-1.txt"));
|
"testfile1-1.txt"));
|
||||||
|
fileAndFolderService.create(secondChild.toNodeRef(), fileName, ContentModel.TYPE_CONTENT);
|
||||||
nodeService.createNode(secondChild.toNodeRef(),
|
|
||||||
ContentModel.ASSOC_CONTAINS,
|
|
||||||
assocQName,
|
|
||||||
ContentModel.TYPE_CONTENT,
|
|
||||||
properties).getChildRef();
|
|
||||||
assertNotNull(nodeService.getChildByName(secondChild.toNodeRef(),
|
assertNotNull(nodeService.getChildByName(secondChild.toNodeRef(),
|
||||||
ContentModel.ASSOC_CONTAINS,
|
ContentModel.ASSOC_CONTAINS,
|
||||||
"testfile1-1-1.txt"));
|
"testfile1-1-1.txt"));
|
||||||
@@ -393,6 +347,13 @@ public class VirtualNodeServiceExtensionTest extends VirtualizationIntegrationTe
|
|||||||
childAssocsRef);
|
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
|
* Assets that the given {@link ChildAssociationRef} was created within the
|
||||||
* given virtualizable nodeRef container reference.
|
* given virtualizable nodeRef container reference.
|
||||||
@@ -452,18 +413,10 @@ public class VirtualNodeServiceExtensionTest extends VirtualizationIntegrationTe
|
|||||||
ContentModel.ASSOC_CONTAINS,
|
ContentModel.ASSOC_CONTAINS,
|
||||||
"Node2");
|
"Node2");
|
||||||
|
|
||||||
HashMap<QName, Serializable> properties = new HashMap<QName, Serializable>();
|
String fileName="testfile.txt";
|
||||||
properties.put(ContentModel.PROP_NAME,
|
|
||||||
"testfile.txt");
|
|
||||||
QName assocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
|
|
||||||
QName.createValidLocalName("testfile.txt"));
|
|
||||||
|
|
||||||
// add testfile.txt to first virtual child
|
// add testfile.txt to first virtual child
|
||||||
nodeService.createNode(node2,
|
fileAndFolderService.create(node2, fileName, ContentModel.TYPE_CONTENT);
|
||||||
ContentModel.ASSOC_CONTAINS,
|
|
||||||
assocQName,
|
|
||||||
ContentModel.TYPE_CONTENT,
|
|
||||||
properties);
|
|
||||||
|
|
||||||
NodeRef childRef = nodeService.getChildByName(node2,
|
NodeRef childRef = nodeService.getChildByName(node2,
|
||||||
ContentModel.ASSOC_CONTAINS,
|
ContentModel.ASSOC_CONTAINS,
|
||||||
@@ -487,11 +440,7 @@ public class VirtualNodeServiceExtensionTest extends VirtualizationIntegrationTe
|
|||||||
"Node2_1");
|
"Node2_1");
|
||||||
assertNotNull(node2_1);
|
assertNotNull(node2_1);
|
||||||
|
|
||||||
nodeService.createNode(node2_1,
|
fileAndFolderService.create(node2_1, fileName, ContentModel.TYPE_CONTENT);
|
||||||
ContentModel.ASSOC_CONTAINS,
|
|
||||||
assocQName,
|
|
||||||
ContentModel.TYPE_CONTENT,
|
|
||||||
properties);
|
|
||||||
|
|
||||||
NodeRef childRef_1 = nodeService.getChildByName(node2_1,
|
NodeRef childRef_1 = nodeService.getChildByName(node2_1,
|
||||||
ContentModel.ASSOC_CONTAINS,
|
ContentModel.ASSOC_CONTAINS,
|
||||||
@@ -1200,6 +1149,110 @@ public class VirtualNodeServiceExtensionTest extends VirtualizationIntegrationTe
|
|||||||
assertNotNull(childFolderNodeRef);
|
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()
|
private NodeRef createDownloadNode()
|
||||||
{
|
{
|
||||||
NodeRef createDownloadNode = downloadStorage.createDownloadNode(true);
|
NodeRef createDownloadNode = downloadStorage.createDownloadNode(true);
|
||||||
|
@@ -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;
|
package org.alfresco.repo.virtual.store;
|
||||||
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
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.model.ContentModel;
|
||||||
import org.alfresco.repo.site.SiteModel;
|
import org.alfresco.repo.site.SiteModel;
|
||||||
import org.alfresco.repo.virtual.VirtualizationIntegrationTest;
|
import org.alfresco.repo.virtual.VirtualizationIntegrationTest;
|
||||||
@@ -23,15 +47,25 @@ import org.alfresco.repo.virtual.ref.ResourceProcessor;
|
|||||||
import org.alfresco.repo.virtual.ref.VanillaProtocol;
|
import org.alfresco.repo.virtual.ref.VanillaProtocol;
|
||||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
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.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_FOLDER_TYPE = SiteModel.TYPE_SITE;
|
||||||
|
|
||||||
private static final QName TEST_ASPECT = SiteModel.ASPECT_SITE_CONTAINER;
|
private static final QName TEST_ASPECT = SiteModel.ASPECT_SITE_CONTAINER;
|
||||||
|
|
||||||
|
public static class Integration extends VirtualizationIntegrationTest
|
||||||
|
{
|
||||||
private TypeVirtualizationMethod typeVirtualizationMethod;
|
private TypeVirtualizationMethod typeVirtualizationMethod;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -46,38 +80,64 @@ public class TypeVirtualizationMethodTest extends VirtualizationIntegrationTest
|
|||||||
public void tearDown() throws Exception
|
public void tearDown() throws Exception
|
||||||
{
|
{
|
||||||
super.tearDown();
|
super.tearDown();
|
||||||
typeVirtualizationMethod.setQnameFilterRegexp(virtualizationConfigTestBootstrap
|
typeVirtualizationMethod.setQnameFilters(virtualizationConfigTestBootstrap.getTypeTemplatesQNameFilter());
|
||||||
.getTypeTemplatesQNameFilterRegexp());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
public void testFiltering() throws Exception
|
||||||
public void testRegExpFiltering() throws Exception
|
|
||||||
{
|
{
|
||||||
typeVirtualizationMethod.setQnameFilterRegexp("\\{.*site/1\\.0\\}site");
|
typeVirtualizationMethod.setQnameFilters("st:site");
|
||||||
|
|
||||||
ChildAssociationRef typedNodeAssocRef = createTypedNode(testRootFolder.getNodeRef(),
|
ChildAssociationRef typedNodeAssocRef = createTypedNode(testRootFolder.getNodeRef(),
|
||||||
"TypeVirtualized",
|
"TypeVirtualized",
|
||||||
TEST_FOLDER_TYPE);
|
TEST_FOLDER_TYPE);
|
||||||
|
NodeRef virtuaChildRef = typedNodeAssocRef.getChildRef();
|
||||||
assertFalse(typeVirtualizationMethod.canVirtualize(environment,
|
assertFalse(typeVirtualizationMethod.canVirtualize(environment,
|
||||||
typedNodeAssocRef.getChildRef()));
|
virtuaChildRef));
|
||||||
|
|
||||||
addTypeTemplate(TEST_FOLDER_TYPE,
|
addTypeTemplate(TEST_FOLDER_TYPE,
|
||||||
TEST_TEMPLATE_1_JS_CLASSPATH);
|
TEST_TEMPLATE_1_JS_CLASSPATH);
|
||||||
|
|
||||||
assertTrue(typeVirtualizationMethod.canVirtualize(environment,
|
assertTrue(typeVirtualizationMethod.canVirtualize(environment,
|
||||||
typedNodeAssocRef.getChildRef()));
|
virtuaChildRef));
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// invalid prefix
|
||||||
|
typeVirtualizationMethod.setQnameFilters("invalid:site");
|
||||||
|
fail("Should not be able to se invalib filters.");
|
||||||
|
}
|
||||||
|
catch (IllegalArgumentException e)
|
||||||
|
{
|
||||||
|
// as expected
|
||||||
|
}
|
||||||
|
|
||||||
typeVirtualizationMethod.setQnameFilterRegexp("\\{.*site/2\\.0\\}site");
|
assertTrue(typeVirtualizationMethod.canVirtualize(environment,
|
||||||
|
virtuaChildRef));
|
||||||
|
|
||||||
|
typeVirtualizationMethod.setQnameFilters("alf:site");
|
||||||
|
|
||||||
assertFalse(typeVirtualizationMethod.canVirtualize(environment,
|
assertFalse(typeVirtualizationMethod.canVirtualize(environment,
|
||||||
typedNodeAssocRef.getChildRef()));
|
virtuaChildRef));
|
||||||
|
|
||||||
//invalid regexp
|
typeVirtualizationMethod.setQnameFilters("st:*");
|
||||||
typeVirtualizationMethod.setQnameFilterRegexp("{.*site/1\\.0\\}site");
|
|
||||||
|
assertTrue(typeVirtualizationMethod.canVirtualize(environment,
|
||||||
|
virtuaChildRef));
|
||||||
|
|
||||||
|
typeVirtualizationMethod.setQnameFilters("alf:site");
|
||||||
|
|
||||||
assertFalse(typeVirtualizationMethod.canVirtualize(environment,
|
assertFalse(typeVirtualizationMethod.canVirtualize(environment,
|
||||||
typedNodeAssocRef.getChildRef()));
|
virtuaChildRef));
|
||||||
|
|
||||||
|
typeVirtualizationMethod.setQnameFilters("*");
|
||||||
|
|
||||||
|
assertTrue(typeVirtualizationMethod.canVirtualize(environment,
|
||||||
|
virtuaChildRef));
|
||||||
|
|
||||||
|
typeVirtualizationMethod.setQnameFilters("none");
|
||||||
|
|
||||||
|
assertFalse(typeVirtualizationMethod.canVirtualize(environment,
|
||||||
|
virtuaChildRef));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -214,7 +274,8 @@ public class TypeVirtualizationMethodTest extends VirtualizationIntegrationTest
|
|||||||
final String prefixedType = theType.toPrefixString(environment.getNamespacePrefixResolver());
|
final String prefixedType = theType.toPrefixString(environment.getNamespacePrefixResolver());
|
||||||
String contentName = prefixedType;
|
String contentName = prefixedType;
|
||||||
contentName = contentName.replaceAll(":",
|
contentName = contentName.replaceAll(":",
|
||||||
"_") + ".json";
|
"_")
|
||||||
|
+ ".json";
|
||||||
|
|
||||||
InputStream testTemplsteJsonIS = getClass().getResourceAsStream(cp);
|
InputStream testTemplsteJsonIS = getClass().getResourceAsStream(cp);
|
||||||
ChildAssociationRef templateContentChildRef = createContent(templatesLocation,
|
ChildAssociationRef templateContentChildRef = createContent(templatesLocation,
|
||||||
@@ -224,17 +285,110 @@ public class TypeVirtualizationMethodTest extends VirtualizationIntegrationTest
|
|||||||
"UTF-8",
|
"UTF-8",
|
||||||
ContentModel.TYPE_CONTENT);
|
ContentModel.TYPE_CONTENT);
|
||||||
|
|
||||||
String regexp = theType.toString();
|
typeVirtualizationMethod.setQnameFilters(prefixedType);
|
||||||
regexp = regexp.replaceAll("\\{",
|
|
||||||
"\\\\{");
|
|
||||||
regexp = regexp.replaceAll("\\}",
|
|
||||||
"\\\\}");
|
|
||||||
regexp = regexp.replaceAll("\\:",
|
|
||||||
"\\\\:");
|
|
||||||
regexp = regexp.replaceAll("\\.",
|
|
||||||
"\\\\.");
|
|
||||||
typeVirtualizationMethod.setQnameFilterRegexp(regexp);
|
|
||||||
|
|
||||||
return templateContentChildRef;
|
return templateContentChildRef;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class Unit extends TestCase
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
assertQNameFilters("*",
|
||||||
|
this);
|
||||||
|
|
||||||
|
assertQNameFilters("none",
|
||||||
|
this);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static NamespacePrefixResolver mockNamespacePrefixResolver()
|
||||||
|
{
|
||||||
|
NamespacePrefixResolver mockNamespacePrefixResolver = Mockito.mock(NamespacePrefixResolver.class,
|
||||||
|
|
||||||
|
new ThrowsException(new NamespaceException("Mock exception ")));
|
||||||
|
|
||||||
|
Mockito
|
||||||
|
.doReturn(Arrays.<String> 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.<String> 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -22,19 +22,69 @@ package org.alfresco.repo.virtual.template;
|
|||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.alfresco.model.ContentModel;
|
||||||
import org.alfresco.repo.content.MimetypeMap;
|
import org.alfresco.repo.content.MimetypeMap;
|
||||||
import org.alfresco.repo.virtual.VirtualizationIntegrationTest;
|
import org.alfresco.repo.virtual.VirtualizationIntegrationTest;
|
||||||
import org.alfresco.repo.virtual.ref.NewVirtualReferenceMethod;
|
import org.alfresco.repo.virtual.ref.NewVirtualReferenceMethod;
|
||||||
import org.alfresco.repo.virtual.ref.Protocols;
|
import org.alfresco.repo.virtual.ref.Protocols;
|
||||||
import org.alfresco.repo.virtual.ref.Reference;
|
import org.alfresco.repo.virtual.ref.Reference;
|
||||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
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;
|
import org.junit.Test;
|
||||||
|
|
||||||
public class ApplyTemplateMethodTest extends VirtualizationIntegrationTest
|
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
|
@Test
|
||||||
public void testExecuteSysClasspath() throws Exception
|
public void testExecute_virtualSysClasspath() throws Exception
|
||||||
{
|
{
|
||||||
ApplyTemplateMethod applyTemplateMethod = new ApplyTemplateMethod(environment);
|
ApplyTemplateMethod applyTemplateMethod = new ApplyTemplateMethod(environment);
|
||||||
|
|
||||||
@@ -66,7 +116,7 @@ public class ApplyTemplateMethodTest extends VirtualizationIntegrationTest
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testExecuteRepositoryJSON() throws Exception
|
public void testExecute_vanillaRepositoryJSON() throws Exception
|
||||||
{
|
{
|
||||||
ChildAssociationRef templateAssoc = createContent(testRootFolder.getNodeRef(),
|
ChildAssociationRef templateAssoc = createContent(testRootFolder.getNodeRef(),
|
||||||
"template1.json",
|
"template1.json",
|
||||||
|
@@ -28,7 +28,7 @@ import org.junit.Test;
|
|||||||
public class TemplateFilingRuleTest extends VirtualizationIntegrationTest
|
public class TemplateFilingRuleTest extends VirtualizationIntegrationTest
|
||||||
{
|
{
|
||||||
@Test
|
@Test
|
||||||
public void testISO9075FilingSubPath() throws Exception
|
public void testFilingSubPath_specialCharacters() throws Exception
|
||||||
{
|
{
|
||||||
NodeRef vfNodeRef = createVirtualizedFolder(testRootFolder.getNodeRef(),
|
NodeRef vfNodeRef = createVirtualizedFolder(testRootFolder.getNodeRef(),
|
||||||
"Template 6 With Spaces",
|
"Template 6 With Spaces",
|
||||||
@@ -56,7 +56,7 @@ public class TemplateFilingRuleTest extends VirtualizationIntegrationTest
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testISO9075FilingPath() throws Exception
|
public void testFilingPath_specialCharacters() throws Exception
|
||||||
{
|
{
|
||||||
NodeRef vfNodeRef = createVirtualizedFolder(testRootFolder.getNodeRef(),
|
NodeRef vfNodeRef = createVirtualizedFolder(testRootFolder.getNodeRef(),
|
||||||
"Template 6 With Spaces",
|
"Template 6 With Spaces",
|
||||||
|
@@ -81,7 +81,7 @@
|
|||||||
"description":"SpecialFilingPath5",
|
"description":"SpecialFilingPath5",
|
||||||
"search":{
|
"search":{
|
||||||
"language":"fts-alfresco",
|
"language":"fts-alfresco",
|
||||||
"query":"=cm:description:'SpecialFilingPath_5'"
|
"query":"(PATH:'%ACTUAL_PATH%/cm:Space_x0020_Sub_x0020_Folder/*') and =cm:description:'SpecialFilingPath_5'"
|
||||||
},
|
},
|
||||||
"filing":{
|
"filing":{
|
||||||
"path":"%ACTUAL_PATH%/cm:Space_x0020_Sub_x0020_Folder",
|
"path":"%ACTUAL_PATH%/cm:Space_x0020_Sub_x0020_Folder",
|
||||||
|
@@ -32,7 +32,7 @@
|
|||||||
<property name="path" value="${virtual.download.associations.folder}" />
|
<property name="path" value="${virtual.download.associations.folder}" />
|
||||||
</bean>
|
</bean>
|
||||||
</property>
|
</property>
|
||||||
<property name="typeTemplatesQNameFilterRegexp" value="${virtual.folders.config.type.templates.qname.filter.regexp}" />
|
<property name="typeTemplatesQNameFilter" value="${virtual.folders.config.type.templates.qname.filter}" />
|
||||||
</bean>
|
</bean>
|
||||||
<bean id="test.config.hash.store" class="org.alfresco.repo.virtual.ref.HashStoreConfiguration.HashStoreConfigurationBean">
|
<bean id="test.config.hash.store" class="org.alfresco.repo.virtual.ref.HashStoreConfiguration.HashStoreConfigurationBean">
|
||||||
<property name="classpathsHashes" value="/org/alfresco/repo/virtual/template->8,/org/alfresco/repo/virtual/template/testTemplate1.json->9"/>
|
<property name="classpathsHashes" value="/org/alfresco/repo/virtual/template->8,/org/alfresco/repo/virtual/template/testTemplate1.json->9"/>
|
||||||
|
Reference in New Issue
Block a user