/** * 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.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.StringPool; 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; }