001
014
015 package com.liferay.portlet.dynamicdatalists.util;
016
017 import com.liferay.portal.kernel.json.JSONArray;
018 import com.liferay.portal.kernel.json.JSONFactoryUtil;
019 import com.liferay.portal.kernel.json.JSONObject;
020 import com.liferay.portal.kernel.language.LanguageUtil;
021 import com.liferay.portal.kernel.templateparser.Transformer;
022 import com.liferay.portal.kernel.upload.UploadPortletRequest;
023 import com.liferay.portal.kernel.util.GetterUtil;
024 import com.liferay.portal.kernel.util.ParamUtil;
025 import com.liferay.portal.kernel.util.StreamUtil;
026 import com.liferay.portal.kernel.util.StringPool;
027 import com.liferay.portal.kernel.util.Validator;
028 import com.liferay.portal.kernel.xml.Document;
029 import com.liferay.portal.kernel.xml.Element;
030 import com.liferay.portal.kernel.xml.SAXReaderUtil;
031 import com.liferay.portal.model.CompanyConstants;
032 import com.liferay.portal.service.ServiceContext;
033 import com.liferay.portal.theme.ThemeDisplay;
034 import com.liferay.portlet.documentlibrary.DuplicateDirectoryException;
035 import com.liferay.portlet.documentlibrary.DuplicateFileException;
036 import com.liferay.portlet.documentlibrary.store.DLStoreUtil;
037 import com.liferay.portlet.dynamicdatalists.model.DDLRecord;
038 import com.liferay.portlet.dynamicdatalists.model.DDLRecordSet;
039 import com.liferay.portlet.dynamicdatalists.model.DDLRecordVersion;
040 import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
041 import com.liferay.portlet.dynamicdatamapping.model.DDMTemplate;
042 import com.liferay.portlet.dynamicdatamapping.service.DDMTemplateLocalServiceUtil;
043 import com.liferay.portlet.dynamicdatamapping.storage.Field;
044 import com.liferay.portlet.dynamicdatamapping.storage.FieldConstants;
045 import com.liferay.portlet.dynamicdatamapping.storage.Fields;
046 import com.liferay.portlet.dynamicdatamapping.storage.StorageEngineUtil;
047 import com.liferay.portlet.dynamicdatamapping.util.DDMXMLUtil;
048 import com.liferay.portlet.journal.util.JournalUtil;
049 import com.liferay.util.portlet.PortletRequestUtil;
050
051 import java.io.InputStream;
052
053 import java.util.Date;
054 import java.util.Iterator;
055 import java.util.List;
056 import java.util.Map;
057
058 import javax.portlet.RenderRequest;
059 import javax.portlet.RenderResponse;
060
061
065 public class DDLUtil {
066
067 public static void addAllReservedEls(
068 Element rootElement, Map<String, String> tokens,
069 DDLRecordSet recordSet) {
070
071 JournalUtil.addReservedEl(
072 rootElement, tokens, DDLConstants.RESERVED_RECORD_SET_ID,
073 String.valueOf(recordSet.getRecordSetId()));
074
075 JournalUtil.addReservedEl(
076 rootElement, tokens, DDLConstants.RESERVED_RECORD_SET_NAME,
077 recordSet.getName());
078
079 JournalUtil.addReservedEl(
080 rootElement, tokens, DDLConstants.RESERVED_RECORD_SET_DESCRIPTION,
081 recordSet.getDescription());
082
083 JournalUtil.addReservedEl(
084 rootElement, tokens, DDLConstants.RESERVED_DDM_STRUCTURE_ID,
085 String.valueOf(recordSet.getDDMStructureId()));
086 }
087
088 public static String getRecordFileUploadPath(DDLRecord record) {
089 return "ddl_records/" + record.getRecordId();
090 }
091
092 public static JSONObject getRecordJSONObject(
093 DDLRecord record, ThemeDisplay themeDisplay)
094 throws Exception {
095
096 DDLRecordSet recordSet = record.getRecordSet();
097
098 DDMStructure ddmStructure = recordSet.getDDMStructure();
099
100 JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
101
102 for (String fieldName : ddmStructure.getFieldNames()) {
103 jsonObject.put(fieldName, StringPool.BLANK);
104 }
105
106 jsonObject.put("displayIndex", record.getDisplayIndex());
107 jsonObject.put("recordId", record.getRecordId());
108
109 Fields fields = record.getFields();
110
111 Iterator<Field> itr = fields.iterator();
112
113 while (itr.hasNext()) {
114 Field field = itr.next();
115
116 String fieldName = field.getName();
117 Object fieldValue = field.getValue();
118
119 if (fieldValue instanceof Date) {
120 jsonObject.put(fieldName, ((Date)fieldValue).getTime());
121 }
122 else {
123 fieldValue = field.getRenderedValue(themeDisplay);
124
125 jsonObject.put(fieldName, (String)fieldValue);
126 }
127 }
128
129 return jsonObject;
130 }
131
132 public static JSONArray getRecordSetJSONArray(DDLRecordSet recordSet)
133 throws Exception {
134
135 JSONArray jsonArray = JSONFactoryUtil.createJSONArray();
136
137 DDMStructure ddmStructure = recordSet.getDDMStructure();
138
139 Map<String, Map<String, String>> fieldsMap =
140 ddmStructure.getFieldsMap();
141
142 for (Map<String, String> fields : fieldsMap.values()) {
143 JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
144
145 String dataType = fields.get(FieldConstants.DATA_TYPE);
146
147 jsonObject.put("dataType", dataType);
148
149 boolean editable = GetterUtil.getBoolean(
150 fields.get(FieldConstants.EDITABLE), true);
151
152 jsonObject.put("editable", editable);
153
154 String label = fields.get(FieldConstants.LABEL);
155
156 jsonObject.put("label", label);
157
158 String name = fields.get(FieldConstants.NAME);
159
160 jsonObject.put("name", name);
161
162 boolean required = GetterUtil.getBoolean(
163 fields.get(FieldConstants.REQUIRED));
164
165 jsonObject.put("required", required);
166
167 boolean sortable = GetterUtil.getBoolean(
168 fields.get(FieldConstants.SORTABLE), true);
169
170 jsonObject.put("sortable", sortable);
171
172 String type = fields.get(FieldConstants.TYPE);
173
174 jsonObject.put("type", type);
175
176 jsonArray.put(jsonObject);
177 }
178
179 return jsonArray;
180 }
181
182 public static JSONArray getRecordsJSONArray(
183 DDLRecordSet recordSet, ThemeDisplay themeDisplay)
184 throws Exception {
185
186 return getRecordsJSONArray(recordSet.getRecords(), themeDisplay);
187 }
188
189 public static JSONArray getRecordsJSONArray(
190 List<DDLRecord> records, ThemeDisplay themeDisplay)
191 throws Exception {
192
193 JSONArray jsonArray = JSONFactoryUtil.createJSONArray();
194
195 for (DDLRecord record : records) {
196 JSONObject jsonObject = getRecordJSONObject(record, themeDisplay);
197
198 jsonArray.put(jsonObject);
199 }
200
201 return jsonArray;
202 }
203
204 public static String getTemplateContent(
205 long ddmTemplateId, DDLRecordSet recordSet,
206 ThemeDisplay themeDisplay, RenderRequest renderRequest,
207 RenderResponse renderResponse)
208 throws Exception {
209
210 String viewMode = ParamUtil.getString(renderRequest, "viewMode");
211
212 String languageId = LanguageUtil.getLanguageId(renderRequest);
213
214 String xmlRequest = PortletRequestUtil.toXML(
215 renderRequest, renderResponse);
216
217 if (Validator.isNull(xmlRequest)) {
218 xmlRequest = "<request />";
219 }
220
221 Map<String, String> tokens = JournalUtil.getTokens(
222 recordSet.getGroupId(), themeDisplay, xmlRequest);
223
224 String xml = StringPool.BLANK;
225
226 Document document = SAXReaderUtil.createDocument();
227
228 Element rootElement = document.addElement("root");
229
230 Document requestDocument = SAXReaderUtil.read(xmlRequest);
231
232 rootElement.add(requestDocument.getRootElement().createCopy());
233
234 addAllReservedEls(rootElement, tokens, recordSet);
235
236 xml = DDMXMLUtil.formatXML(document);
237
238 DDMTemplate template = DDMTemplateLocalServiceUtil.getTemplate(
239 ddmTemplateId);
240
241 return _transformer.transform(
242 themeDisplay, tokens, viewMode, languageId, xml,
243 template.getScript(), template.getLanguage());
244 }
245
246 public static String storeRecordFieldFile(
247 DDLRecord record, String fieldName, InputStream inputStream)
248 throws Exception {
249
250 DDLRecordVersion recordVersion = record.getLatestRecordVersion();
251
252 String dirName =
253 getRecordFileUploadPath(record) + StringPool.SLASH +
254 recordVersion.getVersion();
255
256 try {
257 DLStoreUtil.addDirectory(
258 record.getCompanyId(), CompanyConstants.SYSTEM, dirName);
259 }
260 catch (DuplicateDirectoryException dde) {
261 }
262
263 String fileName = dirName + StringPool.SLASH + fieldName;
264
265 try {
266 DLStoreUtil.addFile(
267 record.getCompanyId(), CompanyConstants.SYSTEM, fileName,
268 inputStream);
269 }
270 catch (DuplicateFileException dfe) {
271 }
272
273 return fileName;
274 }
275
276 public static void uploadRecordFieldFile(
277 DDLRecord record, String fieldName,
278 UploadPortletRequest uploadPortletRequest,
279 ServiceContext serviceContext)
280 throws Exception {
281
282 DDLRecordSet recordSet = record.getRecordSet();
283 DDMStructure ddmStructure = recordSet.getDDMStructure();
284
285 Fields fields = new Fields();
286
287 String fileName = uploadPortletRequest.getFileName(fieldName);
288
289 Field field = record.getField(fieldName);
290 String fieldValue = StringPool.BLANK;
291
292 if (field != null) {
293 fieldValue = String.valueOf(field.getValue());
294 }
295
296 InputStream inputStream = null;
297
298 try {
299 inputStream = uploadPortletRequest.getFileAsStream(fieldName, true);
300
301 if (inputStream != null) {
302 String filePath = storeRecordFieldFile(
303 record, fieldName, inputStream);
304
305 JSONObject recordFileJSONObject =
306 JSONFactoryUtil.createJSONObject();
307
308 recordFileJSONObject.put("name", fileName);
309 recordFileJSONObject.put("path", filePath);
310 recordFileJSONObject.put("recordId", record.getRecordId());
311
312 fieldValue = recordFileJSONObject.toString();
313 }
314
315 field = new Field(
316 ddmStructure.getStructureId(), fieldName, fieldValue);
317
318 fields.put(field);
319
320 DDLRecordVersion recordVersion = record.getLatestRecordVersion();
321
322 StorageEngineUtil.update(
323 recordVersion.getDDMStorageId(), fields, true, serviceContext);
324 }
325 finally {
326 StreamUtil.cleanUp(inputStream);
327 }
328 }
329
330 public static void uploadRecordFieldFiles(
331 DDLRecord record, UploadPortletRequest uploadPortletRequest,
332 ServiceContext serviceContext)
333 throws Exception {
334
335 DDLRecordSet recordSet = record.getRecordSet();
336
337 DDMStructure ddmStructure = recordSet.getDDMStructure();
338
339 for (String fieldName : ddmStructure.getFieldNames()) {
340 String fieldDataType = ddmStructure.getFieldDataType(fieldName);
341
342 if (fieldDataType.equals(FieldConstants.FILE_UPLOAD)) {
343 DDLUtil.uploadRecordFieldFile(
344 record, fieldName, uploadPortletRequest, serviceContext);
345 }
346 }
347 }
348
349 private static Transformer _transformer = new DDLTransformer();
350
351 }