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.DDMFormXSDDeserializerUtil;
020 import com.liferay.portlet.dynamicdatamapping.io.DDMFormXSDSerializerUtil;
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 = DDMFormXSDDeserializerUtil.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<DDMFormField>(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 String serializeDDMForm(DDMForm templateDDMForm) {
114 String script = DDMFormXSDSerializerUtil.serialize(templateDDMForm);
115
116 return DDMXMLUtil.formatXML(script);
117 }
118
119 protected void synchronizeDDMFormFieldRequiredProperty(
120 DDMFormField structureDDMFormField, DDMFormField templateDDMFormField,
121 String templateMode) {
122
123 if (structureDDMFormField == null) {
124 return;
125 }
126
127 if (!templateMode.equals(DDMTemplateConstants.TEMPLATE_MODE_CREATE)) {
128 return;
129 }
130
131 templateDDMFormField.setRequired(structureDDMFormField.isRequired());
132 }
133
134 protected void synchronizeDDMFormFields(
135 Map<String, DDMFormField> structureDDMFormFieldsMap,
136 List<DDMFormField> templateDDMFormFields, String templateMode) {
137
138 Iterator<DDMFormField> itr = templateDDMFormFields.iterator();
139
140 while (itr.hasNext()) {
141 DDMFormField templateDDMFormField = itr.next();
142
143 String dataType = templateDDMFormField.getDataType();
144 String name = templateDDMFormField.getName();
145
146 if (Validator.isNotNull(dataType) &&
147 !structureDDMFormFieldsMap.containsKey(name)) {
148
149 itr.remove();
150
151 continue;
152 }
153
154 synchronizeDDMFormFieldRequiredProperty(
155 structureDDMFormFieldsMap.get(name), templateDDMFormField,
156 templateMode);
157
158 synchronizeDDMFormFields(
159 structureDDMFormFieldsMap,
160 templateDDMFormField.getNestedDDMFormFields(), templateMode);
161 }
162 }
163
164 protected void updateDDMTemplate(
165 DDMTemplate ddmTemplate, DDMForm templateDDMForm) {
166
167 String script = serializeDDMForm(templateDDMForm);
168
169 ddmTemplate.setScript(script);
170
171 DDMTemplateLocalServiceUtil.updateDDMTemplate(ddmTemplate);
172 }
173
174 private List<DDMTemplate> _ddmFormTemplates = new ArrayList<DDMTemplate>();
175 private DDMForm _structureDDMForm;
176
177 }