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
import java.util.Iterator;
00031
00032
import org.objectweb.cjdbc.common.xml.DatabasesXmlTags;
00033
00045 public class DatabaseTable implements Serializable
00046 {
00048 private String
name;
00049
00051 private ArrayList
columns;
00052
00058 public DatabaseTable(String name)
00059 {
00060
this(name,
new ArrayList());
00061 }
00062
00069 public DatabaseTable(String name,
int nbOfColumns)
00070 {
00071
this(name,
new ArrayList(nbOfColumns));
00072 }
00073
00080 private DatabaseTable(String name, ArrayList columns)
00081 {
00082
if (name == null)
00083
throw new IllegalArgumentException(
"Illegal null database table name in DatabaseTable constructor");
00084
00085
this.name = name;
00086
this.columns = columns;
00087 }
00088
00094 public String
getName()
00095 {
00096
return name;
00097 }
00098
00106 public void addColumn(
DatabaseColumn column)
00107 {
00108
columns.add(column);
00109 }
00110
00118 public void remove(String columnName)
00119 {
00120
columns.remove(
getColumn(columnName));
00121 }
00122
00130 public void remove(
DatabaseColumn column)
00131 {
00132
columns.remove(column);
00133 }
00134
00143 public void mergeColumns(
DatabaseTable table)
throws SQLException
00144 {
00145
if (table == null)
00146
return;
00147
00148 ArrayList otherColumns = table.getColumns();
00149
if (otherColumns == null)
00150
return;
00151
00152
DatabaseColumn c, original;
00153
int size = otherColumns.size();
00154
for (
int i = 0; i < size; i++)
00155 {
00156 c = (
DatabaseColumn) otherColumns.get(i);
00157 original =
getColumn(c.
getName());
00158
if (original == null)
00159
addColumn(c);
00160
else
00161 {
00162
if (!original.
equalsIgnoreType(c))
00163
throw new SQLException(
00164
"Unable to merge tables: column '"
00165 + c.
getName()
00166 +
"' definition mismatch");
00167 }
00168 }
00169 }
00170
00179 public ArrayList
getColumns()
00180 {
00181
return columns;
00182 }
00183
00193 public ArrayList
getUniqueColumns()
00194 {
00195 ArrayList cols =
new ArrayList();
00196 Iterator i;
00197
DatabaseColumn c;
00198
00199
for (i =
columns.iterator(); i.hasNext();)
00200 {
00201 c = (
DatabaseColumn) i.next();
00202
if (c.
isUnique())
00203 cols.add(c);
00204 }
00205
return cols;
00206 }
00207
00215 public DatabaseColumn getColumn(String columnName)
00216 {
00217
DatabaseColumn c;
00218
for (Iterator i =
columns.iterator(); i.hasNext();)
00219 {
00220 c = (
DatabaseColumn) i.next();
00221
if (columnName.equalsIgnoreCase(c.
getName()))
00222
return c;
00223
00224 }
00225
return null;
00226 }
00227
00236 public DatabaseColumn getColumn(String columnName,
boolean isCaseSensitive)
00237 {
00238
if (!isCaseSensitive)
00239
return getColumn(columnName);
00240
00241
DatabaseColumn c;
00242
for (Iterator i =
columns.iterator(); i.hasNext();)
00243 {
00244 c = (
DatabaseColumn) i.next();
00245
if (columnName.equals(c.
getName()))
00246
return c;
00247
00248 }
00249
return null;
00250 }
00251
00259 public boolean equals(Object other)
00260 {
00261
if ((other == null) || !(other instanceof
DatabaseTable))
00262
return false;
00263
00264
DatabaseTable t = (
DatabaseTable) other;
00265
return (t.
getName().equals(
name)) && (t.
getColumns().equals(
columns));
00266 }
00267
00276 public boolean equalsIgnoreType(Object other)
00277 {
00278
if ((other == null) || !(other instanceof
DatabaseTable))
00279
return false;
00280
00281
DatabaseTable t = (
DatabaseTable) other;
00282
if (!t.
getName().equals(
name))
00283
return false;
00284
00285
DatabaseColumn c1, c2;
00286 Iterator iter =
columns.iterator();
00287
while (iter.hasNext())
00288 {
00289 c1 = (
DatabaseColumn) iter.next();
00290 c2 = t.
getColumn(c1.
getName());
00291
00292
if (!c1.
equalsIgnoreType(c2))
00293
return false;
00294 }
00295
return true;
00296 }
00297
00303 public String
getXml()
00304 {
00305 StringBuffer info =
new StringBuffer();
00306 info.append(
00307
"<"
00308 +
DatabasesXmlTags.ELT_DatabaseTable
00309 +
" "
00310 +
DatabasesXmlTags.ATT_tableName
00311 +
"=\""
00312 +
name
00313 +
"\" "
00314 +
DatabasesXmlTags.ATT_nbOfColumns
00315 +
"=\""
00316 +
columns.size()
00317 +
"\">");
00318
for (
int i = 0; i <
columns.size(); i++)
00319 info.append(((
DatabaseColumn)
columns.get(i)).getXml());
00320 info.append(
"</" +
DatabasesXmlTags.ELT_DatabaseTable +
">");
00321
return info.toString();
00322 }
00323 }