mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

matthew_swift
30.27.2009 902747f3618c2ba285058670ee6d0cf57e51c34e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at
 * trunk/opends/resource/legal-notices/OpenDS.LICENSE
 * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at
 * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 * add the following below this CDDL HEADER, with the fields enclosed
 * by brackets "[]" replaced with your own identifying information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 */
 
package org.opends.sdk.schema;
 
 
 
/**
 * This class provides schema-local variables. These variables differ
 * from their normal counterparts in that each schema has its own
 * independently initialized copy of the variable. {@code SchemaLocal}
 * instances are typically private static fields in classes that wish to
 * associate state with a schema (e.g., a schema dependent cache).
 * 
 * @param <T>
 *          The type of the schema-local variable.
 */
public class SchemaLocal<T>
{
  /**
   * Creates a schema-local variable.
   */
  public SchemaLocal()
  {
    // Nothing to do.
  }
 
 
 
  /**
   * Returns the value in the provided schema's copy of this
   * schema-local variable. If the variable has no value associated with
   * the schema, it is first initialized to the value returned by an
   * invocation of the {@link #initialValue} method.
   * 
   * @param schema
   *          The schema whose copy of the schema-local variable is
   *          being requested.
   * @return The schema-local value.
   */
  public final T get(Schema schema)
  {
    // Schema calls back to initialValue() if this is the first time.
    return schema.getAttachment(this);
  }
 
 
 
  /**
   * Removes the provided schema's value for this schema-local variable.
   * If this schema-local variable is subsequently read, its value will
   * be reinitialized by invoking its {@link #initialValue} method,
   * unless its value is set in the interim. This may result in multiple
   * invocations of the {@link #initialValue} method.
   * 
   * @param schema
   *          The schema whose copy of the schema-local variable is
   *          being removed.
   */
  public final void remove(Schema schema)
  {
    schema.removeAttachment(this);
  }
 
 
 
  /**
   * Sets the provided schema's copy of this schema-local variable to
   * the specified value.
   * 
   * @param schema
   *          The schema whose copy of the schema-local variable is
   *          being set.
   * @param value
   *          The schema-local value.
   */
  public final void set(Schema schema, T value)
  {
    schema.setAttachment(this, value);
  }
 
 
 
  /**
   * Returns the provided schema's "initial value" for this schema-local
   * variable. This method will be invoked the first time the variable
   * is accessed with the {@link #get} method for each schema, unless
   * the {@link #set} method has been previously invoked, in which case
   * the {@link #initialValue} method will not be invoked.
   * <p>
   * Normally, this method is invoked at most once per schema, but it
   * may be invoked again in case of subsequent invocations of
   * {@link #remove} followed by {@link #get}. This implementation
   * simply returns {@code null}; if the programmer desires schema-local
   * variables to have an initial value other than {@code null}, {@code
   * SchemaLocal} must be subclassed, and this method overridden.
   * Typically, an anonymous inner class will be used.
   * 
   * @return The initial value for this schema-local.
   */
  protected T initialValue()
  {
    // Default implementation.
    return null;
  }
}