KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectstyle > cayenne > Fault


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;
57
58 import java.io.Serializable JavaDoc;
59 import java.util.List JavaDoc;
60
61 import org.objectstyle.cayenne.access.DataContext;
62 import org.objectstyle.cayenne.access.ToManyList;
63 import org.objectstyle.cayenne.conf.Configuration;
64 import org.objectstyle.cayenne.map.DbRelationship;
65 import org.objectstyle.cayenne.map.EntityResolver;
66 import org.objectstyle.cayenne.map.ObjEntity;
67 import org.objectstyle.cayenne.map.ObjRelationship;
68 import org.objectstyle.cayenne.query.RelationshipQuery;
69
70 /**
71  * Represents a placeholder for an unresolved relationship from a source object. Fault is
72  * resolved via {@link #resolveFault(DataObject,String)}. Depending on the type of fault
73  * it is resolved differently. Each type of fault is a singleton that can be obtained via
74  * corresponding static method.
75  *
76  * @since 1.1
77  * @author Andrei Adamchik
78  */

79
80 // TODO: serialization of faults should take into account the fact that
81
// they are used as singletons to avoid duplicate creation on deserialization
82
public abstract class Fault implements Serializable JavaDoc {
83
84     protected static final Fault toOneFault = new ToOneFault();
85     protected static final Fault toManyFault = new ToManyFault();
86
87     public static Fault getToOneFault() {
88         return toOneFault;
89     }
90
91     public static Fault getToManyFault() {
92         return toManyFault;
93     }
94
95     protected Fault() {
96     }
97
98     /**
99      * Returns an object for a given source object and relationship.
100      */

101     public abstract Object JavaDoc resolveFault(DataObject sourceObject, String JavaDoc relationshipName);
102
103     final static class ToManyFault extends Fault {
104
105         /**
106          * Resolves this fault to a List of objects.
107          */

108         public Object JavaDoc resolveFault(DataObject sourceObject, String JavaDoc relationshipName) {
109             return new ToManyList(sourceObject, relationshipName);
110         }
111     }
112
113     final static class ToOneFault extends Fault {
114
115         /**
116          * Resolves this fault to a DataObject.
117          */

118         public Object JavaDoc resolveFault(DataObject sourceObject, String JavaDoc relationshipName) {
119             DataContext context = sourceObject.getDataContext();
120             EntityResolver resolver = context.getEntityResolver();
121
122             ObjEntity entity = resolver.lookupObjEntity(sourceObject);
123             ObjRelationship relationship = (ObjRelationship) entity
124                     .getRelationship(relationshipName);
125
126             // create HOLLOW object if we can, or do a fetch if we can't
127
// criteria that requires fully resolving an object are:
128

129             // 1. Target ObjectId can't be fully expressed using the values
130
// from source object snapshot or
131
// 2. Target object has subclasses, and it is not clear which class
132
// ro instantiate.
133

134             ObjEntity targetEntity = (ObjEntity) relationship.getTargetEntity();
135             if (relationship.isSourceIndependentFromTargetChange()) {
136
137                 // can't create HOLLOW, do a fetch
138

139                 RelationshipQuery query = new RelationshipQuery(
140                         sourceObject,
141                         relationship);
142                 List JavaDoc objects = context.performQuery(query);
143
144                 if (objects.isEmpty()) {
145                     return null;
146                 }
147                 else if (objects.size() == 1) {
148                     return objects.get(0);
149                 }
150                 else {
151                     throw new CayenneRuntimeException("Error resolving to-one fault. "
152                             + "More than one object found. "
153                             + "Fault entity: "
154                             + targetEntity.getName());
155                 }
156             }
157
158             // get ObjectId...
159
DbRelationship dbRel = (DbRelationship) relationship
160                     .getDbRelationships()
161                     .get(0);
162             Class JavaDoc targetClass = targetEntity.getJavaClass(Configuration
163                     .getResourceLoader());
164             ObjectId id = context.getObjectStore().getSnapshot(
165                     sourceObject.getObjectId(),
166                     context).createTargetObjectId(targetClass, dbRel);
167
168             if (id == null) {
169                 return null;
170             }
171
172
173             if (resolver.lookupInheritanceTree(targetEntity) != null) {
174                 // this should find a correct subclass if we have inheritance case....
175
return DataObjectUtils.objectForPK(context, id);
176             }
177             else {
178                 return context.registeredObject(id);
179             }
180         }
181
182     }
183 }
Popular Tags