com.liferay.exportimport.resources.importer.test.ResourcesImporterTest.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.exportimport.resources.importer.test.ResourcesImporterTest.java

Source

/**
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library 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 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library 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.
 */

package com.liferay.exportimport.resources.importer.test;

import com.liferay.arquillian.extension.junit.bridge.junit.Arquillian;
import com.liferay.asset.kernel.model.AssetEntry;
import com.liferay.asset.kernel.model.AssetTag;
import com.liferay.asset.kernel.service.AssetEntryLocalServiceUtil;
import com.liferay.asset.kernel.service.AssetTagLocalServiceUtil;
import com.liferay.document.library.kernel.model.DLFileEntry;
import com.liferay.document.library.kernel.model.DLFileEntryConstants;
import com.liferay.document.library.kernel.model.DLFolder;
import com.liferay.document.library.kernel.model.DLFolderConstants;
import com.liferay.document.library.kernel.service.DLFileEntryLocalServiceUtil;
import com.liferay.document.library.kernel.service.DLFolderLocalServiceUtil;
import com.liferay.dynamic.data.mapping.model.DDMStructure;
import com.liferay.dynamic.data.mapping.service.DDMStructureLocalServiceUtil;
import com.liferay.dynamic.data.mapping.service.DDMTemplateLocalServiceUtil;
import com.liferay.journal.model.JournalArticle;
import com.liferay.journal.model.JournalFolder;
import com.liferay.journal.service.JournalArticleLocalServiceUtil;
import com.liferay.journal.service.JournalFolderLocalServiceUtil;
import com.liferay.portal.kernel.dao.orm.Criterion;
import com.liferay.portal.kernel.dao.orm.DynamicQuery;
import com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil;
import com.liferay.portal.kernel.messaging.Message;
import com.liferay.portal.kernel.messaging.MessageListener;
import com.liferay.portal.kernel.messaging.MessageListenerException;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.model.Layout;
import com.liferay.portal.kernel.model.LayoutPrototype;
import com.liferay.portal.kernel.model.LayoutTypePortlet;
import com.liferay.portal.kernel.model.LayoutTypePortletConstants;
import com.liferay.portal.kernel.model.Portlet;
import com.liferay.portal.kernel.service.GroupLocalServiceUtil;
import com.liferay.portal.kernel.service.LayoutLocalServiceUtil;
import com.liferay.portal.kernel.service.LayoutPrototypeLocalServiceUtil;
import com.liferay.portal.kernel.test.rule.AggregateTestRule;
import com.liferay.portal.kernel.test.rule.DeleteAfterTestRun;
import com.liferay.portal.kernel.test.util.TestPropsValues;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.UnicodeProperties;
import com.liferay.portal.test.rule.LiferayIntegrationTestRule;
import com.liferay.shrinkwrap.osgi.api.BndProjectBuilder;

import java.io.File;

import java.net.URL;

import java.util.Dictionary;
import java.util.Hashtable;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.ArchiveAsset;
import org.jboss.shrinkwrap.api.asset.UrlAsset;
import org.jboss.shrinkwrap.api.exporter.ZipExporter;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.jboss.shrinkwrap.api.spec.WebArchive;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceRegistration;

/**
 * @author Daniel Kocsis
 */
@RunWith(Arquillian.class)
public class ResourcesImporterTest {

    @ClassRule
    @Rule
    public static final AggregateTestRule aggregateTestRule = new LiferayIntegrationTestRule();

    @Deployment
    public static JavaArchive create() {
        BndProjectBuilder bndProjectBuilder = ShrinkWrap.create(BndProjectBuilder.class);

        bndProjectBuilder.setBndFile(new File("bnd.bnd"));

        bndProjectBuilder.generateManifest(true);

        JavaArchive javaArchive = bndProjectBuilder.as(JavaArchive.class);

        javaArchive.add(new ArchiveAsset(buildTestWebArchive(), ZipExporter.class),
                "com/liferay/exportimport/resources/importer/test/dependencies" + "/test.war");

        return javaArchive;
    }

    @Before
    public void setUp() throws Exception {
        Bundle testBundle = FrameworkUtil.getBundle(ResourcesImporterTest.class);

        _bundleContext = testBundle.getBundleContext();

        URL warURL = ResourcesImporterTest.class.getResource("dependencies/test.war");

        warURL = new URL(warURL.toExternalForm() + "?Web-ContextPath=/test-resource-importer");

        URL bundleURL = new URL("webbundle", null, warURL.toString());

        _bundle = _bundleContext.installBundle(bundleURL.toString());

        Dictionary<String, Object> properties = new Hashtable<>();

        properties.put("destination.name", "liferay/resources_importer");

        final CountDownLatch countDownLatch = new CountDownLatch(1);

        ServiceRegistration<MessageListener> serviceRegistration = _bundleContext
                .registerService(MessageListener.class, new MessageListener() {

                    public void receive(Message message) throws MessageListenerException {

                        countDownLatch.countDown();
                    }

                }, properties);

        _bundle.start();

        countDownLatch.await(1, TimeUnit.MINUTES);

        serviceRegistration.unregister();
    }

    @After
    public void tearDown() throws Exception {
        if (_bundle != null) {
            _bundle.uninstall();
        }
    }

    @Test
    public void testResourcesImport() throws Exception {
        _importedGroup = GroupLocalServiceUtil.fetchGroup(TestPropsValues.getCompanyId(), "ResourcesImporterTest");

        Assert.assertNotNull(_importedGroup);

        _layoutPrototypes = getLayoutPrototypes();

        Assert.assertEquals(_layoutPrototypes.toString(), 2, _layoutPrototypes.size());

        validateLayouts(_importedGroup);

        validateJournal(_importedGroup);

        validateDocumentLibrary(_importedGroup);
    }

    protected static void addWebInfResource(WebArchive webArchive, String resourcePath) {

        URL resource = ResourcesImporterTest.class.getResource(_RESOURCES_BASE_PATH.concat(resourcePath));

        webArchive.addAsWebInfResource(new UrlAsset(resource), resourcePath);
    }

    protected static WebArchive buildTestWebArchive() {
        WebArchive webArchive = ShrinkWrap.create(WebArchive.class);

        // General

        addWebInfResource(webArchive, "liferay-plugin-package.properties");
        addWebInfResource(webArchive, "classes/resources-importer/assets.json");
        addWebInfResource(webArchive, "classes/resources-importer/sitemap.json");

        // Document library

        addWebInfResource(webArchive,
                "classes/resources-importer/document_library/documents" + "/company_logo.png");
        addWebInfResource(webArchive,
                "classes/resources-importer/document_library/documents" + "/Parent Folder/child_document.txt");

        // Journal

        addWebInfResource(webArchive,
                "classes/resources-importer/journal/articles/BASIC_WEB_CONTENT" + "/Basic Article.xml");

        StringBundler sb = new StringBundler(4);

        sb.append("classes/resources-importer/journal/articles");
        sb.append("/BASIC_WEB_CONTENT/Basic Web Content Parent Folder");
        sb.append("/Basic Web Content Child Folder");
        sb.append("/Basic Article in Child Folder.xml");

        addWebInfResource(webArchive, sb.toString());

        addWebInfResource(webArchive, "classes/resources-importer/journal/articles/BASIC_WEB_CONTENT"
                + "/Basic Web Content Parent Folder" + "/Basic Article in Parent Folder.xml");
        addWebInfResource(webArchive, "classes/resources-importer/journal/structures" + "/BASIC_WEB_CONTENT.json");
        addWebInfResource(webArchive,
                "classes/resources-importer/journal/templates/BASIC_WEB_CONTENT" + "/BASIC_WEB_CONTENT.ftl");
        addWebInfResource(webArchive,
                "classes/resources-importer/journal/articles/Child Template" + "/Child Template Article.xml");
        addWebInfResource(webArchive,
                "classes/resources-importer/journal/structures/Parent Structure" + "/Child Structure.json");
        addWebInfResource(webArchive,
                "classes/resources-importer/journal/templates/Child Structure" + "/Child Template.ftl");
        addWebInfResource(webArchive,
                "classes/resources-importer/journal/articles/Parent Template" + "/Parent Template Article.xml");
        addWebInfResource(webArchive, "classes/resources-importer/journal/structures/Parent " + "Structure.json");
        addWebInfResource(webArchive,
                "classes/resources-importer/journal/templates/Parent Structure" + "/Parent Template.ftl");

        // Page templates

        addWebInfResource(webArchive, "classes/resources-importer/templates/page/page_1.json");
        addWebInfResource(webArchive, "classes/resources-importer/templates/page/page_2.json");

        return webArchive;
    }

    protected List<LayoutPrototype> getLayoutPrototypes() {
        DynamicQuery dynamicQuery = LayoutPrototypeLocalServiceUtil.dynamicQuery();

        Criterion layout1Criterion = RestrictionsFactoryUtil.like("name", "%Page 1%");
        Criterion layout2Criterion = RestrictionsFactoryUtil.like("name", "%Page 2%");

        dynamicQuery.add(RestrictionsFactoryUtil.or(layout1Criterion, layout2Criterion));

        return LayoutPrototypeLocalServiceUtil.dynamicQuery(dynamicQuery);
    }

    protected void validateDocumentLibrary(Group importedGroup) {
        List<DLFileEntry> dlFileEntries = DLFileEntryLocalServiceUtil.getFileEntries(importedGroup.getGroupId(),
                DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);

        Assert.assertEquals(dlFileEntries.toString(), 1, dlFileEntries.size());

        DLFileEntry dlFileEntry = dlFileEntries.get(0);

        AssetEntry assetEntry = AssetEntryLocalServiceUtil.fetchEntry(DLFileEntryConstants.getClassName(),
                dlFileEntry.getFileEntryId());

        Assert.assertEquals(2, AssetTagLocalServiceUtil.getAssetEntryAssetTagsCount(assetEntry.getEntryId()));

        List<DLFolder> dlFolders = DLFolderLocalServiceUtil.getFolders(importedGroup.getGroupId(),
                DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);

        Assert.assertEquals(dlFolders.toString(), 1, dlFolders.size());

        DLFolder dlFolder = dlFolders.get(0);

        int dlFileEntriesCount = DLFileEntryLocalServiceUtil.getFileEntriesCount(importedGroup.getGroupId(),
                dlFolder.getFolderId());

        Assert.assertEquals(1, dlFileEntriesCount);
    }

    protected void validateJournal(Group importedGroup) throws Exception {
        List<JournalArticle> journalArticles = JournalArticleLocalServiceUtil
                .getArticles(importedGroup.getGroupId());

        Assert.assertEquals(journalArticles.toString(), 5, journalArticles.size());

        int ddmStructuresCount = DDMStructureLocalServiceUtil.getStructuresCount(importedGroup.getGroupId(),
                PortalUtil.getClassNameId(JournalArticle.class));

        Assert.assertEquals(3, ddmStructuresCount);

        int ddmTemplatesCount = DDMTemplateLocalServiceUtil.getTemplatesCount(importedGroup.getGroupId(),
                PortalUtil.getClassNameId(DDMStructure.class));

        Assert.assertEquals(3, ddmTemplatesCount);

        JournalArticle journalArticle = JournalArticleLocalServiceUtil.getArticle(importedGroup.getGroupId(),
                "BASIC-ARTICLE");

        Assert.assertTrue(journalArticle.isSmallImage());

        Map<Locale, String> descriptionMap = journalArticle.getDescriptionMap();

        Assert.assertFalse(descriptionMap.toString(), descriptionMap.isEmpty());

        AssetEntry assetEntry = AssetEntryLocalServiceUtil.fetchEntry(JournalArticle.class.getName(),
                journalArticle.getResourcePrimKey());

        List<AssetTag> assetTags = AssetTagLocalServiceUtil.getEntryTags(assetEntry.getEntryId());

        Assert.assertEquals(assetTags.toString(), 1, assetTags.size());

        JournalFolder parentJournalFolder = JournalFolderLocalServiceUtil.fetchFolder(importedGroup.getGroupId(),
                "Basic Web Content Parent Folder");

        JournalArticle parentJournalFolderJournalArticle = JournalArticleLocalServiceUtil
                .getArticle(importedGroup.getGroupId(), "BASIC-ARTICLE-IN-PARENT-FOLDER");

        Assert.assertNotNull(parentJournalFolder);

        Assert.assertEquals(parentJournalFolderJournalArticle.getFolder(), parentJournalFolder);

        JournalFolder childJournalFolder = JournalFolderLocalServiceUtil.fetchFolder(importedGroup.getGroupId(),
                "Basic Web Content Child Folder");

        Assert.assertEquals(parentJournalFolder, childJournalFolder.getParentFolder());

        JournalArticle childJournalFolderJournalArticle = JournalArticleLocalServiceUtil
                .getArticle(importedGroup.getGroupId(), "BASIC-ARTICLE-IN-CHILD-FOLDER");

        Assert.assertEquals(childJournalFolderJournalArticle.getFolder(), childJournalFolder);
    }

    protected void validateLayouts(Group importedGroup) throws Exception {
        long privateLayoutsCount = LayoutLocalServiceUtil.getLayoutsCount(importedGroup, true);

        Assert.assertEquals(1, privateLayoutsCount);

        long publicLayoutsCount = LayoutLocalServiceUtil.getLayoutsCount(importedGroup, false);

        Assert.assertEquals(9, publicLayoutsCount);

        Layout layout = LayoutLocalServiceUtil.getFriendlyURLLayout(importedGroup.getGroupId(), false, "/home");

        Map<Locale, String> nameMap = layout.getNameMap();

        Assert.assertTrue(nameMap.containsValue("Bienvenue"));

        Assert.assertTrue(layout.isTypePortlet());

        LayoutTypePortlet layoutTypePortlet = (LayoutTypePortlet) layout.getLayoutType();

        List<Portlet> portlets = layoutTypePortlet.getAllPortlets();

        Assert.assertEquals(portlets.toString(), 7, portlets.size());

        UnicodeProperties layoutTypeSettingsProperties = layout.getTypeSettingsProperties();

        String nestedColumnIds = layoutTypeSettingsProperties.get(LayoutTypePortletConstants.NESTED_COLUMN_IDS);

        Assert.assertTrue((nestedColumnIds != null) && nestedColumnIds.contains("column-1")
                && nestedColumnIds.contains("column-2"));

        layout = LayoutLocalServiceUtil.getFriendlyURLLayout(importedGroup.getGroupId(), false,
                "/layout-prototypes-page-1");

        Assert.assertTrue(layout.isLayoutPrototypeLinkActive());
        Assert.assertEquals("371647ba-3649-4039-bfe6-ae32cf404737", layout.getLayoutPrototypeUuid());

        layout = LayoutLocalServiceUtil.getFriendlyURLLayout(importedGroup.getGroupId(), false,
                "/layout-prototypes-page-2");

        Assert.assertFalse(layout.isLayoutPrototypeLinkActive());
        Assert.assertEquals("c98067d0-fc10-9556-7364-238d39693bc4", layout.getLayoutPrototypeUuid());

        layout = LayoutLocalServiceUtil.getFriendlyURLLayout(importedGroup.getGroupId(), false, "/url-page");

        Assert.assertTrue(layout.isTypeURL());

        layout = LayoutLocalServiceUtil.getFriendlyURLLayout(importedGroup.getGroupId(), false, "/hidden-page");

        Assert.assertTrue(layout.isHidden());
    }

    private static final String _RESOURCES_BASE_PATH = "dependencies/WEB-INF/";

    private Bundle _bundle;
    private BundleContext _bundleContext;

    @DeleteAfterTestRun
    private Group _importedGroup;

    @DeleteAfterTestRun
    private List<LayoutPrototype> _layoutPrototypes;

}