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 we...@apache.org on 2005/06/13 20:08:36 UTC

svn commit: r190466 - /portals/jetspeed-2/trunk/portal/src/java/org/apache/jetspeed/tools/pamanager/PortletApplicationManager.java

Author: weaver
Date: Mon Jun 13 11:08:35 2005
New Revision: 190466

URL: http://svn.apache.org/viewcvs?rev=190466&view=rev
Log:
Better error reporting

Added:
    portals/jetspeed-2/trunk/portal/src/java/org/apache/jetspeed/tools/pamanager/PortletApplicationManager.java

Added: portals/jetspeed-2/trunk/portal/src/java/org/apache/jetspeed/tools/pamanager/PortletApplicationManager.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/portal/src/java/org/apache/jetspeed/tools/pamanager/PortletApplicationManager.java?rev=190466&view=auto
==============================================================================
--- portals/jetspeed-2/trunk/portal/src/java/org/apache/jetspeed/tools/pamanager/PortletApplicationManager.java (added)
+++ portals/jetspeed-2/trunk/portal/src/java/org/apache/jetspeed/tools/pamanager/PortletApplicationManager.java Mon Jun 13 11:08:35 2005
@@ -0,0 +1,441 @@
+/*
+ * Copyright 2000-2004 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jetspeed.tools.pamanager;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.jetspeed.components.portletentity.PortletEntityAccessComponent;
+import org.apache.jetspeed.components.portletentity.PortletEntityNotDeletedException;
+import org.apache.jetspeed.components.portletregistry.PortletRegistry;
+import org.apache.jetspeed.components.portletregistry.RegistryException;
+import org.apache.jetspeed.container.window.PortletWindowAccessor;
+import org.apache.jetspeed.factory.PortletFactory;
+import org.apache.jetspeed.om.common.portlet.MutablePortletApplication;
+import org.apache.jetspeed.om.common.servlet.MutableWebApplication;
+import org.apache.jetspeed.search.SearchEngine;
+import org.apache.jetspeed.security.RoleManager;
+import org.apache.jetspeed.util.FileSystemHelper;
+import org.apache.jetspeed.util.descriptor.PortletApplicationWar;
+
+import org.apache.pluto.om.common.SecurityRole;
+import org.apache.pluto.om.entity.PortletEntity;
+import org.apache.pluto.om.entity.PortletEntityCtrl;
+import org.apache.pluto.om.portlet.PortletDefinition;
+
+import java.io.IOException;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+/**
+ * PortletApplicationManager
+ *
+ * @author <a href="mailto:ate@douma.nu">Ate Douma</a>
+ * @version $Id: PortletApplicationManager.java,v 1.21 2005/04/09 00:24:44 shinsuke Exp $
+ */
+public class PortletApplicationManager implements PortletApplicationManagement
+{
+    private static final Log    log = LogFactory.getLog("deployment");
+    private static final String PORTLET_XML = "WEB-INF/portlet.xml";
+
+    protected PortletEntityAccessComponent entityAccess;
+    protected PortletFactory        portletFactory;
+    protected PortletRegistry       registry;
+    protected PortletWindowAccessor windowAccess;
+    protected SearchEngine          searchEngine;
+    protected RoleManager           roleManager;
+    protected boolean               autoCreateRoles;
+
+    /**
+	 * Creates a new PortletApplicationManager object.
+	 */
+	public PortletApplicationManager(PortletFactory portletFactory, PortletRegistry registry,
+		PortletEntityAccessComponent entityAccess, PortletWindowAccessor windowAccess)
+	{
+		this.portletFactory     = portletFactory;
+		this.registry		    = registry;
+		this.entityAccess	    = entityAccess;
+		this.windowAccess	    = windowAccess;
+	}
+    
+    public void setRoleManager(RoleManager roleManager)
+    {
+        this.roleManager = roleManager;
+    }
+    
+    public void setAutoCreateRoles(boolean autoCreateRoles)
+    {
+        this.autoCreateRoles = autoCreateRoles;
+    }
+
+	public void setSearchEngine(SearchEngine searchEngine)
+	{
+		this.searchEngine = searchEngine;
+	}
+
+	public void startLocalPortletApplication(String contextName, FileSystemHelper warStruct,
+		ClassLoader paClassLoader)
+		throws RegistryException
+	{
+        checkValidContextName(contextName, true);
+        startPA(contextName, warStruct, paClassLoader, true);
+	}
+
+	public void startPortletApplication(String contextName, FileSystemHelper warStruct,
+		ClassLoader paClassLoader)
+		throws RegistryException
+	{
+        ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+        Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+        try
+        {
+            checkValidContextName(contextName, false);
+            startPA(contextName, warStruct, paClassLoader, false);
+        }
+        finally
+        {
+            Thread.currentThread().setContextClassLoader(contextClassLoader);
+        }
+	}
+
+	public void stopLocalPortletApplication(String contextName)
+		throws RegistryException
+	{
+		checkValidContextName(contextName, true);
+		stopPA(contextName);
+	}
+
+	public void stopPortletApplication(String contextName)
+		throws RegistryException
+	{
+        ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+        Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+        try
+        {
+            checkValidContextName(contextName, false);
+            stopPA(contextName);
+        }
+        finally
+        {
+            Thread.currentThread().setContextClassLoader(contextClassLoader);
+        }
+	}
+
+	public void unregisterPortletApplication(String paName)
+		throws RegistryException
+	{
+        ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+        Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+        try
+        {
+            MutablePortletApplication pa = null;
+            
+            try
+            {
+                pa = (MutablePortletApplication) registry.getPortletApplication(paName);
+            }
+            catch (Exception e)
+            {
+                // ignore errors during portal shutdown
+            }
+
+            if (pa != null)
+            {
+                if (portletFactory.getPortletApplicationClassLoader(pa) != null)
+                {
+                    throw new RegistryException("Portlet Application " + paName + " still running");
+                }
+
+                unregisterPortletApplication(pa, true);
+            }
+        }
+        finally
+        {
+            Thread.currentThread().setContextClassLoader(contextClassLoader);
+        }
+	}
+
+	protected void checkValidContextName(String contextName, boolean local)
+		throws RegistryException
+	{
+		int prefixLength = LOCAL_PA_PREFIX.length();
+
+		if ((contextName.length() >= prefixLength)
+			&& contextName.substring(0, prefixLength).equalsIgnoreCase(LOCAL_PA_PREFIX))
+		{
+			if (!local)
+			{
+				throw new RegistryException("Prefix \"" + LOCAL_PA_PREFIX
+					+ "\" is reserved for Local Portlet Applications only.");
+			}
+		}
+		else if (local)
+		{
+			throw new RegistryException("Prefix \"" + LOCAL_PA_PREFIX
+				+ "\" is required for Local Portlet Applications.");
+		}
+	}
+
+	protected MutablePortletApplication registerPortletApplication(PortletApplicationWar paWar,
+		MutablePortletApplication oldPA, boolean local, ClassLoader paClassLoader)
+		throws RegistryException
+	{
+		if (oldPA != null)
+		{
+			unregisterPortletApplication(oldPA, false);
+			oldPA = null;
+		}
+
+		MutablePortletApplication pa		 = null;
+		boolean					  registered = false;
+		String					  paName     = paWar.getPortletApplicationName();
+
+		try
+		{
+			log.info("Loading portlet.xml...." + paName);
+			pa = paWar.createPortletApp(paClassLoader);
+
+			if (local)
+			{
+				pa.setApplicationType(MutablePortletApplication.LOCAL);
+			}
+			else
+			{
+				pa.setApplicationType(MutablePortletApplication.WEBAPP);
+			}
+
+			// load the web.xml
+			log.info("Loading web.xml...." + paName);
+			MutableWebApplication wa = paWar.createWebApp();
+			paWar.validate();
+
+			if (local)
+			{
+				wa.setContextRoot("<portal>");
+			}
+
+			pa.setWebApplicationDefinition(wa);
+            
+            // Make sure existing entities are refreshed with the most
+            // recent PortletDefintion.
+            Collection portletDefs = pa.getPortletDefinitions();
+            if(portletDefs != null && portletDefs.size() > 0)
+            {
+                Iterator pdItr = portletDefs.iterator();
+                while(pdItr.hasNext())
+                {
+                    PortletDefinition pd = (PortletDefinition) pdItr.next();
+                    Collection portletEntites = entityAccess.getPortletEntities(pd);
+                    if(portletEntites != null && portletEntites.size() > 0)
+                    {
+                        Iterator peItr = portletEntites.iterator();
+                        while(peItr.hasNext())
+                        {
+                            PortletEntityCtrl portletEntity = (PortletEntityCtrl) peItr.next();
+                            portletEntity.setPortletDefinition(pd);
+                        }
+                    }
+                }
+            }
+		}
+		catch (Exception e)
+		{
+			String msg = "Failed to load portlet application for "
+				+ paWar.getPortletApplicationName();
+			log.error(msg);
+			throw new RegistryException(msg);
+		}
+
+		// register the portlet application
+		try
+		{
+			registry.registerPortletApplication(pa);
+			registered = true;
+			log.info("Registered the portlet application " + paName);
+
+			// add to search engine result
+			if (searchEngine != null)
+			{
+				searchEngine.add(pa);
+				searchEngine.add(pa.getPortletDefinitions());
+				log.info("Registered the portlet application in the search engine... " + paName);
+			}
+            
+            if ( autoCreateRoles && roleManager != null && pa.getWebApplicationDefinition().getSecurityRoles() != null )
+            {
+                try
+                {
+                    Iterator rolesIter = pa.getWebApplicationDefinition().getSecurityRoles().iterator();
+                    SecurityRole sr;
+                    while ( rolesIter.hasNext() )
+                    {
+                        sr = (SecurityRole)rolesIter.next();
+                        if ( !roleManager.roleExists(sr.getRoleName()) )
+                        {
+                            roleManager.addRole(sr.getRoleName());
+                            log.info("AutoCreated role: "+sr.getRoleName()+" from portlet application "+paName+" its web definition");
+                        }
+                    }
+                }
+                catch (SecurityException sex)
+                {
+                    log.warn("Failed to autoCreate roles for portlet application " + paName+": "+sex.getMessage(), sex);
+                }
+            }
+
+			return pa;
+		}
+		catch (Exception e)
+		{
+			String msg = "Failed to register portlet application, " + paName;
+			log.error(msg, e);
+
+			if (registered)
+			{
+				try
+				{
+					unregisterPortletApplication(pa, local);
+				}
+				catch (Exception re)
+				{
+					log.error("Failed to rollback registration of portlet application" + paName, re);
+				}
+			}
+
+			throw new RegistryException(msg, e);
+		}
+	}
+
+	protected void startPA(String contextName, FileSystemHelper warStruct,
+		ClassLoader paClassLoader, boolean local)
+		throws RegistryException
+	{
+		PortletApplicationWar paWar = null;
+
+		try
+		{
+			try
+			{
+				paWar = new PortletApplicationWar(warStruct, contextName, "/" + contextName);
+
+				if (paClassLoader == null)
+				{
+					paClassLoader = paWar.createClassloader(getClass().getClassLoader());
+				}
+			}
+			catch (IOException e)
+			{
+				String msg = "Failed to create PA WAR for " + contextName;
+				log.error(msg, e);
+				throw new RegistryException(msg, e);
+			}
+
+			MutablePortletApplication pa = (MutablePortletApplication) registry
+				.getPortletApplication(contextName);
+
+			if ((pa != null) && (paWar.getPortletApplicationChecksum() == pa.getChecksum()))
+			{
+                portletFactory.unregisterPortletApplication(pa);
+			}
+			else
+			{
+				pa = registerPortletApplication(paWar, pa, local, paClassLoader);
+			}
+            portletFactory.registerPortletApplication(pa, paClassLoader);
+		}
+		finally
+		{
+			if (paWar != null)
+			{
+				try
+				{
+					paWar.close();
+				}
+				catch (IOException e)
+				{
+					log.error("Failed to close PA WAR for " + contextName, e);
+				}
+			}
+		}
+	}
+
+	protected void stopPA(String contextName)
+		throws RegistryException
+	{
+		MutablePortletApplication pa = null;
+        
+        try
+        {
+            pa = (MutablePortletApplication) registry.getPortletApplication(contextName);
+        }
+        catch (Exception e)
+        {
+            // ignore errors during portal shutdown
+        }
+		if (pa != null)
+		{
+			portletFactory.unregisterPortletApplication(pa);
+		}
+	}
+
+	protected void unregisterPortletApplication(MutablePortletApplication pa,
+		boolean purgeEntityInfo)
+		throws RegistryException
+	{
+		if (searchEngine != null)
+		{
+			searchEngine.remove(pa);
+			searchEngine.remove(pa.getPortletDefinitions());
+		}
+
+		log.info("Remove all registry entries defined for portlet application " + pa.getName());
+
+		Iterator portlets = pa.getPortletDefinitions().iterator();
+
+		while (portlets.hasNext())
+		{
+			PortletDefinition portletDefinition = (PortletDefinition) portlets.next();
+			Iterator		  entities = entityAccess.getPortletEntities(portletDefinition)
+													 .iterator();
+
+			while (entities.hasNext())
+			{
+				PortletEntity entity = (PortletEntity) entities.next();
+
+				if (purgeEntityInfo)
+				{
+					try
+					{
+						entityAccess.removePortletEntity(entity);
+					}
+					catch (PortletEntityNotDeletedException e)
+					{
+						String msg = "Failed to delete Portlet Entity " + entity.getId();
+						log.error(msg, e);
+						throw new RegistryException(msg, e);
+					}
+				}
+
+				entityAccess.removeFromCache(entity);
+				windowAccess.removeWindows(entity);
+			}
+		}
+
+		// todo keep (User)Prefs?
+		registry.removeApplication(pa);
+	}
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org