KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectstyle > cayenne > access > trans > QueryAssembler


1 /* ====================================================================
2  *
3  * The ObjectStyle Group Software License, version 1.1
4  * ObjectStyle Group - http://objectstyle.org/
5  *
6  * Copyright (c) 2002-2005, Andrei (Andrus) Adamchik and individual authors
7  * of the software. All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * 1. Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  *
16  * 2. Redistributions in binary form must reproduce the above copyright
17  * notice, this list of conditions and the following disclaimer in
18  * the documentation and/or other materials provided with the
19  * distribution.
20  *
21  * 3. The end-user documentation included with the redistribution, if any,
22  * must include the following acknowlegement:
23  * "This product includes software developed by independent contributors
24  * and hosted on ObjectStyle Group web site (http://objectstyle.org/)."
25  * Alternately, this acknowlegement may appear in the software itself,
26  * if and wherever such third-party acknowlegements normally appear.
27  *
28  * 4. The names "ObjectStyle Group" and "Cayenne" must not be used to endorse
29  * or promote products derived from this software without prior written
30  * permission. For written permission, email
31  * "andrus at objectstyle dot org".
32  *
33  * 5. Products derived from this software may not be called "ObjectStyle"
34  * or "Cayenne", nor may "ObjectStyle" or "Cayenne" appear in their
35  * names without prior written permission.
36  *
37  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
38  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
39  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
40  * DISCLAIMED. IN NO EVENT SHALL THE OBJECTSTYLE GROUP OR
41  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
43  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
44  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
45  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
46  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
47  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
48  * SUCH DAMAGE.
49  * ====================================================================
50  *
51  * This software consists of voluntary contributions made by many
52  * individuals and hosted on ObjectStyle Group web site. For more
53  * information on the ObjectStyle Group, please see
54  * <http://objectstyle.org/>.
55  */

56 package org.objectstyle.cayenne.access.trans;
57
58 import java.sql.PreparedStatement JavaDoc;
59 import java.util.ArrayList JavaDoc;
60 import java.util.List JavaDoc;
61
62 import org.apache.log4j.Level;
63 import org.objectstyle.cayenne.access.QueryLogger;
64 import org.objectstyle.cayenne.access.QueryTranslator;
65 import org.objectstyle.cayenne.map.DbAttribute;
66 import org.objectstyle.cayenne.map.DbEntity;
67 import org.objectstyle.cayenne.map.DbRelationship;
68
69 /**
70  * Abstract superclass of Query translators.
71  *
72  * @author Andrei Adamchik
73  */

74 public abstract class QueryAssembler extends QueryTranslator {
75     /** PreparedStatement values. */
76     protected List JavaDoc values = new ArrayList JavaDoc();
77
78     /**
79      * PreparedStatement attributes matching entries in <code>values</code>
80      * list.
81      */

82     protected List JavaDoc attributes = new ArrayList JavaDoc();
83
84     /** Processes a join being added. */
85     public abstract void dbRelationshipAdded(DbRelationship dbRel);
86
87     /**
88      * Translates query into sql string. This is a workhorse
89      * method of QueryAssembler. It is called internally from
90      * <code>createStatement</code>. Usually there is no need
91      * to invoke it explicitly.
92      */

93     public abstract String JavaDoc createSqlString() throws Exception JavaDoc;
94
95     public String JavaDoc aliasForTable(DbEntity ent, DbRelationship rel) {
96         return aliasForTable(ent); //Default implementation
97
}
98
99     /**
100      * Returns a name that can be used as column alias.
101      * This can be one of the following:
102      * <ul>
103      * <li>an alias for this table, if it uses aliases</li>
104      * <li>a fully qualified table name, if not.</li>
105      * </ul>
106      *
107      * CayenneRuntimeException is thrown if a table alias
108      * can not be created.
109      */

110     public abstract String JavaDoc aliasForTable(DbEntity dbEnt);
111
112     /** Returns <code>true</code> if table aliases are supported.
113       * Default implementation returns false. */

114     public boolean supportsTableAliases() {
115         return false;
116     }
117
118     /** Registers <code>anObject</code> as a PreparedStatement paramter.
119      *
120      * @param anObject object that represents a value of DbAttribute
121      * @param dbAttr DbAttribute being processed.
122      */

123     public void addToParamList(DbAttribute dbAttr, Object JavaDoc anObject) {
124         attributes.add(dbAttr);
125         values.add(anObject);
126     }
127
128     /** Translates internal query into PreparedStatement. */
129     public PreparedStatement JavaDoc createStatement(Level logLevel) throws Exception JavaDoc {
130         long t1 = System.currentTimeMillis();
131         String JavaDoc sqlStr = createSqlString();
132         QueryLogger.logQuery(
133             logLevel,
134             sqlStr,
135             values,
136             System.currentTimeMillis() - t1);
137         PreparedStatement JavaDoc stmt = connection.prepareStatement(sqlStr);
138         initStatement(stmt);
139         return stmt;
140     }
141
142     /**
143      * Initializes prepared statements with collected parameters.
144      * Called internally from "createStatement". Cayenne users
145      * shouldn't normally call it directly.
146      */

147     protected void initStatement(PreparedStatement JavaDoc stmt) throws Exception JavaDoc {
148         if (values != null && values.size() > 0) {
149             int len = values.size();
150             for (int i = 0; i < len; i++) {
151                 Object JavaDoc val = values.get(i);
152
153                 DbAttribute attr = (DbAttribute) attributes.get(i);
154
155                 // null DbAttributes are a result of inferior qualifier processing
156
// (qualifier can't map parameters to DbAttributes and therefore
157
// only supports standard java types now)
158
// hence, a special moronic case here:
159
if (attr == null) {
160                     stmt.setObject(i + 1, val);
161                 } else {
162                     int type = attr.getType();
163                     int precision = attr.getPrecision();
164                     adapter.bindParameter(stmt, val, i + 1, type, precision);
165                 }
166             }
167         }
168     }
169 }
Popular Tags