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

Quick Search    Search Deep

Source code: org/objectstyle/cayenne/project/ProjectPath.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;
57  
58  /**
59   * Immutable holder of a selection path within a Cayenne project.
60   * Mostly used by various tools (CayenneModeler comes to mind) 
61   * to navigate Cayenne projects. Contains a number of convenience methods 
62   * to access path elements. 
63   * 
64   * <p>For instance, given a path 
65   * <code>Project -> DataMap -> ObjEntity -> ObjAttribute</code>,
66   * <code>getObject</code> will return ObjAttribute, <code>getObjectParent</code> -
67   * ObjEntity, <code>getRoot</code> - Project.</p>
68   *
69   * @author Andrei Adamchik
70   */
71  public class ProjectPath {
72      public static final Object[] EMPTY_PATH = new Object[0];
73  
74      protected Object[] path;
75  
76      public ProjectPath() {
77          path = EMPTY_PATH;
78      }
79  
80      /**
81       * Constructor for ProjectPath.
82       */
83      public ProjectPath(Object object) {
84          path = new Object[] { object };
85      }
86  
87      /**
88       * Constructor for ProjectPath.
89       */
90      public ProjectPath(Object[] path) {
91          this.path = (path != null) ? path : EMPTY_PATH;
92      }
93  
94      public Object[] getPath() {
95          return path;
96      }
97  
98      /**
99       * Scans path, looking for the first element that
100      * is an instanceof <code>aClass</code>.
101      */
102     public Object firstInstanceOf(Class aClass) {
103         for (int i = 0; i < path.length; i++) {
104             if (path[i] != null && aClass.isAssignableFrom(path[i].getClass())) {
105                 return path[i];
106             }
107         }
108 
109         return null;
110     }
111 
112     /**
113      * Returns an instance of the path, expanding this one by 
114      * appending an object at the end.
115      */
116     public ProjectPath appendToPath(Object object) {
117         if (object != null) {
118             Object[] newPath = new Object[path.length + 1];
119 
120             if (path.length > 0) {
121                 System.arraycopy(path, 0, newPath, 0, path.length);
122             }
123             newPath[path.length] = object;
124             return new ProjectPath(newPath);
125         } else {
126             return this;
127         }
128     }
129 
130     /**
131      * Returns the root or starting object of the path.
132      */
133     public Object getRoot() {
134         if (path.length == 0) {
135             return null;
136         }
137 
138         return path[0];
139     }
140 
141     /**
142      * Returns the last object in the path.
143      */
144     public Object getObject() {
145         if (path.length == 0) {
146             return null;
147         }
148 
149         // return last object
150         return path[path.length - 1];
151     }
152 
153     /**
154      * Returns an object corresponding to the parent node 
155      * of the node represented by the path. This is the object 
156      * next to last object in the path.
157      */
158     public Object getObjectParent() {
159         if (path.length == 0) {
160             return null;
161         }
162 
163         // return next to last object
164         return (path.length > 1) ? path[path.length - 2] : null;
165     }
166 
167     public String toString() {
168         StringBuffer buf = new StringBuffer();
169         buf.append("[ProjectPath: ");
170         for (int i = 0; i < path.length; i++) {
171             if (i > 0) {
172                 buf.append(", ");
173             }
174 
175             String token = (path[i] != null) ? path[i].getClass().getName() : "<null>";
176             buf.append(token);
177         }
178         buf.append("]");
179         return buf.toString();
180     }
181 }