KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > geronimo > clustering > LocalCluster


1 /**
2  *
3  * Copyright 2003-2004 The Apache Software Foundation
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */

17
18 package org.apache.geronimo.clustering;
19
20 import java.util.Collections JavaDoc;
21 import java.util.Iterator JavaDoc;
22 import java.util.List JavaDoc;
23 import java.util.Vector JavaDoc;
24
25 import org.apache.commons.logging.Log;
26 import org.apache.commons.logging.LogFactory;
27
28 /**
29  * A uniquely identifiable n->n intra-vm event-raising communications
30  * channel. A number of nodes which are part of the same cluster and
31  * reside in the same VM should share a single Cluster object.
32  *
33  * @version $Rev: 46019 $ $Date: 2004-09-14 02:56:06 -0700 (Tue, 14 Sep 2004) $
34  */

35 public class
36   LocalCluster
37   extends Cluster
38 {
39   protected Log _log=LogFactory.getLog(LocalCluster.class);
40   protected List JavaDoc _members=new Vector JavaDoc();
41
42   public List JavaDoc getMembers(){synchronized (_members){return Collections.unmodifiableList(_members);}}
43
44   // MetaData
45

46   /**
47    * Notify interested Cluster members of a change in membership,
48    * including the node which generated it.
49    *
50    * @param members a <code>List</code> value
51    */

52   protected void
53     notifyMembershipChanged(List JavaDoc members)
54   {
55     for (Iterator JavaDoc i=members.iterator(); i.hasNext();)
56       try
57       {
58     Object JavaDoc member=i.next();
59     if (member instanceof MetaDataListener)
60       ((MetaDataListener)member).setMetaData(members);
61       }
62       catch (Exception JavaDoc e)
63       {
64     _log.warn("problem notifying membership changed", e);
65       }
66   }
67
68   public void
69     join(Object JavaDoc member)
70   {
71     // first one in could turn on the lights...
72
synchronized (_members)
73     {
74       _members.add(member);
75       notifyMembershipChanged(_members);
76     }
77   }
78
79   public void
80     leave(Object JavaDoc member)
81   {
82     synchronized (_members)
83     {
84       _members.remove(member);
85       notifyMembershipChanged(_members);
86     }
87
88     // last one out could turn off the lights...
89
}
90
91   // Data
92

93   /**
94    * Get the Cluster's Data - uses an election policy (currently
95    * hardwired) to decide which node to get it from.
96    *
97    * @return a <code>Data</code> value - The data
98    */

99   public synchronized Data
100     getData()
101   {
102     // TODO - we need a pluggable election policy to decide who will
103
// be asked for state...
104

105     synchronized (_members)
106     {
107       if (_members.isEmpty())
108     return null;
109       else
110       {
111     for (Iterator JavaDoc i=_members.iterator(); i.hasNext();)
112     {
113       Object JavaDoc member=i.next();
114       // TODO - we need to do a deep copy of the state here -
115
// serialise and deserialise...
116
if (member instanceof DataListener)
117         return ((DataListener)member).getData();
118     }
119     return null;
120       }
121     }
122   }
123
124   /**
125    * Apply the given delta to all interested members of the cluster,
126    * excluding the member which generated it.
127    *
128    * @param l a <code>DataDeltaListener</code> value - The node that generated the delta
129    * @param delta a <code>DataDelta</code> value - The delta
130    */

131   public void
132     notifyDataDelta(DataDeltaListener l, DataDelta delta)
133   {
134     synchronized (_members)
135     {
136       for (Iterator JavaDoc i=_members.iterator(); i.hasNext();)
137       {
138     Object JavaDoc member=i.next();
139     if (member != l && member instanceof DataDeltaListener)
140       ((DataDeltaListener)member).applyDataDelta(delta);
141       }
142     }
143   }
144   /*
145   public static GeronimoMBeanInfo
146     getGeronimoMBeanInfo()
147   {
148     GeronimoMBeanInfo mbeanInfo=Cluster.getGeronimoMBeanInfo();
149     mbeanInfo.setTargetClass(LocalCluster.class);
150     return mbeanInfo;
151   }
152   */

153 }
154
Popular Tags