001
014
015 package com.liferay.portal.verify;
016
017 import com.liferay.portal.kernel.dao.orm.QueryUtil;
018 import com.liferay.portal.kernel.json.JSONFactoryUtil;
019 import com.liferay.portal.kernel.json.JSONObject;
020 import com.liferay.portal.kernel.repository.model.FileEntry;
021 import com.liferay.portal.kernel.repository.model.FileVersion;
022 import com.liferay.portal.kernel.util.CharPool;
023 import com.liferay.portal.kernel.util.MimeTypesUtil;
024 import com.liferay.portal.kernel.util.StringBundler;
025 import com.liferay.portal.kernel.util.StringPool;
026 import com.liferay.portal.kernel.util.Validator;
027 import com.liferay.portal.kernel.xml.Document;
028 import com.liferay.portal.kernel.xml.Element;
029 import com.liferay.portal.kernel.xml.Node;
030 import com.liferay.portal.kernel.xml.SAXReaderUtil;
031 import com.liferay.portal.kernel.xml.XPath;
032 import com.liferay.portal.model.BaseModel;
033 import com.liferay.portal.model.CompanyConstants;
034 import com.liferay.portal.service.ServiceContext;
035 import com.liferay.portal.util.PortalUtil;
036 import com.liferay.portlet.documentlibrary.model.DLFileEntryMetadata;
037 import com.liferay.portlet.documentlibrary.model.DLFileVersion;
038 import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
039 import com.liferay.portlet.documentlibrary.model.DLSyncConstants;
040 import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
041 import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
042 import com.liferay.portlet.documentlibrary.service.DLFileEntryMetadataLocalServiceUtil;
043 import com.liferay.portlet.documentlibrary.store.DLStoreUtil;
044 import com.liferay.portlet.dynamicdatalists.model.DDLRecord;
045 import com.liferay.portlet.dynamicdatalists.model.DDLRecordModel;
046 import com.liferay.portlet.dynamicdatalists.model.DDLRecordSet;
047 import com.liferay.portlet.dynamicdatalists.model.DDLRecordVersion;
048 import com.liferay.portlet.dynamicdatalists.service.DDLRecordLocalServiceUtil;
049 import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
050 import com.liferay.portlet.dynamicdatamapping.model.DDMStructureLink;
051 import com.liferay.portlet.dynamicdatamapping.model.DDMTemplate;
052 import com.liferay.portlet.dynamicdatamapping.model.DDMTemplateConstants;
053 import com.liferay.portlet.dynamicdatamapping.service.DDMStructureLinkLocalServiceUtil;
054 import com.liferay.portlet.dynamicdatamapping.service.DDMStructureLocalServiceUtil;
055 import com.liferay.portlet.dynamicdatamapping.service.DDMTemplateLocalServiceUtil;
056 import com.liferay.portlet.dynamicdatamapping.storage.Field;
057 import com.liferay.portlet.dynamicdatamapping.storage.FieldConstants;
058 import com.liferay.portlet.dynamicdatamapping.storage.Fields;
059 import com.liferay.portlet.dynamicdatamapping.storage.StorageEngineUtil;
060 import com.liferay.portlet.dynamicdatamapping.util.DDMXMLUtil;
061
062 import java.io.File;
063 import java.io.Serializable;
064
065 import java.util.HashMap;
066 import java.util.List;
067 import java.util.Map;
068
069
072 public class VerifyDynamicDataMapping extends VerifyProcess {
073
074 protected FileEntry addFileEntry(
075 long companyId, long userId, long groupId, long folderId,
076 String fileName, String filePath, int status)
077 throws Exception {
078
079 String contentType = MimeTypesUtil.getContentType(fileName);
080
081 String title = fileName;
082
083 int index = title.indexOf(CharPool.PERIOD);
084
085 if (index > 0) {
086 title = title.substring(0, index);
087 }
088
089 File file = DLStoreUtil.getFile(
090 companyId, CompanyConstants.SYSTEM, filePath);
091
092 ServiceContext serviceContext = new ServiceContext();
093
094 serviceContext.setAddGroupPermissions(true);
095 serviceContext.setAddGuestPermissions(true);
096
097 FileEntry fileEntry = DLAppLocalServiceUtil.addFileEntry(
098 userId, groupId, folderId, fileName, contentType, title,
099 StringPool.BLANK, StringPool.BLANK, file, serviceContext);
100
101 updateFileEntryStatus(fileEntry, status, serviceContext);
102
103 return fileEntry;
104 }
105
106 protected boolean createDefaultMetadataElement(
107 Element dynamicElementElement, String defaultLanguageId) {
108
109 boolean hasDefaultMetadataElement = hasDefaultMetadataElement(
110 dynamicElementElement, defaultLanguageId);
111
112 if (hasDefaultMetadataElement) {
113 return false;
114 }
115
116 Element metadataElement = dynamicElementElement.addElement("meta-data");
117
118 metadataElement.addAttribute("locale", defaultLanguageId);
119
120 Element entryElement = metadataElement.addElement("entry");
121
122 entryElement.addAttribute("name", "label");
123 entryElement.addCDATA(StringPool.BLANK);
124
125 return true;
126 }
127
128 @Override
129 protected void doVerify() throws Exception {
130 setUpClassNameIds();
131
132 List<DDMStructure> structures =
133 DDMStructureLocalServiceUtil.getStructures();
134
135 for (DDMStructure structure : structures) {
136 verifyStructure(structure);
137
138 updateFileUploadReferences(structure);
139 }
140 }
141
142 protected String getFileUploadPath(BaseModel<?> baseModel)
143 throws Exception {
144
145 StringBundler sb = new StringBundler(7);
146
147 long primaryKey = 0;
148
149 String version = StringPool.BLANK;
150
151 if (baseModel instanceof DDLRecordModel) {
152 DDLRecord ddlRecord = (DDLRecord)baseModel;
153
154 primaryKey = ddlRecord.getPrimaryKey();
155
156 DDLRecordVersion ddlRecordVersion = ddlRecord.getRecordVersion();
157
158 version = ddlRecordVersion.getVersion();
159 }
160 else {
161 DLFileEntryMetadata dlFileEntryMetadata =
162 (DLFileEntryMetadata)baseModel;
163
164 primaryKey = dlFileEntryMetadata.getPrimaryKey();
165
166 DLFileVersion dlFileVersion = dlFileEntryMetadata.getFileVersion();
167
168 version = dlFileVersion.getVersion();
169 }
170
171 sb.append("ddm");
172 sb.append(StringPool.SLASH);
173 sb.append(baseModel.getModelClassName());
174 sb.append(StringPool.SLASH);
175 sb.append(primaryKey);
176 sb.append(StringPool.SLASH);
177 sb.append(version);
178
179 return sb.toString();
180 }
181
182 protected String getJSON(FileEntry fileEntry) {
183 JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
184
185 jsonObject.put("groupId", fileEntry.getGroupId());
186 jsonObject.put("uuid", fileEntry.getUuid());
187
188 return jsonObject.toString();
189 }
190
191 protected boolean hasDefaultMetadataElement(
192 Element dynamicElementElement, String defaultLanguageId) {
193
194 List<Element> metadataElements = dynamicElementElement.elements(
195 "meta-data");
196
197 for (Element metadataElement : metadataElements) {
198 String languageId = metadataElement.attributeValue("locale");
199
200 if (languageId.equals(defaultLanguageId)) {
201 return true;
202 }
203 }
204
205 return false;
206 }
207
208 protected boolean hasFileUploadFields(DDMStructure structure)
209 throws Exception {
210
211 Map<String, Map<String, String>> fieldsMap = structure.getFieldsMap();
212
213 for (Map<String, String> field : fieldsMap.values()) {
214 String dataType = field.get(FieldConstants.DATA_TYPE);
215
216 if (dataType.equals("file-upload")) {
217 return true;
218 }
219 }
220
221 return false;
222 }
223
224 protected void setUpClassNameIds() {
225 _ddlRecordSetClassNameId = PortalUtil.getClassNameId(
226 DDLRecordSet.class);
227 _ddmStructureClassNameId = PortalUtil.getClassNameId(
228 DDMStructure.class);
229 _dlFileEntryMetadataClassNameId = PortalUtil.getClassNameId(
230 DLFileEntryMetadata.class);
231 }
232
233 protected void updateDDLFileUploadReferences(long ddlRecordSetId)
234 throws Exception {
235
236 List<DDLRecord> ddlRecords = DDLRecordLocalServiceUtil.getRecords(
237 ddlRecordSetId);
238
239 for (DDLRecord ddlRecord : ddlRecords) {
240 updateFileUploadReferences(
241 ddlRecord.getCompanyId(), ddlRecord.getDDMStorageId(),
242 ddlRecord.getUserId(), ddlRecord.getGroupId(), ddlRecord,
243 ddlRecord.getStatus());
244 }
245 }
246
247 protected void updateDLFileUploadReferences(long dlFileEntryMetadataId)
248 throws Exception {
249
250 DLFileEntryMetadata dlFileEntryMetadata =
251 DLFileEntryMetadataLocalServiceUtil.getFileEntryMetadata(
252 dlFileEntryMetadataId);
253
254 FileEntry fileEntry = DLAppLocalServiceUtil.getFileEntry(
255 dlFileEntryMetadata.getFileEntryId());
256
257 FileVersion fileVersion = fileEntry.getFileVersion();
258
259 updateFileUploadReferences(
260 fileEntry.getCompanyId(), dlFileEntryMetadata.getDDMStorageId(),
261 fileEntry.getUserId(), fileEntry.getGroupId(), dlFileEntryMetadata,
262 fileVersion.getStatus());
263 }
264
265 protected void updateFieldValues(
266 long storageId, Map<String, String> fieldValues)
267 throws Exception {
268
269 Fields fields = new Fields();
270
271 for (Map.Entry<String, String> entry : fieldValues.entrySet()) {
272 Field field = new Field(
273 storageId, entry.getKey(), entry.getValue());
274
275 fields.put(field);
276 }
277
278 ServiceContext serviceContext = new ServiceContext();
279
280 StorageEngineUtil.update(storageId, fields, true, serviceContext);
281 }
282
283 protected void updateFileEntryStatus(
284 FileEntry fileEntry, int status, ServiceContext serviceContext)
285 throws Exception {
286
287 FileVersion fileVersion = fileEntry.getFileVersion();
288
289 Map<String, Serializable> workflowContext =
290 new HashMap<String, Serializable>();
291
292 workflowContext.put("event", DLSyncConstants.EVENT_ADD);
293
294 DLFileEntryLocalServiceUtil.updateStatus(
295 fileVersion.getUserId(), fileVersion.getFileVersionId(), status,
296 workflowContext, serviceContext);
297 }
298
299 protected void updateFileUploadReferences(DDMStructure structure)
300 throws Exception {
301
302 if (!hasFileUploadFields(structure)) {
303 return;
304 }
305
306 List<DDMStructureLink> structureLinks =
307 DDMStructureLinkLocalServiceUtil.getStructureLinks(
308 structure.getStructureId(), QueryUtil.ALL_POS,
309 QueryUtil.ALL_POS);
310
311 for (DDMStructureLink structureLink : structureLinks) {
312 updateFileUploadReferences(structureLink);
313 }
314
315 updateStructure(structure, updateXSD(structure.getXsd()));
316
317 List<DDMTemplate> templates = DDMTemplateLocalServiceUtil.getTemplates(
318 structure.getGroupId(), _ddmStructureClassNameId,
319 structure.getStructureId(),
320 DDMTemplateConstants.TEMPLATE_TYPE_FORM);
321
322 for (DDMTemplate template : templates) {
323 updateTemplate(template, updateXSD(template.getScript()));
324 }
325 }
326
327 protected void updateFileUploadReferences(DDMStructureLink structureLink)
328 throws Exception {
329
330 long classNameId = structureLink.getClassNameId();
331
332 if (classNameId == _ddlRecordSetClassNameId) {
333 updateDDLFileUploadReferences(structureLink.getClassPK());
334 }
335 else if (classNameId == _dlFileEntryMetadataClassNameId) {
336 updateDLFileUploadReferences(structureLink.getClassPK());
337 }
338 }
339
340 protected void updateFileUploadReferences(
341 long companyId, long storageId, long userId, long groupId,
342 BaseModel<?> baseModel, int status)
343 throws Exception {
344
345 Map<String, String> fieldValues = new HashMap<String, String>();
346
347 Fields fields = StorageEngineUtil.getFields(storageId);
348
349 for (Field field : fields) {
350 String dataType = field.getDataType();
351
352 if (!dataType.equals("file-upload") || (field.getValue() == null)) {
353 continue;
354 }
355
356 String valueString = String.valueOf(field.getValue());
357
358 JSONObject jsonObject = JSONFactoryUtil.createJSONObject(
359 valueString);
360
361 String filePath =
362 getFileUploadPath(baseModel) + StringPool.SLASH +
363 field.getName();
364
365 FileEntry fileEntry = addFileEntry(
366 companyId, userId, groupId,
367 DLFolderConstants.DEFAULT_PARENT_FOLDER_ID,
368 jsonObject.getString("name"), filePath, status);
369
370 fieldValues.put(field.getName(), getJSON(fileEntry));
371 }
372
373 updateFieldValues(storageId, fieldValues);
374 }
375
376 protected void updateStructure(DDMStructure structure, String xsd)
377 throws Exception {
378
379 xsd = DDMXMLUtil.formatXML(xsd);
380
381 structure.setXsd(xsd);
382
383 DDMStructureLocalServiceUtil.updateDDMStructure(structure);
384 }
385
386 protected void updateTemplate(DDMTemplate template, String script)
387 throws Exception {
388
389 script = DDMXMLUtil.formatXML(script);
390
391 template.setScript(script);
392
393 DDMTemplateLocalServiceUtil.updateDDMTemplate(template);
394 }
395
396 protected String updateXSD(String xsd) throws Exception {
397 Document document = SAXReaderUtil.read(xsd);
398
399 Element rootElement = document.getRootElement();
400
401 List<Element> dynamicElementElements = rootElement.elements(
402 "dynamic-element");
403
404 for (Element dynamicElementElement : dynamicElementElements) {
405 updateXSDDynamicElement(dynamicElementElement);
406 }
407
408 return document.asXML();
409 }
410
411 protected void updateXSDDynamicElement(Element element) {
412 String dataType = element.attributeValue("dataType");
413
414 if (Validator.equals(dataType, "file-upload")) {
415 element.addAttribute("dataType", "document-library");
416 element.addAttribute("type", "ddm-documentlibrary");
417 }
418
419 List<Element> dynamicElementElements = element.elements(
420 "dynamic-element");
421
422 for (Element dynamicElementElement : dynamicElementElements) {
423 updateXSDDynamicElement(dynamicElementElement);
424 }
425 }
426
427 protected void verifyStructure(DDMStructure structure) throws Exception {
428 boolean modified = false;
429
430 String defaultLanguageId = structure.getDefaultLanguageId();
431
432 XPath xPathSelector = SAXReaderUtil.createXPath("
433
434 Document document = structure.getDocument();
435
436 List<Node> nodes = xPathSelector.selectNodes(document);
437
438 for (Node node : nodes) {
439 Element dynamicElementElement = (Element)node;
440
441 if (createDefaultMetadataElement(
442 dynamicElementElement, defaultLanguageId)) {
443
444 modified = true;
445 }
446 }
447
448 if (modified) {
449 updateStructure(structure, document.asXML());
450 }
451 }
452
453 private long _ddlRecordSetClassNameId;
454 private long _ddmStructureClassNameId;
455 private long _dlFileEntryMetadataClassNameId;
456
457 }