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

Quick Search    Search Deep

Source code: org/objectstyle/cayenne/project/validator/ObjRelationshipValidator.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.project.validator;
57  
58  import java.util.Iterator;
59  import java.util.List;
60  
61  import org.objectstyle.cayenne.map.DbAttributePair;
62  import org.objectstyle.cayenne.map.DbEntity;
63  import org.objectstyle.cayenne.map.DbRelationship;
64  import org.objectstyle.cayenne.map.DeleteRule;
65  import org.objectstyle.cayenne.map.ObjEntity;
66  import org.objectstyle.cayenne.map.ObjRelationship;
67  import org.objectstyle.cayenne.project.ProjectPath;
68  import org.objectstyle.cayenne.util.Util;
69  
70  /**
71   * @author Andrei Adamchik
72   */
73  public class ObjRelationshipValidator extends TreeNodeValidator {
74  
75      /**
76       * Constructor for ObjRelationshipValidator.
77       */
78      public ObjRelationshipValidator() {
79          super();
80      }
81  
82      public void validateObject(ProjectPath path, Validator validator) {
83          ObjRelationship rel = (ObjRelationship) path.getObject();
84          if (Util.isEmptyString(rel.getName())) {
85              validator.registerError("Unnamed ObjRelationship.", path);
86          }
87          // check if there are attributes having the same name
88          else if (rel.getSourceEntity().getAttribute(rel.getName()) != null) {
89              validator.registerWarning(
90                  "ObjRelationship has the same name as one of ObjAttributes",
91                  path);
92          }
93  
94          if (rel.getTargetEntity() == null) {
95              validator.registerError("ObjRelationship has no target entity.", path);
96          }
97          else {
98              // check for missing DbRelationship mappings
99              List dbRels = rel.getDbRelationships();
100             if (dbRels.size() == 0) {
101                 validator.registerWarning(
102                     "ObjRelationship has no DbRelationship mapping.",
103                     path);
104             }
105             else {
106                 DbEntity expectedSrc = ((ObjEntity) rel.getSourceEntity()).getDbEntity();
107                 DbEntity expectedTarget =
108                     ((ObjEntity) rel.getTargetEntity()).getDbEntity();
109 
110                 if (((DbRelationship) dbRels.get(0)).getSourceEntity() != expectedSrc
111                     || ((DbRelationship) dbRels.get(dbRels.size() - 1)).getTargetEntity()
112                         != expectedTarget) {
113                     validator.registerWarning(
114                         "ObjRelationship has incomplete DbRelationship mapping.",
115                         path);
116                 }
117             }
118         }
119 
120         //Disallow a Nullify delete rule where the relationship is toMany and the 
121         //foreign key attributes are mandatory.
122         if (rel.isToMany()
123             && !rel.isFlattened()
124             && (rel.getDeleteRule() == DeleteRule.NULLIFY)) {
125             ObjRelationship inverse = rel.getReverseRelationship();
126             if (inverse != null) {
127                 DbRelationship firstRel =
128                     (DbRelationship) inverse.getDbRelationships().get(0);
129                 Iterator attributePairIterator = firstRel.getJoins().iterator();
130                 while (attributePairIterator.hasNext()) {
131                     DbAttributePair pair = (DbAttributePair) attributePairIterator.next();
132                     if (pair.getSource().isMandatory()) {
133                         validator.registerWarning(
134                             "ObjRelationship "
135                                 + rel.getName()
136                                 + " has a Nullify delete rule and a mandatory reverse relationship ",
137                             path);
138                     }
139                 }
140             }
141         }
142     }
143 }