Ignore:
Timestamp:
02/04/10 21:56:24 (2 years ago)
Author:
kasper
Message:
 
File:
1 copied

Legend:

Unmodified
Added
Removed
  • MetadataBeans/trunk/src/main/java/org/eobjects/metamodel/schema/ImmutableRelationship.java

    r886 r887  
    2222import org.apache.commons.lang.builder.EqualsBuilder; 
    2323import org.apache.commons.lang.builder.HashCodeBuilder; 
    24  
    25 /** 
    26  * Represents a relationship between two tables where one set of columns is the 
    27  * primary key, and another set is the foreign key. Relationship is unlike most 
    28  * of the MetaModel an immutable type. The immutability help ensure integrity of 
    29  * object-relationships. To create relationsips use the 
    30  * <code>createRelationship</code> method and to remove them use the 
    31  * <code>remove</remove> method. 
    32  *  
    33  * @see Table 
    34  * @see Column 
    35  */ 
    36 public class Relationship implements Serializable, Comparable<Relationship> { 
     24import org.apache.commons.lang.builder.ToStringBuilder; 
     25import org.apache.commons.lang.builder.ToStringStyle; 
     26 
     27public class ImmutableRelationship implements Serializable, Relationship { 
    3728 
    3829        private static final long serialVersionUID = 238786848828528822L; 
    39         private Table _primaryTable; 
     30        private MutableTable _primaryTable; 
    4031        private Column[] _primaryColumns; 
    41         private Table _foreignTable; 
     32        private MutableTable _foreignTable; 
    4233        private Column[] _foreignColumns; 
    4334 
     
    5445        public static Relationship createRelationship(Column[] primaryColumns, 
    5546                        Column[] foreignColumns) { 
    56                 Table primaryTable = checkSameTable(primaryColumns); 
    57                 Table foreignTable = checkSameTable(foreignColumns); 
    58                 Relationship relation = new Relationship(primaryTable, primaryColumns, 
    59                                 foreignTable, foreignColumns); 
     47                MutableTable primaryTable = checkSameTable(primaryColumns); 
     48                MutableTable foreignTable = checkSameTable(foreignColumns); 
     49                ImmutableRelationship relation = new ImmutableRelationship(primaryTable, 
     50                                primaryColumns, foreignTable, foreignColumns); 
    6051                primaryTable.addRelationship(relation); 
    6152 
     
    7465        } 
    7566 
    76         private static Table checkSameTable(Column[] columns) { 
     67        private static MutableTable checkSameTable(Column[] columns) { 
    7768                if (columns == null || columns.length == 0) { 
    7869                        throw new IllegalArgumentException( 
     
    9384                        } 
    9485                } 
    95                 return table; 
    96         } 
    97  
    98         public void remove() { 
     86                if (table instanceof MutableTable) { 
     87                        return (MutableTable) table; 
     88                } 
     89                throw new IllegalStateException( 
     90                                "Can only create MutableRelationship for MutableTables"); 
     91        } 
     92 
     93        private void remove() { 
    9994                _primaryTable.removeRelationship(this); 
    10095                _foreignTable.removeRelationship(this); 
     
    108103         * Prevent external instantiation 
    109104         */ 
    110         private Relationship(Table primaryTable, Column[] primaryColumns, 
    111                         Table foreignTable, Column[] foreignColumns) { 
     105        private ImmutableRelationship(MutableTable primaryTable, 
     106                        Column[] primaryColumns, MutableTable foreignTable, 
     107                        Column[] foreignColumns) { 
    112108                _primaryTable = primaryTable; 
    113109                _primaryColumns = primaryColumns; 
     
    116112        } 
    117113 
     114        @Override 
    118115        public Table getPrimaryTable() { 
    119116                return _primaryTable; 
    120117        } 
    121118 
     119        @Override 
    122120        public Column[] getPrimaryColumns() { 
    123121                return _primaryColumns; 
    124122        } 
    125123 
     124        @Override 
    126125        public Table getForeignTable() { 
    127126                return _foreignTable; 
    128127        } 
    129128 
     129        @Override 
    130130        public Column[] getForeignColumns() { 
    131131                return _foreignColumns; 
     
    134134        @Override 
    135135        public String toString() { 
    136                 StringBuilder sb = new StringBuilder(); 
    137                 sb.append("Relationship["); 
    138                 sb.append("primaryTable=" + _primaryTable.getName()); 
     136                StringBuilder sb = new StringBuilder("{"); 
    139137                Column[] columns = getPrimaryColumns(); 
    140                 sb.append(",primaryColumns={"); 
    141138                for (int i = 0; i < columns.length; i++) { 
    142139                        if (i != 0) { 
     
    146143                } 
    147144                sb.append("}"); 
    148                 sb.append(",foreignTable=" + _foreignTable.getName()); 
     145                String primaryColumns = sb.toString(); 
     146 
     147                sb = new StringBuilder("{"); 
    149148                columns = getForeignColumns(); 
    150                 sb.append(",foreignColumns={"); 
    151149                for (int i = 0; i < columns.length; i++) { 
    152150                        if (i != 0) { 
     
    156154                } 
    157155                sb.append("}"); 
    158                 sb.append("]"); 
    159                 return sb.toString(); 
    160         } 
    161  
     156                String foreignColumns = sb.toString(); 
     157                 
     158                return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE) 
     159                                .append("primaryTable", _primaryTable.getName()).append( 
     160                                                "primaryColumns", primaryColumns).append( 
     161                                                "foreignTable", _foreignTable.getName()).append("foreignColumns", foreignColumns).toString(); 
     162        } 
     163 
     164        @Override 
    162165        public int compareTo(Relationship that) { 
    163166                CompareToBuilder ctb = new CompareToBuilder(); 
     
    198201         *         columns as a part of the relation 
    199202         */ 
     203        @Override 
    200204        public boolean containsColumnPair(Column pkColumn, Column fkColumn) { 
    201205                if (pkColumn != null && fkColumn != null) { 
     
    209213                return false; 
    210214        } 
     215 
     216        public static void remove(Relationship relationship) { 
     217                ((ImmutableRelationship) relationship).remove(); 
     218        } 
    211219} 
Note: See TracChangeset for help on using the changeset viewer.