/**
*
* Copyright 2004-2005 The Apache Software Foundation
*
* 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.apache.geronimo.interop.adapter;
//import org.openejb.EJBContainer;
//import org.openejb.EJBComponentType;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.geronimo.gbean.*;
import org.apache.geronimo.interop.naming.NameService;
import java.util.HashMap;
import java.util.Collection;
import java.util.Collections;
public class AdapterManager implements ReferenceCollectionListener {
private final Log log = LogFactory.getLog(AdapterManager.class);
private HashMap homeAdapters;
private HashMap remoteAdapters;
private Collection containers = Collections.EMPTY_SET;
private ClassLoader classLoader;
private NameService nameService = NameService.getInstance();
/*
* This is a singleton GBean. Do not reference it directly, but use a
* GBean reference to get it.
*/
public AdapterManager()
{
this.homeAdapters = null;
this.remoteAdapters = null;
this.containers = null;
this.classLoader = null;
}
//public AdapterManager( ClassLoader classLoader, Collection containers ) {
public AdapterManager( ClassLoader classLoader) {
//log.debug( "AdapterManager(): containers = " + containers );
this.classLoader = classLoader;
/*
ReferenceCollection ref = (ReferenceCollection) containers;
ref.addReferenceCollectionListener(this);
this.containers = containers;
int len = ( containers != null ? containers.size() : 20 );
homeAdapters = new HashMap( len );
remoteAdapters = new HashMap( len );
*/
// Todo: Add the containers .. invoke memberAdded for each element in containers.
registerNameServer();
}
protected void registerNameServer()
{
//
// NameService
//
String bindNames[] = new String[] { "NameService" };
String remoteClassName = "org.apache.geronimo.interop.rmi.iiop.server.ServerNamingContext";
//String remoteInterfaceName = "org.apache.geronimo.interop.rmi.iiop.NameService";
String remoteInterfaceName = "org.apache.geronimo.interop.CosNaming.NamingContext";
String ids[] = new String[] { "IDL:omg.org/CosNaming/NamingContext:1.0",
"IDL:omg.org/CosNaming/NamingContextExt:1.0" };
ClassLoader cl = this.getClass().getClassLoader();
CorbaAdapter a = new CorbaAdapter( bindNames, ids, remoteClassName, remoteInterfaceName, cl );
a.start();
registerRemoteAdapter(a);
}
protected Adapter getAdapter( Object adapterID ) {
// more likely to be using the remoteadapter...
Adapter rc = getRemoteAdapter( adapterID );
if (rc == null)
{
rc = getHomeAdapter( adapterID );
}
return rc;
}
protected Adapter getHomeAdapter( Object adapterID )
{
return (Adapter)homeAdapters.get( adapterID );
}
protected Adapter getRemoteAdapter( Object adapterID )
{
return (Adapter)remoteAdapters.get( adapterID );
}
protected void registerHomeAdapter( Adapter adapter )
{
homeAdapters.put( adapter.getAdapterID(), adapter );
}
protected void registerRemoteAdapter( Adapter adapter )
{
remoteAdapters.put( adapter.getAdapterID(), adapter );
}
protected void unregisterHomeAdapter( Adapter adapter )
{
homeAdapters.remove( adapter.getAdapterID() );
}
protected void unregisterRemoteAdapter( Adapter adapter )
{
remoteAdapters.remove( adapter.getAdapterID() );
}
public void memberAdded(ReferenceCollectionEvent event) {
/*
EJBContainer container = (EJBContainer) event.getMember();
log.debug( "AdapterManager.memberAdded(): container = " + container );
log.debug( "AdapterManager.memberAdded(): containerID = " + container.getContainerID() );
switch (container.getProxyInfo().getComponentType()) {
case EJBComponentType.STATELESS:
//generator = new AdapterStateless(container, orb, poa, tieLoader);
break;
case EJBComponentType.STATEFUL:
//generator = new AdapterStateful(container, orb, poa, tieLoader);
break;
case EJBComponentType.BMP_ENTITY:
case EJBComponentType.CMP_ENTITY:
//generator = new AdapterEntity(container, orb, poa, tieLoader);
break;
default:
// throw new CORBAException("CORBA HomeAdapter does not handle MDB containers");
}
Adapter adapter = new HomeAdapter( container );
adapter.start();
registerHomeAdapter( adapter );
adapter = new RemoteAdapter( container );
adapter.start();
registerRemoteAdapter( adapter );
*/
}
public void memberRemoved(ReferenceCollectionEvent event) {
/*
EJBContainer container = (EJBContainer) event.getMember();
log.debug( "AdapterManager.memberRemoved(): container = " + container );
log.debug( "AdapterManager.memberRemoved(): containerID = " + container.getContainerID() );
Adapter adapter = getHomeAdapter( container.getContainerID() );
adapter.stop();
unregisterHomeAdapter( adapter );
adapter = getRemoteAdapter( container.getContainerID() );
adapter.stop();
unregisterRemoteAdapter( adapter );
*/
}
public static final GBeanInfo GBEAN_INFO;
static {
GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic(AdapterManager.class);
infoFactory.addAttribute("classLoader", ClassLoader.class, false);
//infoFactory.addReference("containers", EJBContainer.class);
//infoFactory.setConstructor(new String[]{"classLoader", "containers"});
infoFactory.setConstructor(new String[]{"classLoader"});
GBEAN_INFO = infoFactory.getBeanInfo();
}
public static GBeanInfo getGBeanInfo() {
return GBEAN_INFO;
}
}