001
014
015 package com.liferay.portlet.dynamicdatalists.lar;
016
017 import com.liferay.portal.kernel.lar.BasePortletDataHandler;
018 import com.liferay.portal.kernel.lar.PortletDataContext;
019 import com.liferay.portal.kernel.util.MapUtil;
020 import com.liferay.portal.kernel.util.StringBundler;
021 import com.liferay.portal.kernel.xml.Document;
022 import com.liferay.portal.kernel.xml.Element;
023 import com.liferay.portal.kernel.xml.SAXReaderUtil;
024 import com.liferay.portal.service.ServiceContext;
025 import com.liferay.portal.util.PortletKeys;
026 import com.liferay.portlet.dynamicdatalists.model.DDLRecordSet;
027 import com.liferay.portlet.dynamicdatalists.service.DDLRecordSetLocalServiceUtil;
028 import com.liferay.portlet.dynamicdatalists.service.persistence.DDLRecordSetUtil;
029 import com.liferay.portlet.dynamicdatamapping.lar.DDMPortletDataHandlerImpl;
030 import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
031 import com.liferay.portlet.dynamicdatamapping.model.DDMTemplate;
032
033 import java.util.List;
034 import java.util.Map;
035
036 import javax.portlet.PortletPreferences;
037
038
041 public class DDLPortletDataHandlerImpl
042 extends BasePortletDataHandler implements DDLPortletDataHandler {
043
044 public void exportRecordSet(
045 PortletDataContext portletDataContext, Element recordSetsElement,
046 DDLRecordSet recordSet)
047 throws Exception {
048
049 String path = getRecordSetPath(portletDataContext, recordSet);
050
051 if (!portletDataContext.isPathNotProcessed(path)) {
052 return;
053 }
054
055 Element recordSetElement = recordSetsElement.addElement("record-set");
056
057 portletDataContext.addClassedModel(
058 recordSetElement, path, recordSet, _NAMESPACE);
059
060 Element ddmStructuresElement = recordSetElement.addElement(
061 "ddm-structures");
062
063 DDMStructure ddmStructure = recordSet.getDDMStructure();
064
065 DDMPortletDataHandlerImpl.exportStructure(
066 portletDataContext, ddmStructuresElement, ddmStructure);
067
068 Element ddmTemplatesElement = recordSetElement.addElement(
069 "ddm-templates");
070
071 List<DDMTemplate> ddmTemplates = ddmStructure.getTemplates();
072
073 for (DDMTemplate ddmTemplate : ddmTemplates) {
074 DDMPortletDataHandlerImpl.exportTemplate(
075 portletDataContext, ddmTemplatesElement, ddmTemplate);
076 }
077 }
078
079 public void importRecordSet(
080 PortletDataContext portletDataContext, Element recordSetElement)
081 throws Exception {
082
083 Element ddmStructuresElement = recordSetElement.element(
084 "ddm-structures");
085
086 if (ddmStructuresElement != null) {
087 importDDMStructures(portletDataContext, ddmStructuresElement);
088 }
089
090 Element ddmTemplatesElement = recordSetElement.element("ddm-templates");
091
092 if (ddmTemplatesElement != null) {
093 importDDMTemplates(portletDataContext, ddmTemplatesElement);
094 }
095
096 String path = recordSetElement.attributeValue("path");
097
098 if (!portletDataContext.isPathNotProcessed(path)) {
099 return;
100 }
101
102 DDLRecordSet recordSet =
103 (DDLRecordSet)portletDataContext.getZipEntryAsObject(path);
104
105 long userId = portletDataContext.getUserId(recordSet.getUserUuid());
106
107 Map<Long, Long> structureIds =
108 (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
109 DDMStructure.class);
110
111 long structureId = MapUtil.getLong(
112 structureIds, recordSet.getDDMStructureId(),
113 recordSet.getDDMStructureId());
114
115 ServiceContext serviceContext = portletDataContext.createServiceContext(
116 recordSetElement, recordSet, _NAMESPACE);
117
118 DDLRecordSet importedRecordSet = null;
119
120 if (portletDataContext.isDataStrategyMirror()) {
121 DDLRecordSet existingRecordSet = DDLRecordSetUtil.fetchByUUID_G(
122 recordSet.getUuid(), portletDataContext.getScopeGroupId());
123
124 if (existingRecordSet == null) {
125 serviceContext.setUuid(recordSet.getUuid());
126
127 importedRecordSet = DDLRecordSetLocalServiceUtil.addRecordSet(
128 userId, portletDataContext.getScopeGroupId(), structureId,
129 recordSet.getRecordSetKey(), recordSet.getNameMap(),
130 recordSet.getDescriptionMap(),
131 recordSet.getMinDisplayRows(), recordSet.getScope(),
132 serviceContext);
133 }
134 else {
135 importedRecordSet =
136 DDLRecordSetLocalServiceUtil.updateRecordSet(
137 existingRecordSet.getRecordSetId(), structureId,
138 recordSet.getNameMap(), recordSet.getDescriptionMap(),
139 recordSet.getMinDisplayRows(), serviceContext);
140 }
141 }
142 else {
143 importedRecordSet = DDLRecordSetLocalServiceUtil.addRecordSet(
144 userId, portletDataContext.getScopeGroupId(), structureId,
145 recordSet.getRecordSetKey(), recordSet.getNameMap(),
146 recordSet.getDescriptionMap(), recordSet.getMinDisplayRows(),
147 recordSet.getScope(), serviceContext);
148 }
149
150 portletDataContext.importClassedModel(
151 recordSet, importedRecordSet, _NAMESPACE);
152 }
153
154 @Override
155 public boolean isAlwaysExportable() {
156 return _ALWAYS_EXPORTABLE;
157 }
158
159 @Override
160 public boolean isDataLocalized() {
161 return _DATA_LOCALIZED;
162 }
163
164 @Override
165 protected PortletPreferences doDeleteData(
166 PortletDataContext portletDataContext, String portletId,
167 PortletPreferences portletPreferences)
168 throws Exception {
169
170 if (!portletDataContext.addPrimaryKey(
171 DDLPortletDataHandlerImpl.class, "deleteData")) {
172
173 DDLRecordSetLocalServiceUtil.deleteRecordSets(
174 portletDataContext.getScopeGroupId());
175 }
176
177 return portletPreferences;
178 }
179
180 @Override
181 protected String doExportData(
182 PortletDataContext portletDataContext, String portletId,
183 PortletPreferences portletPreferences)
184 throws Exception {
185
186 portletDataContext.addPermissions(
187 "com.liferay.portlet.dynamicdatalist",
188 portletDataContext.getScopeGroupId());
189
190 Document document = SAXReaderUtil.createDocument();
191
192 Element rootElement = document.addElement("ddl-data");
193
194 Element recordSetsElement = rootElement.addElement("record-sets");
195
196 List<DDLRecordSet> recordSets =
197 DDLRecordSetLocalServiceUtil.getRecordSets(
198 portletDataContext.getScopeGroupId());
199
200 for (DDLRecordSet recordSet : recordSets) {
201 if (portletDataContext.isWithinDateRange(
202 recordSet.getModifiedDate())) {
203
204 exportRecordSet(
205 portletDataContext, recordSetsElement, recordSet);
206 }
207 }
208
209 return document.formattedString();
210 }
211
212 @Override
213 protected PortletPreferences doImportData(
214 PortletDataContext portletDataContext, String portletId,
215 PortletPreferences portletPreferences, String data)
216 throws Exception {
217
218 portletDataContext.importPermissions(
219 "com.liferay.portlet.dynamicdatalist",
220 portletDataContext.getSourceGroupId(),
221 portletDataContext.getScopeGroupId());
222
223 Document document = SAXReaderUtil.read(data);
224
225 Element rootElement = document.getRootElement();
226
227 Element recordSetsElement = rootElement.element("record-sets");
228
229 List<Element> recordSetElements = recordSetsElement.elements(
230 "record-set");
231
232 for (Element recordSetElement : recordSetElements) {
233 importRecordSet(portletDataContext, recordSetElement);
234 }
235
236 return portletPreferences;
237 }
238
239 protected String getRecordSetPath(
240 PortletDataContext portletDataContext, DDLRecordSet recordSet) {
241
242 StringBundler sb = new StringBundler(4);
243
244 sb.append(
245 portletDataContext.getPortletPath(PortletKeys.DYNAMIC_DATA_LISTS));
246 sb.append("/record-sets/");
247 sb.append(recordSet.getRecordSetId());
248 sb.append(".xml");
249
250 return sb.toString();
251 }
252
253 protected void importDDMStructures(
254 PortletDataContext portletDataContext,
255 Element ddmStructureReferencesElement)
256 throws Exception {
257
258 List<Element> ddmStructureElements =
259 ddmStructureReferencesElement.elements("structure");
260
261 for (Element ddmStructureElement : ddmStructureElements) {
262 DDMPortletDataHandlerImpl.importStructure(
263 portletDataContext, ddmStructureElement);
264 }
265 }
266
267 protected void importDDMTemplates(
268 PortletDataContext portletDataContext,
269 Element ddmTemplateReferencesElement)
270 throws Exception {
271
272 List<Element> ddmTemplateElements =
273 ddmTemplateReferencesElement.elements("template");
274
275 for (Element ddmTemplateElement : ddmTemplateElements) {
276 DDMPortletDataHandlerImpl.importTemplate(
277 portletDataContext, ddmTemplateElement);
278 }
279 }
280
281 private static final boolean _ALWAYS_EXPORTABLE = true;
282
283 private static final boolean _DATA_LOCALIZED = true;
284
285 private static final String _NAMESPACE = "ddl";
286
287 }