001    /**
002     * Copyright (c) 2000-2010 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.portal.editor.fckeditor.receiver.impl;
016    
017    import com.liferay.portal.editor.fckeditor.command.CommandArgument;
018    import com.liferay.portal.editor.fckeditor.exception.FCKException;
019    import com.liferay.portal.editor.fckeditor.receiver.CommandReceiver;
020    import com.liferay.portal.kernel.dao.orm.QueryUtil;
021    import com.liferay.portal.kernel.log.Log;
022    import com.liferay.portal.kernel.log.LogFactoryUtil;
023    import com.liferay.portal.kernel.util.GetterUtil;
024    import com.liferay.portal.kernel.util.HtmlUtil;
025    import com.liferay.portal.kernel.util.StringBundler;
026    import com.liferay.portal.kernel.util.StringPool;
027    import com.liferay.portal.kernel.util.StringUtil;
028    import com.liferay.portal.model.Group;
029    import com.liferay.portal.model.Organization;
030    import com.liferay.portal.service.GroupLocalServiceUtil;
031    import com.liferay.portal.service.OrganizationLocalServiceUtil;
032    import com.liferay.portal.upload.LiferayFileItemFactory;
033    import com.liferay.portal.upload.UploadServletRequestImpl;
034    import com.liferay.portal.util.PropsValues;
035    
036    import java.io.File;
037    import java.io.PrintWriter;
038    
039    import java.util.HashMap;
040    import java.util.LinkedHashMap;
041    import java.util.List;
042    import java.util.Map;
043    
044    import javax.servlet.http.HttpServletRequest;
045    import javax.servlet.http.HttpServletResponse;
046    
047    import javax.xml.parsers.DocumentBuilder;
048    import javax.xml.parsers.DocumentBuilderFactory;
049    import javax.xml.parsers.ParserConfigurationException;
050    import javax.xml.transform.Transformer;
051    import javax.xml.transform.TransformerFactory;
052    import javax.xml.transform.dom.DOMSource;
053    import javax.xml.transform.stream.StreamResult;
054    
055    import org.apache.commons.fileupload.FileItem;
056    import org.apache.commons.fileupload.FileUploadException;
057    import org.apache.commons.fileupload.disk.DiskFileItem;
058    import org.apache.commons.fileupload.servlet.ServletFileUpload;
059    
060    import org.w3c.dom.Document;
061    import org.w3c.dom.Element;
062    import org.w3c.dom.Node;
063    
064    /**
065     * @author Ivica Cardic
066     */
067    public abstract class BaseCommandReceiver implements CommandReceiver {
068    
069            public void createFolder(
070                    CommandArgument argument, HttpServletRequest request,
071                    HttpServletResponse response) {
072    
073                    Document doc = _createDocument();
074    
075                    Node root = _createRoot(
076                            doc, argument.getCommand(), argument.getType(),
077                            argument.getCurrentFolder(), StringPool.BLANK);
078    
079                    Element errorEl = doc.createElement("Error");
080    
081                    root.appendChild(errorEl);
082    
083                    String returnValue = "0";
084    
085                    try {
086                            returnValue = createFolder(argument);
087                    }
088                    catch (FCKException fcke) {
089                            Throwable cause = fcke.getCause();
090    
091                            returnValue = "110";
092    
093                            if (cause != null) {
094                                    String causeString = GetterUtil.getString(cause.toString());
095    
096                                    if (causeString.indexOf("DuplicateFolderNameException") != -1) {
097                                            returnValue = "101";
098                                    }
099                                    else if (causeString.indexOf("FolderNameException") != -1) {
100                                            returnValue = "102";
101                                    }
102                                    else if (causeString.indexOf("NoSuchGroupException") != -1) {
103                                            returnValue = "103";
104                                    }
105                                    else {
106                                            throw fcke;
107                                    }
108                            }
109                    }
110    
111                    errorEl.setAttribute("number", returnValue);
112    
113                    _writeDocument(doc, response);
114            }
115    
116            public void getFolders(
117                    CommandArgument argument, HttpServletRequest request,
118                    HttpServletResponse response) {
119    
120                    Document doc = _createDocument();
121    
122                    Node root = _createRoot(
123                            doc, argument.getCommand(), argument.getType(),
124                            argument.getCurrentFolder(), getPath(argument));
125    
126                    getFolders(argument, doc, root);
127    
128                    _writeDocument(doc, response);
129            }
130    
131            public void getFoldersAndFiles(
132                    CommandArgument argument, HttpServletRequest request,
133                    HttpServletResponse response) {
134    
135                    Document doc = _createDocument();
136    
137                    Node root = _createRoot(
138                            doc, argument.getCommand(), argument.getType(),
139                            argument.getCurrentFolder(), getPath(argument));
140    
141                    getFoldersAndFiles(argument, doc, root);
142    
143                    _writeDocument(doc, response);
144            }
145    
146            public void fileUpload(
147                    CommandArgument argument, HttpServletRequest request,
148                    HttpServletResponse response) {
149    
150                    ServletFileUpload upload = new ServletFileUpload(
151                            new LiferayFileItemFactory(
152                                    UploadServletRequestImpl.DEFAULT_TEMP_DIR));
153    
154                    List<FileItem> items = null;
155    
156                    try {
157                            items = upload.parseRequest(request);
158                    }
159                    catch (FileUploadException fue) {
160                            throw new FCKException(fue);
161                    }
162    
163                    Map<String, Object> fields = new HashMap<String, Object>();
164    
165                    for (FileItem item : items) {
166                            if (item.isFormField()) {
167                                    fields.put(item.getFieldName(), item.getString());
168                            }
169                            else {
170                                    fields.put(item.getFieldName(), item);
171                            }
172                    }
173    
174                    DiskFileItem fileItem = (DiskFileItem)fields.get("NewFile");
175    
176                    String fileName = StringUtil.replace(fileItem.getName(), "\\", "/");
177                    String[] fileNameArray = StringUtil.split(fileName, "/");
178                    fileName = fileNameArray[fileNameArray.length - 1];
179    
180                    String extension = _getExtension(fileName);
181    
182                    String returnValue = null;
183    
184                    try {
185                            returnValue = fileUpload(
186                                    argument, fileName, fileItem.getStoreLocation(), extension);
187                    }
188                    catch (FCKException fcke) {
189                            Throwable cause = fcke.getCause();
190    
191                            returnValue = "203";
192    
193                            if (cause != null) {
194                                    String causeString = GetterUtil.getString(cause.toString());
195    
196                                    if ((causeString.indexOf("NoSuchFolderException") != -1) ||
197                                            (causeString.indexOf("NoSuchGroupException") != -1)) {
198    
199                                            returnValue = "204";
200                                    }
201                                    else if (causeString.indexOf("ImageNameException") != -1) {
202                                            returnValue = "205";
203                                    }
204                                    else if (causeString.indexOf("FileNameException") != -1) {
205                                            returnValue = "206";
206                                    }
207                                    else if (causeString.indexOf("PrincipalException") != -1) {
208                                            returnValue = "207";
209                                    }
210                                    else {
211                                            throw fcke;
212                                    }
213                            }
214    
215                            _writeUploadResponse(returnValue, response);
216                    }
217    
218                    _writeUploadResponse(returnValue, response);
219            }
220    
221            protected abstract String createFolder(CommandArgument argument);
222    
223            protected abstract String fileUpload(
224                    CommandArgument argument, String fileName, File file, String extension);
225    
226            protected abstract void getFolders(
227                    CommandArgument argument, Document doc, Node root);
228    
229            protected abstract void getFoldersAndFiles(
230                    CommandArgument argument, Document doc, Node root);
231    
232            protected void getRootFolders(
233                            CommandArgument argument, Document doc, Element foldersEl)
234                    throws Exception {
235    
236                    LinkedHashMap<String, Object> groupParams =
237                            new LinkedHashMap<String, Object>();
238    
239                    groupParams.put("usersGroups", new Long(argument.getUserId()));
240    
241                    List<Group> groups = GroupLocalServiceUtil.search(
242                            argument.getCompanyId(), null, null, groupParams, QueryUtil.ALL_POS,
243                            QueryUtil.ALL_POS);
244    
245                    List<Organization> userOrgs =
246                            OrganizationLocalServiceUtil.getUserOrganizations(
247                                    argument.getUserId(), true);
248    
249                    for (Organization organization : userOrgs) {
250                            groups.add(0, organization.getGroup());
251                    }
252    
253                    if (PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_ENABLED ||
254                            PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_ENABLED) {
255    
256                            Group userGroup = GroupLocalServiceUtil.getUserGroup(
257                                    argument.getCompanyId(), argument.getUserId());
258    
259                            groups.add(0, userGroup);
260                    }
261    
262                    for (Group group : groups) {
263                            Element folderEl = doc.createElement("Folder");
264    
265                            foldersEl.appendChild(folderEl);
266    
267                            if (group.hasStagingGroup()) {
268                                    Group stagingGroup = group.getStagingGroup();
269    
270                                    folderEl.setAttribute(
271                                            "name",
272                                            stagingGroup.getGroupId() + " - " +
273                                                    HtmlUtil.escape(stagingGroup.getDescriptiveName()));
274                            }
275                            else {
276                                    folderEl.setAttribute(
277                                            "name",
278                                            group.getGroupId() + " - " +
279                                                    HtmlUtil.escape(group.getDescriptiveName()));
280                            }
281                    }
282            }
283    
284            protected String getPath(CommandArgument argument) {
285                    return StringPool.BLANK;
286            }
287    
288            protected String getSize() {
289                    return getSize(0);
290            }
291    
292            protected String getSize(long size) {
293                    return String.valueOf(Math.ceil(size / 1000));
294            }
295    
296            private Document _createDocument() {
297                    try {
298                            Document doc = null;
299    
300                            DocumentBuilderFactory factory =
301                                    DocumentBuilderFactory.newInstance();
302    
303                            DocumentBuilder builder = null;
304    
305                            builder = factory.newDocumentBuilder();
306    
307                            doc = builder.newDocument();
308    
309                            return doc;
310                    }
311                    catch (ParserConfigurationException pce) {
312                            throw new FCKException(pce);
313                    }
314            }
315    
316            private Node _createRoot(
317                    Document doc, String commandStr, String typeStr, String currentPath,
318                    String currentUrl) {
319    
320                    Element root = doc.createElement("Connector");
321    
322                    doc.appendChild(root);
323    
324                    root.setAttribute("command", commandStr);
325                    root.setAttribute("resourceType", typeStr);
326    
327                    Element el = doc.createElement("CurrentFolder");
328    
329                    root.appendChild(el);
330    
331                    el.setAttribute("path", currentPath);
332                    el.setAttribute("url", currentUrl);
333    
334                    return root;
335            }
336    
337            private String _getExtension(String fileName) {
338                    return fileName.substring(fileName.lastIndexOf(".") + 1);
339            }
340    
341            private void _writeDocument(Document doc, HttpServletResponse response) {
342                    try {
343                            doc.getDocumentElement().normalize();
344    
345                            TransformerFactory transformerFactory =
346                                    TransformerFactory.newInstance();
347    
348                            Transformer transformer = transformerFactory.newTransformer();
349    
350                            DOMSource source = new DOMSource(doc);
351    
352                            if (_log.isDebugEnabled()) {
353                                    StreamResult result = new StreamResult(System.out);
354    
355                                    transformer.transform(source, result);
356                            }
357    
358                            response.setContentType("text/xml; charset=UTF-8");
359                            response.setHeader("Cache-Control", "no-cache");
360    
361                            PrintWriter out = response.getWriter();
362    
363                            StreamResult result = new StreamResult(out);
364    
365                            transformer.transform(source, result);
366    
367                            out.flush();
368                            out.close();
369                    }
370                    catch (Exception e) {
371                            throw new FCKException(e);
372                    }
373            }
374    
375            private void _writeUploadResponse(
376                    String returnValue, HttpServletResponse response) {
377    
378                    try {
379                            StringBundler sb = new StringBundler(7);
380    
381                            String newName = StringPool.BLANK;
382    
383                            sb.append("<script type=\"text/javascript\">");
384                            sb.append("window.parent.frames['frmUpload'].OnUploadCompleted(");
385                            sb.append(returnValue);
386                            sb.append(",'");
387                            sb.append(newName);
388                            sb.append("');");
389                            sb.append("</script>");
390    
391                            response.setContentType("text/html; charset=UTF-8");
392                            response.setHeader("Cache-Control", "no-cache");
393    
394                            PrintWriter out = null;
395    
396                            out = response.getWriter();
397    
398                            out.print(sb.toString());
399    
400                            out.flush();
401                            out.close();
402                    }
403                    catch (Exception e) {
404                            throw new FCKException(e);
405                    }
406            }
407    
408            private static Log _log = LogFactoryUtil.getLog(BaseCommandReceiver.class);
409    
410    }