01: /**
02: * Objective Database Abstraction Layer (ODAL)
03: * Copyright (c) 2004, The ODAL Development Group
04: * All rights reserved.
05: * For definition of the ODAL Development Group please refer to LICENCE.txt file
06: *
07: * Distributable under LGPL license.
08: * See terms of license at gnu.org.
09: */package com.completex.objective.components.persistency;
10:
11: import com.completex.objective.util.StringUtil;
12:
13: /**
14: * Represents link by foreign key. Actual database foreign key is not required.
15: * Normally it will link parent object to child based on column indeces
16: *
17: * @author Gennady Krizhevsky
18: */
19: public class ChainedLink extends Link {
20:
21: /**
22: *
23: * @param query Query object with empty where clause. After ChainedLink is instantiated
24: * you can add extras to where clause.
25: * @param parentIndeces parent indeces which values are mapped to corresponding "this indeces"
26: * @param thisIndeces "this indeces" indeces of this link query's SingularResultFactory
27: * @param name link name - mandatory for PersistentObject trees
28: * @throws OdalRuntimePersistencyException if following condition is not satisfied:
29: * query != null && isEmpty(query.getWhere()) && query.getSingularResultFactory() != null
30: */
31: public ChainedLink(Query query, int[] parentIndeces,
32: int this Indeces[], String name) {
33: this (query, parentIndeces, this Indeces, name, 0);
34: }
35:
36: protected ChainedLink(Query query, int[] parentIndeces,
37: int this Indeces[], String name, int compoundIndex) {
38: super (query, parentIndeces, this Indeces, name);
39: chain(query, this Indeces, compoundIndex);
40: }
41:
42: public ChainedLink(Link source) {
43: super (source);
44: chain(source.getQuery(), this Indeces);
45: }
46:
47: protected void chain(Query query, int[] this Indeces) {
48: chain(query, this Indeces, 0);
49: }
50:
51: protected void chain(Query query, int[] this Indeces,
52: int compoundIndex) {
53: if (query != null && StringUtil.isEmpty(query.getWhere())
54: && query.getSingularResultFactory() != null) {
55: AbstractPersistentObject object = (AbstractPersistentObject) query
56: .getSingularResultFactory();
57: PersistentObject persistent;
58: if (object.compound()) {
59: persistent = object.compoundEntry(compoundIndex);
60: } else {
61: persistent = (PersistentObject) object;
62: }
63: for (int i = 0; i < this Indeces.length; i++) {
64: int columnIndex = this Indeces[i];
65: MetaColumn column = persistent.record().getColumn(
66: columnIndex);
67: String tableName = persistent.record().getTableName();
68: String columnName = column.getColumnName();
69: String fullColumnName = persistent.record().getColumn(
70: columnIndex).getFullColumnName();
71: query.addToChainedColumns(columnIndex, tableName,
72: columnName);
73: }
74: } else {
75: throw new OdalRuntimePersistencyException(
76: "Cannot create ChainedLink: following condition not "
77: + "satisfied : "
78: + "query != null && isEmpty(query.getWhere()) && query.getSingularResultFactory() != null");
79: }
80: }
81:
82: }
|