001: /*
002: * (C) Copyright 2000 - 2005 Nabh Information Systems, Inc.
003: *
004: * This program is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU General Public License
006: * as published by the Free Software Foundation; either version 2
007: * of the License, or (at your option) any later version.
008: *
009: * This program is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
012: * GNU General Public License for more details.
013: *
014: * You should have received a copy of the GNU General Public License
015: * along with this program; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
017: *
018: */
019: package com.nabhinc.portlet.portletadmin;
020:
021: import java.io.IOException;
022: import java.util.ArrayList;
023: import java.util.HashMap;
024: import java.util.Hashtable;
025:
026: import javax.portlet.ActionRequest;
027: import javax.portlet.ActionResponse;
028: import javax.portlet.PortletException;
029: import javax.servlet.http.HttpServletRequest;
030: import javax.servlet.http.HttpServletResponse;
031:
032: import com.nabhinc.core.Defaults;
033: import com.nabhinc.core.MimeTypes;
034: import com.nabhinc.portal.config.PortletType;
035: import com.nabhinc.portal.container.PortletRequestImpl;
036: import com.nabhinc.portal.container.PortletResponseImpl;
037: import com.nabhinc.portal.core.PortalServlet;
038: import com.nabhinc.portal.core.PortletConfigInfo;
039: import com.nabhinc.portlet.base.BasePortlet;
040: import com.nabhinc.portlet.mvcportlet.core.ActionConfig;
041: import com.nabhinc.portlet.mvcportlet.core.ActionProcessor;
042: import com.nabhinc.portlet.mvcportlet.core.BaseRequestProcessor;
043: import com.nabhinc.portlet.report.ReportPortlet;
044: import com.nabhinc.util.StringUtil;
045:
046: /**
047: *
048: *
049: * @author Padmanabh Dabke
050: * (c) 2005 Nabh Information Systems, Inc. All Rights Reserved.
051: * @since 2.4.1
052: */
053: public class ReportPortletCreator extends BaseRequestProcessor
054: implements ActionProcessor {
055:
056: /* (non-Javadoc)
057: * @see com.nabhinc.portlet.mvcportlet.core.ActionProcessor#process(javax.portlet.ActionRequest, javax.portlet.ActionResponse, com.nabhinc.portlet.mvcportlet.core.ActionConfig)
058: */
059: public String process(ActionRequest request,
060: ActionResponse response, ActionConfig actionConfig)
061: throws PortletException, IOException {
062:
063: final String PORTLET_TYPE = "com.nabhinc.portlet.report.ReportPortlet";
064: final String DEFAULT_DATA_SOURCE = Defaults.getDataSourceName();
065:
066: final String VIEW_MODE = "view";
067: final String EDIT_MODE = "edit";
068: final String HELP_MODE = "help";
069:
070: boolean isEdit = "true".equals(request.getParameter("edit"));
071: String portletIndex = request.getParameter("portlet_index");
072: int pIndex = portletIndex == null ? -1 : Integer
073: .parseInt(portletIndex);
074:
075: //HTML mime type is supported by default
076: boolean isHTMLMimeTypeSupported = true; //rReq.getParameter("html_mime_type") != null;
077: boolean isHTMLEditSupported = request
078: .getParameter("html_edit_mode") != null;
079: boolean isHTMLHelpSupported = request
080: .getParameter("html_help_mode") != null;
081: boolean isXHTMLMimeTypeSupported = true;
082: boolean isWMLMimeTypeSupported = false;
083:
084: boolean isNewPage = false;
085:
086: String pName = request.getParameter("pname");
087: String title = request.getParameter("title");
088: String keywordsStr = request.getParameter("keywords");
089: String shortTitle = request.getParameter("short_title");
090: String expCache = request.getParameter("exp_cache");
091: String resourceBundleName = request
092: .getParameter("resource_bundle");
093: String supportedLocales = request
094: .getParameter("supported_locales");
095:
096: String totalSecRoles = request.getParameter("sec_roles_total");
097: String totalDescrLang = request
098: .getParameter("descr_lang_total");
099: String totalDispLang = request
100: .getParameter("display_lang_total");
101:
102: int numOfSecRoles = Integer.parseInt(totalSecRoles);
103: int numOfDescrLangs = Integer.parseInt(totalDescrLang);
104: int numOfDispLangs = Integer.parseInt(totalDispLang);
105:
106: //datasource is the default datasource
107: String dataSource = request.getParameter("data_source");
108:
109: String listSQL = request.getParameter("list_sql");
110: String countSQL = request.getParameter("count_sql");
111: String headers = request.getParameter("headers");
112: String reportHeader = request.getParameter("report_header");
113: String reportFooter = request.getParameter("report_footer");
114: String pageHeader = request.getParameter("page_header");
115: String pageFooter = request.getParameter("page_footer");
116: String columns = request.getParameter("columns");
117: String columnName = request.getParameter("column_name");
118: String columnExpr0 = request.getParameter("column_expr_0");
119: String columnExpr1 = request.getParameter("column_expr_1");
120: String columnExpr2 = request.getParameter("column_expr_2");
121: String columnExpr3 = request.getParameter("column_expr_3");
122: String columnExpr4 = request.getParameter("column_expr_4");
123: String columnExpr5 = request.getParameter("column_expr_5");
124: String sectionName0 = request.getParameter("section_name_0");
125: String sectionHeader0 = request
126: .getParameter("section_header_0");
127: String sectionFooter0 = request
128: .getParameter("section_footer_0");
129: String sectionExpr0 = request.getParameter("section_expr_0");
130: //boolean
131: String startGroupOnNewPage = request
132: .getParameter("start_group_on_new_page");
133: String emptyReportMsg = request
134: .getParameter("empty_report_msg");
135: String nextLabel = request.getParameter("next_label");
136: String prevLabel = request.getParameter("prev_label");
137: String refreshLabel = request.getParameter("refresh_label");
138: //preference
139: String rowsPerPage = request.getParameter("rows_per_page");
140:
141: String editPath = request.getParameter("edit_path");
142: String helpPath = request.getParameter("help_path");
143:
144: String error = "";
145:
146: if (pName.trim().equals("")) {
147: error += "You must provide portlet name.<br/>";
148: } else if (PortalServlet.getInstance().isPortletExists(pName)) {
149: if (!isEdit
150: || !pName.equals(((PortletConfigInfo) PortalServlet
151: .getInstance().getPortletConfigInfoList()
152: .elementAt(pIndex)).name)) {
153: error += "Duplicate portlet name.<br/>";
154: }
155: }
156: if (title.trim().equals("")) {
157: error += "You must provide portlet title.<br/>";
158: }
159: if (listSQL.trim().equals("")) {
160: error += "Missing list SQL.<br/>";
161: }
162: if (countSQL.trim().equals("")) {
163: error += "Missing count SQL.<br/>";
164: }
165: if (headers.trim().equals("")) {
166: error += "Missing table headers.<br/>";
167: }
168: if (dataSource.trim().equals("")) {
169: error += "Missing data source.<br/>";
170: }
171:
172: if (!rowsPerPage.trim().equals("")) {
173: try {
174: Integer.parseInt(rowsPerPage);
175: } catch (Exception ex) {
176: error += "Rows per page has to be a number.<br/>";
177: }
178: }
179: if (expCache != null && !expCache.trim().equals("")) {
180: try {
181: Integer.parseInt(expCache);
182: } catch (Exception ex) {
183: error += "Expiration cache must be a number.<br/>";
184: }
185: }
186:
187: if (!error.equals("")) {
188: response.setRenderParameter("error", error);
189: if (isEdit)
190: response.setRenderParameter("edit", "true");
191: return "failure";
192: }
193:
194: PortletType pType = PortletUtil.createPortletType(pName,
195: PORTLET_TYPE);
196: PortletUtil.setTitle(title, pType);
197: PortletUtil.setShortTitle(shortTitle, pType);
198: PortletUtil.setResourceBundle(resourceBundleName, pType);
199:
200: HashMap descrMap = new HashMap();
201: for (int i = 0; i < numOfDescrLangs; i++) {
202: String lang = request.getParameter("descr_lang" + i);
203: String descr = request.getParameter("descr" + i);
204: if (descrMap.containsKey(lang))
205: continue;
206: descrMap.put(lang, descr);
207: }
208: PortletUtil.setDescription(descrMap, pType);
209:
210: HashMap displayMap = new HashMap();
211: for (int i = 0; i < numOfDispLangs; i++) {
212: String lang = request.getParameter("display_lang" + i);
213: String displayName = request.getParameter("display_name"
214: + i);
215: if (displayMap.containsKey(lang))
216: continue;
217: displayMap.put(lang, displayName);
218: }
219: PortletUtil.setDisplayName(displayMap, pType);
220:
221: if (expCache != null && !expCache.trim().equals(""))
222: PortletUtil.setExpirationCache(Integer.parseInt(expCache),
223: pType);
224:
225: Hashtable initParams = new Hashtable();
226:
227: if (editPath != null && !editPath.trim().equals("")) {
228: if (editPath.indexOf("://") == -1
229: && !editPath.startsWith("/")) {
230: editPath = "/" + editPath;
231: }
232: initParams.put(BasePortlet.EDIT_JSP_PARAM, editPath);
233: isHTMLEditSupported = true;
234: }
235:
236: if (helpPath != null && !helpPath.trim().equals("")) {
237: if (helpPath.indexOf("://") == -1
238: && !helpPath.startsWith("/")) {
239: helpPath = "/" + helpPath;
240: }
241: initParams.put(BasePortlet.HELP_JSP_PARAM, helpPath);
242: isHTMLHelpSupported = true;
243: }
244:
245: initParams.put(ReportPortlet.LIST_SQL_INIT_PARAM, listSQL);
246: initParams.put(ReportPortlet.COUNT_SQL_INIT_PARAM, countSQL);
247: initParams.put(ReportPortlet.HEADERS_INIT_PARAM, headers);
248: addInitParameter(initParams,
249: ReportPortlet.DATA_SOURCE_INIT_PARAM, dataSource);
250: addInitParameter(initParams,
251: ReportPortlet.REPORT_HEADER_INIT_PARAM, reportHeader);
252: addInitParameter(initParams,
253: ReportPortlet.REPORT_FOOTER_INIT_PARAM, reportFooter);
254: addInitParameter(initParams,
255: ReportPortlet.PAGE_HEADER_INIT_PARAM, pageHeader);
256: addInitParameter(initParams,
257: ReportPortlet.PAGE_FOOTER_INIT_PARAM, pageFooter);
258: addInitParameter(initParams, ReportPortlet.COLUMNS_INIT_PARAM,
259: columns);
260: addInitParameter(initParams,
261: ReportPortlet.COLUMN_NAME_INIT_PARAM, columnName);
262: addInitParameter(initParams,
263: ReportPortlet.COLUMN_EXPR_INIT_PARAM + "0", columnExpr0);
264: addInitParameter(initParams,
265: ReportPortlet.COLUMN_EXPR_INIT_PARAM + "1", columnExpr1);
266: addInitParameter(initParams,
267: ReportPortlet.COLUMN_EXPR_INIT_PARAM + "2", columnExpr2);
268: addInitParameter(initParams,
269: ReportPortlet.COLUMN_EXPR_INIT_PARAM + "3", columnExpr3);
270: addInitParameter(initParams,
271: ReportPortlet.COLUMN_EXPR_INIT_PARAM + "4", columnExpr4);
272: addInitParameter(initParams,
273: ReportPortlet.COLUMN_EXPR_INIT_PARAM + "5", columnExpr5);
274: addInitParameter(initParams,
275: ReportPortlet.SECTION_NAME_INIT_PARAM + "0",
276: sectionName0);
277: addInitParameter(initParams,
278: ReportPortlet.SECTION_HEADER_INIT_PARAM + "0",
279: sectionHeader0);
280: addInitParameter(initParams,
281: ReportPortlet.SECTION_FOOTER_INIT_PARAM + "0",
282: sectionFooter0);
283: addInitParameter(initParams,
284: ReportPortlet.SECTION_EXPR_INIT_PARAM + "0",
285: sectionExpr0);
286: if (isNewPage)
287: initParams.put(
288: ReportPortlet.START_GROUP_ON_NEW_PAGE_INIT_PARAM,
289: "true");
290: addInitParameter(initParams,
291: ReportPortlet.EMPTY_REPORT_MSG_INIT_PARAM,
292: emptyReportMsg);
293: addInitParameter(initParams,
294: ReportPortlet.NEXT_LABEL_INIT_PARAM, nextLabel);
295: addInitParameter(initParams,
296: ReportPortlet.PREV_LABEL_INIT_PARAM, prevLabel);
297: addInitParameter(initParams,
298: ReportPortlet.REFRESH_LABEL_INIT_PARAM, refreshLabel);
299:
300: PortletUtil.setInitParams(initParams, pType);
301:
302: Hashtable prefMap = new Hashtable();
303: if (!"".equals(rowsPerPage)) {
304: ArrayList valueList1 = new ArrayList();
305: valueList1.add(rowsPerPage);
306: prefMap.put(ReportPortlet.ROWS_PER_PAGE_PREF, valueList1);
307: }
308:
309: PortletUtil.setPreferences(prefMap, pType);
310: PortletUtil.setKeywords(keywordsStr, pType);
311:
312: if (isHTMLMimeTypeSupported) {
313: String[] supportedModes = null;
314: if (isHTMLEditSupported && isHTMLHelpSupported) {
315: supportedModes = new String[] { EDIT_MODE, HELP_MODE };
316:
317: } else if (isHTMLEditSupported) {
318: supportedModes = new String[] { EDIT_MODE };
319:
320: } else if (isHTMLHelpSupported) {
321: supportedModes = new String[] { HELP_MODE };
322: }
323:
324: PortletUtil.setSupports(supportedModes, MimeTypes.HTML,
325: pType);
326: }
327:
328: if (isXHTMLMimeTypeSupported) {
329: String[] supportedModes = null;
330: PortletUtil.setSupports(supportedModes, MimeTypes.XHTML_MP,
331: pType);
332: }
333:
334: if (isWMLMimeTypeSupported) {
335: String[] supportedModes = null;
336: PortletUtil.setSupports(supportedModes, MimeTypes.WML,
337: pType);
338: }
339:
340: if (supportedLocales != null
341: && !"".equals(supportedLocales.trim())) {
342: String[] locales = StringUtil.split(supportedLocales, ",");
343: PortletUtil.setSupportedLocales(locales, pType);
344: }
345:
346: HashMap secRoleMap = new HashMap();
347: for (int i = 0; i < numOfSecRoles; i++) {
348: String roleName = request.getParameter("role_name" + i);
349: if (roleName != null && !"".equals(roleName.trim())) {
350: secRoleMap.put(roleName, request
351: .getParameter("role_link" + i));
352: }
353: }
354: PortletUtil.setSecurityRoleReference(secRoleMap, pType);
355:
356: try {
357: if (isEdit) {
358: HttpServletRequest req = ((PortletRequestImpl) request)
359: .getHttpServletRequest();
360: HttpServletResponse res = ((PortletResponseImpl) response)
361: .getHttpServletResponse();
362: PortalServlet.getInstance().replacePortlet(pType,
363: pIndex, req, res);
364: } else {
365: PortalServlet.getInstance().addPortlet(pType);
366: }
367: PortalServlet.getInstance().savePortletConfiguration();
368:
369: } catch (Exception ex) {
370: throw new PortletException("Failed to create URL portlet.",
371: ex);
372: }
373:
374: return "success";
375: }
376:
377: private void addInitParameter(Hashtable table, String paramName,
378: String paramValue) {
379: if (paramValue != null) {
380: paramValue = paramValue.trim();
381: if (!paramValue.equals("")) {
382: table.put(paramName, paramValue);
383: }
384: }
385: }
386: }
|