1   /**
2    * Copyright (c) 2000-2008 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portlet.messageboards.action;
24  
25  import com.liferay.portal.kernel.language.LanguageUtil;
26  import com.liferay.portal.kernel.portlet.ConfigurationAction;
27  import com.liferay.portal.kernel.util.Constants;
28  import com.liferay.portal.kernel.util.LocaleUtil;
29  import com.liferay.portal.kernel.util.ParamUtil;
30  import com.liferay.portal.kernel.util.StringPool;
31  import com.liferay.portal.kernel.util.StringUtil;
32  import com.liferay.portal.kernel.util.Validator;
33  import com.liferay.portlet.PortletPreferencesFactoryUtil;
34  import com.liferay.util.LocalizationUtil;
35  import com.liferay.util.servlet.SessionErrors;
36  import com.liferay.util.servlet.SessionMessages;
37  
38  import java.util.ArrayList;
39  import java.util.Iterator;
40  import java.util.List;
41  import java.util.Locale;
42  import java.util.Map;
43  import java.util.TreeMap;
44  
45  import javax.portlet.ActionRequest;
46  import javax.portlet.ActionResponse;
47  import javax.portlet.PortletConfig;
48  import javax.portlet.PortletPreferences;
49  import javax.portlet.RenderRequest;
50  import javax.portlet.RenderResponse;
51  
52  /**
53   * <a href="ConfigurationActionImpl.java.html"><b><i>View Source</i></b></a>
54   *
55   * @author Brian Wing Shun Chan
56   *
57   */
58  public class ConfigurationActionImpl implements ConfigurationAction {
59  
60      public void processAction(
61              PortletConfig config, ActionRequest req, ActionResponse res)
62          throws Exception {
63  
64          String cmd = ParamUtil.getString(req, Constants.CMD);
65  
66          if (!cmd.equals(Constants.UPDATE)) {
67              return;
68          }
69  
70          String portletResource = ParamUtil.getString(req, "portletResource");
71  
72          PortletPreferences prefs =
73              PortletPreferencesFactoryUtil.getPortletSetup(req, portletResource);
74  
75          String tabs2 = ParamUtil.getString(req, "tabs2");
76  
77          if (tabs2.equals("anonymous-posting")) {
78              updateAnonymousPosting(req, prefs);
79          }
80          else if (tabs2.equals("email-from")) {
81              updateEmailFrom(req, prefs);
82          }
83          else if (tabs2.equals("message-added-email")) {
84              updateEmailMessageAdded(req, prefs);
85          }
86          else if (tabs2.equals("message-updated-email")) {
87              updateEmailMessageUpdated(req, prefs);
88          }
89          else if (tabs2.equals("rss")) {
90              updateRSS(req, prefs);
91          }
92          else if (tabs2.equals("thread-priorities")) {
93              updateThreadPriorities(req, prefs);
94          }
95          else if (tabs2.equals("user-ranks")) {
96              updateUserRanks(req, prefs);
97          }
98  
99          if (SessionErrors.isEmpty(req)) {
100             prefs.store();
101 
102             SessionMessages.add(req, config.getPortletName() + ".doConfigure");
103         }
104     }
105 
106     public String render(
107             PortletConfig config, RenderRequest req, RenderResponse res)
108         throws Exception {
109 
110         return "/html/portlet/message_boards/configuration.jsp";
111     }
112 
113     protected void updateAnonymousPosting(
114             ActionRequest req, PortletPreferences prefs)
115         throws Exception {
116 
117         String allowAnonymousPosting = ParamUtil.getString(
118             req, "allowAnonymousPosting");
119 
120         prefs.setValue("allow-anonymous-posting", allowAnonymousPosting);
121     }
122 
123     protected void updateEmailFrom(ActionRequest req, PortletPreferences prefs)
124         throws Exception {
125 
126         String emailFromName = ParamUtil.getString(req, "emailFromName");
127         String emailFromAddress = ParamUtil.getString(req, "emailFromAddress");
128         boolean emailHtmlFormat = ParamUtil.getBoolean(req, "emailHtmlFormat");
129 
130         if (Validator.isNull(emailFromName)) {
131             SessionErrors.add(req, "emailFromName");
132         }
133         else if (!Validator.isEmailAddress(emailFromAddress) &&
134                  !Validator.isVariableTerm(emailFromAddress)) {
135 
136             SessionErrors.add(req, "emailFromAddress");
137         }
138         else {
139             prefs.setValue("email-from-name", emailFromName);
140             prefs.setValue("email-from-address", emailFromAddress);
141             prefs.setValue(
142                 "email-html-format", String.valueOf(emailHtmlFormat));
143         }
144     }
145 
146     protected void updateEmailMessageAdded(
147             ActionRequest req, PortletPreferences prefs)
148         throws Exception {
149 
150         boolean emailMessageAddedEnabled = ParamUtil.getBoolean(
151             req, "emailMessageAddedEnabled");
152         String emailMessageAddedSubjectPrefix = ParamUtil.getString(
153             req, "emailMessageAddedSubjectPrefix");
154         String emailMessageAddedBody = ParamUtil.getString(
155             req, "emailMessageAddedBody");
156         String emailMessageAddedSignature = ParamUtil.getString(
157             req, "emailMessageAddedSignature");
158 
159         if (Validator.isNull(emailMessageAddedSubjectPrefix)) {
160             SessionErrors.add(req, "emailMessageAddedSubjectPrefix");
161         }
162         else if (Validator.isNull(emailMessageAddedBody)) {
163             SessionErrors.add(req, "emailMessageAddedBody");
164         }
165         else {
166             prefs.setValue(
167                 "email-message-added-enabled",
168                 String.valueOf(emailMessageAddedEnabled));
169             prefs.setValue(
170                 "email-message-added-subject-prefix",
171                 emailMessageAddedSubjectPrefix);
172             prefs.setValue("email-message-added-body", emailMessageAddedBody);
173             prefs.setValue(
174                 "email-message-added-signature", emailMessageAddedSignature);
175         }
176     }
177 
178     protected void updateEmailMessageUpdated(
179             ActionRequest req, PortletPreferences prefs)
180         throws Exception {
181 
182         boolean emailMessageUpdatedEnabled = ParamUtil.getBoolean(
183             req, "emailMessageUpdatedEnabled");
184         String emailMessageUpdatedSubjectPrefix = ParamUtil.getString(
185             req, "emailMessageUpdatedSubjectPrefix");
186         String emailMessageUpdatedBody = ParamUtil.getString(
187             req, "emailMessageUpdatedBody");
188         String emailMessageUpdatedSignature = ParamUtil.getString(
189             req, "emailMessageUpdatedSignature");
190 
191         if (Validator.isNull(emailMessageUpdatedSubjectPrefix)) {
192             SessionErrors.add(req, "emailMessageUpdatedSubjectPrefix");
193         }
194         else if (Validator.isNull(emailMessageUpdatedBody)) {
195             SessionErrors.add(req, "emailMessageUpdatedBody");
196         }
197         else {
198             prefs.setValue(
199                 "email-message-updated-enabled",
200                 String.valueOf(emailMessageUpdatedEnabled));
201             prefs.setValue(
202                 "email-message-updated-subject-prefix",
203                 emailMessageUpdatedSubjectPrefix);
204             prefs.setValue(
205                 "email-message-updated-body", emailMessageUpdatedBody);
206             prefs.setValue(
207                 "email-message-updated-signature",
208                 emailMessageUpdatedSignature);
209         }
210     }
211 
212     protected void updateRSS(ActionRequest req, PortletPreferences prefs)
213         throws Exception {
214 
215         int rssDelta = ParamUtil.getInteger(req, "rssDelta");
216         String rssDisplayStyle = ParamUtil.getString(req, "rssDisplayStyle");
217         String rssFormat = ParamUtil.getString(req, "rssFormat");
218 
219         prefs.setValue("rss-delta", String.valueOf(rssDelta));
220         prefs.setValue("rss-display-style", rssDisplayStyle);
221         prefs.setValue("rss-format", rssFormat);
222     }
223 
224     protected void updateThreadPriorities(
225             ActionRequest req, PortletPreferences prefs)
226         throws Exception {
227 
228         Locale[] locales = LanguageUtil.getAvailableLocales();
229 
230         for (int i = 0; i < locales.length; i++) {
231             String languageId = LocaleUtil.toLanguageId(locales[i]);
232 
233             List<String> priorities = new ArrayList<String>();
234 
235             for (int j = 0; j < 10; j++) {
236                 String name = ParamUtil.getString(
237                     req, "priorityName" + j + "_" + languageId);
238                 String image = ParamUtil.getString(
239                     req, "priorityImage" + j + "_" + languageId);
240                 double value = ParamUtil.getDouble(
241                     req, "priorityValue" + j + "_" + languageId);
242 
243                 if (Validator.isNotNull(name) || Validator.isNotNull(image) ||
244                     (value != 0.0)) {
245 
246                     priorities.add(
247                         name + StringPool.COMMA + image + StringPool.COMMA +
248                             value);
249                 }
250             }
251 
252             LocalizationUtil.setPrefsValues(
253                 prefs, "priorities", languageId,
254                 priorities.toArray(new String[priorities.size()]));
255         }
256     }
257 
258     protected void updateUserRanks(ActionRequest req, PortletPreferences prefs)
259         throws Exception {
260 
261         Locale[] locales = LanguageUtil.getAvailableLocales();
262 
263         for (int i = 0; i < locales.length; i++) {
264             String languageId = LocaleUtil.toLanguageId(locales[i]);
265 
266             String[] ranks = StringUtil.split(
267                 ParamUtil.getString(req, "ranks_" + languageId),
268                 StringPool.NEW_LINE);
269 
270             Map<String, String> map = new TreeMap<String, String>();
271 
272             for (int j = 0; j < ranks.length; j++) {
273                 String[] kvp = StringUtil.split(ranks[j], StringPool.EQUAL);
274 
275                 String kvpName = kvp[0];
276                 String kvpValue = kvp[1];
277 
278                 map.put(kvpValue, kvpName);
279             }
280 
281             ranks = new String[map.size()];
282 
283             int count = 0;
284 
285             Iterator<Map.Entry<String, String>> itr =
286                 map.entrySet().iterator();
287 
288             while (itr.hasNext()) {
289                 Map.Entry<String, String> entry = itr.next();
290 
291                 String kvpValue = entry.getKey();
292                 String kvpName = entry.getValue();
293 
294                 ranks[count++] = kvpName + StringPool.EQUAL + kvpValue;
295             }
296 
297             LocalizationUtil.setPrefsValues(prefs, "ranks", languageId, ranks);
298         }
299     }
300 
301 }