/**
* 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.util;
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.util.DDMFormValuesMerger;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.osgi.service.component.annotations.Component;
/**
* @author InĂ¡cio Nery
*/
@Component(immediate = true)
public class DDMFormValuesMergerImpl implements DDMFormValuesMerger {
@Override
public DDMFormValues merge(
DDMFormValues newDDMFormValues, DDMFormValues existingDDMFormValues) {
List<DDMFormFieldValue> mergedDDMFormFieldValues =
mergeDDMFormFieldValues(
newDDMFormValues.getDDMFormFieldValues(),
existingDDMFormValues.getDDMFormFieldValues());
existingDDMFormValues.setDDMFormFieldValues(mergedDDMFormFieldValues);
return existingDDMFormValues;
}
protected DDMFormFieldValue getDDMFormFieldValueByName(
List<DDMFormFieldValue> ddmFormFieldValues, String name) {
for (DDMFormFieldValue ddmFormFieldValue : ddmFormFieldValues) {
if (name.equals(ddmFormFieldValue.getName())) {
return ddmFormFieldValue;
}
}
return null;
}
protected List<DDMFormFieldValue> mergeDDMFormFieldValues(
List<DDMFormFieldValue> newDDMFormFieldValues,
List<DDMFormFieldValue> existingDDMFormFieldValues) {
List<DDMFormFieldValue> mergedDDMFormFieldValues = new ArrayList<>(
existingDDMFormFieldValues);
for (DDMFormFieldValue newDDMFormFieldValue : newDDMFormFieldValues) {
DDMFormFieldValue actualDDMFormFieldValue =
getDDMFormFieldValueByName(
existingDDMFormFieldValues, newDDMFormFieldValue.getName());
if (actualDDMFormFieldValue != null) {
mergeValue(
newDDMFormFieldValue.getValue(),
actualDDMFormFieldValue.getValue());
List<DDMFormFieldValue> mergedNestedDDMFormFieldValues =
mergeDDMFormFieldValues(
newDDMFormFieldValue.getNestedDDMFormFieldValues(),
actualDDMFormFieldValue.getNestedDDMFormFieldValues());
newDDMFormFieldValue.setNestedDDMFormFields(
mergedNestedDDMFormFieldValues);
mergedDDMFormFieldValues.remove(actualDDMFormFieldValue);
}
mergedDDMFormFieldValues.add(newDDMFormFieldValue);
}
return mergedDDMFormFieldValues;
}
protected void mergeValue(Value newValue, Value existingValue) {
if (existingValue == null) {
return;
}
for (Locale locale : existingValue.getAvailableLocales()) {
String value = newValue.getString(locale);
if (value == null) {
newValue.addString(locale, existingValue.getString(locale));
}
}
}
}