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: * Free SoftwareFoundation, Inc.
023: * 59 Temple Place, Suite 330
024: * Boston, MA 02111-1307 USA
025: *
026: * @author Scott Ferguson
027: */
028:
029: package com.caucho.ejb.burlap;
030:
031: import com.caucho.naming.AbstractModel;
032: import com.caucho.naming.NamingExceptionWrapper;
033: import com.caucho.services.name.NameServerRemote;
034: import com.caucho.util.L10N;
035:
036: import javax.ejb.EJBHome;
037: import javax.naming.NamingException;
038: import java.util.ArrayList;
039: import java.util.Hashtable;
040: import java.util.List;
041: import java.util.logging.Level;
042: import java.util.logging.Logger;
043:
044: /**
045: * JNDI context for Burlap home objects.
046: *
047: * <p>For now, only allow single level calls to the EJB.
048: */
049: public class BurlapModel extends AbstractModel {
050: private static final L10N L = new L10N(BurlapModel.class);
051: private static final Logger log = Logger
052: .getLogger(BurlapModel.class.getName());
053:
054: private String _urlPrefix;
055: private String _namePrefix;
056: private BurlapModel _root;
057: private Hashtable _cache;
058: private BurlapClientContainer _client;
059: private NameServerRemote _remoteRoot;
060: private NameServerRemote _remote;
061:
062: /**
063: * Creates a new Burlap model
064: */
065: public BurlapModel(String prefix) {
066: if (!prefix.endsWith("/"))
067: prefix = prefix + '/';
068:
069: _urlPrefix = prefix;
070: _namePrefix = "/";
071: _root = this ;
072: _cache = new Hashtable();
073: }
074:
075: /**
076: * Returns the root Burlap model
077: */
078: public BurlapModel(String namePrefix, BurlapModel root) {
079: if (!namePrefix.endsWith("/"))
080: namePrefix = namePrefix + '/';
081:
082: _namePrefix = namePrefix;
083: _root = root;
084: }
085:
086: void setRemote(NameServerRemote remote) {
087: _remote = remote;
088: }
089:
090: void setClientContainer(BurlapClientContainer client) {
091: _root._client = client;
092: }
093:
094: /**
095: * Creates a new instance of BurlapModel.
096: */
097: public AbstractModel copy() {
098: return this ;
099: }
100:
101: /**
102: * Returns the full url prefix.
103: */
104: String getURLPrefix() {
105: return _root._urlPrefix;
106: }
107:
108: /**
109: * Returns the full name.
110: */
111: String getURL() {
112: return getURLPrefix() + _namePrefix;
113: }
114:
115: /**
116: * Looks up the named bean. Since we're assuming only a single level,
117: * just try to look it up directly.
118: *
119: * <p>Burlap to find all the valid names.
120: *
121: * @param name the segment name to lookup
122: *
123: * @return the home stub.
124: */
125: public Object lookup(String name) throws NamingException {
126: try {
127: Object obj = _root._cache.get(getURLPrefix() + _namePrefix
128: + name);
129: if (obj != null)
130: return obj;
131:
132: if (_root._remoteRoot == null) {
133: if (_root._client == null)
134: _root._client = BurlapClientContainer
135: .find(getURLPrefix());
136:
137: _root._remoteRoot = (NameServerRemote) _client
138: .createObjectStub(getURLPrefix());
139: }
140:
141: obj = _root._remoteRoot.lookup(_namePrefix + name);
142:
143: if (obj instanceof EJBHome)
144: _root._cache.put(name, obj);
145: else if (obj instanceof NameServerRemote) {
146: BurlapModel model = new BurlapModel(_namePrefix + name,
147: _root);
148: _remote = (NameServerRemote) obj;
149: model.setRemote(_remote);
150: obj = model;
151: _root._cache.put(name, obj);
152: }
153:
154: if (log.isLoggable(Level.FINE))
155: log.fine(this + " lookup(" + name + ")->" + obj);
156:
157: return obj;
158: } catch (Exception e) {
159: throw new NamingExceptionWrapper(e);
160: }
161: }
162:
163: /**
164: * Returns a list of children of the named bean.
165: *
166: * @return array of the children.
167: */
168: public List list() throws NamingException {
169: try {
170: if (_remote == null) {
171: if (_root._remoteRoot == null) {
172: if (_root._client == null)
173: _root._client = BurlapClientContainer
174: .find(getURLPrefix());
175:
176: _root._remoteRoot = (NameServerRemote) _client
177: .createObjectStub(getURLPrefix());
178: }
179:
180: Object obj = _root._remoteRoot.lookup(_namePrefix);
181: if (obj instanceof NameServerRemote)
182: _remote = (NameServerRemote) obj;
183: }
184:
185: if (_remote == null)
186: throw new NamingException(L.l(
187: "Burlap object `{0}' is not a context.",
188: getURLPrefix() + _namePrefix));
189:
190: String[] list = _remote.list();
191:
192: ArrayList value = new ArrayList();
193: for (int i = 0; list != null && i < list.length; i++)
194: value.add(list[i]);
195:
196: return value;
197: } catch (NamingException e) {
198: throw e;
199: } catch (Exception e) {
200: throw new NamingExceptionWrapper(e);
201: }
202: }
203:
204: public String toString() {
205: return "BurlapModel[url=" + " " + getURLPrefix() + ",name="
206: + _namePrefix + "]";
207: }
208: }
|