001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.usersadmin.action;
016    
017    import com.liferay.portal.AddressCityException;
018    import com.liferay.portal.AddressStreetException;
019    import com.liferay.portal.AddressZipException;
020    import com.liferay.portal.DuplicateOrganizationException;
021    import com.liferay.portal.EmailAddressException;
022    import com.liferay.portal.NoSuchCountryException;
023    import com.liferay.portal.NoSuchListTypeException;
024    import com.liferay.portal.NoSuchOrganizationException;
025    import com.liferay.portal.NoSuchRegionException;
026    import com.liferay.portal.OrganizationNameException;
027    import com.liferay.portal.OrganizationParentException;
028    import com.liferay.portal.PhoneNumberException;
029    import com.liferay.portal.RequiredOrganizationException;
030    import com.liferay.portal.WebsiteURLException;
031    import com.liferay.portal.kernel.repository.model.FileEntry;
032    import com.liferay.portal.kernel.servlet.SessionErrors;
033    import com.liferay.portal.kernel.util.Constants;
034    import com.liferay.portal.kernel.util.FileUtil;
035    import com.liferay.portal.kernel.util.HttpUtil;
036    import com.liferay.portal.kernel.util.LocalizationUtil;
037    import com.liferay.portal.kernel.util.ParamUtil;
038    import com.liferay.portal.kernel.util.StringUtil;
039    import com.liferay.portal.kernel.util.Validator;
040    import com.liferay.portal.model.Address;
041    import com.liferay.portal.model.EmailAddress;
042    import com.liferay.portal.model.Group;
043    import com.liferay.portal.model.OrgLabor;
044    import com.liferay.portal.model.Organization;
045    import com.liferay.portal.model.OrganizationConstants;
046    import com.liferay.portal.model.Phone;
047    import com.liferay.portal.model.Website;
048    import com.liferay.portal.security.auth.PrincipalException;
049    import com.liferay.portal.security.permission.ActionKeys;
050    import com.liferay.portal.service.OrganizationServiceUtil;
051    import com.liferay.portal.service.ServiceContext;
052    import com.liferay.portal.service.ServiceContextFactory;
053    import com.liferay.portal.service.permission.GroupPermissionUtil;
054    import com.liferay.portal.struts.PortletAction;
055    import com.liferay.portal.theme.ThemeDisplay;
056    import com.liferay.portal.util.PortalUtil;
057    import com.liferay.portal.util.WebKeys;
058    import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
059    import com.liferay.portlet.sites.util.SitesUtil;
060    import com.liferay.portlet.usersadmin.util.UsersAdminUtil;
061    
062    import java.util.List;
063    
064    import javax.portlet.ActionRequest;
065    import javax.portlet.ActionResponse;
066    import javax.portlet.PortletConfig;
067    import javax.portlet.PortletPreferences;
068    import javax.portlet.RenderRequest;
069    import javax.portlet.RenderResponse;
070    
071    import org.apache.struts.action.ActionForm;
072    import org.apache.struts.action.ActionForward;
073    import org.apache.struts.action.ActionMapping;
074    
075    /**
076     * @author Brian Wing Shun Chan
077     * @author Julio Camarero
078     * @author Jorge Ferrer
079     */
080    public class EditOrganizationAction extends PortletAction {
081    
082            @Override
083            public void processAction(
084                            ActionMapping actionMapping, ActionForm actionForm,
085                            PortletConfig portletConfig, ActionRequest actionRequest,
086                            ActionResponse actionResponse)
087                    throws Exception {
088    
089                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
090    
091                    try {
092                            Organization organization = null;
093    
094                            if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
095                                    organization = updateOrganization(actionRequest);
096                            }
097                            else if (cmd.equals(Constants.DELETE)) {
098                                    deleteOrganizations(actionRequest);
099                            }
100    
101                            String redirect = ParamUtil.getString(actionRequest, "redirect");
102    
103                            if (organization != null) {
104                                    redirect = HttpUtil.setParameter(
105                                            redirect, actionResponse.getNamespace() + "organizationId",
106                                            organization.getOrganizationId());
107                            }
108    
109                            sendRedirect(actionRequest, actionResponse, redirect);
110                    }
111                    catch (Exception e) {
112                            if (e instanceof NoSuchOrganizationException ||
113                                    e instanceof PrincipalException) {
114    
115                                    SessionErrors.add(actionRequest, e.getClass());
116    
117                                    setForward(actionRequest, "portlet.users_admin.error");
118                            }
119                            else if (e instanceof AddressCityException ||
120                                             e instanceof AddressStreetException ||
121                                             e instanceof AddressZipException ||
122                                             e instanceof DuplicateOrganizationException ||
123                                             e instanceof EmailAddressException ||
124                                             e instanceof NoSuchCountryException ||
125                                             e instanceof NoSuchListTypeException ||
126                                             e instanceof NoSuchRegionException ||
127                                             e instanceof OrganizationNameException ||
128                                             e instanceof OrganizationParentException ||
129                                             e instanceof PhoneNumberException ||
130                                             e instanceof RequiredOrganizationException ||
131                                             e instanceof WebsiteURLException) {
132    
133                                    if (e instanceof NoSuchListTypeException) {
134                                            NoSuchListTypeException nslte = (NoSuchListTypeException)e;
135    
136                                            SessionErrors.add(
137                                                    actionRequest,
138                                                    e.getClass().getName() + nslte.getType());
139                                    }
140                                    else {
141                                            SessionErrors.add(actionRequest, e.getClass());
142                                    }
143    
144                                    if (e instanceof RequiredOrganizationException) {
145                                            String redirect = PortalUtil.escapeRedirect(
146                                                    ParamUtil.getString(actionRequest, "redirect"));
147    
148                                            long organizationId = ParamUtil.getLong(
149                                                    actionRequest, "organizationId");
150    
151                                            if (organizationId > 0) {
152                                                    redirect = HttpUtil.setParameter(
153                                                            redirect,
154                                                            actionResponse.getNamespace() + "organizationId",
155                                                            organizationId);
156                                            }
157    
158                                            if (Validator.isNotNull(redirect)) {
159                                                    actionResponse.sendRedirect(redirect);
160                                            }
161                                    }
162                            }
163                            else {
164                                    throw e;
165                            }
166                    }
167            }
168    
169            @Override
170            public ActionForward render(
171                            ActionMapping actionMapping, ActionForm actionForm,
172                            PortletConfig portletConfig, RenderRequest renderRequest,
173                            RenderResponse renderResponse)
174                    throws Exception {
175    
176                    try {
177                            ActionUtil.getOrganization(renderRequest);
178                    }
179                    catch (Exception e) {
180                            if (e instanceof NoSuchOrganizationException ||
181                                    e instanceof PrincipalException) {
182    
183                                    SessionErrors.add(renderRequest, e.getClass());
184    
185                                    return actionMapping.findForward("portlet.users_admin.error");
186                            }
187                            else {
188                                    throw e;
189                            }
190                    }
191    
192                    return actionMapping.findForward(
193                            getForward(renderRequest, "portlet.users_admin.edit_organization"));
194            }
195    
196            protected void deleteOrganizations(ActionRequest actionRequest)
197                    throws Exception {
198    
199                    long[] deleteOrganizationIds = StringUtil.split(
200                            ParamUtil.getString(actionRequest, "deleteOrganizationIds"), 0L);
201    
202                    for (long deleteOrganizationId : deleteOrganizationIds) {
203                            OrganizationServiceUtil.deleteOrganization(deleteOrganizationId);
204                    }
205            }
206    
207            protected Organization updateOrganization(ActionRequest actionRequest)
208                    throws Exception {
209    
210                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
211                            WebKeys.THEME_DISPLAY);
212    
213                    long organizationId = ParamUtil.getLong(
214                            actionRequest, "organizationId");
215    
216                    long parentOrganizationId = ParamUtil.getLong(
217                            actionRequest, "parentOrganizationSearchContainerPrimaryKeys",
218                            OrganizationConstants.DEFAULT_PARENT_ORGANIZATION_ID);
219                    String name = ParamUtil.getString(actionRequest, "name");
220                    long statusId = ParamUtil.getLong(actionRequest, "statusId");
221                    String type = ParamUtil.getString(actionRequest, "type");
222                    long regionId = ParamUtil.getLong(actionRequest, "regionId");
223                    long countryId = ParamUtil.getLong(actionRequest, "countryId");
224                    String comments = ParamUtil.getString(actionRequest, "comments");
225                    boolean deleteLogo = ParamUtil.getBoolean(actionRequest, "deleteLogo");
226    
227                    byte[] logoBytes = null;
228    
229                    long fileEntryId = ParamUtil.getLong(actionRequest, "fileEntryId");
230    
231                    if (fileEntryId > 0) {
232                            FileEntry fileEntry = DLAppLocalServiceUtil.getFileEntry(
233                                    fileEntryId);
234    
235                            logoBytes = FileUtil.getBytes(fileEntry.getContentStream());
236                    }
237    
238                    boolean site = ParamUtil.getBoolean(actionRequest, "site");
239                    List<Address> addresses = UsersAdminUtil.getAddresses(actionRequest);
240                    List<EmailAddress> emailAddresses = UsersAdminUtil.getEmailAddresses(
241                            actionRequest);
242                    List<OrgLabor> orgLabors = UsersAdminUtil.getOrgLabors(actionRequest);
243                    List<Phone> phones = UsersAdminUtil.getPhones(actionRequest);
244                    List<Website> websites = UsersAdminUtil.getWebsites(actionRequest);
245    
246                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
247                            Organization.class.getName(), actionRequest);
248    
249                    Organization organization = null;
250    
251                    if (organizationId <= 0) {
252    
253                            // Add organization
254    
255                            organization = OrganizationServiceUtil.addOrganization(
256                                    parentOrganizationId, name, type, regionId, countryId, statusId,
257                                    comments, site, addresses, emailAddresses, orgLabors, phones,
258                                    websites, serviceContext);
259                    }
260                    else {
261    
262                            // Update organization
263    
264                            organization = OrganizationServiceUtil.updateOrganization(
265                                    organizationId, parentOrganizationId, name, type, regionId,
266                                    countryId, statusId, comments, !deleteLogo, logoBytes, site,
267                                    addresses, emailAddresses, orgLabors, phones, websites,
268                                    serviceContext);
269                    }
270    
271                    // Layout set prototypes
272    
273                    long publicLayoutSetPrototypeId = ParamUtil.getLong(
274                            actionRequest, "publicLayoutSetPrototypeId");
275                    long privateLayoutSetPrototypeId = ParamUtil.getLong(
276                            actionRequest, "privateLayoutSetPrototypeId");
277                    boolean publicLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
278                            actionRequest, "publicLayoutSetPrototypeLinkEnabled",
279                            (publicLayoutSetPrototypeId > 0));
280                    boolean privateLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
281                            actionRequest, "privateLayoutSetPrototypeLinkEnabled",
282                            (privateLayoutSetPrototypeId > 0));
283    
284                    Group organizationGroup = organization.getGroup();
285    
286                    if (GroupPermissionUtil.contains(
287                                    themeDisplay.getPermissionChecker(), organizationGroup,
288                                    ActionKeys.UPDATE)) {
289    
290                            SitesUtil.updateLayoutSetPrototypesLinks(
291                                    organizationGroup, publicLayoutSetPrototypeId,
292                                    privateLayoutSetPrototypeId,
293                                    publicLayoutSetPrototypeLinkEnabled,
294                                    privateLayoutSetPrototypeLinkEnabled);
295                    }
296    
297                    // Reminder queries
298    
299                    String reminderQueries = actionRequest.getParameter("reminderQueries");
300    
301                    PortletPreferences portletPreferences = organization.getPreferences();
302    
303                    LocalizationUtil.setLocalizedPreferencesValues(
304                            actionRequest, portletPreferences, "reminderQueries");
305    
306                    portletPreferences.setValue("reminderQueries", reminderQueries);
307    
308                    portletPreferences.store();
309    
310                    return organization;
311            }
312    
313    }