| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You 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.apache.openejb.core; |
| |
| import org.apache.openejb.loader.OpenEJBInstance; |
| import org.apache.openejb.loader.SystemInstance; |
| import org.apache.openejb.util.OptionsLog; |
| |
| import javax.naming.Context; |
| import javax.naming.NamingException; |
| import javax.naming.spi.InitialContextFactory; |
| import java.lang.reflect.Constructor; |
| import java.lang.reflect.InvocationTargetException; |
| import java.util.Hashtable; |
| import java.util.Properties; |
| import java.util.concurrent.locks.ReentrantLock; |
| |
| /** |
| * @version $Rev$ $Date$ |
| */ |
| @SuppressWarnings("UseOfObsoleteCollectionType") |
| @Deprecated // use org.apache.openejb.core.OpenEJBInitialContextFactory |
| public class LocalInitialContextFactory implements InitialContextFactory { |
| |
| private static final ReentrantLock lock = new ReentrantLock(); |
| private static OpenEJBInstance openejb; |
| |
| private boolean bootedOpenEJB; |
| |
| @Override |
| public Context getInitialContext(final Hashtable env) throws NamingException { |
| init(env); |
| return getLocalInitialContext(env); |
| } |
| |
| protected void init(final Hashtable env) throws NamingException { |
| |
| final ReentrantLock l = lock; |
| l.lock(); |
| |
| try { |
| if (openejb != null && openejb.isInitialized()) { |
| return; |
| } |
| try { |
| final Properties properties = new Properties(); |
| properties.putAll(env); |
| init(properties); |
| } catch (final Exception e) { |
| throw (NamingException) new NamingException("Attempted to load OpenEJB. " + e.getMessage()).initCause(e); |
| } |
| } finally { |
| l.unlock(); |
| } |
| } |
| |
| boolean bootedOpenEJB() { |
| final ReentrantLock l = lock; |
| l.lock(); |
| |
| try { |
| return bootedOpenEJB; |
| } finally { |
| l.unlock(); |
| } |
| |
| } |
| |
| private void init(final Properties properties) throws Exception { |
| if (openejb != null && openejb.isInitialized()) { |
| return; |
| } |
| |
| openejb = new OpenEJBInstance(); |
| |
| if (openejb.isInitialized()) { |
| return; |
| } |
| |
| bootedOpenEJB = true; |
| SystemInstance.init(properties); |
| OptionsLog.install(); |
| SystemInstance.get().setProperty("openejb.embedded", "true"); |
| openejb.init(properties); |
| } |
| |
| public void close() { |
| final ReentrantLock l = lock; |
| l.lock(); |
| |
| try { |
| openejb = null; |
| } finally { |
| l.unlock(); |
| } |
| } |
| |
| private Context getLocalInitialContext(final Hashtable env) throws NamingException { |
| final Context context; |
| try { |
| final ClassLoader cl = SystemInstance.get().getClassLoader(); |
| |
| final Class localInitialContext = Class.forName("org.apache.openejb.core.LocalInitialContext", true, cl); |
| |
| //noinspection unchecked |
| final Constructor constructor = localInitialContext.getConstructor(Hashtable.class, LocalInitialContextFactory.class); |
| context = (Context) constructor.newInstance(env, this); |
| } catch (Throwable e) { |
| if (e instanceof InvocationTargetException) { |
| final InvocationTargetException ite = (InvocationTargetException) e; |
| if (ite.getTargetException() != null) { |
| e = ite.getTargetException(); |
| } |
| } |
| |
| if (e instanceof NamingException) { |
| throw (NamingException) e; |
| } |
| throw (NamingException) new NamingException("Cannot instantiate a LocalInitialContext. Exception: " |
| + e.getClass().getName() + " " + e.getMessage()).initCause(e); |
| } |
| |
| return context; |
| } |
| |
| } |