001
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
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 }