001
014
015 package com.liferay.portlet.dynamicdatamapping.util;
016
017 import com.liferay.portal.kernel.exception.PortalException;
018 import com.liferay.portal.kernel.util.Validator;
019 import com.liferay.portlet.dynamicdatamapping.io.DDMFormJSONDeserializerUtil;
020 import com.liferay.portlet.dynamicdatamapping.io.DDMFormJSONSerializerUtil;
021 import com.liferay.portlet.dynamicdatamapping.model.DDMForm;
022 import com.liferay.portlet.dynamicdatamapping.model.DDMFormField;
023 import com.liferay.portlet.dynamicdatamapping.model.DDMTemplate;
024 import com.liferay.portlet.dynamicdatamapping.model.DDMTemplateConstants;
025 import com.liferay.portlet.dynamicdatamapping.service.DDMTemplateLocalServiceUtil;
026
027 import java.util.ArrayList;
028 import java.util.Iterator;
029 import java.util.LinkedList;
030 import java.util.List;
031 import java.util.Map;
032 import java.util.Queue;
033
034
037 public class DDMFormTemplateSynchonizer {
038
039 public DDMFormTemplateSynchonizer(DDMForm structureDDMForm) {
040 _structureDDMForm = structureDDMForm;
041 }
042
043 public void setDDMFormTemplates(List<DDMTemplate> ddmFormTemplates) {
044 _ddmFormTemplates = ddmFormTemplates;
045 }
046
047 public void synchronize() throws PortalException {
048 for (DDMTemplate ddmTemplate : getDDMFormTemplates()) {
049 DDMForm templateDDMForm = DDMFormJSONDeserializerUtil.deserialize(
050 ddmTemplate.getScript());
051
052 synchronizeDDMFormFields(
053 _structureDDMForm.getDDMFormFieldsMap(true),
054 templateDDMForm.getDDMFormFields(), ddmTemplate.getMode());
055
056 String mode = ddmTemplate.getMode();
057
058 if (mode.equals(DDMTemplateConstants.TEMPLATE_MODE_CREATE)) {
059 addRequiredDDMFormFields(
060 _structureDDMForm.getDDMFormFields(),
061 templateDDMForm.getDDMFormFields());
062 }
063
064 updateDDMTemplate(ddmTemplate, templateDDMForm);
065 }
066 }
067
068 protected void addRequiredDDMFormFields(
069 List<DDMFormField> structureDDMFormFields,
070 List<DDMFormField> templateDDMFormFields) {
071
072 for (int i = 0; i < structureDDMFormFields.size(); i++) {
073 DDMFormField structureDDMFormField = structureDDMFormFields.get(i);
074
075 DDMFormField templateDDMFormField = getDDMFormField(
076 templateDDMFormFields, structureDDMFormField.getName());
077
078 if (templateDDMFormField == null) {
079 if (structureDDMFormField.isRequired()) {
080 templateDDMFormFields.add(structureDDMFormField);
081 }
082 }
083 else {
084 addRequiredDDMFormFields(
085 structureDDMFormField.getNestedDDMFormFields(),
086 templateDDMFormField.getNestedDDMFormFields());
087 }
088 }
089 }
090
091 protected DDMFormField getDDMFormField(
092 List<DDMFormField> ddmFormFields, String name) {
093
094 Queue<DDMFormField> queue = new LinkedList<>(ddmFormFields);
095
096 DDMFormField ddmFormField = null;
097
098 while ((ddmFormField = queue.poll()) != null) {
099 if (name.equals(ddmFormField.getName())) {
100 return ddmFormField;
101 }
102
103 queue.addAll(ddmFormField.getNestedDDMFormFields());
104 }
105
106 return null;
107 }
108
109 protected List<DDMTemplate> getDDMFormTemplates() {
110 return _ddmFormTemplates;
111 }
112
113 protected void synchronizeDDMFormFieldRequiredProperty(
114 DDMFormField structureDDMFormField, DDMFormField templateDDMFormField,
115 String templateMode) {
116
117 if (structureDDMFormField == null) {
118 return;
119 }
120
121 if (!templateMode.equals(DDMTemplateConstants.TEMPLATE_MODE_CREATE)) {
122 return;
123 }
124
125 templateDDMFormField.setRequired(structureDDMFormField.isRequired());
126 }
127
128 protected void synchronizeDDMFormFields(
129 Map<String, DDMFormField> structureDDMFormFieldsMap,
130 List<DDMFormField> templateDDMFormFields, String templateMode) {
131
132 Iterator<DDMFormField> itr = templateDDMFormFields.iterator();
133
134 while (itr.hasNext()) {
135 DDMFormField templateDDMFormField = itr.next();
136
137 String dataType = templateDDMFormField.getDataType();
138 String name = templateDDMFormField.getName();
139
140 if (Validator.isNotNull(dataType) &&
141 !structureDDMFormFieldsMap.containsKey(name)) {
142
143 itr.remove();
144
145 continue;
146 }
147
148 synchronizeDDMFormFieldRequiredProperty(
149 structureDDMFormFieldsMap.get(name), templateDDMFormField,
150 templateMode);
151
152 synchronizeDDMFormFields(
153 structureDDMFormFieldsMap,
154 templateDDMFormField.getNestedDDMFormFields(), templateMode);
155 }
156 }
157
158 protected void updateDDMTemplate(
159 DDMTemplate ddmTemplate, DDMForm templateDDMForm) {
160
161 String script = DDMFormJSONSerializerUtil.serialize(templateDDMForm);
162
163 ddmTemplate.setScript(script);
164
165 DDMTemplateLocalServiceUtil.updateDDMTemplate(ddmTemplate);
166 }
167
168 private List<DDMTemplate> _ddmFormTemplates = new ArrayList<>();
169 private final DDMForm _structureDDMForm;
170
171 }