/* * 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 * The type of the schema-local variable. */ public class SchemaLocal { /** * 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. *

* 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; } }