001    /**
002     * Copyright (c) 2000-2011 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
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    /**
062     * @author Marcelllus Tavares
063     * @author Eduardo Lundgren
064     */
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    }