001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: package org.apache.pluto.driver;
018:
019: import org.apache.pluto.PortletContainer;
020: import org.apache.pluto.driver.services.portal.PageConfig;
021: import org.apache.pluto.driver.config.AdminConfiguration;
022: import org.apache.commons.logging.Log;
023: import org.apache.commons.logging.LogFactory;
024:
025: import javax.servlet.http.HttpServletRequest;
026: import javax.servlet.http.HttpServletResponse;
027: import javax.servlet.ServletContext;
028: import javax.servlet.ServletException;
029: import java.io.IOException;
030: import java.text.DecimalFormat;
031:
032: /**
033: * TCK Driver Servlet.
034: *
035: * @version 1.0
036: * @since Dec 11, 2005
037: */
038: public class TCKDriverServlet extends PortalDriverServlet {
039:
040: /** Logger. */
041: private static final Log LOG = LogFactory
042: .getLog(TCKDriverServlet.class);
043:
044: private int pageCounter = 0;
045:
046: public String getServletInfo() {
047: return "Pluto TCK Driver Servlet";
048: }
049:
050: public void init() {
051: super .init();
052: ServletContext servletContext = getServletContext();
053: container = (PortletContainer) servletContext
054: .getAttribute(AttributeKeys.PORTLET_CONTAINER);
055: }
056:
057: /**
058: * Overwrites <code>super.doGet(..)</code>. If <code>portletName</code>
059: * (multiple occurrences) parameter is received, the driver is attempting
060: * to create a new page. This page must be setup and then redirected to the
061: * actual page. Otherwise, the driver calls <code>super.doGet(..)</code>
062: * to continue as normal.
063: * @param request the incoming servlet request.
064: * @param response the incoming servlet response.
065: * @throws IOException
066: * @throws ServletException
067: */
068: public void doGet(HttpServletRequest request,
069: HttpServletResponse response) throws IOException,
070: ServletException {
071: String[] portletNames = request
072: .getParameterValues("portletName");
073: if (portletNames != null && portletNames.length > 0) {
074: debugWithName("Initializing new TCK page...");
075: doSetup(request, response);
076: } else {
077: debugWithName("No portlet names specified. Continue as normal.");
078: super .doGet(request, response);
079: }
080: }
081:
082: public void doPost(HttpServletRequest req,
083: HttpServletResponse response) throws IOException,
084: ServletException {
085: super .doGet(req, response);
086: }
087:
088: // Private Methods ---------------------------------------------------------
089:
090: private void doSetup(HttpServletRequest request,
091: HttpServletResponse response) throws IOException,
092: ServletException {
093: String[] portletNames = request
094: .getParameterValues("portletName");
095: String pageName = request.getParameter("pageName");
096: if (pageName != null) {
097: debugWithName("Retrieved page name from request: "
098: + pageName);
099: } else {
100: debugWithName("Creating page name...");
101: AdminConfiguration adminConfig = (AdminConfiguration) getServletContext()
102: .getAttribute(AttributeKeys.DRIVER_ADMIN_CONFIG);
103: if (adminConfig == null) {
104: throw new ServletException("Invalid configuration: "
105: + "an AdminConfiguration must be specified "
106: + "to run the TCK.");
107: }
108:
109: pageName = (new DecimalFormat("TCK00000"))
110: .format(pageCounter++);
111: PageConfig pageConfig = new PageConfig();
112: pageConfig.setName(pageName);
113: pageConfig.setUri(DEFAULT_PAGE_URI);
114: for (int i = 0; i < portletNames.length; i++) {
115: debugWithName("Processing portlet name: "
116: + portletNames[i]);
117: int index = portletNames[i].indexOf("/");
118: String contextPath = "/"
119: + portletNames[i].substring(0, index);
120: String portletName = portletNames[i]
121: .substring(index + 1);
122: pageConfig.addPortlet(contextPath, portletName);
123: adminConfig.getPortletRegistryAdminService()
124: .addPortletApplication(contextPath);
125: }
126:
127: adminConfig.getRenderConfigAdminService().addPage(
128: pageConfig);
129: debugWithName("Created TCK Page: " + pageName);
130: }
131:
132: // The other possibility would be to redirect to the actual portal.
133: // I'm not sure which is better at this point.
134: StringBuffer buffer = new StringBuffer();
135: buffer.append(request.getRequestURL().toString());
136: if (!request.getRequestURL().toString().endsWith("/")) {
137: buffer.append("/");
138: }
139: buffer.append(pageName);
140: debugWithName("Sending redirect to: " + buffer.toString());
141: response.sendRedirect(buffer.toString());
142: }
143:
144: /**
145: * Prints debug message with a <code>[Pluto TCK Driver]</code> prefix.
146: * @param message message to debug.
147: */
148: private void debugWithName(String message) {
149: if (LOG.isDebugEnabled()) {
150: LOG.debug("[Pluto TCK Driver] " + message);
151: }
152: }
153:
154: }
|