org.alfresco.repo.virtual.VirtualizationIntegrationTest.java Source code

Java tutorial

Introduction

Here is the source code for org.alfresco.repo.virtual.VirtualizationIntegrationTest.java

Source

/*
 * #%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.Status;
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.alfresco.util.transaction.TransactionSupportUtil;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Ignore;
import org.springframework.context.ApplicationContext;
import org.springframework.transaction.support.TransactionSynchronizationManager;

@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 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) {
        assertTrue(Reference.isReference(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;
    }
}