1 package uba.db.table;
2
3 import java.util.ArrayList;
4 import java.util.HashSet;
5 import java.util.Iterator;
6 import java.util.List;
7 import java.util.Set;
8
9 import org.apache.commons.collections.Closure;
10 import org.apache.commons.collections.CollectionUtils;
11 import org.apache.commons.collections.PredicateUtils;
12
13 import uba.db.column.ColumnSpecification;
14
15 /***
16 * Facilita la creación de instancias concretas de
17 * {@link uba.db.table.TableSchema}.
18 *
19 * @version $Revision: 1.2 $
20 */
21 public class TableSchemaBuilder {
22 private String tableName;
23 private List columns;
24 private Set primaryKeyColumnNames;
25 private Set uniqueColumnNames;
26
27 public TableSchemaBuilder(String tableName) {
28 this.tableName = tableName;
29 columns = new ArrayList();
30 primaryKeyColumnNames = new HashSet();
31 uniqueColumnNames = new HashSet();
32 }
33
34 /***
35 * @return
36 * @throws TableSchemaBuildException
37 */
38 public TableSchema build() throws TableSchemaBuildException {
39 Set primaryKeyColumns = resolvePrimaryKeyColumns();
40 Set uniqueColumns = resolveUniqueColumns();
41
42
43
44 return new TableSchema(tableName, columns, primaryKeyColumns);
45 }
46
47 private Set resolvePrimaryKeyColumns() {
48 return resolveColumnNames(primaryKeyColumnNames, new Closure() {
49 public void execute(Object columnName) {
50 throw new InvalidPrimaryKeyColumnName((String) columnName);
51 }
52 });
53 }
54
55 private Set resolveUniqueColumns() {
56 return resolveColumnNames(uniqueColumnNames, new Closure() {
57 public void execute(Object columnName) {
58 throw new InvalidUniqueColumnName((String) columnName);
59 }
60 });
61 }
62
63 private Set resolveColumnNames(Set columnNames, Closure failedClosure) {
64 Set columnSpecifications = new HashSet();
65
66 Iterator iter = columnNames.iterator();
67 while (iter.hasNext()) {
68 String columnName = (String) iter.next();
69
70 ColumnSpecification columnSpecification = findColumnNamed(columnName);
71 if (columnSpecification == null) {
72 failedClosure.equals(columnName);
73 }
74
75 columnSpecifications.add(columnSpecification);
76 }
77
78 return columnSpecifications;
79 }
80
81 private ColumnSpecification findColumnNamed(String primaryKeyColumnName) {
82
83 return (ColumnSpecification) CollectionUtils.find(columns, PredicateUtils
84 .invokerPredicate("isNamed",
85 new Class[] { String.class },
86 new Object[] { primaryKeyColumnName }));
87 }
88
89 public TableSchemaBuilder addColumn(ColumnSpecification columnSpecification) {
90 columns.add(columnSpecification);
91 return this;
92 }
93
94 public TableSchemaBuilder addPrimaryKeyConstraintTo(String columnName) {
95 primaryKeyColumnNames.add(columnName);
96 return this;
97 }
98
99 public TableSchemaBuilder addUniqueConstraintTo(String columnName) {
100 uniqueColumnNames.add(columnName);
101 return this;
102 }
103 }