KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > continuent > sequoia > driver > connectpolicy > PreferredListConnectPolicy


1 /**
2  * Sequoia: Database clustering technology.
3  * Copyright (C) 2005 Emic Networks.
4  * Contact: sequoia@continuent.org
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * Initial developer(s): Emmanuel Cecchet.
19  * Contributor(s): ______________________.
20  */

21
22 package org.continuent.sequoia.driver.connectpolicy;
23
24 import java.sql.SQLException JavaDoc;
25 import java.util.ArrayList JavaDoc;
26 import java.util.StringTokenizer JavaDoc;
27
28 import org.continuent.sequoia.common.exceptions.NoMoreControllerException;
29 import org.continuent.sequoia.driver.ControllerInfo;
30 import org.continuent.sequoia.driver.SequoiaUrl;
31
32 /**
33  * This class defines a PreferredListConnectPolicy
34  *
35  * @author <a HREF="mailto:emmanuel.cecchet@emicnetworks.com">Emmanuel Cecchet
36  * </a>
37  * @version 1.0
38  */

39 public class PreferredListConnectPolicy extends AbstractControllerConnectPolicy
40 {
41   private int index = -1;
42   private ArrayList JavaDoc preferredControllers;
43   private ArrayList JavaDoc deadPreferredControllers;
44
45   /**
46    * Creates a new <code>PreferredListConnectPolicy</code> object
47    *
48    * @param controllerList list of controller from Sequoia url
49    * @param retryIntervalInMs Interval in milliseconds before retrying to
50    * re-connect to a controller that has failed
51    * @param preferredControllerList comma separated list of preferred
52    * controllers
53    * @param debugLevel the debug level to use
54    * @see org.continuent.sequoia.driver.SequoiaUrl#DEBUG_LEVEL_OFF
55    */

56   public PreferredListConnectPolicy(ControllerInfo[] controllerList,
57       long retryIntervalInMs, String JavaDoc preferredControllerList, int debugLevel)
58   {
59     super(controllerList, retryIntervalInMs, debugLevel);
60
61     // Check the validity of each controller in the list
62
StringTokenizer JavaDoc controllers = new StringTokenizer JavaDoc(preferredControllerList,
63         ",", true);
64     int tokenNumber = controllers.countTokens();
65     preferredControllers = new ArrayList JavaDoc(tokenNumber - 1);
66     deadPreferredControllers = new ArrayList JavaDoc(tokenNumber - 1);
67     int i = 0;
68     String JavaDoc s;
69     boolean lastTokenWasComma = false;
70     while (controllers.hasMoreTokens())
71     {
72       s = controllers.nextToken().trim();
73       if (s.equals(","))
74       {
75         if (lastTokenWasComma || (i == 0) || (i == tokenNumber - 1))
76           // ',' cannot be the first or the last token
77
// another ',' cannot follow a ','
78
throw new RuntimeException JavaDoc(
79               "Syntax error in controller list for preferredController attribute '"
80                   + preferredControllerList + "'");
81         else
82         {
83           lastTokenWasComma = true;
84           continue;
85         }
86       }
87       lastTokenWasComma = false;
88       try
89       {
90         preferredControllers.add(SequoiaUrl.parseController(s));
91       }
92       catch (SQLException JavaDoc e)
93       {
94         throw new RuntimeException JavaDoc("Invalid controller " + s
95             + " in controller list for preferredController attribute");
96       }
97       i++;
98     }
99
100   }
101
102   /**
103    * @see org.continuent.sequoia.driver.connectpolicy.AbstractControllerConnectPolicy#removeControllerFromSuspectList(org.continuent.sequoia.driver.ControllerInfo)
104    */

105   public synchronized void removeControllerFromSuspectList(
106       ControllerInfo controller)
107   {
108     super.removeControllerFromSuspectList(controller);
109     while (deadPreferredControllers.remove(controller))
110       preferredControllers.add(controller);
111   }
112
113   /**
114    * @see org.continuent.sequoia.driver.connectpolicy.AbstractControllerConnectPolicy#suspectControllerOfFailure(org.continuent.sequoia.driver.ControllerInfo)
115    */

116   public synchronized void suspectControllerOfFailure(
117       ControllerInfo controllerInfo)
118   {
119     super.suspectControllerOfFailure(controllerInfo);
120     while (preferredControllers.remove(controllerInfo))
121       deadPreferredControllers.add(controllerInfo);
122   }
123
124   /**
125    * @see org.continuent.sequoia.driver.connectpolicy.AbstractControllerConnectPolicy#getController()
126    */

127   public synchronized ControllerInfo getController()
128       throws NoMoreControllerException
129   {
130     if (suspectedControllers.size() == controllerList.length)
131       throw new NoMoreControllerException();
132
133     if (preferredControllers.isEmpty())
134     { // Find 1st available controller in round-robin
135
int looked = 0;
136       do
137       {
138         index = (index + 1) % controllerList.length;
139         looked++;
140       }
141       while (suspectedControllers.contains(controllerList[index])
142           && (looked <= controllerList.length));
143       if (looked > controllerList.length)
144         throw new NoMoreControllerException();
145
146       if (debugLevel == SequoiaUrl.DEBUG_LEVEL_DEBUG)
147         System.out.println("Selected controller[" + index + "]:"
148             + controllerList[index]);
149       return controllerList[index];
150     }
151     else
152     {
153       index = (index + 1) % preferredControllers.size();
154       ControllerInfo controllerInfo = (ControllerInfo) preferredControllers
155           .get(index);
156       if (debugLevel == SequoiaUrl.DEBUG_LEVEL_DEBUG)
157         System.out.println("Selected controller[" + index + "]:"
158             + controllerInfo);
159       return controllerInfo;
160     }
161   }
162
163 }
164
Popular Tags