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/RelationshipFault.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.io.Serializable;
59  import java.util.List;
60  
61  import org.objectstyle.cayenne.CayenneRuntimeException;
62  import org.objectstyle.cayenne.DataObject;
63  import org.objectstyle.cayenne.access.DataContext;
64  import org.objectstyle.cayenne.map.ObjEntity;
65  import org.objectstyle.cayenne.map.Relationship;
66  import org.objectstyle.cayenne.query.SelectQuery;
67  
68  /**
69   * This class represents a placeholder for an unresolved relationship from a source object.
70   * RelationshipFault is used in cases when it is impossible to create a HOLLOW object using 
71   * the information from the relationship source object. These cases include dependent to-one 
72   * relationships and flattened to-one relationships.
73   * 
74   * @since 1.0.1
75   * @author Andrei Adamchik
76   */
77  public class RelationshipFault implements Serializable {
78      protected String relationshipName;
79      protected DataObject sourceObject;
80  
81      public RelationshipFault(DataObject sourceObject, String relationshipName) {
82          this.relationshipName = relationshipName;
83          this.sourceObject = sourceObject;
84      }
85  
86      public String getRelationshipName() {
87          return relationshipName;
88      }
89  
90      public DataObject getSourceObject() {
91          return sourceObject;
92      }
93  
94      /**
95       * Resolves this fault to a DataObject.
96       */
97      public DataObject resolveToOne() {
98          DataContext context = sourceObject.getDataContext();
99          SelectQuery select =
100             QueryUtils.selectRelationshipObjects(context, sourceObject, relationshipName);
101         select.setFetchLimit(2);
102 
103         List objects = context.performQuery(select);
104 
105         if (objects.isEmpty()) {
106             return null;
107         }
108         else if (objects.size() == 1) {
109             return (DataObject) objects.get(0);
110         }
111         else {
112             ObjEntity entity = faultEntity();
113             String label = (entity != null) ? entity.getName() : "Unknown";
114             throw new CayenneRuntimeException(
115                 "Error resolving to-one fault. "
116                     + "More than one object found. "
117                     + "Fault entity: "
118                     + label);
119         }
120     }
121 
122     /**
123      * Determines ObjEntity of this fault.
124      */
125     protected ObjEntity faultEntity() {
126         DataContext context = sourceObject.getDataContext();
127         ObjEntity srcEntity = context.getEntityResolver().lookupObjEntity(sourceObject);
128         Relationship relationship = srcEntity.getRelationship(relationshipName);
129 
130         if (relationship == null) {
131             throw new IllegalStateException(
132                 "Non-existent relationship: " + relationshipName);
133         }
134 
135         return (ObjEntity) relationship.getTargetEntity();
136     }
137 }