You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by at...@apache.org on 2005/11/08 02:09:11 UTC
svn commit: r331657 - in /portals/jetspeed-2/trunk:
commons/src/java/org/apache/jetspeed/container/
components/portal/src/java/org/apache/jetspeed/container/invoker/
components/portlet-factory/src/java/org/apache/jetspeed/factory/
Author: ate
Date: Mon Nov 7 17:08:54 2005
New Revision: 331657
URL: http://svn.apache.org/viewcvs?rev=331657&view=rev
Log:
Corrections for portlet UnavailableException handling
Modified:
portals/jetspeed-2/trunk/commons/src/java/org/apache/jetspeed/container/ContainerConstants.java
portals/jetspeed-2/trunk/commons/src/java/org/apache/jetspeed/container/JetspeedContainerServlet.java
portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/container/invoker/LocalPortletInvoker.java
portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/container/invoker/ServletPortletInvoker.java
portals/jetspeed-2/trunk/components/portlet-factory/src/java/org/apache/jetspeed/factory/JetspeedPortletFactory.java
portals/jetspeed-2/trunk/components/portlet-factory/src/java/org/apache/jetspeed/factory/JetspeedPortletInstance.java
Modified: portals/jetspeed-2/trunk/commons/src/java/org/apache/jetspeed/container/ContainerConstants.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/commons/src/java/org/apache/jetspeed/container/ContainerConstants.java?rev=331657&r1=331656&r2=331657&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/commons/src/java/org/apache/jetspeed/container/ContainerConstants.java (original)
+++ portals/jetspeed-2/trunk/commons/src/java/org/apache/jetspeed/container/ContainerConstants.java Mon Nov 7 17:08:54 2005
@@ -30,6 +30,7 @@
public final static String PORTAL_CONTEXT = "org.apache.jetspeed.context";
public final static String METHOD_ID = "org.apache.jetspeed.method";
public final static String PORTLET = "org.apache.jetspeed.portlet";
+ public final static String PORTLET_NAME = "org.apache.jetspeed.portlet.name";
public final static Integer METHOD_RENDER = new Integer(1);
public final static Integer METHOD_ACTION = new Integer(3);
public final static Integer METHOD_NOOP = new Integer(5);
Modified: portals/jetspeed-2/trunk/commons/src/java/org/apache/jetspeed/container/JetspeedContainerServlet.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/commons/src/java/org/apache/jetspeed/container/JetspeedContainerServlet.java?rev=331657&r1=331656&r2=331657&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/commons/src/java/org/apache/jetspeed/container/JetspeedContainerServlet.java (original)
+++ portals/jetspeed-2/trunk/commons/src/java/org/apache/jetspeed/container/JetspeedContainerServlet.java Mon Nov 7 17:08:54 2005
@@ -28,6 +28,7 @@
import javax.portlet.Portlet;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
+import javax.portlet.UnavailableException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
@@ -195,6 +196,9 @@
{
String portletName = null;
Integer method = ContainerConstants.METHOD_NOOP;
+ Portlet portlet = null;
+ boolean destroyPortlet = false;
+
try
{
method = (Integer) request.getAttribute(ContainerConstants.METHOD_ID);
@@ -203,7 +207,8 @@
return;
}
- Portlet portlet = (Portlet)request.getAttribute(ContainerConstants.PORTLET);
+ portlet = (Portlet)request.getAttribute(ContainerConstants.PORTLET);
+ portletName = (String)request.getAttribute(ContainerConstants.PORTLET_NAME);
request.removeAttribute(ContainerConstants.PORTLET);
if (method == ContainerConstants.METHOD_ACTION)
@@ -230,6 +235,12 @@
}
catch (Throwable t)
{
+ if ( t instanceof UnavailableException )
+ {
+ // destroy the portlet in the finally clause
+ destroyPortlet = true;
+ }
+
if (method != ContainerConstants.METHOD_ACTION)
{
ServletContext context = getServletContext();
@@ -281,6 +292,21 @@
else
{
throw new ServletException(t);
+ }
+ }
+ }
+ finally
+ {
+ if ( destroyPortlet )
+ {
+ // portlet throwed UnavailableException: take it out of service
+ try
+ {
+ portlet.destroy();
+ }
+ catch (Exception e)
+ {
+ // never mind, it won't be used anymore.
}
}
}
Modified: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/container/invoker/LocalPortletInvoker.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/container/invoker/LocalPortletInvoker.java?rev=331657&r1=331656&r2=331657&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/container/invoker/LocalPortletInvoker.java (original)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/container/invoker/LocalPortletInvoker.java Mon Nov 7 17:08:54 2005
@@ -24,6 +24,7 @@
import javax.portlet.PortletResponse;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
+import javax.portlet.UnavailableException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
@@ -145,10 +146,12 @@
* @throws IOException
*/
protected void invoke(PortletRequest portletRequest, PortletResponse portletResponse, Integer method)
- throws PortletException, IOException
+ throws PortletException, IOException
{
- ClassLoader paClassLoader = portletFactory.getPortletApplicationClassLoader((PortletApplication)portletDefinition.getPortletApplicationDefinition());
- PortletInstance portletInstance = portletFactory.getPortletInstance(jetspeedContext,portletDefinition);
+ ClassLoader paClassLoader = portletFactory
+ .getPortletApplicationClassLoader((PortletApplication) portletDefinition
+ .getPortletApplicationDefinition());
+ PortletInstance portletInstance = portletFactory.getPortletInstance(jetspeedContext, portletDefinition);
if (method == ContainerConstants.METHOD_NOOP)
{
@@ -158,36 +161,67 @@
// gather all required data from request and response
ServletRequest servletRequest = ((javax.servlet.http.HttpServletRequestWrapper) portletRequest).getRequest();
- ServletResponse servletResponse = ((javax.servlet.http.HttpServletResponseWrapper) portletResponse).getResponse();
+ ServletResponse servletResponse = ((javax.servlet.http.HttpServletResponseWrapper) portletResponse)
+ .getResponse();
- ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
+ ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
try
{
servletRequest.setAttribute(ContainerConstants.PORTLET_CONFIG, portletInstance.getConfig());
servletRequest.setAttribute(ContainerConstants.PORTLET_REQUEST, portletRequest);
servletRequest.setAttribute(ContainerConstants.PORTLET_RESPONSE, portletResponse);
- RequestContext requestContext = (RequestContext)servletRequest.getAttribute(PortalReservedParameters.REQUEST_CONTEXT_ATTRIBUTE);
- servletRequest.setAttribute(ContainerConstants.PORTAL_CONTEXT, requestContext.getRequest().getContextPath());
+ RequestContext requestContext = (RequestContext) servletRequest
+ .getAttribute(PortalReservedParameters.REQUEST_CONTEXT_ATTRIBUTE);
+ servletRequest
+ .setAttribute(ContainerConstants.PORTAL_CONTEXT, requestContext.getRequest().getContextPath());
Thread.currentThread().setContextClassLoader(paClassLoader);
- if (method == ContainerConstants.METHOD_ACTION)
- {
- ActionRequest actionRequest = (ActionRequest)portletRequest;
- ActionResponse actionResponse = (ActionResponse)portletResponse;
+ if (method == ContainerConstants.METHOD_ACTION)
+ {
+ ActionRequest actionRequest = (ActionRequest) portletRequest;
+ ActionResponse actionResponse = (ActionResponse) portletResponse;
portletInstance.processAction(actionRequest, actionResponse);
- }
- else if (method == ContainerConstants.METHOD_RENDER)
- {
- RenderRequest renderRequest = (RenderRequest)portletRequest;
- RenderResponse renderResponse = (RenderResponse)portletResponse;
-
- renderResponse.setContentType("text/html");
-// TODO: ??? renderResponse.getWriter().print(portletDefinition.getName());
+ }
+ else if (method == ContainerConstants.METHOD_RENDER)
+ {
+ RenderRequest renderRequest = (RenderRequest) portletRequest;
+ RenderResponse renderResponse = (RenderResponse) portletResponse;
+
+ renderResponse.setContentType("text/html");
+ // TODO: ???
+ // renderResponse.getWriter().print(portletDefinition.getName());
portletInstance.render(renderRequest, renderResponse);
+ }
}
+ catch (Throwable t)
+ {
+ if ( t instanceof UnavailableException )
+ {
+ // take it out of service
+ try
+ {
+ portletInstance.destroy();
+ }
+ catch (Throwable ignore)
+ {
+ // never mind, it won't be used anymore
+ }
+ }
+ if ( t instanceof PortletException )
+ {
+ throw (PortletException)t;
+ }
+ if ( t instanceof IOException )
+ {
+ throw (IOException)t;
+ }
+ else
+ {
+ throw new PortletException(t);
+ }
}
finally
{
@@ -196,7 +230,7 @@
servletRequest.removeAttribute(ContainerConstants.PORTLET_RESPONSE);
servletRequest.removeAttribute(ContainerConstants.PORTAL_CONTEXT);
- Thread.currentThread().setContextClassLoader(oldLoader);
+ Thread.currentThread().setContextClassLoader(oldLoader);
}
}
Modified: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/container/invoker/ServletPortletInvoker.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/container/invoker/ServletPortletInvoker.java?rev=331657&r1=331656&r2=331657&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/container/invoker/ServletPortletInvoker.java (original)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/container/invoker/ServletPortletInvoker.java Mon Nov 7 17:08:54 2005
@@ -206,6 +206,7 @@
servletRequest.setAttribute(ContainerConstants.PORTLET_REQUEST, portletRequest);
servletRequest.setAttribute(ContainerConstants.PORTLET_RESPONSE, portletResponse);
servletRequest.setAttribute(ContainerConstants.METHOD_ID, methodID);
+ servletRequest.setAttribute(ContainerConstants.PORTLET_NAME, app.getName()+"::"+portletDefinition.getName());
RequestContext requestContext = (RequestContext)servletRequest.getAttribute(PortalReservedParameters.REQUEST_CONTEXT_ATTRIBUTE);
servletRequest.setAttribute(ContainerConstants.PORTAL_CONTEXT, requestContext.getRequest().getContextPath());
@@ -226,6 +227,7 @@
servletRequest.removeAttribute(ContainerConstants.PORTLET_REQUEST);
servletRequest.removeAttribute(ContainerConstants.PORTLET_RESPONSE);
servletRequest.removeAttribute(ContainerConstants.METHOD_ID);
+ servletRequest.removeAttribute(ContainerConstants.PORTLET_NAME);
servletRequest.removeAttribute(ContainerConstants.PORTAL_CONTEXT);
}
Modified: portals/jetspeed-2/trunk/components/portlet-factory/src/java/org/apache/jetspeed/factory/JetspeedPortletFactory.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/components/portlet-factory/src/java/org/apache/jetspeed/factory/JetspeedPortletFactory.java?rev=331657&r1=331656&r2=331657&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/components/portlet-factory/src/java/org/apache/jetspeed/factory/JetspeedPortletFactory.java (original)
+++ portals/jetspeed-2/trunk/components/portlet-factory/src/java/org/apache/jetspeed/factory/JetspeedPortletFactory.java Mon Nov 7 17:08:54 2005
@@ -66,36 +66,36 @@
classLoaderMap.put(pa.getId().toString(), cl);
}
}
-
+
public void unregisterPortletApplication(PortletApplication pa)
{
- synchronized (classLoaderMap)
- {
- synchronized (portletCache)
- {
- ClassLoader cl = (ClassLoader)classLoaderMap.remove(pa.getId().toString());
- if ( cl != null )
+ synchronized (classLoaderMap)
{
- ClassLoader currentContextClassLoader = Thread.currentThread().getContextClassLoader();
-
- Iterator portletDefinitions = pa.getPortletDefinitions().iterator();
- while (portletDefinitions.hasNext())
- {
- PortletDefinition pd = (PortletDefinition)portletDefinitions.next();
- Portlet portlet = (Portlet)portletCache.remove(pd.getId().toString());
- if ( portlet != null )
+ synchronized (portletCache)
+ {
+ ClassLoader cl = (ClassLoader) classLoaderMap.remove(pa.getId().toString());
+ if (cl != null)
{
- try
- {
- Thread.currentThread().setContextClassLoader(cl);
- portlet.destroy();
- }
- finally
+ ClassLoader currentContextClassLoader = Thread.currentThread().getContextClassLoader();
+
+ Iterator portletDefinitions = pa.getPortletDefinitions().iterator();
+ while (portletDefinitions.hasNext())
+ {
+ PortletDefinition pd = (PortletDefinition) portletDefinitions.next();
+ Portlet portlet = (Portlet) portletCache.remove(pd.getId().toString());
+ if (portlet != null)
{
- Thread.currentThread().setContextClassLoader(currentContextClassLoader);
+ try
+ {
+ Thread.currentThread().setContextClassLoader(cl);
+ portlet.destroy();
+ }
+ finally
+ {
+ Thread.currentThread().setContextClassLoader(currentContextClassLoader);
+ }
}
}
- }
}
}
}
@@ -141,7 +141,7 @@
// wrap new Portlet inside PortletInstance which ensures the destroy
// method will wait for all its invocation threads to complete
// and thereby releasing all its ClassLoader locks as needed for local portlets.
- portlet = new JetspeedPortletInstance((Portlet)clazz.newInstance());
+ portlet = new JetspeedPortletInstance(pd.getName(), (Portlet)clazz.newInstance());
}
finally
{
Modified: portals/jetspeed-2/trunk/components/portlet-factory/src/java/org/apache/jetspeed/factory/JetspeedPortletInstance.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/components/portlet-factory/src/java/org/apache/jetspeed/factory/JetspeedPortletInstance.java?rev=331657&r1=331656&r2=331657&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/components/portlet-factory/src/java/org/apache/jetspeed/factory/JetspeedPortletInstance.java (original)
+++ portals/jetspeed-2/trunk/components/portlet-factory/src/java/org/apache/jetspeed/factory/JetspeedPortletInstance.java Mon Nov 7 17:08:54 2005
@@ -40,17 +40,19 @@
private Portlet portlet;
private PortletConfig config;
private boolean destroyed;
+ private final String portletName;
- public JetspeedPortletInstance(Portlet portlet)
+ public JetspeedPortletInstance(String portletName, Portlet portlet)
{
- this.portlet = portlet;
+ this.portletName = portletName;
+ this.portlet = portlet;
}
private void checkAvailable() throws UnavailableException
{
if ( destroyed )
{
- throw new UnavailableException("Portlet "+portlet.getClass().getName()+" no longer available");
+ throw new UnavailableException("Portlet "+portletName+" no longer available");
}
}
@@ -58,9 +60,13 @@
{
if (!destroyed)
{
- destroyed = true;
+ destroyed = true;
+ if ( config != null )
+ {
+ // Portlet really has been put into service, now destroy it.
+ portlet.destroy();
+ }
}
- portlet.destroy();
}
public boolean equals(Object obj)
---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org