/******************************************************************************* | |
* Copyright (c) 2010 Oracle. | |
* All rights reserved. This program and the accompanying materials | |
* are made available under the terms of the Eclipse Public License v1.0 | |
* and Apache License v2.0 which accompanies this distribution. | |
* The Eclipse Public License is available at | |
* http://www.eclipse.org/legal/epl-v10.html | |
* and the Apache License v2.0 is available at | |
* http://www.opensource.org/licenses/apache2.0.php. | |
* You may elect to redistribute this code under either of these licenses. | |
* | |
* Contributors: | |
* Bob Nettleton (Oracle) - Initial Reference Implementation | |
******************************************************************************/ | |
package org.eclipse.gemini.naming; | |
import javax.naming.Context; | |
import javax.naming.NamingException; | |
import javax.naming.directory.DirContext; | |
import javax.naming.spi.InitialContextFactory; | |
import java.util.Hashtable; | |
/** | |
* A Wrapper implementation of InitialContextFactory, used to support URL | |
* context factories in Gemini Naming. | |
* | |
*/ | |
class InitialContextFactoryWrapper implements InitialContextFactory { | |
private final InitialContextFactory m_initialContextFactory; | |
private final FactoryManager m_factoryManager; | |
public InitialContextFactoryWrapper(InitialContextFactory initialContextFactory, FactoryManager factoryManager) { | |
m_initialContextFactory = initialContextFactory; | |
m_factoryManager = factoryManager; | |
} | |
public Context getInitialContext(Hashtable environment) throws NamingException { | |
final Context contextToReturn = | |
m_initialContextFactory.getInitialContext(environment); | |
if(contextToReturn instanceof DirContext) { | |
final DirContextWrapperImpl dirContextWrapper = new DirContextWrapperImpl((DirContext)contextToReturn, m_factoryManager); | |
setupFactoryAssociation(dirContextWrapper); | |
return ServiceAwareContextFactory.createServiceAwareDirContextWrapper(m_initialContextFactory, dirContextWrapper, m_factoryManager); | |
} else { | |
final ContextWrapperImpl contextWrapper = new ContextWrapperImpl(contextToReturn, m_factoryManager); | |
setupFactoryAssociation(contextWrapper); | |
return ServiceAwareContextFactory.createServiceAwareContextWrapper(m_initialContextFactory, contextWrapper, m_factoryManager); | |
} | |
} | |
private void setupFactoryAssociation(final Context contextWrapper) { | |
if(m_initialContextFactory instanceof BuilderSupportedInitialContextFactory) { | |
BuilderSupportedInitialContextFactory builderFactory = | |
(BuilderSupportedInitialContextFactory)m_initialContextFactory; | |
// this Context is backed by an InitialContextFactoryBuilder service | |
m_factoryManager.associateFactoryService(builderFactory.getBuilder(), contextWrapper); | |
} else { | |
// this Context is backed by an InitialContextFactory service | |
m_factoryManager.associateFactoryService(m_initialContextFactory, contextWrapper); | |
} | |
} | |
} |