com.liferay.dynamic.data.mapping.internal.upgrade.v1_0_0.UpgradeDynamicDataMappingTest.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.dynamic.data.mapping.internal.upgrade.v1_0_0.UpgradeDynamicDataMappingTest.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.dynamic.data.mapping.internal.upgrade.v1_0_0;

import com.liferay.dynamic.data.mapping.io.DDMFormValuesJSONDeserializer;
import com.liferay.dynamic.data.mapping.io.DDMFormValuesJSONSerializer;
import com.liferay.dynamic.data.mapping.io.internal.DDMFormValuesJSONDeserializerImpl;
import com.liferay.dynamic.data.mapping.io.internal.DDMFormValuesJSONSerializerImpl;
import com.liferay.dynamic.data.mapping.model.DDMForm;
import com.liferay.dynamic.data.mapping.model.DDMFormField;
import com.liferay.dynamic.data.mapping.model.LocalizedValue;
import com.liferay.dynamic.data.mapping.model.UnlocalizedValue;
import com.liferay.dynamic.data.mapping.model.Value;
import com.liferay.dynamic.data.mapping.storage.DDMFormFieldValue;
import com.liferay.dynamic.data.mapping.storage.DDMFormValues;
import com.liferay.dynamic.data.mapping.test.util.DDMFormTestUtil;
import com.liferay.dynamic.data.mapping.test.util.DDMFormValuesTestUtil;
import com.liferay.petra.string.StringPool;
import com.liferay.portal.json.JSONFactoryImpl;
import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.language.Language;
import com.liferay.portal.kernel.language.LanguageUtil;
import com.liferay.portal.kernel.security.permission.ResourceActions;
import com.liferay.portal.kernel.security.xml.SecureXMLFactoryProviderUtil;
import com.liferay.portal.kernel.test.util.RandomTestUtil;
import com.liferay.portal.kernel.upgrade.UpgradeException;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.ListUtil;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.util.LocalizationUtil;
import com.liferay.portal.kernel.util.ProxyUtil;
import com.liferay.portal.kernel.util.SetUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.xml.Document;
import com.liferay.portal.kernel.xml.Element;
import com.liferay.portal.kernel.xml.SAXReaderUtil;
import com.liferay.portal.kernel.xml.UnsecureSAXReaderUtil;
import com.liferay.portal.security.xml.SecureXMLFactoryProviderImpl;
import com.liferay.portal.util.LocalizationImpl;
import com.liferay.portal.util.PropsValues;
import com.liferay.portal.xml.SAXReaderImpl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;

import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor;
import org.powermock.modules.junit4.PowerMockRunner;

import org.skyscreamer.jsonassert.JSONAssert;

/**
 * @author Marcellus Tavares
 */
@PowerMockIgnore("javax.xml.stream.*")
@PrepareForTest({ LocaleUtil.class, PropsValues.class })
@RunWith(PowerMockRunner.class)
@SuppressStaticInitializationFor({ "com.liferay.portal.kernel.xml.SAXReaderUtil",
        "com.liferay.portal.util.PropsValues" })
public class UpgradeDynamicDataMappingTest extends PowerMockito {

    @Before
    public void setUp() throws Exception {
        setUpDDMFormValuesJSONDeserializer();
        setUpDDMFormValuesJSONSerializer();
        setUpLanguageUtil();
        setUpLocaleUtil();
        setUpLocalizationUtil();
        setUpPropsValues();
        setUpSecureXMLFactoryProviderUtil();
        setUpSAXReaderUtil();
        setUpJSONFactoryUtil();

        _upgradeDynamicDataMapping = new UpgradeDynamicDataMapping(null, null, null, null, null,
                _ddmFormValuesJSONDeserializer, _ddmFormValuesJSONSerializer, null, null, null, null, null, null,
                null,
                (ResourceActions) ProxyUtil.newProxyInstance(UpgradeDynamicDataMappingTest.class.getClassLoader(),
                        new Class<?>[] { ResourceActions.class }, new InvocationHandler() {

                            @Override
                            public Object invoke(Object proxy, Method method, Object[] args) {

                                String methodName = method.getName();

                                if (methodName.equals("getCompositeModelName")) {
                                    if (ArrayUtil.isEmpty(args)) {
                                        return StringPool.BLANK;
                                    }

                                    Arrays.sort(args);

                                    StringBundler sb = new StringBundler(args.length * 2);

                                    for (Object className : args) {
                                        sb.append(className);
                                    }

                                    sb.setIndex(sb.index() - 1);

                                    return sb.toString();
                                }

                                return null;
                            }

                        }),
                null, null);
    }

    @Test(expected = UpgradeException.class)
    public void testCreateNewFieldNameWithConflictingNewFieldName() throws Exception {

        Set<String> existingFieldNames = new HashSet<>();

        existingFieldNames.add("myna");

        _upgradeDynamicDataMapping.createNewDDMFormFieldName("?my/--na", existingFieldNames);
    }

    @Test
    public void testCreateNewFieldNameWithSupportedOldFieldName() throws Exception {

        Set<String> existingFieldNames = Collections.<String>emptySet();

        Assert.assertEquals("name",
                _upgradeDynamicDataMapping.createNewDDMFormFieldName("name/?--", existingFieldNames));
        Assert.assertEquals("firstName",
                _upgradeDynamicDataMapping.createNewDDMFormFieldName("first Name", existingFieldNames));
        Assert.assertEquals("this_is_a_field_name", _upgradeDynamicDataMapping
                .createNewDDMFormFieldName("this?*&_is///_{{a[[  [_]  ~'field'////>_<name", existingFieldNames));
    }

    @Test(expected = UpgradeException.class)
    public void testCreateNewFieldNameWithUnsupportedOldFieldName() throws Exception {

        Set<String> existingFieldNames = Collections.<String>emptySet();

        _upgradeDynamicDataMapping.createNewDDMFormFieldName("??????", existingFieldNames);
    }

    @Test
    public void testIsInvalidFieldName() {
        Assert.assertTrue(_upgradeDynamicDataMapping.isInvalidFieldName("/name?"));
        Assert.assertTrue(_upgradeDynamicDataMapping.isInvalidFieldName("_name--"));
        Assert.assertTrue(_upgradeDynamicDataMapping.isInvalidFieldName("name^*"));
        Assert.assertTrue(_upgradeDynamicDataMapping.isInvalidFieldName("name^*"));
        Assert.assertTrue(_upgradeDynamicDataMapping.isInvalidFieldName("my name"));
    }

    @Test
    public void testIsValidFieldName() {
        Assert.assertFalse(_upgradeDynamicDataMapping.isInvalidFieldName("name"));
        Assert.assertFalse(_upgradeDynamicDataMapping.isInvalidFieldName("name_"));
        Assert.assertFalse(_upgradeDynamicDataMapping.isInvalidFieldName(""));
    }

    @Test
    public void testRenameInvalidDDMFormFieldNamesInJSON() throws Exception {
        long structureId = RandomTestUtil.randomLong();

        DDMForm ddmForm = DDMFormTestUtil.createDDMForm();

        DDMFormField ddmFormField = DDMFormTestUtil.createTextDDMFormField("name", false, false, false);

        ddmFormField.setProperty("oldName", "name<!**>");

        ddmForm.addDDMFormField(ddmFormField);

        _upgradeDynamicDataMapping.populateStructureInvalidDDMFormFieldNamesMap(structureId, ddmForm);

        DDMFormValues ddmFormValues = DDMFormValuesTestUtil.createDDMFormValues(ddmForm);

        ddmFormValues.addDDMFormFieldValue(
                DDMFormValuesTestUtil.createUnlocalizedDDMFormFieldValue("name<!**>", "Joe Bloggs"));

        String serializedDDMFormValues = _ddmFormValuesJSONSerializer.serialize(ddmFormValues);

        String updatedSerializedDDMFormValues = _upgradeDynamicDataMapping
                .renameInvalidDDMFormFieldNames(structureId, serializedDDMFormValues);

        DDMFormValues updatedDDMFormValues = _ddmFormValuesJSONDeserializer.deserialize(ddmForm,
                updatedSerializedDDMFormValues);

        List<DDMFormFieldValue> updatedDDMFormFieldValues = updatedDDMFormValues.getDDMFormFieldValues();

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

        DDMFormFieldValue updatedDDMFormFieldValue = updatedDDMFormFieldValues.get(0);

        Value value = updatedDDMFormFieldValue.getValue();

        Assert.assertEquals("name", updatedDDMFormFieldValue.getName());

        Assert.assertEquals("Joe Bloggs", value.getString(Locale.US));
    }

    @Test
    public void testRenameInvalidDDMFormFieldNamesInVMTemplate() {
        long structureId = RandomTestUtil.randomLong();

        DDMForm ddmForm = DDMFormTestUtil.createDDMForm();

        DDMFormField ddmFormField = DDMFormTestUtil.createTextDDMFormField("name", false, false, false);

        ddmFormField.setProperty("oldName", "name*");

        ddmForm.addDDMFormField(ddmFormField);

        _upgradeDynamicDataMapping.populateStructureInvalidDDMFormFieldNamesMap(structureId, ddmForm);

        String updatedScript = _upgradeDynamicDataMapping.renameInvalidDDMFormFieldNames(structureId,
                "Hello $name*!");

        Assert.assertEquals("Hello $name!", updatedScript);
    }

    @Test
    public void testToJSONWithLocalizedAndNestedData() throws Exception {
        DDMForm ddmForm = new DDMForm();

        ddmForm.setAvailableLocales(createAvailableLocales(LocaleUtil.US));
        ddmForm.setDefaultLocale(LocaleUtil.US);

        DDMFormField textDDMFormField = new DDMFormField("Text", "text");

        textDDMFormField.setDataType("string");
        textDDMFormField.setLocalizable(true);
        textDDMFormField.setRepeatable(true);

        DDMFormField textAreaDDMFormField = new DDMFormField("TextArea", "textarea");

        textAreaDDMFormField.setDataType("string");
        textAreaDDMFormField.setLocalizable(true);
        textAreaDDMFormField.setRepeatable(true);

        textDDMFormField.addNestedDDMFormField(textAreaDDMFormField);

        ddmForm.addDDMFormField(textDDMFormField);

        // DDM form values

        DDMFormValues ddmFormValues = new DDMFormValues(ddmForm);

        ddmFormValues.setAvailableLocales(createAvailableLocales(LocaleUtil.BRAZIL, LocaleUtil.US));
        ddmFormValues.setDefaultLocale(LocaleUtil.US);

        DDMFormFieldValue text1DDMFormFieldValue = createDDMFormFieldValue("srfa", "Text",
                createLocalizedValue("En Text Value 1", "Pt Text Value 1", LocaleUtil.US));

        text1DDMFormFieldValue.addNestedDDMFormFieldValue(createDDMFormFieldValue("elcy", "TextArea",
                createLocalizedValue("En Text Area Value 1", "Pt Text Area Value 1", LocaleUtil.US)));
        text1DDMFormFieldValue.addNestedDDMFormFieldValue(createDDMFormFieldValue("uxyj", "TextArea",
                createLocalizedValue("En Text Area Value 2", "Pt Text Area Value 2", LocaleUtil.US)));

        ddmFormValues.addDDMFormFieldValue(text1DDMFormFieldValue);

        DDMFormFieldValue text2DDMFormFieldValue = createDDMFormFieldValue("ealq", "Text",
                createLocalizedValue("En Text Value 2", "Pt Text Value 2", LocaleUtil.US));

        text2DDMFormFieldValue.addNestedDDMFormFieldValue(createDDMFormFieldValue("eepy", "TextArea",
                createLocalizedValue("En Text Area Value 3", "Pt Text Area Value 3", LocaleUtil.US)));

        ddmFormValues.addDDMFormFieldValue(text2DDMFormFieldValue);

        // XML

        Document document = SAXReaderUtil.createDocument();

        Element rootElement = document.addElement("root");

        rootElement.addAttribute("default-locale", "en_US");
        rootElement.addAttribute("available-locales", "en_US,pt_BR");

        addDynamicElementElement(rootElement, "Text", new String[] { "En Text Value 1", "En Text Value 2" },
                new String[] { "Pt Text Value 1", "Pt Text Value 2" });
        addDynamicElementElement(rootElement, "TextArea",
                new String[] { "En Text Area Value 1", "En Text Area Value 2", "En Text Area Value 3" },
                new String[] { "Pt Text Area Value 1", "Pt Text Area Value 2", "Pt Text Area Value 3" });
        addDynamicElementElement(rootElement, "_fieldsDisplay",
                new String[] { "Text_INSTANCE_srfa,TextArea_INSTANCE_elcy,"
                        + "TextArea_INSTANCE_uxyj,Text_INSTANCE_ealq," + "TextArea_INSTANCE_eepy" });

        String expectedJSON = _ddmFormValuesJSONSerializer.serialize(ddmFormValues);

        DDMFormValues actualDDMFormValues = _upgradeDynamicDataMapping.getDDMFormValues(1L, ddmForm,
                document.asXML());

        String actualJSON = _upgradeDynamicDataMapping.toJSON(actualDDMFormValues);

        JSONAssert.assertEquals(expectedJSON, actualJSON, false);
    }

    @Test
    public void testToJSONWithLocalizedData() throws Exception {
        DDMForm ddmForm = new DDMForm();

        ddmForm.setAvailableLocales(createAvailableLocales(LocaleUtil.US));
        ddmForm.setDefaultLocale(LocaleUtil.US);

        DDMFormField textDDMFormField = new DDMFormField("Text", "text");

        textDDMFormField.setDataType("string");
        textDDMFormField.setLocalizable(true);
        textDDMFormField.setRepeatable(true);

        ddmForm.addDDMFormField(textDDMFormField);

        DDMFormField textAreaDDMFormField = new DDMFormField("TextArea", "textarea");

        textAreaDDMFormField.setDataType("string");
        textAreaDDMFormField.setLocalizable(true);
        textAreaDDMFormField.setRepeatable(true);

        ddmForm.addDDMFormField(textAreaDDMFormField);

        DDMFormField integerDDMFormField = new DDMFormField("Integer", "ddm-integer");

        integerDDMFormField.setDataType("integer");
        integerDDMFormField.setLocalizable(false);
        integerDDMFormField.setRepeatable(false);

        ddmForm.addDDMFormField(integerDDMFormField);

        // DDM form values

        DDMFormValues ddmFormValues = new DDMFormValues(ddmForm);

        ddmFormValues.setAvailableLocales(createAvailableLocales(LocaleUtil.BRAZIL, LocaleUtil.US));
        ddmFormValues.setDefaultLocale(LocaleUtil.US);

        ddmFormValues.addDDMFormFieldValue(createDDMFormFieldValue("srfa", "Text",
                createLocalizedValue("En Text Value 1", "Pt Text Value 1", LocaleUtil.US)));
        ddmFormValues.addDDMFormFieldValue(createDDMFormFieldValue("ealq", "Text",
                createLocalizedValue("En Text Value 2", "Pt Text Value 2", LocaleUtil.US)));
        ddmFormValues.addDDMFormFieldValue(createDDMFormFieldValue("elcy", "TextArea",
                createLocalizedValue("En Text Area Value 1", "Pt Text Area Value 1", LocaleUtil.US)));
        ddmFormValues.addDDMFormFieldValue(createDDMFormFieldValue("uxyj", "TextArea",
                createLocalizedValue("En Text Area Value 2", "Pt Text Area Value 2", LocaleUtil.US)));
        ddmFormValues.addDDMFormFieldValue(createDDMFormFieldValue("eepy", "TextArea",
                createLocalizedValue("En Text Area Value 3", "Pt Text Area Value 3", LocaleUtil.US)));
        ddmFormValues.addDDMFormFieldValue(createDDMFormFieldValue("ckkp", "Integer", new UnlocalizedValue("1")));

        // XML

        Document document = SAXReaderUtil.createDocument();

        Element rootElement = document.addElement("root");

        rootElement.addAttribute("default-locale", "en_US");
        rootElement.addAttribute("available-locales", "en_US,pt_BR");

        addDynamicElementElement(rootElement, "Text", new String[] { "En Text Value 1", "En Text Value 2" },
                new String[] { "Pt Text Value 1", "Pt Text Value 2" });
        addDynamicElementElement(rootElement, "TextArea",
                new String[] { "En Text Area Value 1", "En Text Area Value 2", "En Text Area Value 3" },
                new String[] { "Pt Text Area Value 1", "Pt Text Area Value 2", "Pt Text Area Value 3" });
        addDynamicElementElement(rootElement, "Integer", new String[] { "1" });
        addDynamicElementElement(rootElement, "_fieldsDisplay",
                new String[] {
                        "Text_INSTANCE_srfa,Text_INSTANCE_ealq," + "TextArea_INSTANCE_elcy,TextArea_INSTANCE_uxyj,"
                                + "TextArea_INSTANCE_eepy,Integer_INSTANCE_ckkp" });

        String expectedJSON = _ddmFormValuesJSONSerializer.serialize(ddmFormValues);

        DDMFormValues actualDDMFormValues = _upgradeDynamicDataMapping.getDDMFormValues(1L, ddmForm,
                document.asXML());

        String actualJSON = _upgradeDynamicDataMapping.toJSON(actualDDMFormValues);

        JSONAssert.assertEquals(expectedJSON, actualJSON, false);
    }

    @Test
    public void testToJSONWithoutLocalizedData() throws Exception {
        DDMForm ddmForm = new DDMForm();

        ddmForm.setAvailableLocales(createAvailableLocales(LocaleUtil.US));
        ddmForm.setDefaultLocale(LocaleUtil.US);

        DDMFormField textDDMFormField = new DDMFormField("Text", "text");

        textDDMFormField.setDataType("string");
        textDDMFormField.setLocalizable(false);
        textDDMFormField.setRepeatable(false);

        ddmForm.addDDMFormField(textDDMFormField);

        DDMFormField textAreaDDMFormField = new DDMFormField("TextArea", "textarea");

        textAreaDDMFormField.setDataType("string");
        textAreaDDMFormField.setLocalizable(false);
        textAreaDDMFormField.setRepeatable(true);

        ddmForm.addDDMFormField(textAreaDDMFormField);

        // DDM form values

        DDMFormValues ddmFormValues = new DDMFormValues(ddmForm);

        ddmFormValues.setAvailableLocales(createAvailableLocales(LocaleUtil.US));
        ddmFormValues.setDefaultLocale(LocaleUtil.US);

        ddmFormValues
                .addDDMFormFieldValue(createDDMFormFieldValue("hcxo", "Text", new UnlocalizedValue("Text Value")));
        ddmFormValues.addDDMFormFieldValue(
                createDDMFormFieldValue("vfqd", "TextArea", new UnlocalizedValue("Text Area Value 1")));
        ddmFormValues.addDDMFormFieldValue(
                createDDMFormFieldValue("ycey", "TextArea", new UnlocalizedValue("Text Area Value 2")));
        ddmFormValues.addDDMFormFieldValue(
                createDDMFormFieldValue("habt", "TextArea", new UnlocalizedValue("Text Area Value 3")));

        // XML

        Document document = SAXReaderUtil.createDocument();

        Element rootElement = document.addElement("root");

        rootElement.addAttribute("default-locale", "en_US");
        rootElement.addAttribute("available-locales", "en_US");

        addDynamicElementElement(rootElement, "Text", new String[] { "Text Value" });
        addDynamicElementElement(rootElement, "TextArea",
                new String[] { "Text Area Value 1", "Text Area Value 2", "Text Area Value 3" });
        addDynamicElementElement(rootElement, "_fieldsDisplay", new String[] {
                "Text_INSTANCE_hcxo,TextArea_INSTANCE_vfqd," + "TextArea_INSTANCE_ycey,TextArea_INSTANCE_habt" });

        String expectedJSON = _ddmFormValuesJSONSerializer.serialize(ddmFormValues);

        DDMFormValues actualDDMFormValues = _upgradeDynamicDataMapping.getDDMFormValues(1L, ddmForm,
                document.asXML());

        String actualJSON = _upgradeDynamicDataMapping.toJSON(actualDDMFormValues);

        JSONAssert.assertEquals(expectedJSON, actualJSON, false);
    }

    @Test
    public void testToXMLWithoutLocalizedData() throws Exception {
        Map<String, String> expandoValuesMap = new HashMap<>();

        expandoValuesMap.put("Text", createLocalizationXML(new String[] { "Joe Bloggs" }));

        String fieldsDisplay = "Text_INSTANCE_hcxo";

        expandoValuesMap.put("_fieldsDisplay", createLocalizationXML(new String[] { fieldsDisplay }));

        String xml = _upgradeDynamicDataMapping.toXML(expandoValuesMap);

        Document document = SAXReaderUtil.read(xml);

        Map<String, Map<String, List<String>>> dataMap = toDataMap(document);

        Map<String, List<String>> actualTextData = dataMap.get("Text");

        assertEquals(ListUtil.toList(new String[] { "Joe Bloggs" }), actualTextData.get("en_US"));

        Map<String, List<String>> actualFieldsDisplayData = dataMap.get("_fieldsDisplay");

        assertEquals(ListUtil.toList(new String[] { fieldsDisplay }), actualFieldsDisplayData.get("en_US"));
    }

    @Test
    public void testToXMLWithRepeatableAndLocalizedData() throws Exception {
        Map<String, String> expandoValuesMap = new HashMap<>();

        expandoValuesMap.put("Text",
                createLocalizationXML(new String[] { "A", "B", "C" }, new String[] { "D", "E", "F" }));

        String fieldsDisplay = "Text_INSTANCE_hcxo,Text_INSTANCE_vfqd,Text_INSTANCE_ycey";

        expandoValuesMap.put("_fieldsDisplay", createLocalizationXML(new String[] { fieldsDisplay }));

        String xml = _upgradeDynamicDataMapping.toXML(expandoValuesMap);

        Document document = SAXReaderUtil.read(xml);

        Map<String, Map<String, List<String>>> dataMap = toDataMap(document);

        Map<String, List<String>> actualTextData = dataMap.get("Text");

        assertEquals(ListUtil.toList(new String[] { "A", "B", "C" }), actualTextData.get("en_US"));

        assertEquals(ListUtil.toList(new String[] { "D", "E", "F" }), actualTextData.get("pt_BR"));

        Map<String, List<String>> actualFieldsDisplayData = dataMap.get("_fieldsDisplay");

        assertEquals(ListUtil.toList(new String[] { fieldsDisplay }), actualFieldsDisplayData.get("en_US"));
    }

    protected void addDynamicContentElements(Element dynamicElementElement, String[] dynamicContentDataArray,
            Locale locale) {

        for (String dynamicContentData : dynamicContentDataArray) {
            Element dynamicContentElement = dynamicElementElement.addElement("dynamic-content");

            dynamicContentElement.addAttribute("language-id", LocaleUtil.toLanguageId(locale));
            dynamicContentElement.addCDATA(dynamicContentData);
        }
    }

    protected void addDynamicElementElement(Element rootElement, String fieldName,
            String[] enDynamicContentDataArray) {

        Element dynamicElementElement = createDynamicElementElement(rootElement, fieldName);

        addDynamicContentElements(dynamicElementElement, enDynamicContentDataArray, LocaleUtil.US);
    }

    protected void addDynamicElementElement(Element rootElement, String fieldName,
            String[] enDynamicContentDataArray, String[] ptDynamicContentDataArray) {

        Element dynamicElementElement = createDynamicElementElement(rootElement, fieldName);

        addDynamicContentElements(dynamicElementElement, enDynamicContentDataArray, LocaleUtil.US);
        addDynamicContentElements(dynamicElementElement, ptDynamicContentDataArray, LocaleUtil.BRAZIL);
    }

    protected void append(Map<String, List<String>> localizedDataMap, String languageId, String localizedData) {

        List<String> data = localizedDataMap.get(languageId);

        if (data == null) {
            data = new ArrayList<>();

            localizedDataMap.put(languageId, data);
        }

        data.add(localizedData);
    }

    protected void assertEquals(List<String> expectedDataValues, List<String> actualDataValues) {

        int expectedDataValuesSize = expectedDataValues.size();

        Assert.assertEquals(actualDataValues.toString(), expectedDataValuesSize, actualDataValues.size());

        for (int i = 0; i < expectedDataValuesSize; i++) {
            Assert.assertEquals(expectedDataValues.get(i), actualDataValues.get(i));
        }
    }

    protected Set<Locale> createAvailableLocales(Locale... locales) {
        Set<Locale> availableLocales = new LinkedHashSet<>();

        for (Locale locale : locales) {
            availableLocales.add(locale);
        }

        return availableLocales;
    }

    protected DDMFormFieldValue createDDMFormFieldValue(String instanceId, String name, Value value) {

        DDMFormFieldValue ddmFormFieldValue = new DDMFormFieldValue();

        ddmFormFieldValue.setInstanceId(instanceId);
        ddmFormFieldValue.setName(name);
        ddmFormFieldValue.setValue(value);

        return ddmFormFieldValue;
    }

    protected Element createDynamicElementElement(Element rootElement, String fieldName) {

        Element dynamicElementElement = rootElement.addElement("dynamic-element");

        dynamicElementElement.addAttribute("default-language-id", "en_US");
        dynamicElementElement.addAttribute("name", fieldName);

        return dynamicElementElement;
    }

    protected String createLocalizationXML(String[] enData) {
        StringBundler sb = new StringBundler(6);

        sb.append("<?xml version=\"1.0\"?>");
        sb.append("<root available-locales='en_US' default-locale='en_US'>");
        sb.append("<Data language-id='en_US'>");
        sb.append(StringUtil.merge(enData));
        sb.append("</Data>");
        sb.append("</root>");

        return sb.toString();
    }

    protected String createLocalizationXML(String[] enData, String[] ptData) {
        StringBundler sb = new StringBundler(10);

        sb.append("<?xml version=\"1.0\"?>");
        sb.append("<root available-locales='en_US,pt_BR,' ");
        sb.append("default-locale='en_US'>");
        sb.append("<Data language-id='en_US'>");
        sb.append(StringUtil.merge(enData));
        sb.append("</Data>");
        sb.append("<Data language-id='pt_BR'>");
        sb.append(StringUtil.merge(ptData));
        sb.append("</Data>");
        sb.append("</root>");

        return sb.toString();
    }

    protected Value createLocalizedValue(String enValue, String ptValue, Locale defaultLocale) {

        Value value = new LocalizedValue(defaultLocale);

        value.addString(LocaleUtil.BRAZIL, ptValue);
        value.addString(LocaleUtil.US, enValue);

        return value;
    }

    protected Map<String, List<String>> getLocalizedDataMap(Element dynamicElementElement) {

        Map<String, List<String>> localizedDataMap = new HashMap<>();

        for (Element dynamicContentElement : dynamicElementElement.elements()) {
            String languageId = dynamicContentElement.attributeValue("language-id");

            append(localizedDataMap, languageId, dynamicContentElement.getText());
        }

        return localizedDataMap;
    }

    protected void setUpDDMFormValuesJSONDeserializer() throws Exception {
        field(DDMFormValuesJSONDeserializerImpl.class, "_jsonFactory").set(_ddmFormValuesJSONDeserializer,
                new JSONFactoryImpl());
    }

    protected void setUpDDMFormValuesJSONSerializer() throws Exception {
        field(DDMFormValuesJSONSerializerImpl.class, "_jsonFactory").set(_ddmFormValuesJSONSerializer,
                new JSONFactoryImpl());
    }

    protected void setUpJSONFactoryUtil() {
        JSONFactoryUtil jsonFactoryUtil = new JSONFactoryUtil();

        jsonFactoryUtil.setJSONFactory(new JSONFactoryImpl());
    }

    protected void setUpLanguageUtil() {
        whenLanguageGetLanguageId(LocaleUtil.US, "en_US");
        whenLanguageGetLanguageId(LocaleUtil.BRAZIL, "pt_BR");

        whenLanguageGetAvailableLocalesThen(SetUtil.fromArray(new Locale[] { LocaleUtil.BRAZIL, LocaleUtil.US }));

        whenLanguageIsAvailableLocale(LocaleUtil.BRAZIL);
        whenLanguageIsAvailableLocale(LocaleUtil.US);

        LanguageUtil languageUtil = new LanguageUtil();

        languageUtil.setLanguage(_language);
    }

    protected void setUpLocaleUtil() {
        mockStatic(LocaleUtil.class);

        when(LocaleUtil.fromLanguageId("en_US")).thenReturn(LocaleUtil.US);

        when(LocaleUtil.fromLanguageId("pt_BR")).thenReturn(LocaleUtil.BRAZIL);

        when(LocaleUtil.toLanguageId(LocaleUtil.US)).thenReturn("en_US");

        when(LocaleUtil.toLanguageId(LocaleUtil.BRAZIL)).thenReturn("pt_BR");

        when(LocaleUtil.toLanguageIds((Locale[]) Matchers.any())).then(new Answer<String[]>() {

            @Override
            public String[] answer(InvocationOnMock invocationOnMock) throws Throwable {

                Object[] args = invocationOnMock.getArguments();

                Locale[] locales = (Locale[]) args[0];

                String[] languageIds = new String[locales.length];

                for (int i = 0; i < locales.length; i++) {
                    languageIds[i] = LocaleUtil.toLanguageId(locales[i]);
                }

                return languageIds;
            }

        });
    }

    protected void setUpLocalizationUtil() {
        LocalizationUtil localizationUtil = new LocalizationUtil();

        localizationUtil.setLocalization(new LocalizationImpl());
    }

    protected void setUpPropsValues() {
        mockStatic(PropsValues.class);
    }

    protected void setUpSAXReaderUtil() {
        SAXReaderUtil saxReaderUtil = new SAXReaderUtil();

        SAXReaderImpl secureSAXReader = new SAXReaderImpl();

        secureSAXReader.setSecure(true);

        saxReaderUtil.setSAXReader(secureSAXReader);

        UnsecureSAXReaderUtil unsecureSAXReaderUtil = new UnsecureSAXReaderUtil();

        SAXReaderImpl unsecureSAXReader = new SAXReaderImpl();

        unsecureSAXReaderUtil.setSAXReader(unsecureSAXReader);
    }

    protected void setUpSecureXMLFactoryProviderUtil() {
        SecureXMLFactoryProviderUtil secureXMLFactoryProviderUtil = new SecureXMLFactoryProviderUtil();

        secureXMLFactoryProviderUtil.setSecureXMLFactoryProvider(new SecureXMLFactoryProviderImpl());
    }

    protected Map<String, Map<String, List<String>>> toDataMap(Document document) {

        Element rootElement = document.getRootElement();

        Map<String, Map<String, List<String>>> dataMap = new HashMap<>();

        for (Element dynamicElementElement : rootElement.elements("dynamic-element")) {

            String name = dynamicElementElement.attributeValue("name");

            Map<String, List<String>> localizedDataMap = getLocalizedDataMap(dynamicElementElement);

            dataMap.put(name, localizedDataMap);
        }

        return dataMap;
    }

    protected void whenLanguageGetAvailableLocalesThen(Set<Locale> availableLocales) {

        when(_language.getAvailableLocales()).thenReturn(availableLocales);
    }

    protected void whenLanguageGetLanguageId(Locale locale, String languageId) {
        when(_language.getLanguageId(Matchers.eq(locale))).thenReturn(languageId);
    }

    protected void whenLanguageIsAvailableLocale(Locale locale) {
        when(_language.isAvailableLocale(Matchers.eq(locale))).thenReturn(true);
    }

    private final DDMFormValuesJSONDeserializer _ddmFormValuesJSONDeserializer = new DDMFormValuesJSONDeserializerImpl();
    private final DDMFormValuesJSONSerializer _ddmFormValuesJSONSerializer = new DDMFormValuesJSONSerializerImpl();

    @Mock
    private Language _language;

    private UpgradeDynamicDataMapping _upgradeDynamicDataMapping;

}