KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectstyle > cayenne > access > DataContextSelectAction


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
57 package org.objectstyle.cayenne.access;
58
59 import java.util.Collections JavaDoc;
60 import java.util.List JavaDoc;
61
62 import org.objectstyle.cayenne.CayenneRuntimeException;
63 import org.objectstyle.cayenne.ObjectFactory;
64 import org.objectstyle.cayenne.access.util.SelectObserver;
65 import org.objectstyle.cayenne.map.ObjEntity;
66 import org.objectstyle.cayenne.query.GenericSelectQuery;
67
68 /**
69  * A DataContext helper that handles select query execution.
70  *
71  * @since 1.2
72  * @author Andrei Adamchik
73  */

74 class DataContextSelectAction {
75
76     DataContext context;
77
78     DataContextSelectAction(DataContext context) {
79         this.context = context;
80     }
81
82     List JavaDoc performQuery(GenericSelectQuery query) {
83         return performQuery(query, query.getName(), query.isRefreshingObjects());
84     }
85
86     List JavaDoc performQuery(GenericSelectQuery query, String JavaDoc cacheKey, boolean refreshCache) {
87
88         // check if result pagination is requested
89
// let a list handle fetch in this case
90
if (query.getPageSize() > 0) {
91             return new IncrementalFaultList(context, query);
92         }
93
94         boolean localCache = GenericSelectQuery.LOCAL_CACHE
95                 .equals(query.getCachePolicy());
96         boolean sharedCache = GenericSelectQuery.SHARED_CACHE.equals(query
97                 .getCachePolicy());
98         boolean useCache = localCache || sharedCache;
99
100         String JavaDoc name = query.getName();
101
102         // sanity check
103
if (useCache && name == null) {
104             throw new CayenneRuntimeException(
105                     "Caching of unnamed queries is not supported.");
106         }
107
108         // get results from cache...
109
if (!refreshCache && useCache) {
110             List JavaDoc results = null;
111
112             if (localCache) {
113                 // results should have been stored as rows or objects when
114
// they were originally cached... do no conversions now
115
results = context.getObjectStore().getCachedQueryResult(cacheKey);
116             }
117             else if (sharedCache) {
118
119                 List JavaDoc rows = context
120                         .getObjectStore()
121                         .getDataRowCache()
122                         .getCachedSnapshots(cacheKey);
123                 if (rows != null) {
124
125                     // decorate shared cached lists with immutable list to avoid messing
126
// up the cache
127
if (rows.size() == 0) {
128                         results = Collections.EMPTY_LIST;
129                     }
130                     else if (query.isFetchingDataRows()) {
131                         results = Collections.unmodifiableList(rows);
132                     }
133                     else {
134                         ObjEntity root = context.getEntityResolver().lookupObjEntity(
135                                 query);
136                         results = context.objectsFromDataRows(root, rows, query
137                                 .isRefreshingObjects(), query.isResolvingInherited());
138                     }
139                 }
140             }
141
142             if (results != null) {
143                 return results;
144             }
145         }
146
147         // must fetch...
148
SelectObserver observer = new SelectObserver(query.getLoggingLevel());
149         context.performQueries(Collections.singleton(query), observer);
150
151         List JavaDoc results;
152
153         if (query.isFetchingDataRows()) {
154             results = observer.getResults(query);
155         }
156         else {
157             ObjectFactory factory = new DataContextObjectFactory(context, query
158                     .isRefreshingObjects(), query.isResolvingInherited());
159             ObjEntity rootEntity = context.getEntityResolver().lookupObjEntity(query);
160             results = observer.getResultsAsObjects(factory, rootEntity, query);
161         }
162
163         // cache results if needed
164
if (useCache) {
165             if (localCache) {
166                 context.getObjectStore().cacheQueryResult(cacheKey, results);
167             }
168             else if (sharedCache) {
169                 context.getObjectStore().getDataRowCache().cacheSnapshots(
170                         cacheKey,
171                         observer.getResults(query));
172             }
173         }
174
175         return results;
176     }
177 }
Popular Tags