taylor 2003/12/29 22:37:40
Modified: portal maven.xml
portal/src/java/org/apache/jetspeed
JetspeedPortalContext.java PortalContext.java
portal/src/java/org/apache/jetspeed/container/invoker
PortletInvokerFactoryImpl.java
ServletPortletInvoker.java
portal/src/java/org/apache/jetspeed/om/portlet/impl
PortletApplicationDefinitionImpl.java
portal/src/java/org/apache/jetspeed/services/information
StaticInformationProviderImpl.java
portal/src/java/org/apache/jetspeed/tools/pamanager
FileSystemPAM.java PortletApplicationManager.java
portal/src/webapp/WEB-INF/conf jetspeed.properties
portal/src/webapp/WEB-INF/pages default-page.psml
Added: portal/src/java/org/apache/jetspeed/container/invoker
JetspeedPortletInvoker.java
LocalPortletInvoker.java
portal/src/webapp/WEB-INF/apps README.txt
Removed: portal/src/java/org/apache/jetspeed/container/invoker
JetspeedServletPortletInvoker.java
PortletInvokerFactory.java
Log:
Modified the PAM to deploy to 2 different types of apps: WEBAPP and LOCAL
Before it only supported WEBAPP, which required a cross-context invoker.
LOCAL PAs do not require a cross-context invoker. Useful for app servers which do
not support this esoteric feature. AFAIK, Weblogic does not support cross-context.
Added support for LOCAL portlet applications to the portal.
Tested RequestDispatcher and Resource loading from the portlet API.
However, there are still some important outstanding issues, almost all related to
webapp resources:
1. Security. Someone with knowledge could possibly get to resources outside of the
webapp
2. Resources that arent' loaded by the Portlet API need to be rewritten, unless
someone else has a solution...
TLB, JSP includes, HREF, CSS, GIF, HTML snipets ....
One solution would be to rewrite all links for a known type of mimetype during
deployment
3. PLT 10.3 - Portlet Context and its relationship to the ServletContext. There's
some munging we'll have to do there
4. Should we support servlets in Local portlet applications? The easy answer is
no...read sections PLT 3 and PLT 10.3...
Revision Changes Path
1.21 +22 -0 jakarta-jetspeed-2/portal/maven.xml
Index: maven.xml
===================================================================
RCS file: /home/cvs/jakarta-jetspeed-2/portal/maven.xml,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- maven.xml 22 Dec 2003 02:18:22 -0000 1.20
+++ maven.xml 30 Dec 2003 06:37:39 -0000 1.21
@@ -50,6 +50,28 @@
<arg value="jetspeed" />
</java>
</goal>
+
+ <!-- testing out Portlet App within Jetspeed -->
+ <goal name="pam.padeploy">
+ <java
classname="org.apache.jetspeed.tools.pamanager.PortletApplicationManager" fork="yes">
+ <classpath>
+ <path refid="maven.dependency.classpath"/>
+ <pathelement path="${maven.build.dest}"/>
+ </classpath>
+ <arg value="-action" />
+ <arg value="deploy" />
+ <arg value="-PortletAppName" />
+ <arg value="pam" />
+ <arg value="-warfilename" />
+ <arg value="../applications/pam/target/pam.war" />
+ <arg value="-webappDir" />
+ <arg value="${pam.deploy.dir}/" />
+ <arg value="-PortalName" />
+ <arg value="jetspeed" />
+ <arg value="-ApplicationType" />
+ <arg value="local" />
+ </java>
+ </goal>
<goal name="pam.undeploy">
<java
classname="org.apache.jetspeed.tools.pamanager.PortletApplicationManager" fork="yes">
1.2 +63 -1
jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/JetspeedPortalContext.java
Index: JetspeedPortalContext.java
===================================================================
RCS file:
/home/cvs/jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/JetspeedPortalContext.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- JetspeedPortalContext.java 28 Jul 2003 23:47:36 -0000 1.1
+++ JetspeedPortalContext.java 30 Dec 2003 06:37:39 -0000 1.2
@@ -53,9 +53,13 @@
*/
package org.apache.jetspeed;
+import java.util.Enumeration;
import java.util.HashMap;
import org.apache.commons.configuration.Configuration;
import org.apache.jetspeed.engine.Engine;
+import org.apache.jetspeed.engine.core.PortalContextProviderImpl;
+import org.apache.pluto.services.information.PortalContextProvider;
+import org.apache.pluto.util.Enumerator;
/**
* Implementation of Portal Context associated with running thread of the engine
@@ -176,5 +180,63 @@
attributes.put(name, value);
}
+ /* (non-Javadoc)
+ * @see javax.portlet.PortalContext#getProperty(java.lang.String)
+ */
+ public String getProperty(String name)
+ {
+ return getPortalContextProvider().getProperty(name);
+ }
+
+ /* (non-Javadoc)
+ * @see javax.portlet.PortalContext#getPropertyNames()
+ */
+ public Enumeration getPropertyNames()
+ {
+ return new Enumerator(getPortalContextProvider().getPropertyNames());
+ }
+
+ /* (non-Javadoc)
+ * @see javax.portlet.PortalContext#getSupportedPortletModes()
+ */
+ public Enumeration getSupportedPortletModes()
+ {
+ return new
Enumerator(getPortalContextProvider().getSupportedPortletModes());
+ }
+
+ /* (non-Javadoc)
+ * @see javax.portlet.PortalContext#getSupportedWindowStates()
+ */
+ public Enumeration getSupportedWindowStates()
+ {
+ return new
Enumerator(getPortalContextProvider().getSupportedWindowStates());
+ }
+ /* (non-Javadoc)
+ * @see javax.portlet.PortalContext#getPortalInfo()
+ */
+ public String getPortalInfo()
+ {
+ return getPortalContextProvider().getPortalInfo();
+ }
+
+ /**
+ * TODO: need to refactor context provider, move implementation directly into
here since it comes back here anyway
+ * @return
+ */
+ private PortalContextProvider getPortalContextProvider()
+ {
+ javax.servlet.ServletContext context =
engine.getServletConfig().getServletContext();
+
+ PortalContextProvider provider =
+ (PortalContextProvider)
context.getAttribute("org.apache.jetspeed.engine.core.PortalContextProvider");
+
+ if (provider == null)
+ {
+ provider = new PortalContextProviderImpl();
+
context.setAttribute("org.apache.jetspeed.engine.core.PortalContextProvider",
provider);
+ }
+
+ return provider;
+ }
}
1.2 +2 -2
jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/PortalContext.java
Index: PortalContext.java
===================================================================
RCS file:
/home/cvs/jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/PortalContext.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- PortalContext.java 28 Jul 2003 23:47:36 -0000 1.1
+++ PortalContext.java 30 Dec 2003 06:37:39 -0000 1.2
@@ -62,7 +62,7 @@
* @author <a href="mailto:[EMAIL PROTECTED]">David Sean Taylor</a>
* @version $Id$
*/
-public interface PortalContext
+public interface PortalContext extends javax.portlet.PortalContext
{
public Engine getEngine();
1.2 +55 -4
jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/container/invoker/PortletInvokerFactoryImpl.java
Index: PortletInvokerFactoryImpl.java
===================================================================
RCS file:
/home/cvs/jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/container/invoker/PortletInvokerFactoryImpl.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- PortletInvokerFactoryImpl.java 28 Jul 2003 23:47:37 -0000 1.1
+++ PortletInvokerFactoryImpl.java 30 Dec 2003 06:37:39 -0000 1.2
@@ -54,8 +54,14 @@
package org.apache.jetspeed.container.invoker;
import java.util.Map;
+
import javax.servlet.ServletConfig;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.jetspeed.Jetspeed;
+import org.apache.jetspeed.PortalContext;
+import org.apache.jetspeed.om.common.portlet.MutablePortletApplication;
import org.apache.pluto.factory.PortletInvokerFactory;
import org.apache.pluto.om.portlet.PortletDefinition;
import org.apache.pluto.invoker.PortletInvoker;
@@ -69,6 +75,11 @@
public class PortletInvokerFactoryImpl
implements PortletInvokerFactory
{
+ private final static Log log =
LogFactory.getLog(PortletInvokerFactoryImpl.class);
+
+ public final static String INVOKER_SERVLET = "factory.invoker.servlet";
+ public final static String INVOKER_LOCAL = "factory.invoker.local";
+
private ServletConfig servletConfig;
public void init(ServletConfig config, Map properties)
@@ -84,11 +95,51 @@
public PortletInvoker getPortletInvoker(PortletDefinition portletDefinition)
{
+ PortalContext pc = Jetspeed.getContext();
+ JetspeedPortletInvoker invoker = null;
+
+ MutablePortletApplication app =
(MutablePortletApplication)portletDefinition.getPortletApplicationDefinition();
+ if (app.getApplicationType() == MutablePortletApplication.LOCAL)
+ {
+ System.out.println("$$$$$$ LOCAL INVOKIN " +
portletDefinition.getName());
+
+ // TODO: pooling
+
+ try
+ {
+ String className = pc.getConfigurationProperty(INVOKER_LOCAL);
+ invoker =
(JetspeedPortletInvoker)Class.forName(className).newInstance();
+ invoker.activate(portletDefinition, servletConfig);
+ return invoker;
+ }
+ catch (Throwable t)
+ {
+ log.error("failed to create LOCAL invoker, using default", t);
+ // try default
+ invoker = new LocalPortletInvoker();
+ invoker.activate(portletDefinition, servletConfig);
+ return invoker;
+ }
+ }
+
// TODO: pooling
- System.out.println("$$$$$$ INVOKIN " + portletDefinition.getName());
+ System.out.println("$$$$$$ EXTERNAL INVOKIN " +
portletDefinition.getName());
- PortletInvoker invoker = new ServletPortletInvoker(portletDefinition,
servletConfig);
- return invoker;
+ try
+ {
+ String className = pc.getConfigurationProperty(INVOKER_SERVLET);
+ //PortletInvoker invoker = new ServletPortletInvoker(portletDefinition,
servletConfig);
+ invoker =
(JetspeedPortletInvoker)Class.forName(className).newInstance();
+ invoker.activate(portletDefinition, servletConfig);
+ return invoker;
+ }
+ catch (Throwable t)
+ {
+ log.error("failed to create SERVLET invoker, using default", t);
+ invoker = new ServletPortletInvoker();
+ invoker.activate(portletDefinition, servletConfig);
+ return invoker;
+ }
}
}
1.6 +37 -13
jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/container/invoker/ServletPortletInvoker.java
Index: ServletPortletInvoker.java
===================================================================
RCS file:
/home/cvs/jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/container/invoker/ServletPortletInvoker.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ServletPortletInvoker.java 20 Oct 2003 03:47:06 -0000 1.5
+++ ServletPortletInvoker.java 30 Dec 2003 06:37:39 -0000 1.6
@@ -74,11 +74,8 @@
import org.apache.commons.logging.LogFactory;
import org.apache.jetspeed.container.ContainerConstants;
import org.apache.jetspeed.container.PortletContextFactory;
-import org.apache.jetspeed.engine.servlet.ServletObjectAccess;
-import org.apache.pluto.core.CoreUtils;
+import org.apache.jetspeed.om.common.portlet.MutablePortletApplication;
import org.apache.pluto.core.impl.PortletConfigImpl;
-import org.apache.pluto.invoker.PortletInvoker;
-import org.apache.pluto.om.portlet.PortletApplicationDefinition;
import org.apache.pluto.om.portlet.PortletDefinition;
/**
@@ -87,7 +84,7 @@
* @author <a href="mailto:[EMAIL PROTECTED]">David Sean Taylor</a>
* @version $Id$
*/
-public class ServletPortletInvoker implements PortletInvoker
+public class ServletPortletInvoker implements JetspeedPortletInvoker
{
public static final String MVC_ENTRY_SERVLET = "/container";
@@ -95,15 +92,39 @@
protected ServletContext jetspeedContext;
protected ServletConfig jetspeedConfig;
- private PortletDefinition portletDefinition;
+ protected PortletDefinition portletDefinition;
+ protected boolean activated = false;
- public ServletPortletInvoker(PortletDefinition portletDefinition, ServletConfig
servletConfig)
+ /* (non-Javadoc)
+ * @see org.apache.jetspeed.container.invoker.JetspeedPortletInvoker#passivate()
+ */
+ public void passivate()
+ {
+ activated = false;
+ }
+
+ /* (non-Javadoc)
+ * @see
org.apache.jetspeed.container.invoker.JetspeedPortletInvoker#isActivated()
+ */
+ public boolean isActivated()
{
- System.out.println("%%% invoker.portletdef = " + portletDefinition);
+ return activated;
+ }
+ /* (non-Javadoc)
+ * @see
org.apache.jetspeed.container.invoker.JetspeedPortletInvoker#activate(org.apache.pluto.om.portlet.PortletDefinition,
javax.servlet.ServletConfig)
+ */
+ public void activate(PortletDefinition portletDefinition, ServletConfig
servletConfig)
+ {
this.jetspeedConfig = servletConfig;
jetspeedContext = servletConfig.getServletContext();
this.portletDefinition = portletDefinition;
+ activated = true;
+ }
+
+
+ public ServletPortletInvoker()
+ {
}
/**
@@ -142,6 +163,9 @@
}
/**
+ * Creates a servlet request dispatcher to dispatch to another web application
to render the portlet.
+ * NOTE: this method requires that your container supports cross-context
dispatching.
+ * Cross-context dispatching is known to work on Tomcat, Catalina, Tomcat-5.
*
* @param portletRequest
* @param portletResponse
@@ -152,10 +176,10 @@
protected void invoke(PortletRequest portletRequest, PortletResponse
portletResponse, Integer methodID)
throws PortletException, IOException
{
- PortletApplicationDefinition app =
portletDefinition.getPortletApplicationDefinition();
- System.out.println("%%% invoker.pa = " + app);
+ MutablePortletApplication app =
(MutablePortletApplication)portletDefinition.getPortletApplicationDefinition();
String portletApplicationName =
app.getWebApplicationDefinition().getContextRoot();
+ System.out.println("%%% webapp invoker.pa = " + portletApplicationName);
// gather all required data from request and response
ServletRequest servletRequest =
((javax.servlet.http.HttpServletRequestWrapper) portletRequest).getRequest();
@@ -193,14 +217,13 @@
PortletContext portletContext =
PortletContextFactory.createPortletContext(appContext, app);
PortletConfig portletConfig = new
PortletConfigImpl(this.jetspeedConfig, portletContext, portletDefinition);
servletRequest.setAttribute(ContainerConstants.PORTLET_CONFIG,
portletConfig);
-
dispatcher.include(servletRequest, servletResponse);
}
catch (Exception e)
{
String message =
"Failed to dispatch.include for Portlet Application: " +
portletApplicationName + ", servlet: " + MVC_ENTRY_SERVLET;
- log.error(message, e);
+ log.error(message, e);
throw new PortletException(message, e);
}
finally
@@ -211,6 +234,7 @@
servletRequest.removeAttribute(ContainerConstants.PORTLET_CONFIG);
servletRequest.removeAttribute(ContainerConstants.PORTLET_ENTITY);
}
+
}
}
1.1
jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/container/invoker/JetspeedPortletInvoker.java
Index: JetspeedPortletInvoker.java
===================================================================
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000-2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Jetspeed" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Jetspeed", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.jetspeed.container.invoker;
import javax.servlet.ServletConfig;
import org.apache.pluto.invoker.PortletInvoker;
import org.apache.pluto.om.portlet.PortletDefinition;
/**
* JetspeedPortletInvoker extends Pluto's portlet invoker and extends it
* with lifecycle management. Portlet Invokers can be pooled, and activated
* and passivated per request cycle.
* TODO: I'd like to refactor activate and passivate, hopefully with a IOC service
framework
*
* @author <a href="mailto:[EMAIL PROTECTED]">David Sean Taylor</a>
* @version $Id: JetspeedPortletInvoker.java,v 1.1 2003/12/30 06:37:39 taylor Exp $
*/
public interface JetspeedPortletInvoker extends PortletInvoker
{
/**
* Activating an invoker makes it ready to invoke portlets.
* If an invoker's state is not activated, it can not invoke.
*
* @param portletDefinition The portlet's definition that is being invoked.
* @param servletConfig The servlet configuration of the portal.
*/
void activate(PortletDefinition portletDefinition, ServletConfig servletConfig);
/**
* Passivates an invoker, freeing it back to the invoker pool.
* If an invoker's state is passivated, it cannot be used to invoke portlets.
*/
void passivate();
/**
* Returns true if the state of this invoke is 'activated', and false if it is
'passivated'.
* @return True if the current state of the invoker is 'activated' otherwise
false.
*/
boolean isActivated();
}
1.1
jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/container/invoker/LocalPortletInvoker.java
Index: LocalPortletInvoker.java
===================================================================
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000-2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Jetspeed" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Jetspeed", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.jetspeed.container.invoker;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.HashMap;
import java.util.Map;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.Portlet;
import javax.portlet.PortletException;
import javax.portlet.PortletRequest;
import javax.portlet.PortletResponse;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jetspeed.container.ContainerConstants;
import org.apache.jetspeed.container.JetspeedPortletContext;
import org.apache.jetspeed.factory.JetspeedPortletFactory;
import org.apache.pluto.om.portlet.PortletApplicationDefinition;
import org.apache.pluto.om.portlet.PortletDefinition;
/**
* JetspeedPortletInvoker invokes local (internal) portlet applications.
* Local portlet applications are stored within the Jetspeed Portlet application.
* They are not separate web applications; but are stored under Jetspeed's
* WEB-INF/apps directory.
*
* @author <a href="mailto:[EMAIL PROTECTED]">David Sean Taylor</a>
* @version $Id: LocalPortletInvoker.java,v 1.1 2003/12/30 06:37:39 taylor Exp $
*/
public class LocalPortletInvoker implements JetspeedPortletInvoker
{
private final static Log log = LogFactory.getLog(LocalPortletInvoker.class);
protected ServletContext jetspeedContext;
protected ServletConfig jetspeedConfig;
protected PortletDefinition portletDefinition;
protected boolean activated = false;
/**
* One class loader per local portlet application
*/
protected static Map classLoaders = new HashMap();
public static final String LOCAL_CLASSES = "/WEB-INF/classes/";
public static final String LOCAL_JARS = "/WEB-INF/lib/";
/* (non-Javadoc)
* @see
org.apache.jetspeed.container.invoker.JetspeedPortletInvoker#activate(org.apache.pluto.om.portlet.PortletDefinition,
javax.servlet.ServletConfig)
*/
public void activate(PortletDefinition portletDefinition, ServletConfig
servletConfig)
{
System.out.println("%%% internal invoker.portletdef = " + portletDefinition);
this.jetspeedConfig = servletConfig;
jetspeedContext = servletConfig.getServletContext();
this.portletDefinition = portletDefinition;
activated = true;
}
/* (non-Javadoc)
* @see org.apache.jetspeed.container.invoker.JetspeedPortletInvoker#passivate()
*/
public void passivate()
{
activated = false;
}
/* (non-Javadoc)
* @see
org.apache.jetspeed.container.invoker.JetspeedPortletInvoker#isActivated()
*/
public boolean isActivated()
{
return activated;
}
public LocalPortletInvoker()
{
activated = false;
}
/* (non-Javadoc)
* @see
org.apache.pluto.invoker.PortletInvoker#action(javax.portlet.ActionRequest,
javax.portlet.ActionResponse)
*/
public void action(ActionRequest request, ActionResponse response)
throws PortletException, IOException
{
invoke(request, response, ContainerConstants.METHOD_ACTION);
}
/* (non-Javadoc)
* @see
org.apache.pluto.invoker.PortletInvoker#render(javax.portlet.RenderRequest,
javax.portlet.RenderResponse)
*/
public void render(RenderRequest request, RenderResponse response)
throws PortletException, IOException
{
invoke(request, response, ContainerConstants.METHOD_RENDER);
}
/* (non-Javadoc)
* @see
org.apache.pluto.invoker.PortletInvoker#load(javax.portlet.PortletRequest,
javax.portlet.RenderResponse)
*/
public void load(PortletRequest request, RenderResponse response)
throws PortletException
{
try
{
invoke(request, response, ContainerConstants.METHOD_NOOP);
}
catch (IOException e)
{
log.error("PortletInvokerImpl.load() - Error while dispatching
portlet.", e);
throw new PortletException(e);
}
}
static private final String PHONEY_PORTLET_WINDOW =
"<P>++++++++++++++++++++++++++++++++++</P>";
/**
* Invokes the specific request denoted by the <code>method</code> parameter on
a portlet.
* The portlet is invoked with a direct method call on the portlet. It is not
invoked in another web application.
* This requires manipulation of the current thread's classpath.
*
* @param portletRequest
* @param portletResponse
* @param methodID
* @throws PortletException
* @throws IOException
*/
protected void invoke(PortletRequest portletRequest, PortletResponse
portletResponse, Integer method)
throws PortletException, IOException
{
PortletApplicationDefinition app =
portletDefinition.getPortletApplicationDefinition();
ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
String portletApplicationName =
app.getWebApplicationDefinition().getContextRoot();
System.out.println("%%% local invoker.pa = " + portletApplicationName);
// gather all required data from request and response
ServletRequest servletRequest =
((javax.servlet.http.HttpServletRequestWrapper) portletRequest).getRequest();
ServletResponse servletResponse =
((javax.servlet.http.HttpServletResponseWrapper) portletResponse).getResponse();
ServletContext appContext =
jetspeedContext.getContext(portletApplicationName);
if (null == appContext)
{
String message = "Failed to find Servlet context for Portlet
Application: " + portletApplicationName;
log.error(message);
throw new PortletException();
}
Portlet portlet = null;
try
{
ClassLoader loader =
(ClassLoader)classLoaders.get(portletApplicationName);
if (null == loader)
{
StringBuffer localPath = new StringBuffer("file:");
localPath.append(jetspeedContext.getRealPath(JetspeedPortletContext.LOCAL_PA_ROOT));
localPath.append(portletApplicationName);
String localAppPath = localPath.toString();
URL[] urls = {new URL(localAppPath + LOCAL_CLASSES),
new URL(localAppPath + LOCAL_JARS)};
loader = new URLClassLoader(urls, oldLoader);
classLoaders.put(portletApplicationName, loader);
}
Thread.currentThread().setContextClassLoader(loader);
portlet = JetspeedPortletFactory.getPortlet(jetspeedConfig,
portletDefinition);
}
catch (Exception e)
{
e.printStackTrace();
return;
}
if (method == ContainerConstants.METHOD_NOOP)
{
return;
}
//res.getWriter().print("Rendering: Portlet Class = " +
entity.getPortletClass() + "<BR/>");
if (method == ContainerConstants.METHOD_ACTION)
{
ActionRequest actionRequest = (ActionRequest)portletRequest;
ActionResponse actionResponse = (ActionResponse)portletResponse;
portlet.processAction(actionRequest, actionResponse);
}
else if (method == ContainerConstants.METHOD_RENDER)
{
RenderRequest renderRequest = (RenderRequest)portletRequest;
RenderResponse renderResponse = (RenderResponse)portletResponse;
renderResponse.setContentType("text/html");
renderResponse.getWriter().print(PHONEY_PORTLET_WINDOW);
renderResponse.getWriter().print(portletDefinition.getName());
renderResponse.getWriter().print(PHONEY_PORTLET_WINDOW);
portlet.render(renderRequest, renderResponse);
renderResponse.getWriter().print(PHONEY_PORTLET_WINDOW);
}
Thread.currentThread().setContextClassLoader(oldLoader);
}
}
1.3 +2 -2
jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/om/portlet/impl/PortletApplicationDefinitionImpl.java
Index: PortletApplicationDefinitionImpl.java
===================================================================
RCS file:
/home/cvs/jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/om/portlet/impl/PortletApplicationDefinitionImpl.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- PortletApplicationDefinitionImpl.java 29 Dec 2003 02:12:52 -0000 1.2
+++ PortletApplicationDefinitionImpl.java 30 Dec 2003 06:37:39 -0000 1.3
@@ -99,7 +99,7 @@
private PortletDefinitionListImpl portlets;
- private int applicationType = MutablePortletApplication.PORTLET_APP;
+ private int applicationType = MutablePortletApplication.WEBAPP;
/** Creates a new instance of BaseApplication */
public PortletApplicationDefinitionImpl()
1.4 +14 -13
jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/services/information/StaticInformationProviderImpl.java
Index: StaticInformationProviderImpl.java
===================================================================
RCS file:
/home/cvs/jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/services/information/StaticInformationProviderImpl.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- StaticInformationProviderImpl.java 8 Oct 2003 04:36:39 -0000 1.3
+++ StaticInformationProviderImpl.java 30 Dec 2003 06:37:40 -0000 1.4
@@ -54,6 +54,7 @@
package org.apache.jetspeed.services.information;
import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
import org.apache.pluto.services.information.PortalContextProvider;
import org.apache.pluto.services.information.StaticInformationProvider;
@@ -100,21 +101,21 @@
* @see
org.apache.pluto.services.information.StaticInformationProvider#getPortalContextProvider()
* @return
*/
- public PortalContextProvider getPortalContextProvider()
- {
- javax.servlet.ServletContext context = config.getServletContext();
-
- PortalContextProvider provider =
- (PortalContextProvider)
context.getAttribute("org.apache.jetspeed.engine.core.PortalContextProvider");
+ public PortalContextProvider getPortalContextProvider()
+ {
+ ServletContext context = config.getServletContext();
- if (provider == null)
- {
- provider = new PortalContextProviderImpl();
-
context.setAttribute("org.apache.jetspeed.engine.core.PortalContextProvider",
provider);
- }
+ PortalContextProvider provider =
+ (PortalContextProvider)
context.getAttribute("org.apache.jetspeed.engine.core.PortalContextProvider");
- return provider;
+ if (provider == null)
+ {
+ provider = new PortalContextProviderImpl();
+
context.setAttribute("org.apache.jetspeed.engine.core.PortalContextProvider",
provider);
}
+
+ return provider;
+ }
/**
* <p>
1.8 +10 -2
jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/tools/pamanager/FileSystemPAM.java
Index: FileSystemPAM.java
===================================================================
RCS file:
/home/cvs/jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/tools/pamanager/FileSystemPAM.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- FileSystemPAM.java 9 Dec 2003 00:24:38 -0000 1.7
+++ FileSystemPAM.java 30 Dec 2003 06:37:40 -0000 1.8
@@ -61,6 +61,7 @@
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.jetspeed.Jetspeed;
import org.apache.jetspeed.services.registry.JetspeedPortletRegistry;
+import org.apache.jetspeed.container.JetspeedPortletContext;
import org.apache.jetspeed.exception.RegistryException;
import org.apache.jetspeed.om.common.portlet.MutablePortletApplication;
@@ -129,7 +130,14 @@
rollback(nState, webAppsDir, paName, app);
return;
}
-
+ if (webAppsDir.startsWith(JetspeedPortletContext.LOCAL_PA_ROOT))
+ {
+ app.setApplicationType(MutablePortletApplication.LOCAL);
+ }
+ else
+ {
+ app.setApplicationType(MutablePortletApplication.WEBAPP);
+ }
// create the web application
MutableWebApplication webapp = new WebApplicationDefinitionImpl();
if (paName.startsWith("/"))
1.2 +64 -53
jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/tools/pamanager/PortletApplicationManager.java
Index: PortletApplicationManager.java
===================================================================
RCS file:
/home/cvs/jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/tools/pamanager/PortletApplicationManager.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- PortletApplicationManager.java 28 Jul 2003 23:47:53 -0000 1.1
+++ PortletApplicationManager.java 30 Dec 2003 06:37:40 -0000 1.2
@@ -87,6 +87,8 @@
* -Daction={deploy|undeploy|start|stop|reload}
* -DPortletAppName= Name of the Portlet application
* -DApplicationServer={Catalina}
+ * -DApplicationType={webapp|local}
+ * (default webapp)
*
*Notes: The deploy action requires the WarFileName. If no ApplicationServer
* is defined it requires in additionthe WebappDir.
@@ -108,6 +110,7 @@
String strPortletAppName = "";
String strAppServer = "";
String strPortalName = "jetspeed";
+ String applicationType = "webapp";
while (i < args.length && args[i].startsWith("-"))
{
@@ -119,49 +122,48 @@
if (i < args.length)
strPortletAppName = args[i++];
}
- else
- if (arg.equalsIgnoreCase("-Action"))
+ else if (arg.equalsIgnoreCase("-Action"))
+ {
+ if (i < args.length)
+ strAction = args[i++];
+ }
+ else if (arg.equalsIgnoreCase("-WebAppDir"))
+ {
+ if (i < args.length)
+ strWebAppDir = args[i++];
+ }
+ else if (arg.equalsIgnoreCase("-WarFileName"))
+ {
+ if (i < args.length)
+ strWarFileName = args[i++];
+ }
+ else if (arg.equalsIgnoreCase("-ApplicationServer"))
+ {
+ if (i < args.length)
+ strAppServer = args[i++];
+ }
+ else if (arg.equalsIgnoreCase("-PortalName"))
+ {
+ if (i < args.length)
+ strPortalName = args[i++];
+ }
+ else if (arg.equalsIgnoreCase("-ApplicationType"))
+ {
+ if (i < args.length)
{
- if (i < args.length)
- strAction = args[i++];
- }
- else
- if (arg.equalsIgnoreCase("-WebAppDir"))
- {
- if (i < args.length)
- strWebAppDir = args[i++];
- }
- else
- if (arg.equalsIgnoreCase("-WarFileName"))
- {
- if (i < args.length)
- strWarFileName = args[i++];
- }
- else
- if (arg.equalsIgnoreCase("-ApplicationServer"))
- {
- if (i < args.length)
- strAppServer = args[i++];
- }
- else
- if (arg.equalsIgnoreCase("-PortalName"))
- {
- if (i < args.length)
- strPortalName = args[i++];
- }
- else
- if (arg.equalsIgnoreCase("-h"))
- {
- helpScreen();
- return;
- }
- else
- if (arg.equalsIgnoreCase("-?"))
- {
- helpScreen();
- return;
- }
-
+ applicationType = args[i++];
+ }
+ }
+ else if (arg.equalsIgnoreCase("-h"))
+ {
+ helpScreen();
+ return;
+ }
+ else if (arg.equalsIgnoreCase("-?"))
+ {
+ helpScreen();
+ return;
+ }
}
// Portlet Application Name and action are required by all functions.
@@ -175,9 +177,10 @@
return;
}
+ String strAppRoot = strWebAppDir + strPortalName;
+
try
{
- String strAppRoot = strWebAppDir + "/" + strPortalName;
// Start the registry service -- it's needed by many actions
Configuration properties =
(Configuration) new PropertiesConfiguration(strAppRoot +
"/WEB-INF/conf/jetspeed.properties");
@@ -209,17 +212,24 @@
{
if (strAppServer.length() == 0)
{
- // Requires WebAppDir
- if (strWebAppDir.length() == 0)
+ if (applicationType.equals("local"))
{
- System.out.println(
- "\nDeploy action requires the definition of the
ApplicationServer or the Web application directory.");
- return;
+ String portletAppRoot = strAppRoot + "/WEB-INF/apps/";
+ deploy(portletAppRoot, strWarFileName, strPortletAppName);
+ }
+ else
+ {
+ // Requires WebAppDir
+ if (strWebAppDir.length() == 0)
+ {
+ System.out.println(
+ "\nDeploy action requires the definition of the
ApplicationServer or the Web application directory.");
+ return;
+ }
+
+ // File deploy uses Directory and warfile
+ deploy(strWebAppDir, strWarFileName, strPortletAppName);
}
-
- // File deploy uses Directory and warfile
- deploy(strWebAppDir, strWarFileName, strPortletAppName);
-
}
else
{
@@ -280,6 +290,7 @@
System.out.println("\t-WebAppDir\t\t{Path to target WebApp directory}\n");
System.out.println("\t-WarFileName\t\t{Path to war file to deploy}\n");
System.out.println("\t-ApplicationServer\t{Application server}\n");
+ System.out.println("\t-ApplicationType\t{webapp|local}\n");
System.out.println("\nNotes:");
System.out.println("-Each command requires at least the action and the
PortletAppName options.");
1.1 jakarta-jetspeed-2/portal/src/webapp/WEB-INF/apps/README.txt
Index: README.txt
===================================================================
The apps directory holds Portlet Applications stored locally inside Jetspeed.
This is an alternative to storing Portlet Applications in another web application,
which requires a cross-context servlet invoker (as of Servlet spec 2.3). Some
application servers do not support cross-context Servlet invokers, such as Weblogic
8.1 and prior versions. If your application server doesn't support cross-context,
recommend deploying your portlet applications here. See the Portlet Application
Manager documentation for details on how to deploy portlet applications internally.
1.16 +3 -4
jakarta-jetspeed-2/portal/src/webapp/WEB-INF/conf/jetspeed.properties
Index: jetspeed.properties
===================================================================
RCS file:
/home/cvs/jakarta-jetspeed-2/portal/src/webapp/WEB-INF/conf/jetspeed.properties,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- jetspeed.properties 22 Dec 2003 02:18:23 -0000 1.15
+++ jetspeed.properties 30 Dec 2003 06:37:40 -0000 1.16
@@ -69,7 +69,8 @@
factory.container.request = org.apache.jetspeed.container.ContainerRequest
# invokers
-factory.invoker.servlet =
org.apache.jetspeed.container.invoker.JetspeedServletPortletInvoker
+factory.invoker.servlet =
org.apache.jetspeed.container.invoker.ServletPortletInvoker
+factory.invoker.local = org.apache.jetspeed.container.invoker.LocalPortletInvoker
## Pluto Factory
plutofactory.javax.portlet.ActionRequest =
org.apache.pluto.factory.impl.ActionRequestFactoryImpl
@@ -89,8 +90,6 @@
plutofactory.org.apache.pluto.invoker.PortletInvoker =
org.apache.jetspeed.container.invoker.PortletInvokerFactoryImpl
plutofactory.org.apache.pluto.util.NamespaceMapper =
org.apache.pluto.util.impl.NamespaceMapperFactoryImpl
-
-
plutofactory.org.apache.pluto.services.information.StaticInformationProvider =
org.apache.jetspeed.services.information.InformationProviderServiceImpl
plutofactory.org.apache.pluto.services.information.DynamicInformationProvider =
org.apache.jetspeed.services.information.InformationProviderServiceImpl
1.3 +8 -4
jakarta-jetspeed-2/portal/src/webapp/WEB-INF/pages/default-page.psml
Index: default-page.psml
===================================================================
RCS file:
/home/cvs/jakarta-jetspeed-2/portal/src/webapp/WEB-INF/pages/default-page.psml,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- default-page.psml 6 Dec 2003 02:06:11 -0000 1.2
+++ default-page.psml 30 Dec 2003 06:37:40 -0000 1.3
@@ -7,21 +7,25 @@
/>
<title>My First PSML Page</title>
<fragment id="f001" type="layout" name="Layout">
- <fragment id="pe001" type="portlet" name="HelloPortlet">
+ <fragment id="pe000" type="portlet" name="PortletApplicationBrowser">
<property layout="TwoColumns" name="row" value="0" />
<property layout="TwoColumns" name="column" value="0" />
</fragment>
- <fragment id="pe002" type="portlet" name="JMXPortlet">
+ <fragment id="pe001" type="portlet" name="HelloPortlet">
<property layout="TwoColumns" name="row" value="0" />
<property layout="TwoColumns" name="column" value="1" />
</fragment>
- <fragment id="pe003" type="portlet" name="CustomerList">
+ <fragment id="pe002" type="portlet" name="JMXPortlet">
<property layout="TwoColumns" name="row" value="1" />
<property layout="TwoColumns" name="column" value="0" />
</fragment>
- <fragment id="pe004" type="portlet" name="CustomerInfo">
+ <fragment id="pe003" type="portlet" name="CustomerList">
<property layout="TwoColumns" name="row" value="1" />
<property layout="TwoColumns" name="column" value="1" />
+ </fragment>
+ <fragment id="pe004" type="portlet" name="CustomerInfo">
+ <property layout="TwoColumns" name="row" value="1" />
+ <property layout="TwoColumns" name="column" value="2" />
</fragment>
</fragment>
</page>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]