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