portals-jetspeed-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From tay...@apache.org
Subject svn commit: r500054 - in /portals/jetspeed-2/trunk: components/portal/src/java/org/apache/jetspeed/cluster/ components/portal/src/java/org/apache/jetspeed/tools/pamanager/ components/portal/src/test/org/apache/jetspeed/cluster/ jetspeed-api/src/java/or...
Date Thu, 25 Jan 2007 23:31:23 GMT
Author: taylor
Date: Thu Jan 25 15:31:22 2007
New Revision: 500054

URL: http://svn.apache.org/viewvc?view=rev&rev=500054
Log:
https://issues.apache.org/jira/browse/JS2-647
Cluster Deployment
contribution from Hajo Birthelmer

Added:
    portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/cluster/
    portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/cluster/NodeInformationImpl.java
    portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/cluster/NodeManagerImpl.java
    portals/jetspeed-2/trunk/components/portal/src/test/org/apache/jetspeed/cluster/
    portals/jetspeed-2/trunk/components/portal/src/test/org/apache/jetspeed/cluster/TestCluster.java
    portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/cluster/
    portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/cluster/NodeInformation.java
    portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/cluster/NodeManager.java
    portals/jetspeed-2/trunk/src/webapp/WEB-INF/assembly/cluster-node.xml
Modified:
    portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/tools/pamanager/PortletApplicationManager.java
    portals/jetspeed-2/trunk/src/webapp/WEB-INF/assembly/deployment.xml

Added: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/cluster/NodeInformationImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/cluster/NodeInformationImpl.java?view=auto&rev=500054
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/cluster/NodeInformationImpl.java
(added)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/cluster/NodeInformationImpl.java
Thu Jan 25 15:31:22 2007
@@ -0,0 +1,181 @@
+/*
+ * Copyright 2000-2001,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.cluster;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.text.DateFormat;
+import java.util.Date;
+
+import org.apache.pluto.om.common.ObjectID;
+
+/**
+ * Node Information
+ * 
+ * @author <a href="mailto:hajo@bluesunrise.com">Hajo Birthelmer</a>
+ * @version
+ */
+public class NodeInformationImpl implements NodeInformation, Serializable 
+{
+	static final long serialVersionUID = -598265530537353219L;
+
+	private Long id;
+	private String contextName;
+	private Date lastDeployDate = null;
+	private static final int CompressVersion = 1;
+
+	/**
+	 * default class construtor required for bean management
+	 *
+	 */
+	public NodeInformationImpl()
+	{}
+	
+	/**
+	 * extensible serialization routine - indicates the version written to allow for later structural
updates
+	 *
+	 */
+	private void writeObject(ObjectOutputStream out) throws IOException
+	{
+		out.writeByte(CompressVersion);
+		out.writeLong(id.longValue());
+		out.writeUTF(contextName);
+		if (lastDeployDate == null)
+			out.writeByte(0);
+		else
+		{
+			out.writeByte(1);
+			out.writeLong(lastDeployDate.getTime());
+		}
+	}
+	/**
+	 * extensible serialization routine 
+	 * using the version byte code can identify older versions and handle updates correctly
+	 *
+	 */
+	private void readObject(ObjectInputStream in) throws IOException,
+			ClassNotFoundException
+	{
+		int version = in.readByte();
+		// do changes here if version dependant
+
+		id = new Long(in.readLong());
+		contextName = in.readUTF();
+		int dateSet = in.readByte();
+		
+		if (dateSet == 1)
+			lastDeployDate = new Date(in.readLong());
+		else
+			lastDeployDate = null;
+	}
+
+	public boolean equals(Object object)
+	{
+		if (object == this)
+			return true;
+		if (!(object instanceof NodeInformation))
+			return false;
+		return equals((NodeInformation) object);
+	}
+
+	public int compareTo(Object object)
+	{
+		if (object == null)
+			return 1;
+		if (object == this)
+			return 0;
+		if (!(object instanceof NodeInformation))
+			return 1;
+		return compareTo((NodeInformation) object);
+	}
+
+	public final boolean equals(NodeInformation object)
+	{
+		if (object == null)
+			return false;
+		return object.getContextName().equalsIgnoreCase(contextName);
+	}
+
+	public final int compareTo(NodeInformation object)
+	{
+		return getContextName().compareToIgnoreCase(contextName);
+	}
+
+	public String toString()
+	{
+		StringBuffer buffer = new StringBuffer();
+		buffer.append("id= " + this.id.longValue());
+		buffer.append("; contextName= " + this.getContextName());
+		buffer.append("; lastDeployDate= " + this.getContextName());
+		if (this.lastDeployDate != null)
+		{
+			DateFormat format = DateFormat.getTimeInstance(DateFormat.SHORT);
+			try
+			{
+				buffer.append(format.format(this.lastDeployDate));
+			} catch (Exception e)
+			{
+				buffer.append("<invalidDate>");
+			}
+		} else
+			buffer.append("<empty>");
+
+		return buffer.toString();
+	}
+
+	public String getContextName()
+	{
+		return contextName;
+	}
+
+	public void setContextName(String contextName)
+	{
+		this.contextName = contextName;
+	}
+
+	public Long getId()
+	{
+		return id;
+	}
+
+	public void setId(ObjectID id)
+	{
+		this.id = new Long(id.toString());
+	}
+
+	public void setId(Long id)
+	{
+		this.id = id;
+	}
+
+	public void setId(long id)
+	{
+		this.id = new Long(id);
+	}
+
+	public Date getLastDeployDate()
+	{
+		return lastDeployDate;
+	}
+
+	public void setLastDeployDate(Date lastDeployDate)
+	{
+		this.lastDeployDate = lastDeployDate;
+	}
+
+}

Added: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/cluster/NodeManagerImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/cluster/NodeManagerImpl.java?view=auto&rev=500054
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/cluster/NodeManagerImpl.java
(added)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/cluster/NodeManagerImpl.java
Thu Jan 25 15:31:22 2007
@@ -0,0 +1,198 @@
+/*
+ * Copyright 2000-2001,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.cluster;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.HashMap;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.jetspeed.om.common.portlet.MutablePortletApplication;
+import org.apache.pluto.om.common.ObjectID;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.BeanFactoryAware;
+
+/**
+ * Node Manager 
+ *
+ * @author <a href="mailto:hajo@bluesunrise.com">Hajo Birthelmer</a>
+ * @version 
+ */
+public class NodeManagerImpl implements NodeManager,BeanFactoryAware
+{
+	protected final static Log log = LogFactory.getLog(NodeManagerImpl.class);
+
+    /**
+     * added support for bean factory to create profile rules
+     */
+    private BeanFactory beanFactory;
+
+	private HashMap nodes = null; 
+	private File rootIndexDir = null;
+	    
+    /** the default criterion bean name */
+    private String nodeInformationBean = "NodeInformation";
+
+	
+	public NodeManagerImpl(String indexRoot, String nodeInformationBean)
+    throws Exception
+    {
+    	
+        //assume it's full path for now
+        rootIndexDir = new File(indexRoot);
+        this.nodeInformationBean = nodeInformationBean;
+
+        if (!(rootIndexDir.exists()))
+        	rootIndexDir.mkdirs();
+        load();
+    }
+
+	
+	protected void save()
+	{
+		try {
+		      FileOutputStream fout = new FileOutputStream(rootIndexDir.getAbsolutePath()+ "/nodeInfo.ser");
+		      ObjectOutputStream oos = new ObjectOutputStream(fout);
+		      oos.writeObject(nodes);
+		      oos.close();
+		      }
+		   catch (Exception e) 
+		   {
+	            log.error("Failed to write nodes data file to  " + rootIndexDir.getAbsolutePath()+
"/nodeInfo.ser" + " - error : " + e.getLocalizedMessage());
+			   e.printStackTrace(); 
+			}
+	}
+    
+	protected void load()
+	{
+			File data = new File( rootIndexDir.getAbsolutePath()+ "/nodeInfo.ser");
+			if (data.exists())
+			{
+				try {
+				    FileInputStream fin = new FileInputStream(data.getAbsolutePath());
+				    ObjectInputStream ois = new ObjectInputStream(fin);
+				    nodes = (HashMap) ois.readObject();
+				    ois.close();
+				    }
+				   catch (Exception e) 
+				   { 
+			            log.error("Failed to read nodes data file from " + data.getAbsolutePath()
+ " - error : " + e.getLocalizedMessage());
+					   nodes = new HashMap();
+				   }
+			}
+			else
+			{
+				try
+				{
+					data.createNewFile();
+				}
+				catch (Exception e)
+				{
+		            log.error("Failed to create new nodes data file error : " + e.getLocalizedMessage());
+					e.printStackTrace();
+				}
+				nodes = new HashMap();
+			}
+			
+//			NodeInformationImpl temp = new NodeInformationImpl();
+//			temp.setContextName("tttt");
+	}
+	public int checkNode(Long id, String contextName)
+	{
+		if ((contextName == null) || (id == null))
+			return NodeManager.INVALID_NODE_REQUEST;
+		NodeInformation info = (NodeInformation)nodes.get(contextName);
+		if (info == null)
+			return NodeManager.NODE_NEW;
+		if (info.getId().longValue() < id.longValue())
+			return NodeManager.NODE_OUTDATED;
+		return NodeManager.NODE_SAVED;
+	}
+	
+	public void addNode(Long id, String contextName) throws Exception
+	{
+		if ((contextName == null) || (id == null))
+			return;
+		NodeInformation info = (NodeInformation)nodes.get(contextName);
+		if (info == null)
+		{
+			info = createNodeInformation();
+			info.setContextName(contextName);
+		}
+		info.setId(id);
+		nodes.put(contextName, info);
+		save();
+	}
+
+	public void removeNode(String contextName) throws Exception
+	{
+		if (contextName == null)
+			return;
+		NodeInformation info = (NodeInformation)nodes.get(contextName);
+		if (info == null)
+			return;
+		nodes.remove(contextName);
+		save();
+	}
+
+	
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.jetspeed.profiler.Profiler#createRuleCriterion()
+     */
+    protected NodeInformation createNodeInformation() throws ClassNotFoundException
+    {
+        try
+        {
+            NodeInformation nodeInformation = (NodeInformation) beanFactory.getBean(
+                    this.nodeInformationBean, NodeInformation.class);
+            return nodeInformation;
+        } catch (Exception e)
+        {
+            log.error("Failed to create nodeInformation for " + nodeInformationBean
+                    + " error : " + e.getLocalizedMessage());
+            throw new ClassNotFoundException("Spring failed to create the "
+                    + " nodeInformation bean.", e);
+        }
+
+    }
+
+    /*
+     * Method called automatically by Spring container upon initialization
+     * 
+     * @param beanFactory automatically provided by framework @throws
+     * BeansException
+     */
+    public void setBeanFactory(BeanFactory beanFactory) throws BeansException
+    {
+        this.beanFactory = beanFactory;
+    }
+
+	public int getNumberOfNodes()
+	{
+		return nodes.size();
+	}
+
+    
+    
+    
+}

Modified: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/tools/pamanager/PortletApplicationManager.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/tools/pamanager/PortletApplicationManager.java?view=diff&rev=500054&r1=500053&r2=500054
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/tools/pamanager/PortletApplicationManager.java
(original)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/tools/pamanager/PortletApplicationManager.java
Thu Jan 25 15:31:22 2007
@@ -15,9 +15,17 @@
  */
 package org.apache.jetspeed.tools.pamanager;
 
+import java.io.File;
+import java.io.IOException;
+import java.security.Permission;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-
+import org.apache.jetspeed.cluster.NodeManager;
 import org.apache.jetspeed.components.portletentity.PortletEntityAccessComponent;
 import org.apache.jetspeed.components.portletentity.PortletEntityNotDeletedException;
 import org.apache.jetspeed.components.portletregistry.PortletRegistry;
@@ -31,25 +39,16 @@
 import org.apache.jetspeed.security.PortletPermission;
 import org.apache.jetspeed.security.Role;
 import org.apache.jetspeed.security.RoleManager;
+import org.apache.jetspeed.security.SecurityException;
 import org.apache.jetspeed.util.DirectoryHelper;
 import org.apache.jetspeed.util.FileSystemHelper;
 import org.apache.jetspeed.util.MultiFileChecksumHelper;
 import org.apache.jetspeed.util.descriptor.PortletApplicationWar;
-import org.apache.jetspeed.security.SecurityException;
 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.File;
-import java.io.IOException;
-
-import java.security.Permission;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
 /**
  * PortletApplicationManager
  *
@@ -74,13 +73,15 @@
     protected DescriptorChangeMonitor monitor;
     protected boolean started;
 
+    protected NodeManager nodeManager;
+    
     /**
 	 * Creates a new PortletApplicationManager object.
 	 */
 	public PortletApplicationManager(PortletFactory portletFactory, PortletRegistry registry,
 		PortletEntityAccessComponent entityAccess, PortletWindowAccessor windowAccess,
         PermissionManager permissionManager, SearchEngine searchEngine,
-        RoleManager roleManager, List permissionRoles)
+        RoleManager roleManager, List permissionRoles, NodeManager nodeManager)
 	{
 		this.portletFactory     = portletFactory;
 		this.registry		    = registry;
@@ -90,6 +91,7 @@
         this.searchEngine       = searchEngine;
         this.roleManager        = roleManager;        
         this.permissionRoles    = permissionRoles;
+        this.nodeManager		= nodeManager;
 	}
     
     public void start()
@@ -217,6 +219,7 @@
                 // ignore errors during portal shutdown
             }
 
+            
             if (pa != null)
             {
                 if (portletFactory.isPortletApplicationRegistered(pa))
@@ -225,6 +228,14 @@
                 }
 
                 unregisterPortletApplication(pa, true);
+                try
+                {
+                	nodeManager.removeNode(paName);
+                }
+                catch (Exception ee)
+                {
+                	// we actually do not care about an exception in the remove operation...
+                }
             }
         }
         finally
@@ -337,12 +348,10 @@
 			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);
-			}
+			this.updateSearchEngine(false, pa);
+			
+			// and add to the current node info
+			nodeManager.addNode(new Long(pa.getId().toString()), pa.getName());
             
             // grant default permissions to portlet application
 			grantDefaultPermissions(paName);
@@ -451,17 +460,85 @@
                 }
                 portletFactory.unregisterPortletApplication(pa);                        
             }
-            if (register && (pa == null || checksum != pa.getChecksum()))
+//            if (register && (pa == null || checksum != pa.getChecksum()))
+            if (register)
             {
-                try
-                {
-                    pa = registerPortletApplication(paWar, pa, local, paClassLoader);
-                }
-                catch (Exception e)
-                {
-                    // don't register the pa
-                    register = false;
-                }
+            	if (pa == null)
+            	{ 
+            		// new
+	                try
+	                {
+	                    pa = registerPortletApplication(paWar, pa, local, paClassLoader);
+	                }
+	                catch (Exception e)
+	                {
+	                    // don't register the pa
+	                    register = false;
+	                }
+            	}
+            	else
+            	{
+            		int status = nodeManager.checkNode(new Long(pa.getId().toString()), pa.getName());
+        			boolean reregister = false;
+        			boolean deploy = false;
+        			switch (status)
+        			{
+        				case  NodeManager.NODE_NEW:
+        				{
+            				//only reason is that the file got somehow corrupted 
+            				// so we really do not know what is going on here...
+            				// the best chance at this point is to reregister (which might be the absolute
wrong choice)
+            				log.warn("The portlet application " + pa.getName() + " is registered in the
database but not locally .... we will reregister");
+            				reregister = true;
+        					if (checksum != pa.getChecksum())
+        					{
+                				log.warn("The provided portlet application " + pa.getName() + " is a
different version than in the database (db-checksum=" + pa.getChecksum() + ", local-checksum=:
" + checksum + ") .... we will redeploy (also to the database)");
+    							deploy = true;
+        					}
+        					break;
+        				}
+        				case  NodeManager.NODE_SAVED:
+        				{
+        					if (checksum != pa.getChecksum())
+                    		{	
+                				log.warn("The provided portlet application " + pa.getName() + " is a
different version than in the local node info and the database (db-checksum=" + pa.getChecksum()
+ ", local-checksum=: " + checksum + ") .... we will reregister AND redeploy (also to the
database)");
+        						//database and local node info are in synch, so we assume that this is a brand
new
+        						// war .... let's deploy
+        						reregister = true;
+        						deploy = true;
+                    		}
+        					break;
+        				}
+        				case  NodeManager.NODE_OUTDATED:
+        				{
+            				//database version is older (determined by id) than the database 
+        					//let's deploy and reregister
+        					if (checksum != pa.getChecksum())
+                				log.error("The portlet application " + pa.getName() + " provided for
the upgrade IS WRONG. The database checksum= " + pa.getChecksum() + ", but the local=" + checksum
+ "....THIS NEEDS TO BE CORRECTED");
+       						reregister = true;
+        					break;
+        				}
+        			}
+        			if (deploy)
+	                    pa = registerPortletApplication(paWar, pa, local, paClassLoader);
+        			else
+        				if (reregister)
+        				{
+        					// add to search engine result
+        					this.updateSearchEngine(false, pa);
+        					
+        					// and add to the current node info
+        					try
+        					{
+        						nodeManager.addNode(new Long(pa.getId().toString()), pa.getName());
+        					} catch (Exception e)
+        					{
+        						log.error("Adding node for portlet application " + pa.getName() + " caused
exception" , e);
+        					}
+        				}
+        				
+            	
+            	}
             }
             if (register)
             {
@@ -525,16 +602,32 @@
 		}
 	}
 
-	protected void unregisterPortletApplication(MutablePortletApplication pa,
-		boolean purgeEntityInfo)
-		throws RegistryException
+	
+	protected void updateSearchEngine(boolean remove,MutablePortletApplication pa )
 	{
 		if (searchEngine != null)
 		{
-			searchEngine.remove(pa);
-			searchEngine.remove(pa.getPortletDefinitions());
+			if (remove)
+			{
+				searchEngine.remove(pa);
+				searchEngine.remove(pa.getPortletDefinitions());
+					log.info("Un-Registered the portlet application in the search engine... " + pa.getName());
+			}
+			else
+			{
+					searchEngine.add(pa);
+					searchEngine.add(pa.getPortletDefinitions());
+					log.info("Registered the portlet application in the search engine... " + pa.getName());
+			}
 		}
+		
+	}
+	protected void unregisterPortletApplication(MutablePortletApplication pa,
+		boolean purgeEntityInfo)
+		throws RegistryException
+	{
 
+		updateSearchEngine(true,pa);
 		log.info("Remove all registry entries defined for portlet application " + pa.getName());
 
 		Iterator portlets = pa.getPortletDefinitions().iterator();

Added: portals/jetspeed-2/trunk/components/portal/src/test/org/apache/jetspeed/cluster/TestCluster.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/portal/src/test/org/apache/jetspeed/cluster/TestCluster.java?view=auto&rev=500054
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/test/org/apache/jetspeed/cluster/TestCluster.java
(added)
+++ portals/jetspeed-2/trunk/components/portal/src/test/org/apache/jetspeed/cluster/TestCluster.java
Thu Jan 25 15:31:22 2007
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2000-2001,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.cluster;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.apache.jetspeed.components.util.DatasourceEnabledSpringTestCase;
+
+/**
+ * <p>
+ * TestCluster
+ * </p>
+ * 
+ * @author <a href="mailto:weaver@apache.org">Scott T. Weaver </a>
+ * @version $Id: TestCluster.java 463270 2006-10-12 15:19:29Z taylor $
+ *  
+ */
+public class TestCluster extends DatasourceEnabledSpringTestCase
+{
+ 
+	   /** The node manager. */
+    private NodeManager single;
+
+    /**
+     * @see junit.framework.TestCase#setUp()
+     */
+    public void setUp() throws Exception
+    {
+    	System.setProperty("applicationRoot","target/jetspeed");
+        super.setUp();
+
+        single = (NodeManager) ctx.getBean("org.apache.jetspeed.cluster.NodeManager");
+    }
+  
+    public static Test suite()
+    {
+        // All methods starting with "test" will be executed in the test suite.
+        return new TestSuite(TestCluster.class);
+    }
+
+    /** Test set user info map. * */
+    public void testCluser() throws Exception
+    {
+    	String contextName = "SOME_NEW_PORTLET_APPLICATION";
+    	Long id = new Long(10);
+    	
+        assertNotNull("Manager should be instantiated", single);
+        
+        int numExistingApps = single.getNumberOfNodes();
+        
+        //create a new node
+        int status = single.checkNode(id, contextName);
+        if (status != NodeManager.NODE_NEW)
+        {
+        	single.removeNode(contextName); //previous run didn't clean up
+        	status = single.checkNode(id, contextName);
+            assertEquals("Should be a new node",NodeManager.NODE_NEW,status);
+        }
+        
+        // ok - create a new node
+        single.addNode(id, contextName);
+        int newApps = single.getNumberOfNodes();
+
+        assertEquals("Should have added new node",newApps, numExistingApps+1);
+        
+        status = single.checkNode(id, contextName);
+        assertEquals("Should be a current (saved) node",NodeManager.NODE_SAVED,status);
+        
+    	id = new Long(20);
+        status = single.checkNode(id, contextName);
+        assertEquals("Should be an outdated node",NodeManager.NODE_OUTDATED,status);
+
+        single.addNode(id, contextName);
+        status = single.checkNode(id, contextName);
+        assertEquals("Should be again a current (saved) node",NodeManager.NODE_SAVED,status);
+
+    	id = new Long(10);
+        status = single.checkNode(id, contextName);
+        assertEquals("Should still be a current (saved) node",NodeManager.NODE_SAVED,status);
+
+    	single.removeNode(contextName); //previous run didn't clean up
+        status = single.checkNode(id, contextName);
+        assertEquals("Node should be gone....",NodeManager.NODE_NEW,status);
+    }
+    protected String[] getConfigurations()
+    {
+        return new String[]
+        { "cluster-node.xml"};
+    }
+
+}

Added: portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/cluster/NodeInformation.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/cluster/NodeInformation.java?view=auto&rev=500054
==============================================================================
--- portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/cluster/NodeInformation.java
(added)
+++ portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/cluster/NodeInformation.java
Thu Jan 25 15:31:22 2007
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2000-2001,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.cluster;
+
+import java.util.Date;
+import org.apache.pluto.om.common.ObjectID;
+
+/**
+ * Node Information Interface
+ *
+ * @author <a href="mailto:hajo@bluesunrise.com">Hajo Birthelmer</a>
+ * @version 
+ */
+
+public interface NodeInformation
+{
+
+	/**
+	 * Getter for ContextName
+	 * @return
+	 */
+	public String getContextName();
+	/**
+	 * setter for context name
+	 * 
+	 * @param id
+	 */	
+	public void setContextName(String contextName);
+
+	
+	/**
+	 * Getter for ObjectID 
+	 * @return
+	 */
+	public Long getId();
+
+	/**
+	 * setter for ObjectID 
+	 * 
+	 * @param id
+	 */	
+	public void setId(ObjectID id);
+
+	/**
+	 * setter for ObjectID 
+	 * 
+	 * @param id
+	 */	
+	public void setId(Long id);
+	/**
+	 * setter for ObjectID 
+	 * 
+	 * @param id
+	 */	
+	public void setId(long id);
+
+	/**
+	 * Getter for Last Deploy Date
+	 * @return
+	 */
+	public Date getLastDeployDate();
+
+
+	/**
+	 * setter for last deploy date 
+	 * 
+	 * @param id
+	 */	
+	public void setLastDeployDate(Date lastDeployDate);
+	
+	public String toString ();
+}
\ No newline at end of file

Added: portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/cluster/NodeManager.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/cluster/NodeManager.java?view=auto&rev=500054
==============================================================================
--- portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/cluster/NodeManager.java
(added)
+++ portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/cluster/NodeManager.java
Thu Jan 25 15:31:22 2007
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2000-2001,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.cluster;
+
+/**
+ * Node Manager Interface
+ *
+ * @author <a href="mailto:hajo@bluesunrise.com">Hajo Birthelmer</a>
+ * @version 
+ */
+public interface NodeManager
+{
+
+	public static final int INVALID_NODE_REQUEST = -1;
+	public static final int NODE_SAVED = 0;
+	public static final int NODE_OUTDATED = 1;
+	public static final int NODE_NEW = 2;
+
+	/**
+	 * Returns the current "knowledge" about a given node (i.e. the portlet application).
+	 * If the contextName doesn't exist NODE_NEW is returned.
+	 * An id requested newer than what is stored is indicated by NODE_OUTDATED. 
+	 * @param id
+	 * @param contextName
+	 * @return
+	 */
+	public int checkNode(Long id, String contextName);
+
+	/**
+	 * Add a new node or update the id of an existing one...(i.e. the portlet application) to
the local info
+	 * @param id
+	 * @param contextName
+	 * @throws Exception
+	 */
+	public void addNode(Long id, String contextName) throws Exception;
+
+	/**
+	 * return the number of currently stored nodes
+	 * @return
+	 */
+	public int getNumberOfNodes();
+
+	/**
+	 * Remove a node
+	 * @param id
+	 * @param contextName
+	 * @throws Exception
+	 */
+	public void removeNode(String contextName) throws Exception;
+
+}

Added: portals/jetspeed-2/trunk/src/webapp/WEB-INF/assembly/cluster-node.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/src/webapp/WEB-INF/assembly/cluster-node.xml?view=auto&rev=500054
==============================================================================
--- portals/jetspeed-2/trunk/src/webapp/WEB-INF/assembly/cluster-node.xml (added)
+++ portals/jetspeed-2/trunk/src/webapp/WEB-INF/assembly/cluster-node.xml Thu Jan 25 15:31:22
2007
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+<!--
+Copyright 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.
+-->
+<beans>
+
+  <!--CLUSTER NODE COMPONENT-->
+  <bean id="org.apache.jetspeed.cluster.NodeManager"
+  	class="org.apache.jetspeed.cluster.NodeManagerImpl"
+  >
+  	<constructor-arg index="0">
+	<value>${applicationRoot}/WEB-INF/cluster_node</value> 
+<!--   				<value>target/jetspeed/WEB-INF/cluster_node</value> -->
+  		</constructor-arg>
+ 	<!--  pass reference to NodeInformation -->
+		<constructor-arg index="1">
+			<value>NodeInformation</value>
+		</constructor-arg>
+ 	
+  </bean>
+  
+  	<!-- Rule Criterion -->
+	<bean id="NodeInformation" class="org.apache.jetspeed.cluster.NodeInformationImpl" singleton="false"></bean>
+  
+</beans>

Modified: portals/jetspeed-2/trunk/src/webapp/WEB-INF/assembly/deployment.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/src/webapp/WEB-INF/assembly/deployment.xml?view=diff&rev=500054&r1=500053&r2=500054
==============================================================================
--- portals/jetspeed-2/trunk/src/webapp/WEB-INF/assembly/deployment.xml (original)
+++ portals/jetspeed-2/trunk/src/webapp/WEB-INF/assembly/deployment.xml Thu Jan 25 15:31:22
2007
@@ -51,6 +51,7 @@
             <value>user</value>
          </list>
        </constructor-arg>
+  	   <constructor-arg><ref bean="org.apache.jetspeed.cluster.NodeManager"/></constructor-arg>
                    
 
    <!-- optional configuration for automatic creation of not yet existing roles as defined
in the deployed web.xml:
        <property name="autoCreateRoles"><value>true</value></property>



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


Mime
View raw message