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

Quick Search    Search Deep

Source code: org/objectstyle/cayenne/util/CayenneMap.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.util;
57  
58  import java.util.Comparator;
59  import java.util.Iterator;
60  import java.util.Map;
61  import java.util.SortedMap;
62  
63  import org.apache.commons.collections.FastTreeMap;
64  
65  /**
66   * A <code>CayenneMap</code> is a specialized double-linked 
67   * ordered map class. Attempts to add objects using
68   * an already existing keys will result in 
69   * IllegalArgumentExceptions. 
70   * 
71   * <p>Normally CayenneMap is not subclassed directly,
72   * but is rather used as an instance variable within
73   * another class. Enclosing instance would set itself
74   * as a parent of this map.</p>
75   * 
76   * 
77   * @author Andrei Adamchik
78   */
79  public class CayenneMap extends FastTreeMap {
80      protected Object parent;
81  
82      /**
83       * Constructor for CayenneMap.
84       */
85      public CayenneMap(Object parent) {
86          this.parent = parent;
87      }
88  
89      /**
90       * Constructor for CayenneMap.
91       * @param c
92       */
93      public CayenneMap(Object parent, Comparator c) {
94          super(c);
95          this.parent = parent;
96      }
97  
98      /**
99       * Constructor for CayenneMap.
100      * @param m
101      */
102     public CayenneMap(Object parent, Map m) {
103         // !IMPORTANT - set parent before populating the map
104         this.parent = parent;
105         putAll(m);
106     }
107 
108     /**
109      * Constructor for CayenneMap.
110      * @param m
111      */
112     public CayenneMap(Object parent, SortedMap m) {
113         // !IMPORTANT - set parent before populating the map
114         this.parent = parent;
115         putAll(m);
116     }
117 
118     /** 
119      * Maps specified key-value pair. If value is a
120      * CayenneMapEntry, sets its parent to this map.
121      * 
122      * @see java.util.Map#put(Object, Object)
123      */
124     public Object put(Object key, Object value) {
125 
126         if (containsKey(key) && get(key) != value) {
127             // build descriptive failure message
128             StringBuffer message = new StringBuffer();
129             message.append("Attempt to insert duplicate key. [key '");
130             message.append(key);
131             message.append("'");
132 
133             if (parent instanceof CayenneMapEntry) {
134                 message.append(", parent '").append(
135                     ((CayenneMapEntry) parent).getName()).append(
136                     "'");
137             }
138 
139             if (value instanceof CayenneMapEntry) {
140                 message.append(", child '").append(
141                     ((CayenneMapEntry) value).getName()).append(
142                     "'");
143             }
144             message.append("]");
145 
146             throw new IllegalArgumentException(message.toString());
147         }
148 
149         if (value instanceof CayenneMapEntry) {
150             ((CayenneMapEntry) value).setParent(parent);
151         }
152 
153         super.put(key, value);
154         return null;
155     }
156 
157     /**
158      * @see java.util.Map#putAll(Map)
159      */
160     public void putAll(Map t) {
161         Iterator it = t.keySet().iterator();
162         while (it.hasNext()) {
163             Object key = it.next();
164             put(key, t.get(key));
165         }
166     }
167 
168     /**
169      * Returns the parent.
170      * @return Object
171      */
172     public Object getParent() {
173         return parent;
174     }
175 
176     /**
177      * Sets the parent.
178      * @param parent The parent to set
179      */
180     public void setParent(Object mapParent) {
181         this.parent = mapParent;
182     }
183 }