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/ContextSelectObserver.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  package org.objectstyle.cayenne.access.util;
57  
58  import java.util.ArrayList;
59  import java.util.Iterator;
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.access.DataContext;
66  import org.objectstyle.cayenne.map.DbEntity;
67  import org.objectstyle.cayenne.map.ObjEntity;
68  import org.objectstyle.cayenne.map.ObjRelationship;
69  import org.objectstyle.cayenne.query.PrefetchSelectQuery;
70  import org.objectstyle.cayenne.query.Query;
71  
72  /** 
73   * ContextSelectObserver is a SelectObserver that would 
74   * convert fetched data rows into objects of an associated 
75   * DataContext.
76   */
77  public class ContextSelectObserver extends SelectObserver {
78    protected DataContext context;
79  
80    /**
81     * Constructor for ContextSelectObserver.
82     * @param logLevel
83     */
84    public ContextSelectObserver(DataContext context, Level logLevel) {
85      super(logLevel);
86      this.context = context;
87    }
88  
89    /** 
90     * Overrides superclass behavior to convert each  data row to a real
91     * object. Registers objects with parent DataContext.
92     */
93    public void nextDataRows(Query query, List dataRows) {
94      List result = new ArrayList();
95      if (dataRows != null && dataRows.size() > 0) {
96        ObjEntity ent = context.getEntityResolver().lookupObjEntity(query);
97        
98        // do a sanity check on ObjEntity... if it's DbEntity has no PK defined,
99        // we can't build a valid ObjectId
100       DbEntity dbEntity = ent.getDbEntity();
101       if(dbEntity == null) {
102         throw new CayenneRuntimeException("ObjEntity '" + ent.getName() + "' has no DbEntity.");      
103       }
104       
105       if(dbEntity.getPrimaryKey().size() == 0) {
106         throw new CayenneRuntimeException("Can't create ObjectId for '" 
107         + ent.getName() 
108         + "'. Reason: DbEntity '" 
109         + dbEntity.getName() 
110         + "' has no Primary Key defined.");
111       }
112       
113       Iterator it = dataRows.iterator();
114       while (it.hasNext()) {
115         result.add(
116           context.objectFromDataRow(ent, (Map) it.next(), true));
117       }
118     }
119 
120     if (query instanceof PrefetchSelectQuery) {
121       PrefetchSelectQuery prefetchQuery = (PrefetchSelectQuery) query;
122       ObjRelationship theRelationship =
123         prefetchQuery.getSingleStepToManyRelationship();
124       if (theRelationship!= null) {
125         //The root query should have already executed, so we can get it's
126         // results
127         List rootQueryResults =
128           this.getResults(prefetchQuery.getRootQuery());
129         if (rootQueryResults == null) {
130           throw new CayenneRuntimeException(
131             "Prefetch query for path "
132               + prefetchQuery.getPrefetchPath()
133               + " executed before it's root query "
134               + prefetchQuery.getRootQuery());
135         }
136         this
137           .context
138           .getSnapshotManager()
139           .mergePrefetchResultsRelationships(
140           rootQueryResults, theRelationship, result);
141       }
142     }
143 
144     super.nextDataRows(query, result);
145   }
146 }