001: //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/trunk/src/org/deegree/io/datastore/schema/TableRelation.java $
002: /*---------------- FILE HEADER ------------------------------------------
003:
004: This file is part of deegree.
005: Copyright (C) 2001-2008 by:
006: EXSE, Department of Geography, University of Bonn
007: http://www.giub.uni-bonn.de/deegree/
008: lat/lon GmbH
009: http://www.lat-lon.de
010:
011: This library is free software; you can redistribute it and/or
012: modify it under the terms of the GNU Lesser General Public
013: License as published by the Free Software Foundation; either
014: version 2.1 of the License, or (at your option) any later version.
015:
016: This library is distributed in the hope that it will be useful,
017: but WITHOUT ANY WARRANTY; without even the implied warranty of
018: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
019: Lesser General Public License for more details.
020:
021: You should have received a copy of the GNU Lesser General Public
022: License along with this library; if not, write to the Free Software
023: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
024:
025: Contact:
026:
027: Andreas Poth
028: lat/lon GmbH
029: Aennchenstraße 19
030: 53177 Bonn
031: Germany
032: E-Mail: poth@lat-lon.de
033:
034: Prof. Dr. Klaus Greve
035: Department of Geography
036: University of Bonn
037: Meckenheimer Allee 166
038: 53115 Bonn
039: Germany
040: E-Mail: greve@giub.uni-bonn.de
041:
042: ---------------------------------------------------------------------------*/
043: package org.deegree.io.datastore.schema;
044:
045: import org.deegree.io.datastore.DatastoreTransaction;
046: import org.deegree.io.datastore.idgenerator.IdGenerationException;
047: import org.deegree.io.datastore.idgenerator.IdGenerator;
048: import org.deegree.io.datastore.schema.content.MappingField;
049:
050: /**
051: * Describes a relation (join condition) between two database tables.
052: *
053: * @author <a href="mailto:schneider@lat-lon.de">Markus Schneider </a>
054: * @author last edited by: $Author: apoth $
055: *
056: * @version $Revision: 9342 $, $Date: 2007-12-27 04:32:57 -0800 (Thu, 27 Dec 2007) $
057: */
058: public class TableRelation {
059:
060: /**
061: * Used to represent the foreign key position.
062: */
063: public static enum FK_INFO {
064:
065: /**
066: * No foreign key information available (sufficient for read access).
067: */
068: noFKInfo,
069:
070: /**
071: * Foreign stored in 'To'-table, primary key in 'From'-table.
072: */
073: fkIsToField,
074:
075: /**
076: * Foreign stored in 'From'-table, primary key in 'To'-table.
077: */
078: fkIsFromField
079: }
080:
081: private MappingField[] fromFields;
082:
083: private MappingField[] toFields;
084:
085: private FK_INFO fkInfo;
086:
087: private IdGenerator idGenerator;
088:
089: /**
090: * Initializes a newly created <code>TableRelation</code> instance with the given
091: * parameters.
092: *
093: * @param fromFields
094: * @param toFields
095: * @param fkInfo
096: * @param idGenerator
097: */
098: public TableRelation(MappingField[] fromFields,
099: MappingField[] toFields, FK_INFO fkInfo,
100: IdGenerator idGenerator) {
101: if (fromFields.length < 1) {
102: throw new IllegalArgumentException(
103: "A relation between two tables must have at least one 'from' field.");
104: }
105: if (toFields.length < 1) {
106: throw new IllegalArgumentException(
107: "A relation between two tables must have at least one 'to' field.");
108: }
109: if (fromFields.length != toFields.length) {
110: throw new IllegalArgumentException(
111: "A relation between two tables must have the same number of 'from' and 'to' fields.");
112: }
113: this .fromFields = fromFields;
114: this .toFields = toFields;
115: this .fkInfo = fkInfo;
116: this .idGenerator = idGenerator;
117: }
118:
119: /**
120: * Returns the name of the table where the relation starts ('From'-table).
121: *
122: * @return the name of the table where the relation starts ('From'-table)
123: */
124: public String getFromTable() {
125: return fromFields[0].getTable();
126: }
127:
128: /**
129: * Returns the name of the table where the relation ends ('To'-table).
130: *
131: * @return the name of the table where the relation ends ('To'-table)
132: */
133: public String getToTable() {
134: return toFields[0].getTable();
135: }
136:
137: /**
138: * Returns the {@link MappingField}s that constitute the key in the 'From'-table.
139: *
140: * @return the MappingFields that constitute the key in the 'From'-table
141: */
142: public MappingField[] getFromFields() {
143: return this .fromFields;
144: }
145:
146: /**
147: * Returns the {@link MappingField}s that constitute the key in the 'To'-table.
148: *
149: * @return the MappingFields that constitute the key in the 'To'-table
150: */
151: public MappingField[] getToFields() {
152: return this .toFields;
153: }
154:
155: /**
156: * Returns the foreign key position.
157: *
158: * @return the foreign key position
159: */
160: public FK_INFO getFKInfo() {
161: return this .fkInfo;
162: }
163:
164: /**
165: * Returns whether the foreign key is stored in the 'From'-table.
166: *
167: * @return true, if foreign key information is available and foreign key is in 'From'-table,
168: * false otherwise
169: */
170: public boolean isFromFK() {
171: boolean isFromFK = false;
172: switch (this .fkInfo) {
173: case fkIsFromField: {
174: isFromFK = true;
175: break;
176: }
177: case fkIsToField: {
178: isFromFK = false;
179: break;
180: }
181: default: {
182: throw new RuntimeException(
183: "No foreign key information available for relation: "
184: + this );
185: }
186: }
187: return isFromFK;
188: }
189:
190: /**
191: * Returns the {@link IdGenerator} instance that may be used to generate new primary keys.
192: *
193: * @return IdGenerator instance that may be used to generate new primary keys
194: */
195: public IdGenerator getIdGenerator() {
196: return this .idGenerator;
197: }
198:
199: /**
200: * Returns a new primary key generated by the associated {@link IdGenerator}.
201: *
202: * @param ta
203: * @return a new primary key
204: * @throws IdGenerationException
205: */
206: public Object getNewPK(DatastoreTransaction ta)
207: throws IdGenerationException {
208: return this .idGenerator.getNewId(ta);
209: }
210:
211: @Override
212: public String toString() {
213: StringBuffer sb = new StringBuffer();
214: sb.append(getFromTable());
215: if (this .fkInfo == FK_INFO.fkIsFromField) {
216: sb.append(" (fk) ");
217: }
218: sb.append(" -> ");
219: sb.append(getToTable());
220: if (this .fkInfo == FK_INFO.fkIsToField) {
221: sb.append(" (fk) ");
222: }
223: sb.append(" (");
224: for (int i = 0; i < fromFields.length; i++) {
225: sb.append(fromFields[i]);
226: sb.append("=");
227: sb.append(toFields[i]);
228: if (i != fromFields.length - 1) {
229: sb.append(" AND ");
230: }
231: }
232: sb.append(")");
233: return sb.toString();
234: }
235: }
|