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/Validator.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.project.validator;
58  
59  import java.util.ArrayList;
60  import java.util.Iterator;
61  import java.util.List;
62  
63  import org.objectstyle.cayenne.conf.ConfigStatus;
64  import org.objectstyle.cayenne.project.Project;
65  import org.objectstyle.cayenne.project.ProjectPath;
66  
67  /** 
68   * Validator is used to validate Cayenne projects.
69   * 
70   * @author Andrei Adamchik
71   */
72  public class Validator {
73      protected Project project;
74      protected List validationResults = new ArrayList();
75      protected int maxSeverity;
76  
77      /**
78       * Creates a new validator initialized with the project.
79       * 
80       * @param project
81       */
82      public Validator(Project project) {
83          this.project = project;
84      }
85  
86      /**
87       * Initializes validator with the project loading config status.
88       * 
89       * @param project
90       * @param status
91       */
92      public Validator(Project project, ConfigStatus status) {
93          this(project);
94  
95          if (status.hasFailures()) {
96              ProjectPath path = new ProjectPath(project);
97  
98              Iterator it = status.getOtherFailures().iterator();
99              while (it.hasNext()) {
100                 registerError((String) it.next(), path);
101             }
102 
103             it = status.getFailedMaps().keySet().iterator();
104             while (it.hasNext()) {
105                 registerError("Map failed to load: " + it.next(), path);
106             }
107 
108             it = status.getFailedAdapters().keySet().iterator();
109             while (it.hasNext()) {
110                 registerError("Adapter failed to load: " + it.next(), path);
111             }
112 
113             it = status.getFailedDataSources().keySet().iterator();
114             while (it.hasNext()) {
115                 registerError("DataSource failed to load: " + it.next(), path);
116             }
117 
118             it = status.getFailedMapRefs().iterator();
119             while (it.hasNext()) {
120                 registerError("Map reference failed to load: " + it.next(), path);
121             }
122         }
123     }
124 
125     /**
126      * Returns the project.
127      * @return Project
128      */
129     public Project getProject() {
130         return project;
131     }
132 
133     /** 
134      * Resets internal state. 
135      * Called internally before starting validation.
136      */
137     protected void reset() {
138         if (validationResults != null) {
139             validationResults = new ArrayList();
140         }
141         maxSeverity = ValidationInfo.VALID;
142     }
143 
144     /** 
145      * Returns maximum severity level encountered during 
146      * the last validation run. 
147      */
148     public int getMaxSeverity() {
149         return maxSeverity;
150     }
151 
152     /**
153      * Registers validation result. 
154      * Increases internally stored max severity if 
155      * <code>result</code> parameter has a higher severity then the current value. 
156      * Leaves current value unchanged otherwise.
157      */
158     public void registerValidated(
159         int severity,
160         String message,
161         ProjectPath treeNodePath) {
162         ValidationInfo result = new ValidationInfo(severity, message, treeNodePath);
163         validationResults.add(result);
164         if (maxSeverity < severity) {
165             maxSeverity = severity;
166         }
167     }
168 
169     public void registerError(String message, ProjectPath treeNodePath) {
170         registerValidated(ValidationInfo.ERROR, message, treeNodePath);
171     }
172 
173     public void registerWarning(String message, ProjectPath treeNodePath) {
174         registerValidated(ValidationInfo.WARNING, message, treeNodePath);
175     }
176 
177     /** Return collection of ValidationInfo objects from last validation. */
178     public List validationResults() {
179         return validationResults;
180     }
181 
182     /** 
183      * Validates all project elements.
184      * 
185      * @return ValidationInfo.VALID if no errors were found, 
186      * or an error code of the error with the highest severity 
187      * if there were errors.
188      */
189     public synchronized int validate() {
190         return validate(project.treeNodes());
191     }
192 
193   /** 
194    * Validates a set of tree nodes passed as an iterator.
195    * 
196    * @return ValidationInfo.VALID if no errors were found, 
197    * or an error code of the error with the highest severity 
198    * if there were errors.
199    */
200     public synchronized int validate(Iterator treeNodes) {
201         reset();
202 
203         while (treeNodes.hasNext()) {
204             TreeNodeValidator.validate((ProjectPath) treeNodes.next(), this);
205         }
206 
207         return getMaxSeverity();
208     }
209 }