001: /*
002: * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved
003: *
004: * This file is part of Resin(R) Open Source
005: *
006: * Each copy or derived work must preserve the copyright notice and this
007: * notice unmodified.
008: *
009: * Resin Open Source is free software; you can redistribute it and/or modify
010: * it under the terms of the GNU General Public License as published by
011: * the Free Software Foundation; either version 2 of the License, or
012: * (at your option) any later version.
013: *
014: * Resin Open Source is distributed in the hope that it will be useful,
015: * but WITHOUT ANY WARRANTY; without even the implied warranty of
016: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
017: * of NON-INFRINGEMENT. See the GNU General Public License for more
018: * details.
019: *
020: * You should have received a copy of the GNU General Public License
021: * along with Resin Open Source; if not, write to the
022: *
023: * Free Software Foundation, Inc.
024: * 59 Temple Place, Suite 330
025: * Boston, MA 02111-1307 USA
026: *
027: * @author Scott Ferguson
028: */
029:
030: package com.caucho.naming;
031:
032: import javax.naming.NamingException;
033:
034: import java.util.ArrayList;
035: import java.util.HashMap;
036: import java.util.List;
037:
038: import com.caucho.loader.*;
039:
040: /**
041: * Environment based model for JNDI.
042: */
043: public class EnvironmentModelRoot {
044: private static final EnvironmentLocal<EnvironmentModelRoot> _local = new EnvironmentLocal<EnvironmentModelRoot>();
045:
046: private final ClassLoader _loader;
047:
048: private HashMap<String, EnvironmentModel> _map = new HashMap<String, EnvironmentModel>();
049:
050: /**
051: * Creates a new instance of the memory model.
052: */
053: private EnvironmentModelRoot(ClassLoader loader) {
054: for (; loader != null
055: && !(loader instanceof EnvironmentClassLoader); loader = loader
056: .getParent()) {
057: }
058:
059: _loader = loader;
060:
061: _map.put("", new EnvironmentModel(this , ""));
062: }
063:
064: /**
065: * Return the local model if it exists.
066: */
067: public static EnvironmentModelRoot getLocal() {
068: return _local.get();
069: }
070:
071: /**
072: * Return the local model if it exists.
073: */
074: public static EnvironmentModelRoot getLocal(ClassLoader loader) {
075: return _local.get(loader);
076: }
077:
078: /**
079: * Create the local model if it exists.
080: */
081: public static EnvironmentModelRoot create() {
082: return create(Thread.currentThread().getContextClassLoader());
083: }
084:
085: /**
086: * Create the local model if it exists.
087: */
088: public static EnvironmentModelRoot create(ClassLoader loader) {
089: synchronized (_local) {
090: EnvironmentModelRoot root = _local.getLevel(loader);
091:
092: if (root == null) {
093: root = new EnvironmentModelRoot(loader);
094: _local.set(root, loader);
095: }
096:
097: return root;
098: }
099: }
100:
101: protected ClassLoader getClassLoader() {
102: return _loader;
103: }
104:
105: /**
106: * Returns a specific node.
107: */
108: public EnvironmentModel get(String path) {
109: synchronized (this ) {
110: return _map.get(path);
111: }
112: }
113:
114: /**
115: * Set a specific node.
116: */
117: public EnvironmentModel put(String path, EnvironmentModel value) {
118: synchronized (this ) {
119: return _map.put(path, value);
120: }
121: }
122:
123: /**
124: * Set a specific node.
125: */
126: public EnvironmentModel remove(String path) {
127: synchronized (this) {
128: return _map.remove(path);
129: }
130: }
131: }
|