00001
00025
package org.objectweb.cjdbc.controller.loadbalancer.policies.createtable;
00026
00027
import java.util.ArrayList;
00028
00029
import org.objectweb.cjdbc.controller.backend.DatabaseBackend;
00030
00038 public class CreateTableRoundRobin extends CreateTableRule
00039 {
00040 private int index = 0;
00041
00045 public CreateTableRoundRobin()
00046 {
00047 super(
CreateTablePolicy.ROUND_ROBIN);
00048 }
00049
00055 public CreateTableRoundRobin(ArrayList backendList)
00056 {
00057 super(
CreateTablePolicy.ROUND_ROBIN, backendList);
00058 }
00059
00063 public ArrayList
getBackends(ArrayList backends)
throws CreateTableException
00064 {
00065
int size = backends.size();
00066
00067
if (nbOfNodes == 0)
00068
return null;
00069
else if (nbOfNodes == size)
00070
return backends;
00071
00072 ArrayList clonedList;
00073
00074
if (backendList.size() > 0)
00075 {
00076 clonedList =
new ArrayList(nbOfNodes);
00077
for (
int i = 0; i < size; i++)
00078 {
00079
DatabaseBackend db = (
DatabaseBackend) backends.get(i);
00080
if (db.
isWriteEnabled() && backendList.contains(db.
getName()))
00081 clonedList.add(db);
00082 }
00083 }
00084
else
00085 {
00086 clonedList =
new ArrayList(size);
00087
for (
int i = 0; i < size; i++)
00088 {
00089
DatabaseBackend db = (
DatabaseBackend) backends.get(i);
00090
if (db.
isWriteEnabled())
00091 clonedList.add(db);
00092 }
00093 }
00094
00095
int clonedSize = clonedList.size();
00096
00097
if (nbOfNodes == clonedSize)
00098
return backends;
00099
else if (nbOfNodes > clonedSize)
00100
throw new CreateTableException(
00101
"Asking for more backends ("
00102 + nbOfNodes
00103 +
") than available ("
00104 + clonedSize
00105 +
")");
00106
00107 ArrayList result =
new ArrayList(nbOfNodes);
00108
00109
synchronized (
this)
00110 {
00111
for (
int i = 0; i < nbOfNodes; i++)
00112 {
00113
index = (
index + 1) % clonedSize;
00114 result.add(clonedList.remove(
index));
00115 }
00116 }
00117
00118
return result;
00119 }
00120
00124 public String
getInformation()
00125 {
00126 String s;
00127
if (tableName == null)
00128 s =
"Default rule create table on ";
00129
else
00130 s =
"Rule for table " + tableName +
" create table on ";
00131
00132
return s + nbOfNodes +
" node(s) in round-robin from " + backendList;
00133 }
00134 }