/* * Copyright 2004-2015 the Seasar Foundation and the Others. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ package org.seasar.extension.j2ee; import java.util.Hashtable; import javax.naming.Context; import javax.naming.Name; import javax.naming.NameAlreadyBoundException; import javax.naming.NameParser; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.OperationNotSupportedException; import org.seasar.framework.container.ComponentNotFoundRuntimeException; import org.seasar.framework.container.S2Container; import org.seasar.framework.container.factory.SingletonS2ContainerFactory; import org.seasar.framework.exception.SRuntimeException; import org.seasar.framework.util.StringUtil; /** * S2コンテナに<code>JNDI</code>経由でアクセスするためのコンテキストです。 * * @author higa * */ public class JndiContext implements Context { /** * 環境です。 */ protected final Hashtable env; /** * パスです。 */ protected final String path; /** * {@link JndiContext}を作成します。 * * @param env * 環境 */ public JndiContext(final Hashtable env) { this.env = env; this.path = (String) env.get(PROVIDER_URL); } public Object addToEnvironment(final String propName, final Object propVal) throws NamingException { return env.put(propName, propVal); } public void bind(final Name name, final Object obj) throws NamingException { if (name.isEmpty()) { throw new NamingException("name is empty"); } bind(JndiResourceLocator.resolveName(name), obj); } public void bind(final String name, final Object obj) throws NamingException { bind(JndiResourceLocator.resolveName(name).split("\\."), obj); } public void close() throws NamingException { } public Name composeName(final Name name, final Name prefix) throws NamingException { throw new OperationNotSupportedException("composeName"); } public String composeName(final String name, final String prefix) throws NamingException { throw new OperationNotSupportedException("composeName"); } public Context createSubcontext(final Name name) throws NamingException { throw new OperationNotSupportedException("createSubcontext"); } public Context createSubcontext(final String name) throws NamingException { throw new OperationNotSupportedException("createSubcontext"); } public void destroySubcontext(final Name name) throws NamingException { throw new OperationNotSupportedException("destroySubcontext"); } public void destroySubcontext(final String name) throws NamingException { throw new OperationNotSupportedException("destroySubcontext"); } public Hashtable getEnvironment() throws NamingException { return env; } public String getNameInNamespace() throws NamingException { throw new OperationNotSupportedException("getNameInNamespace"); } public NameParser getNameParser(final Name name) throws NamingException { throw new OperationNotSupportedException("getNameParser"); } public NameParser getNameParser(final String name) throws NamingException { throw new OperationNotSupportedException("getNameParser"); } public NamingEnumeration list(final Name name) throws NamingException { throw new OperationNotSupportedException("list"); } public NamingEnumeration list(final String name) throws NamingException { throw new OperationNotSupportedException("list"); } public NamingEnumeration listBindings(final Name name) throws NamingException { throw new OperationNotSupportedException("listBindings"); } public NamingEnumeration listBindings(final String name) throws NamingException { throw new OperationNotSupportedException("listBindings"); } public Object lookup(final Name name) throws NamingException { if (name.isEmpty()) { return new JndiContext(new Hashtable(env)); } return lookup(name.toString()); } public Object lookup(final String name) throws NamingException { if (StringUtil.isEmpty(name)) { return new JndiContext(new Hashtable(env)); } return SingletonS2ContainerFactory.getContainer().getComponent( JndiResourceLocator.resolveName(name)); } public Object lookupLink(final Name name) throws NamingException { throw new OperationNotSupportedException("lookupLink"); } public Object lookupLink(final String name) throws NamingException { throw new OperationNotSupportedException("lookupLink"); } public void rebind(final Name name, final Object obj) throws NamingException { throw new OperationNotSupportedException("rebind"); } public void rebind(final String name, final Object obj) throws NamingException { throw new OperationNotSupportedException("rebind"); } public Object removeFromEnvironment(final String propName) throws NamingException { return env.remove(propName); } public void rename(final Name oldName, final Name newName) throws NamingException { throw new OperationNotSupportedException("rename"); } public void rename(final String oldName, final String newName) throws NamingException { throw new OperationNotSupportedException("rename"); } public void unbind(final Name name) throws NamingException { throw new OperationNotSupportedException("unbind"); } public void unbind(final String name) throws NamingException { throw new OperationNotSupportedException("unbind"); } /** * JNDI空間にバインドします。 * * @param names * 名前をデリミタで分割した配列 * @param obj * オブジェクト * @throws NamingException * JNDI例外が発生した場合 */ protected void bind(final String[] names, final Object obj) throws NamingException { final StringBuffer buf = new StringBuffer(100); try { S2Container context = SingletonS2ContainerFactory.getContainer(); for (int i = 0; i < names.length - 1; ++i) { buf.append(names[i]); context = (S2Container) context.getComponent(names[i]); buf.append('/'); } final String name = names[names.length - 1]; buf.append(name); if (context.hasComponentDef(name)) { throw new NameAlreadyBoundException(new String(buf)); } context.register(obj, name); } catch (final ComponentNotFoundRuntimeException e) { throw createNamingException(new String(buf), e); } catch (final SRuntimeException e) { throw createNamingException(e.getMessage(), e); } } /** * {@link NamingException}を作成します。 * * @param message * メッセージ * @param cause * 原因 * @return {@link NamingException} */ protected NamingException createNamingException(final String message, final Throwable cause) { final NamingException e = new NamingException(message); e.initCause(cause); return e; } }