001    /**
002     * Copyright (c) 2000-2012 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.servlet.SessionErrors;
032    import com.liferay.portal.kernel.util.Constants;
033    import com.liferay.portal.kernel.util.HttpUtil;
034    import com.liferay.portal.kernel.util.LocalizationUtil;
035    import com.liferay.portal.kernel.util.ParamUtil;
036    import com.liferay.portal.kernel.util.StringUtil;
037    import com.liferay.portal.kernel.util.Validator;
038    import com.liferay.portal.model.Address;
039    import com.liferay.portal.model.EmailAddress;
040    import com.liferay.portal.model.OrgLabor;
041    import com.liferay.portal.model.Organization;
042    import com.liferay.portal.model.OrganizationConstants;
043    import com.liferay.portal.model.Phone;
044    import com.liferay.portal.model.Website;
045    import com.liferay.portal.security.auth.PrincipalException;
046    import com.liferay.portal.service.OrganizationServiceUtil;
047    import com.liferay.portal.service.ServiceContext;
048    import com.liferay.portal.service.ServiceContextFactory;
049    import com.liferay.portal.struts.PortletAction;
050    import com.liferay.portal.util.PortalUtil;
051    import com.liferay.portlet.sites.util.SitesUtil;
052    import com.liferay.portlet.usersadmin.util.UsersAdminUtil;
053    
054    import java.util.List;
055    
056    import javax.portlet.ActionRequest;
057    import javax.portlet.ActionResponse;
058    import javax.portlet.PortletConfig;
059    import javax.portlet.PortletPreferences;
060    import javax.portlet.RenderRequest;
061    import javax.portlet.RenderResponse;
062    
063    import org.apache.struts.action.ActionForm;
064    import org.apache.struts.action.ActionForward;
065    import org.apache.struts.action.ActionMapping;
066    
067    /**
068     * @author Brian Wing Shun Chan
069     * @author Julio Camarero
070     * @author Jorge Ferrer
071     */
072    public class EditOrganizationAction extends PortletAction {
073    
074            @Override
075            public void processAction(
076                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
077                            ActionRequest actionRequest, ActionResponse actionResponse)
078                    throws Exception {
079    
080                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
081    
082                    try {
083                            Organization organization = null;
084    
085                            if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
086                                    organization = updateOrganization(actionRequest);
087                            }
088                            else if (cmd.equals(Constants.DELETE)) {
089                                    deleteOrganizations(actionRequest);
090                            }
091    
092                            String redirect = ParamUtil.getString(actionRequest, "redirect");
093    
094                            if (organization != null) {
095                                    redirect = HttpUtil.setParameter(
096                                            redirect, actionResponse.getNamespace() + "organizationId",
097                                            organization.getOrganizationId());
098                            }
099    
100                            sendRedirect(actionRequest, actionResponse, redirect);
101                    }
102                    catch (Exception e) {
103                            if (e instanceof NoSuchOrganizationException ||
104                                    e instanceof PrincipalException) {
105    
106                                    SessionErrors.add(actionRequest, e.getClass().getName());
107    
108                                    setForward(actionRequest, "portlet.users_admin.error");
109                            }
110                            else if (e instanceof AddressCityException ||
111                                             e instanceof AddressStreetException ||
112                                             e instanceof AddressZipException ||
113                                             e instanceof DuplicateOrganizationException ||
114                                             e instanceof EmailAddressException ||
115                                             e instanceof NoSuchCountryException ||
116                                             e instanceof NoSuchListTypeException ||
117                                             e instanceof NoSuchRegionException ||
118                                             e instanceof OrganizationNameException ||
119                                             e instanceof OrganizationParentException ||
120                                             e instanceof PhoneNumberException ||
121                                             e instanceof RequiredOrganizationException ||
122                                             e instanceof WebsiteURLException) {
123    
124                                    if (e instanceof NoSuchListTypeException) {
125                                            NoSuchListTypeException nslte = (NoSuchListTypeException)e;
126    
127                                            SessionErrors.add(
128                                                    actionRequest,
129                                                    e.getClass().getName() + nslte.getType());
130                                    }
131                                    else {
132                                            SessionErrors.add(actionRequest, e.getClass().getName());
133                                    }
134    
135                                    if (e instanceof RequiredOrganizationException) {
136                                            String redirect = PortalUtil.escapeRedirect(
137                                                    ParamUtil.getString(actionRequest, "redirect"));
138    
139                                            long organizationId = ParamUtil.getLong(
140                                                    actionRequest, "organizationId");
141    
142                                            if (organizationId > 0) {
143                                                    redirect = HttpUtil.setParameter(
144                                                            redirect,
145                                                            actionResponse.getNamespace() + "organizationId",
146                                                            organizationId);
147                                            }
148    
149                                            if (Validator.isNotNull(redirect)) {
150                                                    actionResponse.sendRedirect(redirect);
151                                            }
152                                    }
153                            }
154                            else {
155                                    throw e;
156                            }
157                    }
158            }
159    
160            @Override
161            public ActionForward render(
162                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
163                            RenderRequest renderRequest, RenderResponse renderResponse)
164                    throws Exception {
165    
166                    try {
167                            ActionUtil.getOrganization(renderRequest);
168                    }
169                    catch (Exception e) {
170                            if (e instanceof NoSuchOrganizationException ||
171                                    e instanceof PrincipalException) {
172    
173                                    SessionErrors.add(renderRequest, e.getClass().getName());
174    
175                                    return mapping.findForward("portlet.users_admin.error");
176                            }
177                            else {
178                                    throw e;
179                            }
180                    }
181    
182                    return mapping.findForward(getForward(
183                            renderRequest, "portlet.users_admin.edit_organization"));
184            }
185    
186            protected void deleteOrganizations(ActionRequest actionRequest)
187                    throws Exception {
188    
189                    long[] deleteOrganizationIds = StringUtil.split(
190                            ParamUtil.getString(actionRequest, "deleteOrganizationIds"), 0L);
191    
192                    for (long deleteOrganizationId : deleteOrganizationIds) {
193                            OrganizationServiceUtil.deleteOrganization(deleteOrganizationId);
194                    }
195            }
196    
197            protected Organization updateOrganization(ActionRequest actionRequest)
198                    throws Exception {
199    
200                    long organizationId = ParamUtil.getLong(
201                            actionRequest, "organizationId");
202    
203                    long parentOrganizationId = ParamUtil.getLong(
204                            actionRequest, "parentOrganizationSearchContainerPrimaryKeys",
205                            OrganizationConstants.DEFAULT_PARENT_ORGANIZATION_ID);
206                    String name = ParamUtil.getString(actionRequest, "name");
207                    boolean recursable = ParamUtil.getBoolean(actionRequest, "recursable");
208                    int statusId = ParamUtil.getInteger(actionRequest, "statusId");
209                    String type = ParamUtil.getString(actionRequest, "type");
210                    long regionId = ParamUtil.getLong(actionRequest, "regionId");
211                    long countryId = ParamUtil.getLong(actionRequest, "countryId");
212                    String comments = ParamUtil.getString(actionRequest, "comments");
213                    boolean site = ParamUtil.getBoolean(actionRequest, "site");
214                    List<Address> addresses = UsersAdminUtil.getAddresses(actionRequest);
215                    List<EmailAddress> emailAddresses = UsersAdminUtil.getEmailAddresses(
216                            actionRequest);
217                    List<OrgLabor> orgLabors = UsersAdminUtil.getOrgLabors(actionRequest);
218                    List<Phone> phones = UsersAdminUtil.getPhones(actionRequest);
219                    List<Website> websites = UsersAdminUtil.getWebsites(actionRequest);
220    
221                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
222                            Organization.class.getName(), actionRequest);
223    
224                    Organization organization = null;
225    
226                    if (organizationId <= 0) {
227    
228                            // Add organization
229    
230                            organization = OrganizationServiceUtil.addOrganization(
231                                    parentOrganizationId, name, type, recursable, regionId,
232                                    countryId, statusId, comments, site, addresses, emailAddresses,
233                                    orgLabors, phones, websites, serviceContext);
234                    }
235                    else {
236    
237                            // Update organization
238    
239                            organization = OrganizationServiceUtil.updateOrganization(
240                                    organizationId, parentOrganizationId, name, type, recursable,
241                                    regionId, countryId, statusId, comments, site, addresses,
242                                    emailAddresses, orgLabors, phones, websites, serviceContext);
243    
244                            boolean deleteLogo = ParamUtil.getBoolean(
245                                    actionRequest, "deleteLogo");
246    
247                            if (deleteLogo) {
248                                    OrganizationServiceUtil.deleteLogo(
249                                            organization.getOrganizationId());
250                            }
251                    }
252    
253                    // Layout set prototypes
254    
255                    long publicLayoutSetPrototypeId = ParamUtil.getLong(
256                            actionRequest, "publicLayoutSetPrototypeId");
257                    long privateLayoutSetPrototypeId = ParamUtil.getLong(
258                            actionRequest, "privateLayoutSetPrototypeId");
259                    boolean publicLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
260                            actionRequest, "publicLayoutSetPrototypeLinkEnabled",
261                            (publicLayoutSetPrototypeId > 0));
262                    boolean privateLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
263                            actionRequest, "privateLayoutSetPrototypeLinkEnabled",
264                            (privateLayoutSetPrototypeId > 0));
265    
266                    SitesUtil.updateLayoutSetPrototypesLinks(
267                            organization.getGroup(), publicLayoutSetPrototypeId,
268                            privateLayoutSetPrototypeId, publicLayoutSetPrototypeLinkEnabled,
269                            privateLayoutSetPrototypeLinkEnabled);
270    
271                    // Reminder queries
272    
273                    String reminderQueries = actionRequest.getParameter("reminderQueries");
274    
275                    PortletPreferences preferences = organization.getPreferences();
276    
277                    LocalizationUtil.setLocalizedPreferencesValues(
278                            actionRequest, preferences, "reminderQueries");
279    
280                    preferences.setValue("reminderQueries", reminderQueries);
281    
282                    preferences.store();
283    
284                    return organization;
285            }
286    
287    }