Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: org/objectstyle/cayenne/access/util/SelectObserver.java


1   /* ====================================================================
2    * 
3    * The ObjectStyle Group Software License, Version 1.0 
4    *
5    * Copyright (c) 2002-2003 The ObjectStyle Group 
6    * and individual authors of the software.  All rights reserved.
7    *
8    * Redistribution and use in source and binary forms, with or without
9    * modification, are permitted provided that the following conditions
10   * are met:
11   *
12   * 1. Redistributions of source code must retain the above copyright
13   *    notice, this list of conditions and the following disclaimer. 
14   *
15   * 2. Redistributions in binary form must reproduce the above copyright
16   *    notice, this list of conditions and the following disclaimer in
17   *    the documentation and/or other materials provided with the
18   *    distribution.
19   *
20   * 3. The end-user documentation included with the redistribution, if
21   *    any, must include the following acknowlegement:  
22   *       "This product includes software developed by the 
23   *        ObjectStyle Group (http://objectstyle.org/)."
24   *    Alternately, this acknowlegement may appear in the software itself,
25   *    if and wherever such third-party acknowlegements normally appear.
26   *
27   * 4. The names "ObjectStyle Group" and "Cayenne" 
28   *    must not be used to endorse or promote products derived
29   *    from this software without prior written permission. For written 
30   *    permission, please contact andrus@objectstyle.org.
31   *
32   * 5. Products derived from this software may not be called "ObjectStyle"
33   *    nor may "ObjectStyle" appear in their names without prior written
34   *    permission of the ObjectStyle Group.
35   *
36   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
37   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
38   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
39   * DISCLAIMED.  IN NO EVENT SHALL THE OBJECTSTYLE GROUP OR
40   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
42   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
43   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
44   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
45   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
46   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
47   * SUCH DAMAGE.
48   * ====================================================================
49   *
50   * This software consists of voluntary contributions made by many
51   * individuals on behalf of the ObjectStyle Group.  For more
52   * information on the ObjectStyle Group, please see
53   * <http://objectstyle.org/>.
54   *
55   */
56  
57  package org.objectstyle.cayenne.access.util;
58  
59  import java.util.HashMap;
60  import java.util.List;
61  import java.util.Map;
62  
63  import org.apache.log4j.Level;
64  import org.objectstyle.cayenne.CayenneRuntimeException;
65  import org.objectstyle.cayenne.query.Query;
66  import org.objectstyle.cayenne.util.Util;
67  
68  /** 
69   * OperationObserver that accumulates select query results provided 
70   * by callback methods. Later the results can be retrieved
71   * via different <code>getResults</code> methods. 
72   * 
73   * <p>This class can serve as a helper for classes that work with 
74   * DataNode directly, bypassing DataContext. Also it is used by DataContext
75   * to implement "data rows" functionality - retrieving data without 
76   * instantiating and registering DataObjects.
77   * </p>
78   * 
79   * <p>If exceptions happen during the execution, they are immediately rethrown.
80   * </p>
81   * 
82   * <p><i>For more information see <a href="../../../../../../userguide/index.html"
83   * target="_top">Cayenne User Guide.</a></i></p>
84   * 
85   *  @author Andrei Adamchik
86   */
87  public class SelectObserver extends DefaultOperationObserver {
88    protected Map results = new HashMap();
89    protected int selectCount;
90  
91    public SelectObserver() {}
92    
93    public SelectObserver(Level logLevel) {
94      super.setLoggingLevel(logLevel);
95    }
96  
97    /** 
98     * Returns a count of select queries that returned results
99     * since the last time "clear" was called, or since this object
100    * was created.
101    */
102   public int getSelectCount() {
103     return selectCount;
104   }
105 
106   /** 
107    * Returns a list of result snapshots for the specified query,
108    * or null if this query has never produced any results.
109    */
110   public List getResults(Query q) {
111     return (List) results.get(q);
112   }
113 
114   /** 
115    * Returns query results accumulated during query execution with this
116    * object as an operation observer. 
117    */
118   public Map getResults() {
119     return results;
120   }
121 
122   /** Clears fetched objects stored in an internal list. */
123   public void clear() {
124     selectCount = 0;
125     results.clear();
126   }
127 
128   /** 
129    * Stores all objects in <code>dataRows</code> in an internal
130    * result list. 
131    */
132   public void nextDataRows(Query query, List dataRows) {
133     super.nextDataRows(query, dataRows);
134     if (dataRows != null) {
135       results.put(query, dataRows);
136     }
137 
138     selectCount++;
139   }
140 
141   /** 
142    * Overrides superclass implementation to rethrow an exception
143    *  immediately. 
144    */
145   public void nextQueryException(Query query, Exception ex) {
146     super.nextQueryException(query, ex);
147     throw new CayenneRuntimeException("Query exception.", Util.unwindException(ex));
148   }
149 
150   /** 
151    * Overrides superclass implementation to rethrow an exception
152    * immediately. 
153    */
154   public void nextGlobalException(Exception ex) {
155     super.nextGlobalException(ex);
156     throw new CayenneRuntimeException("Global exception.", Util.unwindException(ex));
157   }
158 }