package org.jacorb.orb; /* * JacORB - a free Java ORB * * Copyright (C) 1997-2014 Gerald Brose / The JacORB Team. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ import org.omg.CORBA.BAD_PARAM; import org.omg.CORBA.ORB; import org.omg.CORBA.Repository; import org.omg.CORBA.RepositoryHelper; import org.omg.CORBA.ORBPackage.InvalidName; import org.omg.PortableServer.POA; import org.omg.PortableServer.POAHelper; import org.omg.PortableServer.Servant; import org.omg.PortableServer.CurrentPackage.NoContext; import org.omg.PortableServer.POAPackage.ServantNotActive; import org.omg.PortableServer.POAPackage.WrongPolicy; /** * JacORB-specific implementation of PortableServer.Servant * */ public class ServantDelegate implements org.omg.PortableServer.portable.Delegate { private final ORB orb; private Repository ir = null; private org.omg.PortableServer.Current _current = null; private POA poa = null; ServantDelegate( org.jacorb.orb.ORB orb ) { this.orb = orb; } /** * Must be checked for every invocation (cf. Lang. Mapping p. 1-89) */ private final void check() { if (orb == null) { throw new org.omg.CORBA.BAD_INV_ORDER ("The Servant has not been associated with an ORB instance"); } } final public org.omg.CORBA.Object this_object (org.omg.PortableServer.Servant self) { check(); try { poa = poa(self); } catch (org.omg.CORBA.OBJ_ADAPTER e) { // Use servants default POA. Operation may be re-implemented // by servant implementation. poa = self._default_POA (); } if (poa == null) { throw new org.omg.CORBA.OBJ_ADAPTER("null value returned by _default_POA() on Servant " + self); } try { return (poa.servant_to_reference(self)); } catch(ServantNotActive e) { throw new org.omg.CORBA.OBJ_ADAPTER(e.toString()); } catch(WrongPolicy e) { throw new org.omg.CORBA.OBJ_ADAPTER(e.toString()); } } final public ORB orb(org.omg.PortableServer.Servant self) { check(); return orb; } final public POA poa(org.omg.PortableServer.Servant self) { check(); _getPOACurrent(); try { // CORBA 2.4 added the get_servant() operation to the // PortableServer::Current interface. As of JDK 1.4.2, // however, the class org.omg.PortableServant.Current // in Sun's JDK does not have the method get_servant(). // Instead of simply saying _current.get_servant(), below // we say ((org.jacorb.poa.Current)_current).get_servant(). // The cast allows JacORB to run with the obsolete Sun class. if( ((org.jacorb.poa.Current)_current).get_servant() != self ) { throw new org.omg.CORBA.OBJ_ADAPTER(); } return _current.get_POA(); } catch(NoContext e) { throw new org.omg.CORBA.OBJ_ADAPTER(e.toString()); } } final public byte[] object_id(org.omg.PortableServer.Servant self) { check(); _getPOACurrent(); try { return _current.get_object_id(); } catch(NoContext e) { throw new org.omg.CORBA.OBJ_ADAPTER(e.toString()); } } private synchronized void _getPOACurrent() { if (_current == null) { try { _current = org.omg.PortableServer.CurrentHelper.narrow(orb.resolve_initial_references("POACurrent")); } catch (Exception e) { throw new org.omg.CORBA.INITIALIZE(e.toString()); } } } public POA default_POA(org.omg.PortableServer.Servant self) { check(); try { return POAHelper.narrow(orb(self).resolve_initial_references("RootPOA")); } catch(InvalidName e) { throw new org.omg.CORBA.INITIALIZE(e.toString()); } } public boolean non_existent(org.omg.PortableServer.Servant self) { check(); return false; } public org.omg.CORBA.Object get_component(org.omg.PortableServer.Servant self) { check(); return null; } public org.omg.CORBA.Object get_interface_def( org.omg.PortableServer.Servant self) { check(); if ( ir == null) { try { ir = RepositoryHelper.narrow(orb.resolve_initial_references("InterfaceRepository")); } catch (Exception e) { throw new org.omg.CORBA.INITIALIZE(e.toString()); } } return ir.lookup_id( ((org.omg.CORBA.portable.ObjectImpl)self._this_object())._ids()[0] ); } public org.omg.CORBA.InterfaceDef get_interface(org.omg.PortableServer.Servant self) { return org.omg.CORBA.InterfaceDefHelper.narrow( get_interface_def( self )); } public boolean is_a(org.omg.PortableServer.Servant self, String repid) { String [] intf = self._all_interfaces(poa(self), object_id(self)); for( int i = 0; i < intf.length; i++) { if( intf[i].equals(repid)) { return true; } } return "IDL:omg.org/CORBA/Object:1.0".equals (repid); } /** * _get_policy */ public org.omg.CORBA.Policy _get_policy(org.omg.CORBA.Object self, int policy_type) { return poa != null ? ((org.jacorb.poa.POA)poa).getPolicy(policy_type) : null; } /** * _get_domain_managers */ public org.omg.CORBA.DomainManager[] _get_domain_managers (org.omg.CORBA.Object self) { return null; } /** * Similar to invoke in InvokeHandler, which is ultimately implement by * skeletons. This method is used by the POA to handle operations that * are "special", i.e. not implemented by skeletons */ public org.omg.CORBA.portable.OutputStream _invoke(org.omg.PortableServer.Servant self, String method, org.omg.CORBA.portable.InputStream _input, org.omg.CORBA.portable.ResponseHandler handler) throws org.omg.CORBA.SystemException { org.omg.CORBA.portable.OutputStream _out = null; if ("_get_policy".equals (method)) { _out = handler.createReply(); _out.write_Object(_get_policy(_input.read_Object() , _input.read_long() ) ); } else if ("_is_a".equals (method)) { _out = handler.createReply(); _out.write_boolean(self._is_a(_input.read_string() )); } else if ("_interface".equals (method)) { _out = handler.createReply(); _out.write_Object(self._get_interface_def() ); } else if ("_non_existent".equals (method)) { _out = handler.createReply(); _out.write_boolean(self._non_existent() ); } else if ("_get_component".equals (method)) { _out = handler.createReply(); _out.write_Object(self._get_component() ); } else if ("_repository_id".equals (method)) { _out = handler.createReply(); _out.write_string(self._repository_id() ); } else { throw new BAD_PARAM("Unknown operation: " + method ); } return _out; } public String repository_id (Servant self) { return this_object(self)._repository_id(); } }