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.io.ByteArrayFileInputStream;
022 import com.liferay.portal.kernel.log.Log;
023 import com.liferay.portal.kernel.log.LogFactoryUtil;
024 import com.liferay.portal.kernel.util.CharPool;
025 import com.liferay.portal.kernel.util.ContentTypes;
026 import com.liferay.portal.kernel.util.GetterUtil;
027 import com.liferay.portal.kernel.util.HtmlUtil;
028 import com.liferay.portal.kernel.util.MimeTypesUtil;
029 import com.liferay.portal.kernel.util.ParamUtil;
030 import com.liferay.portal.kernel.util.PropsKeys;
031 import com.liferay.portal.kernel.util.StreamUtil;
032 import com.liferay.portal.kernel.util.StringBundler;
033 import com.liferay.portal.kernel.util.StringPool;
034 import com.liferay.portal.kernel.util.StringUtil;
035 import com.liferay.portal.kernel.util.UniqueList;
036 import com.liferay.portal.kernel.util.Validator;
037 import com.liferay.portal.model.Group;
038 import com.liferay.portal.model.Organization;
039 import com.liferay.portal.service.GroupLocalServiceUtil;
040 import com.liferay.portal.service.OrganizationLocalServiceUtil;
041 import com.liferay.portal.theme.ThemeDisplay;
042 import com.liferay.portal.upload.LiferayFileItem;
043 import com.liferay.portal.upload.LiferayFileItemFactory;
044 import com.liferay.portal.upload.LiferayFileUpload;
045 import com.liferay.portal.upload.LiferayServletRequest;
046 import com.liferay.portal.upload.UploadServletRequestImpl;
047 import com.liferay.portal.util.PrefsPropsUtil;
048 import com.liferay.portal.util.PropsValues;
049
050 import java.io.InputStream;
051 import java.io.PrintWriter;
052
053 import java.util.HashMap;
054 import java.util.LinkedHashMap;
055 import java.util.List;
056 import java.util.Map;
057
058 import javax.servlet.http.HttpServletRequest;
059 import javax.servlet.http.HttpServletResponse;
060
061 import javax.xml.parsers.DocumentBuilder;
062 import javax.xml.parsers.DocumentBuilderFactory;
063 import javax.xml.parsers.ParserConfigurationException;
064 import javax.xml.transform.Transformer;
065 import javax.xml.transform.TransformerFactory;
066 import javax.xml.transform.dom.DOMSource;
067 import javax.xml.transform.stream.StreamResult;
068
069 import org.apache.commons.fileupload.FileItem;
070 import org.apache.commons.fileupload.disk.DiskFileItem;
071 import org.apache.commons.fileupload.servlet.ServletFileUpload;
072
073 import org.w3c.dom.Document;
074 import org.w3c.dom.Element;
075 import org.w3c.dom.Node;
076
077
081 public abstract class BaseCommandReceiver implements CommandReceiver {
082
083 public void createFolder(
084 CommandArgument commandArgument, HttpServletRequest request,
085 HttpServletResponse response) {
086
087 Document document = _createDocument();
088
089 Node rootNode = _createRoot(
090 document, commandArgument.getCommand(), commandArgument.getType(),
091 commandArgument.getCurrentFolder(), StringPool.BLANK);
092
093 Element errorElement = document.createElement("Error");
094
095 rootNode.appendChild(errorElement);
096
097 String returnValue = "0";
098
099 try {
100 returnValue = createFolder(commandArgument);
101 }
102 catch (FCKException fcke) {
103 Throwable cause = fcke.getCause();
104
105 returnValue = "110";
106
107 if (cause != null) {
108 String causeString = GetterUtil.getString(cause.toString());
109
110 if (causeString.contains("DuplicateFolderNameException")) {
111 returnValue = "101";
112 }
113 else if (causeString.contains("FolderNameException")) {
114 returnValue = "102";
115 }
116 else if (causeString.contains("NoSuchGroupException") ||
117 causeString.contains("PrincipalException")) {
118
119 returnValue = "103";
120 }
121 else {
122 throw fcke;
123 }
124 }
125 }
126
127 errorElement.setAttribute("number", returnValue);
128
129 _writeDocument(document, response);
130 }
131
132 public void fileUpload(
133 CommandArgument commandArgument, HttpServletRequest request,
134 HttpServletResponse response) {
135
136 InputStream inputStream = null;
137
138 String returnValue = null;
139
140 try {
141 ServletFileUpload servletFileUpload = new LiferayFileUpload(
142 new LiferayFileItemFactory(
143 UploadServletRequestImpl.getTempDir()), request);
144
145 servletFileUpload.setFileSizeMax(
146 PrefsPropsUtil.getLong(
147 PropsKeys.UPLOAD_SERVLET_REQUEST_IMPL_MAX_SIZE));
148
149 LiferayServletRequest liferayServletRequest =
150 new LiferayServletRequest(request);
151
152 List<FileItem> fileItems = servletFileUpload.parseRequest(
153 liferayServletRequest);
154
155 Map<String, Object> fields = new HashMap<String, Object>();
156
157 for (FileItem fileItem : fileItems) {
158 if (fileItem.isFormField()) {
159 fields.put(fileItem.getFieldName(), fileItem.getString());
160 }
161 else {
162 fields.put(fileItem.getFieldName(), fileItem);
163 }
164 }
165
166 DiskFileItem diskFileItem = (DiskFileItem)fields.get("NewFile");
167
168 String fileName = StringUtil.replace(
169 diskFileItem.getName(), CharPool.BACK_SLASH, CharPool.SLASH);
170 String[] fileNameArray = StringUtil.split(fileName, '/');
171 fileName = fileNameArray[fileNameArray.length - 1];
172
173 String contentType = diskFileItem.getContentType();
174
175 if (Validator.isNull(contentType) ||
176 contentType.equals(ContentTypes.APPLICATION_OCTET_STREAM)) {
177
178 contentType = MimeTypesUtil.getContentType(
179 diskFileItem.getStoreLocation());
180 }
181
182 if (diskFileItem.isInMemory()) {
183 inputStream = diskFileItem.getInputStream();
184 }
185 else {
186 inputStream = new ByteArrayFileInputStream(
187 diskFileItem.getStoreLocation(),
188 LiferayFileItem.THRESHOLD_SIZE);
189 }
190
191 long size = diskFileItem.getSize();
192
193 returnValue = fileUpload(
194 commandArgument, fileName, inputStream, contentType, size);
195 }
196 catch (Exception e) {
197 FCKException fcke = null;
198
199 if (e instanceof FCKException) {
200 fcke = (FCKException)e;
201 }
202 else {
203 fcke = new FCKException(e);
204 }
205
206 Throwable cause = fcke.getCause();
207
208 returnValue = "203";
209
210 if (cause != null) {
211 String causeString = GetterUtil.getString(cause.toString());
212
213 if (causeString.contains("NoSuchFolderException")||
214 causeString.contains("NoSuchGroupException")) {
215
216 returnValue = "204";
217 }
218 else if (causeString.contains("ImageNameException")) {
219 returnValue = "205";
220 }
221 else if (causeString.contains("FileExtensionException") ||
222 causeString.contains("FileNameException")) {
223
224 returnValue = "206";
225 }
226 else if (causeString.contains("PrincipalException")) {
227 returnValue = "207";
228 }
229 else if (causeString.contains("ImageSizeException") ||
230 causeString.contains("FileSizeException")) {
231
232 returnValue = "208";
233 }
234 else if (causeString.contains("SystemException")) {
235 returnValue = "209";
236 }
237 else {
238 throw fcke;
239 }
240 }
241
242 _writeUploadResponse(returnValue, response);
243 }
244 finally {
245 StreamUtil.cleanUp(inputStream);
246 }
247
248 _writeUploadResponse(returnValue, response);
249 }
250
251 public void getFolders(
252 CommandArgument commandArgument, HttpServletRequest request,
253 HttpServletResponse response) {
254
255 Document document = _createDocument();
256
257 Node rootNode = _createRoot(
258 document, commandArgument.getCommand(), commandArgument.getType(),
259 commandArgument.getCurrentFolder(), getPath(commandArgument));
260
261 getFolders(commandArgument, document, rootNode);
262
263 _writeDocument(document, response);
264 }
265
266 public void getFoldersAndFiles(
267 CommandArgument commandArgument, HttpServletRequest request,
268 HttpServletResponse response) {
269
270 Document document = _createDocument();
271
272 Node rootNode = _createRoot(
273 document, commandArgument.getCommand(), commandArgument.getType(),
274 commandArgument.getCurrentFolder(), getPath(commandArgument));
275
276 getFoldersAndFiles(commandArgument, document, rootNode);
277
278 _writeDocument(document, response);
279 }
280
281 protected abstract String createFolder(CommandArgument commandArgument);
282
283 protected abstract String fileUpload(
284 CommandArgument commandArgument, String fileName,
285 InputStream inputStream, String contentType, long size);
286
287 protected abstract void getFolders(
288 CommandArgument commandArgument, Document document, Node rootNode);
289
290 protected abstract void getFoldersAndFiles(
291 CommandArgument commandArgument, Document document, Node rootNode);
292
293 protected String getPath(CommandArgument commandArgument) {
294 return StringPool.BLANK;
295 }
296
297 protected void getRootFolders(
298 CommandArgument commandArgument, Document document,
299 Element foldersElement)
300 throws Exception {
301
302 List<Group> groups = new UniqueList<Group>();
303
304 LinkedHashMap<String, Object> groupParams =
305 new LinkedHashMap<String, Object>();
306
307 groupParams.put("usersGroups", new Long(commandArgument.getUserId()));
308
309 groups.addAll(
310 GroupLocalServiceUtil.search(
311 commandArgument.getCompanyId(), null, null, groupParams,
312 QueryUtil.ALL_POS, QueryUtil.ALL_POS));
313
314 List<Organization> userOrgs =
315 OrganizationLocalServiceUtil.getUserOrganizations(
316 commandArgument.getUserId());
317
318 for (Organization organization : userOrgs) {
319 groups.add(0, organization.getGroup());
320 }
321
322 if (PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_ENABLED ||
323 PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_ENABLED) {
324
325 Group userGroup = GroupLocalServiceUtil.getUserGroup(
326 commandArgument.getCompanyId(), commandArgument.getUserId());
327
328 groups.add(0, userGroup);
329 }
330
331 Group companyGroup = GroupLocalServiceUtil.getCompanyGroup(
332 commandArgument.getCompanyId());
333
334 groups.add(0, companyGroup);
335
336 ThemeDisplay themeDisplay = commandArgument.getThemeDisplay();
337
338 long scopeGroupId = themeDisplay.getScopeGroupId();
339
340 HttpServletRequest request = commandArgument.getHttpServletRequest();
341
342 String portletId = ParamUtil.getString(request, "p_p_id");
343
344 for (Group group : groups) {
345 Element folderElement = document.createElement("Folder");
346
347 foldersElement.appendChild(folderElement);
348
349 boolean setNameAttribute = false;
350
351 if (group.hasStagingGroup()) {
352 Group stagingGroup = group.getStagingGroup();
353
354 if ((stagingGroup.getGroupId() == scopeGroupId) &&
355 group.isStagedPortlet(portletId) &&
356 !group.isStagedRemotely() && isStagedData(group)) {
357
358 folderElement.setAttribute(
359 "name",
360 stagingGroup.getGroupId() + " - " +
361 HtmlUtil.escape(stagingGroup.getDescriptiveName()));
362
363 setNameAttribute = true;
364 }
365 }
366
367 if (!setNameAttribute) {
368 folderElement.setAttribute(
369 "name",
370 group.getGroupId() + " - " +
371 HtmlUtil.escape(group.getDescriptiveName()));
372 }
373 }
374 }
375
376 protected String getSize() {
377 return getSize(0);
378 }
379
380 protected String getSize(long size) {
381 return String.valueOf(Math.ceil(size / 1000));
382 }
383
384 protected boolean isStagedData(Group group) {
385 return true;
386 }
387
388 private Document _createDocument() {
389 try {
390 DocumentBuilderFactory documentBuilderFactory =
391 DocumentBuilderFactory.newInstance();
392
393 DocumentBuilder documentBuilder =
394 documentBuilderFactory.newDocumentBuilder();
395
396 return documentBuilder.newDocument();
397 }
398 catch (ParserConfigurationException pce) {
399 throw new FCKException(pce);
400 }
401 }
402
403 private Node _createRoot(
404 Document document, String command, String resourceType, String path,
405 String url) {
406
407 Element rootElement = document.createElement("Connector");
408
409 document.appendChild(rootElement);
410
411 rootElement.setAttribute("command", command);
412 rootElement.setAttribute("resourceType", resourceType);
413
414 Element currentFolderElement = document.createElement("CurrentFolder");
415
416 rootElement.appendChild(currentFolderElement);
417
418 currentFolderElement.setAttribute("path", path);
419 currentFolderElement.setAttribute("url", url);
420
421 return rootElement;
422 }
423
424 private void _writeDocument(
425 Document document, HttpServletResponse response) {
426
427 try {
428 Element documentElement = document.getDocumentElement();
429
430 documentElement.normalize();
431
432 TransformerFactory transformerFactory =
433 TransformerFactory.newInstance();
434
435 Transformer transformer = transformerFactory.newTransformer();
436
437 DOMSource domSource = new DOMSource(document);
438
439 if (_log.isDebugEnabled()) {
440 StreamResult streamResult = new StreamResult(System.out);
441
442 transformer.transform(domSource, streamResult);
443 }
444
445 response.setContentType("text/xml; charset=UTF-8");
446 response.setHeader("Cache-Control", "no-cache");
447
448 PrintWriter printWriter = response.getWriter();
449
450 StreamResult streamResult = new StreamResult(printWriter);
451
452 transformer.transform(domSource, streamResult);
453
454 printWriter.flush();
455 printWriter.close();
456 }
457 catch (Exception e) {
458 throw new FCKException(e);
459 }
460 }
461
462 private void _writeUploadResponse(
463 String returnValue, HttpServletResponse response) {
464
465 try {
466 StringBundler sb = new StringBundler(7);
467
468 String newName = StringPool.BLANK;
469
470 sb.append("<script type=\"text/javascript\">");
471 sb.append("window.parent.frames['frmUpload'].OnUploadCompleted(");
472 sb.append(returnValue);
473 sb.append(",'");
474 sb.append(newName);
475 sb.append("');");
476 sb.append("</script>");
477
478 response.setContentType("text/html; charset=UTF-8");
479 response.setHeader("Cache-Control", "no-cache");
480
481 PrintWriter printWriter = null;
482
483 printWriter = response.getWriter();
484
485 printWriter.print(sb.toString());
486
487 printWriter.flush();
488 printWriter.close();
489 }
490 catch (Exception e) {
491 throw new FCKException(e);
492 }
493 }
494
495 private static Log _log = LogFactoryUtil.getLog(BaseCommandReceiver.class);
496
497 }