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]

Reply via email to