00001
00025
package org.objectweb.cjdbc.common.sql.schema;
00026
00027
import java.io.Serializable;
00028
import java.sql.SQLException;
00029
import java.util.ArrayList;
00030
00031
import org.objectweb.cjdbc.common.xml.DatabasesXmlTags;
00032
00041 public class DatabaseSchema implements Serializable
00042 {
00044 private ArrayList
tables;
00046 private ArrayList
procedures;
00047
00051 public DatabaseSchema()
00052 {
00053
tables =
new ArrayList();
00054
procedures =
new ArrayList();
00055 }
00056
00063 public DatabaseSchema(
int nbOfTables)
00064 {
00065
tables =
new ArrayList(nbOfTables);
00066
procedures =
new ArrayList();
00067 }
00068
00075 public DatabaseSchema(
DatabaseSchema schema)
00076 {
00077
if (schema == null)
00078
throw new IllegalArgumentException(
"Illegal null database schema in DatabaseSchema(DatabaseSchema) constructor");
00079
00080
tables =
new ArrayList(schema.
getTables());
00081
procedures =
new ArrayList(schema.
getProcedures());
00082 }
00083
00089 public void addTable(
DatabaseTable table)
00090 {
00091
if (table == null)
00092
throw new IllegalArgumentException(
"Illegal null database table in addTable(DatabaseTable) method");
00093
tables.add(table);
00094 }
00095
00102 public void addProcedure(
DatabaseProcedure procedure)
00103 {
00104
if (procedure == null)
00105
throw new IllegalArgumentException(
"Illegal null database table in addTable(DatabaseTable) method");
00106
procedures.add(procedure);
00107 }
00108
00114 public void removeTable(
DatabaseTable table)
00115 {
00116
if (table == null)
00117
throw new IllegalArgumentException(
"Illegal null database table in removeTable(DatabaseTable) method");
00118
tables.remove(table);
00119 }
00120
00127 public void removeProcedure(
DatabaseProcedure procedure)
00128 {
00129
if (procedure == null)
00130
throw new IllegalArgumentException(
"Illegal null database procedure in removeProcedure(DatabaseProcedure) method");
00131
procedures.remove(procedure);
00132 }
00133
00142 public void mergeSchema(
DatabaseSchema databaseSchema)
throws SQLException
00143 {
00144
if (databaseSchema == null)
00145
throw new IllegalArgumentException(
"Illegal null database schema in mergeSchema(DatabaseSchema) method");
00146
00147 ArrayList otherTables = databaseSchema.getTables();
00148
if (otherTables.size() == 0)
00149
return;
00150
00151
DatabaseTable table, originalTable;
00152
int size = otherTables.size();
00153
for (
int i = 0; i < size; i++)
00154 {
00155 table = (
DatabaseTable) otherTables.get(i);
00156 originalTable =
getTable(table.
getName());
00157
if (originalTable == null)
00158
addTable(table);
00159
else
00160 originalTable.
mergeColumns(table);
00161 }
00162
00163 ArrayList otherProcedures = databaseSchema.getProcedures();
00164
if (otherProcedures.size() == 0)
00165
return;
00166
00167
DatabaseProcedure procedure, originalProcedure;
00168
int sizep = otherProcedures.size();
00169
for (
int i = 0; i < sizep; i++)
00170 {
00171 procedure = (
DatabaseProcedure) otherProcedures.get(i);
00172 originalProcedure =
getProcedure(procedure.
getName());
00173
if (originalProcedure == null)
00174
addProcedure(procedure);
00175
else
00176 originalProcedure.
mergeParameters(procedure);
00177 }
00178 }
00179
00186 public ArrayList
getTables()
00187 {
00188
return tables;
00189 }
00190
00197 public ArrayList
getProcedures()
00198 {
00199
return procedures;
00200 }
00201
00209 public DatabaseTable getTable(String tableName)
00210 {
00211
if (tableName == null)
00212
return null;
00213
00214
DatabaseTable t;
00215
int size =
tables.size();
00216
for (
int i = 0; i < size; i++)
00217 {
00218 t = (
DatabaseTable)
tables.get(i);
00219
if (tableName.compareTo(t.
getName()) == 0)
00220
return t;
00221 }
00222
return null;
00223 }
00224
00232 public DatabaseProcedure getProcedure(String procedureName)
00233 {
00234
if (procedureName == null)
00235
return null;
00236
00237
DatabaseProcedure t;
00238
int size =
procedures.size();
00239
for (
int i = 0; i < size; i++)
00240 {
00241 t = (
DatabaseProcedure)
procedures.get(i);
00242
if (procedureName.compareTo(t.
getName()) == 0)
00243
return t;
00244 }
00245
return null;
00246 }
00247
00257 public DatabaseTable getTable(String tableName,
boolean isCaseSensitive)
00258 {
00259
if (isCaseSensitive)
00260
return getTable(tableName);
00261
00262
if (tableName == null)
00263
return null;
00264
00265
DatabaseTable t;
00266
int size =
tables.size();
00267
for (
int i = 0; i < size; i++)
00268 {
00269 t = (
DatabaseTable)
tables.get(i);
00270
if (tableName.equalsIgnoreCase(t.
getName()))
00271
return t;
00272 }
00273
return null;
00274 }
00275
00283 public boolean hasTable(String tableName)
00284 {
00285
if (tableName == null)
00286
return false;
00287
00288
DatabaseTable t;
00289
int size =
tables.size();
00290
for (
int i = 0; i < size; i++)
00291 {
00292 t = (
DatabaseTable)
tables.get(i);
00293
if (tableName.equals(t.
getName()))
00294
return true;
00295 }
00296
return false;
00297 }
00298
00306 public boolean hasProcedure(String procedureName)
00307 {
00308
if (procedureName == null)
00309
return false;
00310
00311
DatabaseProcedure t;
00312
int size =
procedures.size();
00313
for (
int i = 0; i < size; i++)
00314 {
00315 t = (
DatabaseProcedure)
procedures.get(i);
00316
if (procedureName.equals(t.
getName()))
00317
return true;
00318 }
00319
return false;
00320 }
00321
00330 public boolean isCompatibleSubset(
DatabaseSchema other)
00331 {
00332
DatabaseTable table, otherTable;
00333
int size =
tables.size();
00334
for (
int i = 0; i < size; i++)
00335 {
00336
00337 table = (
DatabaseTable)
tables.get(i);
00338 otherTable = other.
getTable(table.
getName());
00339
if (otherTable == null)
00340
return false;
00341
else if (!table.
equalsIgnoreType(otherTable))
00342
return false;
00343 }
00344
DatabaseProcedure procedure, otherProcedure;
00345
int sizep =
procedures.size();
00346
for (
int i = 0; i < sizep; i++)
00347 {
00348
00349 procedure = (
DatabaseProcedure)
procedures.get(i);
00350 otherProcedure = other.
getProcedure(procedure.
getName());
00351
if (otherProcedure == null)
00352
return false;
00353
else if (!procedure.
equals(otherProcedure))
00354
return false;
00355 }
00356
return true;
00357 }
00358
00367 public boolean isCompatibleWith(
DatabaseSchema other)
00368 {
00369
DatabaseTable table, otherTable;
00370
int size =
tables.size();
00371
for (
int i = 0; i < size; i++)
00372 {
00373 table = (
DatabaseTable)
tables.get(i);
00374 otherTable = other.
getTable(table.
getName());
00375
if (otherTable == null)
00376
continue;
00377
else if (!table.
equalsIgnoreType(otherTable))
00378
return false;
00379 }
00380
DatabaseProcedure procedure, otherProcedure;
00381
int sizep =
procedures.size();
00382
for (
int i = 0; i < sizep; i++)
00383 {
00384 procedure = (
DatabaseProcedure)
procedures.get(i);
00385 otherProcedure = other.
getProcedure(procedure.
getName());
00386
if (otherProcedure == null)
00387
continue;
00388
else if (!procedure.
equals(otherProcedure))
00389
return false;
00390 }
00391
return true;
00392 }
00393
00401 public boolean equals(Object other)
00402 {
00403
boolean equal =
true;
00404
if ((other == null) || !(other instanceof
DatabaseSchema))
00405
return false;
00406
if (
tables == null)
00407 equal &= ((
DatabaseSchema) other).getTables() == null;
00408
else
00409 equal &=
tables.equals(((
DatabaseSchema) other).
getTables());
00410
if (
procedures == null)
00411 equal &= ((
DatabaseSchema) other).getProcedures() == null;
00412
else
00413 equal &=
procedures.equals(((
DatabaseSchema) other).
getProcedures());
00414
return equal;
00415 }
00416
00422 public String
getXml()
00423 {
00424 StringBuffer info =
new StringBuffer();
00425 info.append(
"<"+
DatabasesXmlTags.ELT_DatabaseStaticSchema+
">");
00426
for(
int i = 0; i <
procedures.size();i++)
00427 info.append(((
DatabaseProcedure)
procedures.get(i)).getXml());
00428
for (
int i = 0; i <
tables.size(); i++)
00429 info.append(((
DatabaseTable)
tables.get(i)).getXml());
00430 info.append(
"</"+
DatabasesXmlTags.ELT_DatabaseStaticSchema+
">");
00431
return info.toString();
00432 }
00433
00434 }