1 21 22 package org.continuent.sequoia.driver.connectpolicy; 23 24 import java.sql.SQLException ; 25 import java.util.ArrayList ; 26 import java.util.StringTokenizer ; 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 39 public class PreferredListConnectPolicy extends AbstractControllerConnectPolicy 40 { 41 private int index = -1; 42 private ArrayList preferredControllers; 43 private ArrayList deadPreferredControllers; 44 45 56 public PreferredListConnectPolicy(ControllerInfo[] controllerList, 57 long retryIntervalInMs, String preferredControllerList, int debugLevel) 58 { 59 super(controllerList, retryIntervalInMs, debugLevel); 60 61 StringTokenizer controllers = new StringTokenizer (preferredControllerList, 63 ",", true); 64 int tokenNumber = controllers.countTokens(); 65 preferredControllers = new ArrayList (tokenNumber - 1); 66 deadPreferredControllers = new ArrayList (tokenNumber - 1); 67 int i = 0; 68 String 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 throw new RuntimeException ( 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 e) 93 { 94 throw new RuntimeException ("Invalid controller " + s 95 + " in controller list for preferredController attribute"); 96 } 97 i++; 98 } 99 100 } 101 102 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 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 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 { 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 |