001
014
015 package com.liferay.portlet.documentlibrary.action;
016
017 import com.liferay.portal.kernel.dao.orm.QueryUtil;
018 import com.liferay.portal.kernel.exception.PortalException;
019 import com.liferay.portal.kernel.language.LanguageUtil;
020 import com.liferay.portal.kernel.portlet.PortletResponseUtil;
021 import com.liferay.portal.kernel.repository.LocalRepository;
022 import com.liferay.portal.kernel.repository.capabilities.TemporaryFileEntriesCapability;
023 import com.liferay.portal.kernel.repository.model.FileEntry;
024 import com.liferay.portal.kernel.repository.model.Folder;
025 import com.liferay.portal.kernel.servlet.SessionErrors;
026 import com.liferay.portal.kernel.util.Constants;
027 import com.liferay.portal.kernel.util.ContentTypes;
028 import com.liferay.portal.kernel.util.HtmlUtil;
029 import com.liferay.portal.kernel.util.ParamUtil;
030 import com.liferay.portal.kernel.util.StreamUtil;
031 import com.liferay.portal.kernel.util.StringPool;
032 import com.liferay.portal.kernel.util.StringUtil;
033 import com.liferay.portal.kernel.workflow.WorkflowConstants;
034 import com.liferay.portal.kernel.zip.ZipWriter;
035 import com.liferay.portal.kernel.zip.ZipWriterFactoryUtil;
036 import com.liferay.portal.model.TrashedModel;
037 import com.liferay.portal.security.auth.PrincipalException;
038 import com.liferay.portal.service.RepositoryLocalServiceUtil;
039 import com.liferay.portal.service.ServiceContext;
040 import com.liferay.portal.service.ServiceContextFactory;
041 import com.liferay.portal.struts.PortletAction;
042 import com.liferay.portal.theme.ThemeDisplay;
043 import com.liferay.portal.util.WebKeys;
044 import com.liferay.portlet.assetpublisher.util.AssetPublisherUtil;
045 import com.liferay.portlet.documentlibrary.DuplicateFileException;
046 import com.liferay.portlet.documentlibrary.DuplicateFolderNameException;
047 import com.liferay.portlet.documentlibrary.FolderNameException;
048 import com.liferay.portlet.documentlibrary.NoSuchFolderException;
049 import com.liferay.portlet.documentlibrary.RequiredFileEntryTypeException;
050 import com.liferay.portlet.documentlibrary.model.DLFileEntry;
051 import com.liferay.portlet.documentlibrary.model.DLFolder;
052 import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
053 import com.liferay.portlet.documentlibrary.service.DLAppServiceUtil;
054 import com.liferay.portlet.trash.util.TrashUtil;
055
056 import java.io.File;
057 import java.io.FileInputStream;
058 import java.io.InputStream;
059
060 import java.util.ArrayList;
061 import java.util.List;
062
063 import javax.portlet.ActionRequest;
064 import javax.portlet.ActionResponse;
065 import javax.portlet.PortletConfig;
066 import javax.portlet.RenderRequest;
067 import javax.portlet.RenderResponse;
068 import javax.portlet.ResourceRequest;
069 import javax.portlet.ResourceResponse;
070
071 import org.apache.struts.action.ActionForm;
072 import org.apache.struts.action.ActionForward;
073 import org.apache.struts.action.ActionMapping;
074
075
081 public class EditFolderAction extends PortletAction {
082
083 @Override
084 public void processAction(
085 ActionMapping actionMapping, ActionForm actionForm,
086 PortletConfig portletConfig, ActionRequest actionRequest,
087 ActionResponse actionResponse)
088 throws Exception {
089
090 String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
091
092 try {
093 if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
094 updateFolder(actionRequest);
095 }
096 else if (cmd.equals(Constants.DELETE)) {
097 deleteFolders(actionRequest, false);
098 }
099 else if (cmd.equals(Constants.MOVE_TO_TRASH)) {
100 deleteFolders(actionRequest, true);
101 }
102 else if (cmd.equals(Constants.SUBSCRIBE)) {
103 subscribeFolder(actionRequest);
104 }
105 else if (cmd.equals(Constants.UNSUBSCRIBE)) {
106 unsubscribeFolder(actionRequest);
107 }
108 else if (cmd.equals("deleteExpiredTemporaryFileEntries")) {
109 deleteExpiredTemporaryFileEntries(actionRequest);
110 }
111 else if (cmd.equals("updateWorkflowDefinitions")) {
112 updateWorkflowDefinitions(actionRequest);
113 }
114
115 sendRedirect(actionRequest, actionResponse);
116 }
117 catch (Exception e) {
118 if (e instanceof NoSuchFolderException ||
119 e instanceof PrincipalException) {
120
121 SessionErrors.add(actionRequest, e.getClass());
122
123 setForward(actionRequest, "portlet.document_library.error");
124 }
125 else if (e instanceof DuplicateFileException ||
126 e instanceof DuplicateFolderNameException ||
127 e instanceof FolderNameException ||
128 e instanceof RequiredFileEntryTypeException) {
129
130 SessionErrors.add(actionRequest, e.getClass());
131 }
132 else {
133 throw e;
134 }
135 }
136 }
137
138 @Override
139 public ActionForward render(
140 ActionMapping actionMapping, ActionForm actionForm,
141 PortletConfig portletConfig, RenderRequest renderRequest,
142 RenderResponse renderResponse)
143 throws Exception {
144
145 try {
146 ActionUtil.getFolder(renderRequest);
147 }
148 catch (Exception e) {
149 if (e instanceof NoSuchFolderException ||
150 e instanceof PrincipalException) {
151
152 SessionErrors.add(renderRequest, e.getClass());
153
154 return actionMapping.findForward(
155 "portlet.document_library.error");
156 }
157 else {
158 throw e;
159 }
160 }
161
162 return actionMapping.findForward(
163 getForward(renderRequest, "portlet.document_library.edit_folder"));
164 }
165
166 @Override
167 public void serveResource(
168 ActionMapping actionMapping, ActionForm actionForm,
169 PortletConfig portletConfig, ResourceRequest resourceRequest,
170 ResourceResponse resourceResponse)
171 throws Exception {
172
173 downloadFolder(resourceRequest, resourceResponse);
174 }
175
176 protected void deleteExpiredTemporaryFileEntries(
177 ActionRequest actionRequest)
178 throws PortalException {
179
180 long repositoryId = ParamUtil.getLong(actionRequest, "repositoryId");
181
182 LocalRepository localRepository =
183 RepositoryLocalServiceUtil.getLocalRepositoryImpl(repositoryId);
184
185 if (localRepository.isCapabilityProvided(
186 TemporaryFileEntriesCapability.class)) {
187
188 TemporaryFileEntriesCapability temporaryFileEntriesCapability =
189 localRepository.getCapability(
190 TemporaryFileEntriesCapability.class);
191
192 temporaryFileEntriesCapability.deleteExpiredTemporaryFileEntries();
193 }
194 }
195
196 protected void deleteFolders(
197 ActionRequest actionRequest, boolean moveToTrash)
198 throws Exception {
199
200 long[] deleteFolderIds = null;
201
202 long folderId = ParamUtil.getLong(actionRequest, "folderId");
203
204 if (folderId > 0) {
205 deleteFolderIds = new long[] {folderId};
206 }
207 else {
208 deleteFolderIds = StringUtil.split(
209 ParamUtil.getString(actionRequest, "folderIds"), 0L);
210 }
211
212 List<TrashedModel> trashedModels = new ArrayList<TrashedModel>();
213
214 for (long deleteFolderId : deleteFolderIds) {
215 if (moveToTrash) {
216 Folder folder = DLAppServiceUtil.moveFolderToTrash(
217 deleteFolderId);
218
219 if (folder.getModel() instanceof DLFolder) {
220 trashedModels.add((DLFolder)folder.getModel());
221 }
222 }
223 else {
224 DLAppServiceUtil.deleteFolder(deleteFolderId);
225 }
226
227 AssetPublisherUtil.removeRecentFolderId(
228 actionRequest, DLFileEntry.class.getName(), deleteFolderId);
229 }
230
231 if (moveToTrash && (deleteFolderIds.length > 0)) {
232 TrashUtil.addTrashSessionMessages(actionRequest, trashedModels);
233
234 hideDefaultSuccessMessage(actionRequest);
235 }
236 }
237
238 protected void downloadFolder(
239 ResourceRequest resourceRequest, ResourceResponse resourceResponse)
240 throws Exception {
241
242 ThemeDisplay themeDisplay = (ThemeDisplay)resourceRequest.getAttribute(
243 WebKeys.THEME_DISPLAY);
244
245 long repositoryId = ParamUtil.getLong(resourceRequest, "repositoryId");
246 long folderId = ParamUtil.getLong(resourceRequest, "folderId");
247
248 File file = null;
249 InputStream inputStream = null;
250
251 try {
252 String zipFileName = LanguageUtil.get(
253 themeDisplay.getLocale(), "documents-and-media");
254
255 if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
256 Folder folder = DLAppServiceUtil.getFolder(folderId);
257
258 zipFileName = folder.getName();
259 }
260
261 ZipWriter zipWriter = ZipWriterFactoryUtil.getZipWriter();
262
263 zipFolder(repositoryId, folderId, StringPool.SLASH, zipWriter);
264
265 file = zipWriter.getFile();
266
267 inputStream = new FileInputStream(file);
268
269 PortletResponseUtil.sendFile(
270 resourceRequest, resourceResponse, zipFileName, inputStream,
271 ContentTypes.APPLICATION_ZIP);
272 }
273 finally {
274 StreamUtil.cleanUp(inputStream);
275
276 if (file != null) {
277 file.delete();
278 }
279 }
280 }
281
282 protected void subscribeFolder(ActionRequest actionRequest)
283 throws Exception {
284
285 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
286 WebKeys.THEME_DISPLAY);
287
288 long folderId = ParamUtil.getLong(actionRequest, "folderId");
289
290 DLAppServiceUtil.subscribeFolder(
291 themeDisplay.getScopeGroupId(), folderId);
292 }
293
294 protected void unsubscribeFolder(ActionRequest actionRequest)
295 throws Exception {
296
297 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
298 WebKeys.THEME_DISPLAY);
299
300 long folderId = ParamUtil.getLong(actionRequest, "folderId");
301
302 DLAppServiceUtil.unsubscribeFolder(
303 themeDisplay.getScopeGroupId(), folderId);
304 }
305
306 protected void updateFolder(ActionRequest actionRequest) throws Exception {
307 long folderId = ParamUtil.getLong(actionRequest, "folderId");
308
309 long repositoryId = ParamUtil.getLong(actionRequest, "repositoryId");
310 long parentFolderId = ParamUtil.getLong(
311 actionRequest, "parentFolderId");
312 String name = ParamUtil.getString(actionRequest, "name");
313 String description = ParamUtil.getString(actionRequest, "description");
314
315 ServiceContext serviceContext = ServiceContextFactory.getInstance(
316 DLFolder.class.getName(), actionRequest);
317
318 if (folderId <= 0) {
319
320
321
322 DLAppServiceUtil.addFolder(
323 repositoryId, parentFolderId, name, description,
324 serviceContext);
325 }
326 else {
327
328
329
330 DLAppServiceUtil.updateFolder(
331 folderId, name, description, serviceContext);
332 }
333 }
334
335 protected void updateWorkflowDefinitions(ActionRequest actionRequest)
336 throws Exception {
337
338 ServiceContext serviceContext = ServiceContextFactory.getInstance(
339 DLFileEntry.class.getName(), actionRequest);
340
341 DLAppServiceUtil.updateFolder(
342 DLFolderConstants.DEFAULT_PARENT_FOLDER_ID, null, null,
343 serviceContext);
344 }
345
346 protected void zipFolder(
347 long repositoryId, long folderId, String path, ZipWriter zipWriter)
348 throws Exception {
349
350 List<Object> foldersAndFileEntriesAndFileShortcuts =
351 DLAppServiceUtil.getFoldersAndFileEntriesAndFileShortcuts(
352 repositoryId, folderId, WorkflowConstants.STATUS_APPROVED,
353 false, QueryUtil.ALL_POS, QueryUtil.ALL_POS);
354
355 for (Object entry : foldersAndFileEntriesAndFileShortcuts) {
356 if (entry instanceof Folder) {
357 Folder folder = (Folder)entry;
358
359 zipFolder(
360 folder.getRepositoryId(), folder.getFolderId(),
361 path.concat(StringPool.SLASH).concat(folder.getName()),
362 zipWriter);
363 }
364 else if (entry instanceof FileEntry) {
365 FileEntry fileEntry = (FileEntry)entry;
366
367 zipWriter.addEntry(
368 path + StringPool.SLASH +
369 HtmlUtil.escapeURL(fileEntry.getTitle()),
370 fileEntry.getContentStream());
371 }
372 }
373 }
374
375 }