View Javadoc
1   /**
2    * Redistribution and use of this software and associated documentation
3    * ("Software"), with or without modification, are permitted provided
4    * that the following conditions are met:
5    *
6    * 1. Redistributions of source code must retain copyright
7    *    statements and notices.  Redistributions must also contain a
8    *    copy of this document.
9    *
10   * 2. Redistributions in binary form must reproduce the
11   *    above copyright notice, this list of conditions and the
12   *    following disclaimer in the documentation and/or other
13   *    materials provided with the distribution.
14   *
15   * 3. The name "Exolab" must not be used to endorse or promote
16   *    products derived from this Software without prior written
17   *    permission of Intalio, Inc.  For written permission,
18   *    please contact info@exolab.org.
19   *
20   * 4. Products derived from this Software may not be called "Exolab"
21   *    nor may "Exolab" appear in their names without prior written
22   *    permission of Intalio, Inc. Exolab is a registered
23   *    trademark of Intalio, Inc.
24   *
25   * 5. Due credit should be given to the Exolab Project
26   *    (http://www.exolab.org/).
27   *
28   * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS
29   * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
30   * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
31   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
32   * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39   * OF THE POSSIBILITY OF SUCH DAMAGE.
40   *
41   * Copyright 1999 (C) Intalio, Inc. All Rights Reserved.
42   *
43   * $Id$
44   */
45  
46  package org.exolab.castor.mapping;
47  
48  import java.io.Serializable;
49  import java.util.HashMap;
50  import java.util.Map;
51  
52  /**
53   * The access mode for a class. This object is used by class
54   * descriptors to specify the access mode for a class.
55   * <p>
56   * In persistent storage each class is defined as having one of three
57   * access modes:
58   * <ul>
59   * <li>Read only
60   * <li>Shared (aka optimistic locking)
61   * <li>Exclusive (aka pessimistic locking)
62   * <li>DbLocked (database lock)
63   * </ul>
64   * Transactions typically access objects based on the specified access
65   * mode. A transaction may be requested to access any object as read
66   * only or exclusive, but may not access exclusive objects as shared.
67   *
68   * @author <a href="arkin@intalio.com">Assaf Arkin</a>
69   * @author <a href="mailto:ralf DOT joachim AT syscon DOT eu">Ralf Joachim</a>
70   * @version $Revision$ $Date: 2006-04-25 15:08:23 -0600 (Tue, 25 Apr 2006) $
71   */
72  public class AccessMode implements Cloneable, Comparable, Serializable {
73      //-------------------------------------------------------------------------
74      
75      /** SerialVersionUID */
76      private static final long serialVersionUID = -7113303922354626951L;
77  
78      private static final Map    IDS = new HashMap(7);
79      private static final Map    NAMES = new HashMap(7);
80      
81      //-------------------------------------------------------------------------
82  
83      /**
84       * Read only access. Objects can be read but are not made
85       * persistent and changes to objects are not reflected in
86       * persistent storage.
87       */
88      public static final AccessMode ReadOnly 
89          = new AccessMode((short) 0, "read-only");
90  
91      /**
92       * Shared access. Objects can be read by multiple concurrent
93       * transactions. Equivalent to optimistic locking.
94       */
95      public static final AccessMode Shared 
96          = new AccessMode((short) 1, "shared");
97  
98      /**
99       * Exclusive access. Objects can be access by a single transaction
100      * at any given time. Equivalent to pessimistic locking.
101      */
102     public static final AccessMode Exclusive 
103         = new AccessMode((short) 2, "exclusive");
104 
105     /**
106      * DbLocked access. Objects can be access by a single transaction
107      * at any given time, and a lock is acquired in the database.
108      */
109     public static final AccessMode DbLocked 
110         = new AccessMode((short) 3, "db-locked");
111 
112     //-------------------------------------------------------------------------
113 
114     /**
115      * Returns the access mode from the name. If <tt>accessMode</tt>
116      * is null, return the default access mode ({@link #Shared}).
117      * Otherwise returns the named access mode.
118      *
119      * @param accessMode The access mode name
120      * @return The access mode
121      */
122     public static AccessMode valueOf(final String accessMode) {
123         AccessMode mode = (AccessMode) NAMES.get(accessMode);
124         if (mode != null) {
125             return mode;
126         }
127         throw new IllegalArgumentException("Unrecognized access mode");
128     }
129 
130     public static AccessMode valueOf(final short accessMode) {
131         AccessMode mode = (AccessMode) IDS.get(new Short(accessMode));
132         if (mode != null) {
133             return mode;
134         }
135         throw new IllegalArgumentException("Unrecognized access mode");
136     }
137 
138     //-------------------------------------------------------------------------
139 
140     /**
141      * The id of this access mode as originally used at Database.load() and
142      * Query.execute().
143      */
144     private short _id;
145 
146     /**
147      * The name of this access mode as it would appear in a mapping file.
148      */
149     private String _name;
150 
151     //-------------------------------------------------------------------------
152 
153     private AccessMode(final short id, final String name) {
154         _id = id;
155         _name = name;
156 
157         IDS.put(new Short(id), this);
158         NAMES.put(name, this);
159     }
160 
161     public short getId() { return _id; }
162     public String getName() { return _name; }
163 
164     //-------------------------------------------------------------------------
165 
166     /**
167      * Returns the String representation of this kind.
168      *
169      * @return String representation of this kind.
170      */
171     public String toString() {
172         return _name;
173     }
174 
175     /**
176      * Clone only returns the one and only instance of this kind.
177      *
178      * @return The original instance.
179      */
180     public Object clone() {
181         return this;
182     }
183 
184     /**
185      * Returns if the specified object and this are one and the same instance.
186      *
187      * @param other Object to be compared with this instance.
188      * @return <code>true</code> if other equals this else <code>false</code>.
189      */
190     public boolean equals(final Object other) {
191         return (this == other);
192     }
193 
194     /**
195      * Returns the hash code of this object.
196      *
197      * @return Hash code of this object.
198      */
199     public int hashCode() {
200         return _id;
201     }
202 
203     /**
204      * Compares id against id of the specified object. So this
205      * method is inconsistent with {@link #equals(Object)}.
206      *
207      * @param other Object to be compared with this instance.
208      * @return A negative integer, zero, or a positive integer as this object
209      *         is less than, equal to, or greater than the specified object.
210      */
211     public int compareTo(final Object other) {
212         return compareTo((AccessMode) other);
213     }
214 
215     public int compareTo(final AccessMode other) {
216         return _id - other._id;
217     }
218 
219     /**
220      * Called during deserialization.
221      *
222      * @return The existing instance of the enum. <br>So you can use '=='
223      *         like 'equals' even if you use a deserialized Enum.
224      */
225     protected Object readResolve() {
226         return NAMES.get(_name);
227     }
228     
229     //-------------------------------------------------------------------------
230 }