001    package com.sptci.rwt;
002    
003    import java.util.Collection;
004    import java.util.Collections;
005    import java.util.Map;
006    import java.util.LinkedHashMap;
007    
008    /**
009     * A metadata object that represents foreign key constraint types.
010     *
011     * <p>&copy; Copyright 2007 <a href='http://sptci.com/' target='_new'>Sans Pareil Technologies, Inc.</a></p>
012     * @author Rakesh Vidyadharan 2007-09-26
013     * @version $Id: ForeignKeyMetaData.java 4123 2008-05-25 21:49:01Z rakesh $
014     */
015    public class ForeignKeyMetaData extends KeyMetaData
016    {
017      /**
018       * The enumeration of <code>UPDATE_RULE</code> and <code>DELETE_RULE</code>
019       * values for keys.
020       */
021      public enum Rule { NoAction, Cascade, SetNull, SetDefault, Restrict };
022    
023      /**
024       * The enumeration of <code>deferrability</code> for keys.
025       */
026      public enum Deferrability
027        { InitiallyDeferred, InitiallyImmediate, NotDeferrable };
028    
029      /**
030       * The schema in which the table whose column this foreign key references
031       * exists.
032       */
033      private String referencedSchema;
034    
035      /**
036       * The table whose column this foreign key references.
037       */
038      private String referencedTable;
039    
040      /**
041       * The columns that comprise this foreign key and the referenced columns.
042       * The map is defined as &lt;ColumnMetaData,String&gt; with the 
043       * <code>key</code> indicating the column on the table and the 
044       * <code>value</code> indicating the referenced column on {@link
045       * #referencedTable}.
046       */
047      private Map<ColumnMetaData,String> columnMappings =
048        new LinkedHashMap<ColumnMetaData,String>();
049    
050      /**
051       * The <code>UPDATE_RULE</code> for this key.
052       */
053      private Rule updateRule;
054    
055      /**
056       * The <code>DELETE_RULE</code> for this key.
057       */
058      private Rule deleteRule;
059    
060      /**
061       * The <code>DEFERRABILITY</code> of this key.
062       */
063      private Deferrability deferrability;
064      
065      /**
066       * Returns {@link #referencedTable}.
067       *
068       * @return The value/reference of/to referencedTable.
069       */
070      public String getReferencedTable()
071      {
072        return referencedTable;
073      }
074      
075      /**
076       * Returns {@link #referencedSchema}.
077       *
078       * @return The value/reference of/to referencedSchema.
079       */
080      public String getReferencedSchema()
081      {
082        return referencedSchema;
083      }
084      
085      /**
086       * Set {@link #referencedSchema}.
087       *
088       * @param referencedSchema The value to set.
089       */
090      protected void setReferencedSchema( final String referencedSchema )
091      {
092        this.referencedSchema = referencedSchema;
093      }
094      
095      /**
096       * Set {@link #referencedTable}.
097       *
098       * @param referencedTable The value to set.
099       */
100      protected void setReferencedTable( final String referencedTable )
101      {
102        this.referencedTable = referencedTable;
103      }
104      
105      /**
106       * Returns {@link #columns}.
107       *
108       * @return The value/reference of/to columns.
109       */
110      public Map<ColumnMetaData,String> getColumnMappings()
111      {
112        return Collections.unmodifiableMap( columnMappings );
113      }
114      
115      /**
116       * Set {@link #columns}.
117       *
118       * @see #setColumns
119       * @param columns The value to set.
120       */
121      protected void setColumnMappings( final Map<ColumnMetaData,String> columns )
122      {
123        this.columnMappings.clear();
124        this.columnMappings.putAll( columns );
125        setColumns( this.columnMappings.keySet() );
126      }
127    
128      /**
129       * Add the specified values to the {@link #columns} map.
130       *
131       * @see #setColumns
132       * @param cmd The column meta data key to add.
133       * @param column The referenced column name to add.
134       */
135      protected void addColumn( final ColumnMetaData cmd, final String column )
136      {
137        columnMappings.put( cmd, column );
138        setColumns( columnMappings.keySet() );
139      }
140      
141      /**
142       * Returns {@link #updateRule}.
143       *
144       * @return The value/reference of/to updateRule.
145       */
146      public String getUpdateRule()
147      {
148        return updateRule.toString();
149      }
150      
151      /**
152       * Set {@link #updateRule}.
153       *
154       * @param updateRule The value to set.
155       */
156      protected void setUpdateRule( final Rule updateRule )
157      {
158        this.updateRule = updateRule;
159      }
160      
161      /**
162       * Returns {@link #deleteRule}.
163       *
164       * @return The value/reference of/to deleteRule.
165       */
166      public String getDeleteRule()
167      {
168        return deleteRule.toString();
169      }
170      
171      /**
172       * Set {@link #deleteRule}.
173       *
174       * @param deleteRule The value to set.
175       */
176      protected void setDeleteRule( final Rule deleteRule )
177      {
178        this.deleteRule = deleteRule;
179      }
180      
181      /**
182       * Returns {@link #deferrability}.
183       *
184       * @return The value/reference of/to deferrability.
185       */
186      public String getDeferrability()
187      {
188        return deferrability.toString();
189      }
190      
191      /**
192       * Set {@link #deferrability}.
193       *
194       * @param deferrability The value to set.
195       */
196      protected void setDeferrability( final Deferrability deferrability )
197      {
198        this.deferrability = deferrability;
199      }
200    }