View Javadoc

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          // TODO modelar el table constraint (ahora no de hace nada con el
43          // constraint de UNIQUE)
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          // quiero el detect y las clasuras de Smalltalk... grrrr!
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 }