001    /**
002     * Copyright (c) 2000-2011 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
014    
015    package com.liferay.portlet.documentlibrary.action;
016    
017    import com.liferay.portal.kernel.servlet.SessionErrors;
018    import com.liferay.portal.kernel.servlet.SessionMessages;
019    import com.liferay.portal.kernel.util.Constants;
020    import com.liferay.portal.kernel.util.GetterUtil;
021    import com.liferay.portal.kernel.util.ParamUtil;
022    import com.liferay.portal.kernel.util.StringUtil;
023    import com.liferay.portal.model.Group;
024    import com.liferay.portal.security.auth.PrincipalException;
025    import com.liferay.portal.service.GroupLocalServiceUtil;
026    import com.liferay.portal.service.ServiceContext;
027    import com.liferay.portal.service.ServiceContextFactory;
028    import com.liferay.portal.struts.PortletAction;
029    import com.liferay.portal.theme.ThemeDisplay;
030    import com.liferay.portal.util.PortletKeys;
031    import com.liferay.portal.util.WebKeys;
032    import com.liferay.portlet.documentlibrary.DuplicateFileEntryTypeException;
033    import com.liferay.portlet.documentlibrary.NoSuchFileEntryTypeException;
034    import com.liferay.portlet.documentlibrary.NoSuchMetadataSetException;
035    import com.liferay.portlet.documentlibrary.model.DLFileEntryType;
036    import com.liferay.portlet.documentlibrary.service.DLFileEntryTypeServiceUtil;
037    import com.liferay.portlet.dynamicdatamapping.NoSuchStructureException;
038    import com.liferay.portlet.dynamicdatamapping.StructureDuplicateElementException;
039    import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
040    import com.liferay.portlet.dynamicdatamapping.service.DDMStructureLocalServiceUtil;
041    
042    import javax.portlet.ActionRequest;
043    import javax.portlet.ActionResponse;
044    import javax.portlet.PortletConfig;
045    import javax.portlet.PortletRequest;
046    import javax.portlet.RenderRequest;
047    import javax.portlet.RenderResponse;
048    
049    import org.apache.struts.action.ActionForm;
050    import org.apache.struts.action.ActionForward;
051    import org.apache.struts.action.ActionMapping;
052    
053    /**
054     * @author Alexander Chow
055     * @author Sergio González
056     */
057    public class EditFileEntryTypeAction extends PortletAction {
058    
059            @Override
060            public void processAction(
061                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
062                            ActionRequest actionRequest, ActionResponse actionResponse)
063                    throws Exception {
064    
065                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
066    
067                    try {
068                            if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
069                                    updateFileEntryType(actionRequest, actionResponse);
070                            }
071                            else if (cmd.equals(Constants.DELETE)) {
072                                    deleteFileEntryType(actionRequest, actionResponse);
073                            }
074    
075                            if (SessionErrors.isEmpty(actionRequest)) {
076                                    SessionMessages.add(
077                                            actionRequest,
078                                            portletConfig.getPortletName() + ".doRefresh",
079                                            PortletKeys.DOCUMENT_LIBRARY);
080                            }
081    
082                            sendRedirect(actionRequest, actionResponse);
083                    }
084                    catch (Exception e) {
085                            if (e instanceof DuplicateFileEntryTypeException ||
086                                    e instanceof NoSuchMetadataSetException ||
087                                    e instanceof StructureDuplicateElementException) {
088    
089                                    SessionErrors.add(actionRequest, e.getClass().getName());
090                            }
091                            else if (e instanceof NoSuchFileEntryTypeException ||
092                                             e instanceof NoSuchStructureException ||
093                                             e instanceof PrincipalException) {
094    
095                                    SessionErrors.add(actionRequest, e.getClass().getName());
096    
097                                    setForward(actionRequest, "portlet.document_library.error");
098                            }
099                            else {
100                                    throw e;
101                            }
102                    }
103            }
104    
105            @Override
106            public ActionForward render(
107                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
108                            RenderRequest renderRequest, RenderResponse renderResponse)
109                    throws Exception {
110    
111                    DLFileEntryType fileEntryType = null;
112    
113                    try {
114                            long fileEntryTypeId = ParamUtil.getLong(
115                                    renderRequest, "fileEntryTypeId");
116    
117                            if (fileEntryTypeId > 0) {
118                                    fileEntryType = DLFileEntryTypeServiceUtil.getFileEntryType(
119                                            fileEntryTypeId);
120    
121                                    renderRequest.setAttribute(
122                                            WebKeys.DOCUMENT_LIBRARY_FILE_ENTRY_TYPE, fileEntryType);
123    
124                                    DDMStructure ddmStructure =
125                                            DDMStructureLocalServiceUtil.fetchStructure(
126                                                    fileEntryType.getGroupId(), "auto_" + fileEntryTypeId);
127    
128                                    renderRequest.setAttribute(
129                                            WebKeys.DYNAMIC_DATA_MAPPING_STRUCTURE, ddmStructure);
130                            }
131                    }
132                    catch (Exception e) {
133                            if (e instanceof NoSuchFileEntryTypeException ||
134                                    e instanceof PrincipalException) {
135    
136                                    SessionErrors.add(renderRequest, e.getClass().getName());
137    
138                                    return mapping.findForward("portlet.document_library.error");
139                            }
140                            else {
141                                    throw e;
142                            }
143                    }
144    
145                    return mapping.findForward(
146                            getForward(
147                                    renderRequest,
148                                    "portlet.document_library.edit_file_entry_type"));
149            }
150    
151            protected void deleteFileEntryType(
152                            ActionRequest actionRequest, ActionResponse actionResponse)
153                    throws Exception {
154    
155                    long fileEntryTypeId = ParamUtil.getLong(
156                            actionRequest, "fileEntryTypeId");
157    
158                    DLFileEntryTypeServiceUtil.deleteFileEntryType(fileEntryTypeId);
159            }
160    
161            protected long[] getLongArray(PortletRequest portletRequest, String name) {
162                    String value = portletRequest.getParameter(name);
163    
164                    if (value == null) {
165                            return null;
166                    }
167    
168                    return StringUtil.split(GetterUtil.getString(value), 0L);
169            }
170    
171            protected void updateFileEntryType(
172                            ActionRequest actionRequest, ActionResponse actionResponse)
173                    throws Exception {
174    
175                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
176                            WebKeys.THEME_DISPLAY);
177    
178                    long fileEntryTypeId = ParamUtil.getLong(
179                            actionRequest, "fileEntryTypeId");
180    
181                    String name = ParamUtil.getString(actionRequest, "name");
182                    String description = ParamUtil.getString(actionRequest, "description");
183                    long[] ddmStructureIds = getLongArray(
184                            actionRequest, "ddmStructuresSearchContainerPrimaryKeys");
185    
186                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
187                            DLFileEntryType.class.getName(), actionRequest);
188    
189                    if (fileEntryTypeId <= 0) {
190    
191                            // Add file entry type
192    
193                            long groupId = themeDisplay.getScopeGroupId();
194    
195                            Group scopeGroup = GroupLocalServiceUtil.getGroup(groupId);
196    
197                            if (scopeGroup.isLayout()) {
198                                    groupId = scopeGroup.getParentGroupId();
199                            }
200    
201                            DLFileEntryTypeServiceUtil.addFileEntryType(
202                                    groupId, name, description, ddmStructureIds, serviceContext);
203                    }
204                    else {
205    
206                            // Update file entry type
207    
208                            DLFileEntryTypeServiceUtil.updateFileEntryType(
209                                    fileEntryTypeId, name, description, ddmStructureIds,
210                                    serviceContext);
211                    }
212            }
213    
214    }