/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.iiop.rmi.ir;
import org.omg.CORBA.ORB;
import org.omg.CORBA.IRObject;
import org.omg.CORBA.IRObjectOperations;
import org.omg.CORBA.DefinitionKind;
import org.omg.CORBA.BAD_INV_ORDER;
import org.omg.CORBA.UserException;
import org.omg.CORBA.CompletionStatus;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.Servant;
import org.omg.PortableServer.POAPackage.WrongPolicy;
import org.omg.PortableServer.POAPackage.ServantAlreadyActive;
import org.omg.PortableServer.POAPackage.ObjectAlreadyActive;
import org.omg.PortableServer.POAPackage.ObjectNotActive;
//import org.omg.PortableServer.POAPackage.ServantNotActive;
/**
* Abstract base class for all IR object implementations.
*
* @author <a href="mailto:osh@sparre.dk">Ole Husgaard</a>
* @version $Revision: 81018 $
*/
abstract class IRObjectImpl
implements IRObjectOperations
{
// Constants -----------------------------------------------------
// Attributes ----------------------------------------------------
protected RepositoryImpl repository;
protected DefinitionKind def_kind;
// Static --------------------------------------------------------
private static final org.jboss.logging.Logger logger =
org.jboss.logging.Logger.getLogger(IRObjectImpl.class);
// Constructors --------------------------------------------------
IRObjectImpl(DefinitionKind def_kind, RepositoryImpl repository)
{
this.def_kind = def_kind;
this.repository = repository;
}
// Public --------------------------------------------------------
// IRObjectOperations implementation -----------------------------
public DefinitionKind def_kind()
{
logger.trace("IRObjectImpl.def_kind() entered.");
return def_kind;
}
public void destroy()
{
throw new BAD_INV_ORDER("Cannot destroy RMI/IIOP mapping.", 2,
CompletionStatus.COMPLETED_NO);
}
// LocalIRObject implementation ----------------------------------
abstract public IRObject getReference();
public void allDone()
throws IRConstructionException
{
getReference();
}
/**
* Unexport this object.
*/
public void shutdown()
{
POA poa = getPOA();
try {
poa.deactivate_object(poa.reference_to_id(getReference()));
} catch (UserException ex) {
logger.warn("Could not deactivate IR object", ex);
}
}
public RepositoryImpl getRepository()
{
return repository;
}
// Package protected ---------------------------------------------
// Protected -----------------------------------------------------
/**
* Return the ORB for this IRObject.
*/
protected ORB getORB()
{
return repository.orb;
}
/**
* Return the POA for this IRObject.
*/
protected POA getPOA()
{
return repository.poa;
}
/**
* Return the POA object ID of this IR object.
*/
protected abstract byte[] getObjectId();
/**
* Convert a servant to a reference.
*/
protected org.omg.CORBA.Object servantToReference(Servant servant)
{
byte[] id = getObjectId();
try {
// repository.poa.activate_object(servant);
// return repository.poa.servant_to_reference(servant);
// repository.poa.activate_object_with_id(getObjectId(), servant);
// return repository.poa.id_to_reference(getObjectId());
logger.debug("#### IRObject.srv2ref: id=[" + new String(id) + "]");
repository.poa.activate_object_with_id(id, servant);
org.omg.CORBA.Object ref = repository.poa.id_to_reference(id);
logger.debug("#### IRObject.srv2ref: returning ref.");
//return repository.poa.id_to_reference(id);
return ref;
} catch (WrongPolicy ex) {
logger.debug("Exception converting CORBA servant to reference", ex);
} catch (ServantAlreadyActive ex) {
logger.debug("Exception converting CORBA servant to reference", ex);
} catch (ObjectAlreadyActive ex) {
logger.debug("Exception converting CORBA servant to reference", ex);
} catch (ObjectNotActive ex) {
logger.debug("Exception converting CORBA servant to reference", ex);
// } catch (ServantNotActive ex) {
// logger.debug("Exception converting CORBA servant to reference", ex);
}
return null;
}
// Private -------------------------------------------------------
// Inner classes -------------------------------------------------
}