mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-10-08 14:51:49 +00:00
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/DEV/5.2.N/root@137793 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
473 lines
20 KiB
Java
473 lines
20 KiB
Java
/*
|
|
* #%L
|
|
* Alfresco Repository
|
|
* %%
|
|
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
|
* %%
|
|
* This file is part of the Alfresco software.
|
|
* If the software was purchased under a paid Alfresco license, the terms of
|
|
* the paid license agreement will prevail. Otherwise, the software is
|
|
* provided under the following open source license terms:
|
|
*
|
|
* 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/>.
|
|
* #L%
|
|
*/
|
|
|
|
package org.alfresco.repo.virtual;
|
|
|
|
import java.io.InputStream;
|
|
import java.io.Serializable;
|
|
import java.util.Arrays;
|
|
import java.util.Collections;
|
|
import java.util.HashMap;
|
|
import java.util.HashSet;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Map.Entry;
|
|
import java.util.Set;
|
|
|
|
import javax.transaction.UserTransaction;
|
|
|
|
import junit.framework.TestCase;
|
|
|
|
import org.alfresco.model.ContentModel;
|
|
import org.alfresco.repo.forms.FormData;
|
|
import org.alfresco.repo.forms.Item;
|
|
import org.alfresco.repo.model.Repository;
|
|
import org.alfresco.repo.security.authentication.AuthenticationComponent;
|
|
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
|
import org.alfresco.repo.transaction.RetryingTransactionHelper;
|
|
import org.alfresco.repo.virtual.model.SystemTemplateLocationsConstraint;
|
|
import org.alfresco.repo.virtual.ref.Reference;
|
|
import org.alfresco.service.ServiceRegistry;
|
|
import org.alfresco.service.cmr.model.FileFolderService;
|
|
import org.alfresco.service.cmr.model.FileInfo;
|
|
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
|
import org.alfresco.service.cmr.repository.ContentService;
|
|
import org.alfresco.service.cmr.repository.ContentWriter;
|
|
import org.alfresco.service.cmr.repository.NodeRef;
|
|
import org.alfresco.service.cmr.repository.NodeService;
|
|
import org.alfresco.service.cmr.repository.StoreRef;
|
|
import org.alfresco.service.cmr.search.SearchService;
|
|
import org.alfresco.service.cmr.security.PermissionService;
|
|
import org.alfresco.service.namespace.NamespaceService;
|
|
import org.alfresco.service.namespace.QName;
|
|
import org.alfresco.service.transaction.TransactionService;
|
|
import org.alfresco.traitextender.SpringExtensionBundle;
|
|
import org.alfresco.util.ApplicationContextHelper;
|
|
import org.apache.commons.logging.Log;
|
|
import org.apache.commons.logging.LogFactory;
|
|
import org.junit.Ignore;
|
|
import org.springframework.context.ApplicationContext;
|
|
|
|
@Ignore
|
|
public abstract class VirtualizationIntegrationTest extends TestCase implements VirtualizationTest
|
|
{
|
|
private static Log logger = LogFactory.getLog(VirtualizationIntegrationTest.class);
|
|
|
|
private static final String PROP_VM_TEMPLATE_CLASSPATH = "prop_smf_system-template-location";
|
|
|
|
protected static final String VIRTUAL_FOLDER_1_NAME = "VirtualFolder1";
|
|
|
|
protected static final String VIRTUAL_FOLDER_2_NAME = "VirtualFolder2";
|
|
|
|
protected static final String VIRTUAL_FOLDER_3_NAME = "VirtualFolder3";
|
|
|
|
protected static final String TEST_ROOT_FOLDER_NAME = "TestFolder";
|
|
|
|
protected static final String TEST_TEMPLATE_CLASSPATH = "/org/alfresco/repo/virtual/template/";
|
|
|
|
protected static final String TEST_TEMPLATE_1_JS_NAME = "testTemplate1.js";
|
|
|
|
protected static final String TEST_TEMPLATE_1_JSON_NAME = "testTemplate1.json";
|
|
|
|
protected static final String TEST_TEMPLATE_2_JSON_NAME = "testTemplate2.json";
|
|
|
|
protected static final String TEST_TEMPLATE_3_JSON_NAME = "testTemplate3.json";
|
|
|
|
protected static final String TEST_TEMPLATE_4_JSON_NAME = "testTemplate4.json";
|
|
|
|
protected static final String TEST_TEMPLATE_5_JSON_NAME = "testTemplate5.json";
|
|
|
|
protected static final String TEST_TEMPLATE_6_JSON_NAME = "testTemplate6.json";
|
|
|
|
protected static final String TEST_TEMPLATE_1_JS_CLASSPATH = TEST_TEMPLATE_CLASSPATH + TEST_TEMPLATE_1_JS_NAME;
|
|
|
|
protected static final String TEST_TEMPLATE_1_JSON_CLASSPATH = TEST_TEMPLATE_CLASSPATH + TEST_TEMPLATE_1_JSON_NAME;
|
|
|
|
protected static final String TEST_TEMPLATE_2_JSON_CLASSPATH = TEST_TEMPLATE_CLASSPATH + TEST_TEMPLATE_2_JSON_NAME;
|
|
|
|
protected static final String TEST_TEMPLATE_3_JSON_CLASSPATH = TEST_TEMPLATE_CLASSPATH + TEST_TEMPLATE_3_JSON_NAME;
|
|
|
|
protected static final String TEST_TEMPLATE_4_JSON_CLASSPATH = TEST_TEMPLATE_CLASSPATH + TEST_TEMPLATE_4_JSON_NAME;
|
|
|
|
protected static final String TEST_TEMPLATE_5_JSON_CLASSPATH = TEST_TEMPLATE_CLASSPATH + TEST_TEMPLATE_5_JSON_NAME;
|
|
|
|
protected static final String TEST_TEMPLATE_6_JSON_CLASSPATH = TEST_TEMPLATE_CLASSPATH + TEST_TEMPLATE_6_JSON_NAME;
|
|
|
|
protected static final String TEST_TEMPLATE_1_JSON_SYS_PATH = "C" + TEST_TEMPLATE_1_JSON_CLASSPATH;
|
|
|
|
protected static final String TEST_TEMPLATE_2_JSON_SYS_PATH = "C" + TEST_TEMPLATE_2_JSON_CLASSPATH;
|
|
|
|
protected static final String TEST_TEMPLATE_3_JSON_SYS_PATH = "C" + TEST_TEMPLATE_3_JSON_CLASSPATH;
|
|
|
|
protected static final String TEST_TEMPLATE_4_JSON_SYS_PATH = "C" + TEST_TEMPLATE_4_JSON_CLASSPATH;
|
|
|
|
protected static final String TEST_TEMPLATE_5_JSON_SYS_PATH = "C" + TEST_TEMPLATE_5_JSON_CLASSPATH;
|
|
|
|
protected static final String TEST_TEMPLATE_6_JSON_SYS_PATH = "C" + TEST_TEMPLATE_6_JSON_CLASSPATH;
|
|
|
|
protected static final String TEST_TEMPLATE_1_JS_SYS_PATH = "C" + TEST_TEMPLATE_1_JS_CLASSPATH;
|
|
|
|
public static final String VANILLA_PROCESSOR_JS_CLASSPATH = "/org/alfresco/repo/virtual/node/vanilla.js";
|
|
|
|
protected static final String FORM_DATA_PROP_NAME = "prop_cm_name";
|
|
|
|
protected static final String FORM_DATA_PROP_ALF_DEF = "alf_destination";
|
|
|
|
protected static final ApplicationContext ctx = ApplicationContextHelper.getApplicationContext(CONFIG_LOCATIONS);
|
|
|
|
protected FileFolderService fileAndFolderService;
|
|
|
|
protected ContentService contentService;
|
|
|
|
protected TransactionService transactionService;
|
|
|
|
protected NodeService nodeService;
|
|
|
|
protected PermissionService permissionService;
|
|
|
|
protected SearchService searchService;
|
|
|
|
protected RetryingTransactionHelper retryingTransactionHelper;
|
|
|
|
protected FileInfo testRootFolder;
|
|
|
|
protected NodeRef virtualFolder1NodeRef;
|
|
|
|
protected NodeRef rootNodeRef;
|
|
|
|
protected NodeRef companyHomeNodeRef;
|
|
|
|
protected ActualEnvironment environment;
|
|
|
|
protected TypeAndAspectsFormProcessor typeAndAspectsFormProcessor;
|
|
|
|
protected String txnTamperHint;
|
|
|
|
protected UserTransaction txn;
|
|
|
|
protected AuthenticationComponent authenticationComponent;
|
|
|
|
protected VirtualizationConfigTestBootstrap virtualizationConfigTestBootstrap;
|
|
|
|
protected SystemTemplateLocationsConstraint constraints;
|
|
|
|
/** when set to a not-null value will be restored up[on {@link #tearDown()} */
|
|
protected String configuredTemplatesClassPath = null;
|
|
|
|
@Override
|
|
protected void setUp() throws Exception
|
|
{
|
|
virtualizationConfigTestBootstrap = ctx.getBean(VIRTUALIZATION_CONFIG_TEST_BOOTSTRAP_BEAN_ID,
|
|
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())
|
|
{
|
|
// "use the force" and enable virtual folders
|
|
SpringExtensionBundle vfBundle = ctx.getBean("smartFoldersBundle",
|
|
SpringExtensionBundle.class);
|
|
vfBundle.start();
|
|
}
|
|
else
|
|
{
|
|
logger.info("Virtual folders are spring-enabled.");
|
|
}
|
|
|
|
this.authenticationComponent.setSystemUserAsCurrentUser();
|
|
|
|
// start the transaction
|
|
txn = transactionService.getUserTransaction();
|
|
txn.begin();
|
|
|
|
AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName());
|
|
companyHomeNodeRef = repository.getCompanyHome();
|
|
testRootFolder = fileAndFolderService.create(companyHomeNodeRef,
|
|
TEST_ROOT_FOLDER_NAME,
|
|
ContentModel.TYPE_FOLDER);
|
|
|
|
virtualFolder1NodeRef = createVirtualizedFolder(testRootFolder.getNodeRef(),
|
|
VIRTUAL_FOLDER_1_NAME,
|
|
TEST_TEMPLATE_1_JSON_SYS_PATH);
|
|
rootNodeRef = nodeService.getRootNode(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE);
|
|
|
|
}
|
|
|
|
public void tearDown() throws Exception
|
|
{
|
|
if (!virtualizationConfigTestBootstrap.areVirtualFoldersEnabled())
|
|
{
|
|
// "use the force" and disable virtual folders
|
|
SpringExtensionBundle vfBundle = ctx.getBean("smartFoldersBundle",
|
|
SpringExtensionBundle.class);
|
|
vfBundle.stop();
|
|
}
|
|
|
|
if (configuredTemplatesClassPath != null)
|
|
{
|
|
constraints.setTemplatesParentClasspath(configuredTemplatesClassPath);
|
|
configuredTemplatesClassPath = null;
|
|
}
|
|
authenticationComponent.clearCurrentSecurityContext();
|
|
try
|
|
{
|
|
txn.rollback();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
logger.error("Test tear down failed. Has the test setup transaction been tempered with ? Hint : "
|
|
+ txnTamperHint,
|
|
e);
|
|
}
|
|
|
|
super.tearDown();
|
|
}
|
|
|
|
/**
|
|
* @param parent
|
|
* @param name
|
|
* @param templateSysPath system path of the template to be applied. If
|
|
* <code>null</code> the property is not set - this should
|
|
* trigger default predefined settings behavior.
|
|
* @return the {@link NodeRef} of a newly created folder that has the
|
|
* predefined virtualization method aspect applied
|
|
*/
|
|
protected NodeRef createVirtualizedFolder(NodeRef parent, String name, String templateSysPath)
|
|
{
|
|
Item testItem = new Item("typeAndAspects",
|
|
"cm:folder,smf:systemConfigSmartFolder");
|
|
FormData testFormData = new FormData();
|
|
|
|
testFormData.addFieldData(FORM_DATA_PROP_NAME,
|
|
name);
|
|
if (templateSysPath != null)
|
|
{
|
|
testFormData.addFieldData(PROP_VM_TEMPLATE_CLASSPATH,
|
|
templateSysPath);
|
|
}
|
|
// alf_destination is mandatory
|
|
testFormData.addFieldData(FORM_DATA_PROP_ALF_DEF,
|
|
parent.toString());
|
|
|
|
return (NodeRef) typeAndAspectsFormProcessor.persist(testItem,
|
|
testFormData);
|
|
|
|
}
|
|
|
|
protected void assertVirtualNode(NodeRef nodeRef)
|
|
{
|
|
assertVirtualNode(nodeRef,
|
|
Collections.<QName, Serializable> emptyMap());
|
|
}
|
|
|
|
protected void assertVirtualNode(NodeRef nodeRef, Map<QName, Serializable> expectedProperties)
|
|
{
|
|
assertNotNull(Reference.fromNodeRef(nodeRef));
|
|
|
|
assertTrue(nodeService.hasAspect(nodeRef,
|
|
VirtualContentModel.ASPECT_VIRTUAL));
|
|
Set<QName> aspects = nodeService.getAspects(nodeRef);
|
|
assertTrue("Smart virtual node missing virtual aspect",aspects.contains(VirtualContentModel.ASPECT_VIRTUAL));
|
|
//ACE-5303 injected properties title and description require the titled aspect
|
|
assertTrue("Smaft virtual node missing titled aspect",aspects.contains(ContentModel.ASPECT_TITLED));
|
|
|
|
Map<QName, Serializable> nodeProperties = nodeService.getProperties(nodeRef);
|
|
|
|
List<QName> mandatoryProperties = Arrays.asList(ContentModel.PROP_STORE_IDENTIFIER,
|
|
ContentModel.PROP_STORE_PROTOCOL,
|
|
ContentModel.PROP_LOCALE,
|
|
ContentModel.PROP_MODIFIED,
|
|
ContentModel.PROP_MODIFIER,
|
|
ContentModel.PROP_CREATED,
|
|
ContentModel.PROP_CREATOR,
|
|
ContentModel.PROP_NODE_DBID,
|
|
ContentModel.PROP_DESCRIPTION);
|
|
|
|
Set<QName> missingPropreties = new HashSet<>(mandatoryProperties);
|
|
missingPropreties.removeAll(nodeProperties.keySet());
|
|
|
|
assertTrue("Mandatory properties are missing" + missingPropreties,
|
|
missingPropreties.isEmpty());
|
|
|
|
assertFalse("ACE-5303 : ContentModel.PROP_TITLE should remain unset",nodeProperties.containsKey(ContentModel.PROP_TITLE));
|
|
|
|
Set<Entry<QName, Serializable>> epEntries = expectedProperties.entrySet();
|
|
StringBuilder unexpectedBuilder = new StringBuilder();
|
|
for (Entry<QName, Serializable> entry : epEntries)
|
|
{
|
|
Serializable actualValue = nodeProperties.get(entry.getKey());
|
|
Serializable expectedValue = expectedProperties.get(entry.getKey());
|
|
boolean fail = false;
|
|
String expectedValueStr = null;
|
|
|
|
if (expectedValue != null)
|
|
{
|
|
expectedValueStr = expectedValue.toString();
|
|
|
|
if (!expectedValue.equals(actualValue))
|
|
{
|
|
fail = true;
|
|
}
|
|
|
|
}
|
|
else if (actualValue != null)
|
|
{
|
|
fail = true;
|
|
expectedValueStr = "<null>";
|
|
}
|
|
|
|
if (fail)
|
|
{
|
|
unexpectedBuilder.append("\n");
|
|
unexpectedBuilder.append(entry.getKey());
|
|
unexpectedBuilder.append(" expected[");
|
|
unexpectedBuilder.append(expectedValueStr);
|
|
unexpectedBuilder.append("] != actua[");
|
|
unexpectedBuilder.append(actualValue);
|
|
unexpectedBuilder.append("]");
|
|
}
|
|
}
|
|
String unexpectedStr = unexpectedBuilder.toString();
|
|
assertTrue("Unexpected property values : " + unexpectedStr,
|
|
unexpectedStr.isEmpty());
|
|
}
|
|
|
|
protected ChildAssociationRef createTypedNode(NodeRef parent, final String name, QName type)
|
|
{
|
|
return createTypedNode(parent,
|
|
name,
|
|
type,
|
|
new HashMap<QName, Serializable>());
|
|
}
|
|
|
|
protected ChildAssociationRef createTypedNode(NodeRef parent, final String name, QName type,
|
|
HashMap<QName, Serializable> properties)
|
|
{
|
|
final HashMap<QName, Serializable> newProperties = new HashMap<QName, Serializable>(properties);
|
|
newProperties.put(ContentModel.PROP_NAME,
|
|
name);
|
|
QName assocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
|
|
QName.createValidLocalName(name));
|
|
return nodeService.createNode(parent,
|
|
ContentModel.ASSOC_CONTAINS,
|
|
assocQName,
|
|
type,
|
|
newProperties);
|
|
}
|
|
|
|
protected ChildAssociationRef createFolder(NodeRef parent, final String name)
|
|
{
|
|
return createTypedNode(parent,
|
|
name,
|
|
ContentModel.TYPE_FOLDER);
|
|
}
|
|
|
|
protected ChildAssociationRef createFolder(NodeRef parent, final String name,
|
|
HashMap<QName, Serializable> properties)
|
|
{
|
|
return createTypedNode(parent,
|
|
name,
|
|
ContentModel.TYPE_FOLDER,
|
|
properties);
|
|
}
|
|
|
|
protected ChildAssociationRef createContent(NodeRef parent, final String name)
|
|
{
|
|
return createTypedNode(parent,
|
|
name,
|
|
ContentModel.TYPE_CONTENT);
|
|
}
|
|
|
|
protected ChildAssociationRef createContent(NodeRef parent, final String name, InputStream stream, String mimeType,
|
|
String encoding)
|
|
{
|
|
return createContent(parent,
|
|
name,
|
|
stream,
|
|
mimeType,
|
|
encoding,
|
|
ContentModel.TYPE_CONTENT);
|
|
}
|
|
|
|
protected ChildAssociationRef createContent(NodeRef parent, final String name, InputStream stream, String mimeType,
|
|
String encoding, QName nodeType)
|
|
{
|
|
ChildAssociationRef nodeAssoc = createTypedNode(parent,
|
|
name,
|
|
nodeType);
|
|
NodeRef child = nodeAssoc.getChildRef();
|
|
ContentWriter writer = contentService.getWriter(child,
|
|
ContentModel.PROP_CONTENT,
|
|
true);
|
|
|
|
writer.setMimetype(mimeType);
|
|
writer.setEncoding(encoding);
|
|
writer.putContent(stream);
|
|
return nodeAssoc;
|
|
}
|
|
|
|
protected ChildAssociationRef createContent(NodeRef parent, final String name, String contentString,
|
|
String mimeType, String encoding)
|
|
{
|
|
ChildAssociationRef nodeAssoc = createTypedNode(parent,
|
|
name,
|
|
ContentModel.TYPE_CONTENT);
|
|
NodeRef child = nodeAssoc.getChildRef();
|
|
ContentWriter writer = contentService.getWriter(child,
|
|
ContentModel.PROP_CONTENT,
|
|
true);
|
|
|
|
writer.setMimetype(mimeType);
|
|
writer.setEncoding(encoding);
|
|
writer.putContent(contentString);
|
|
return nodeAssoc;
|
|
}
|
|
}
|