/* * JacORB - a free Java ORB * * Copyright (C) 1999-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. * */ package org.jacorb.tao_imr; import java.util.List; import org.jacorb.orb.ParsedIOR; import org.jacorb.orb.iiop.IIOPAddress; import org.jacorb.orb.iiop.IIOPProfile; import org.jacorb.orb.util.CorbaLoc; import org.jacorb.tao_imr.ImplementationRepository.ServerObject; import org.jacorb.tao_imr.ImplementationRepository.ServerObjectHelper; import org.jacorb.tao_imr.ImplementationRepository.ServerObjectImpl; import org.omg.CORBA.INTERNAL; import org.omg.ETF.Profile; /** * @author Quynh Nguyen * * This ImR adapter class contains hooks for a JacORB to register and * unregister with a TAO ImR. */ public class ImRAccessImpl implements org.jacorb.orb.ImRAccess { private org.jacorb.tao_imr.ImplementationRepository.Administration imrLocator = null; private org.jacorb.orb.ORB orb_ = null; private org.jacorb.poa.POA poa_ = null; private org.jacorb.poa.POA root_poa_ = null; private ServerObjectImpl serverObjImpl = null; private ParsedIOR pior = null; private IIOPProfile profile = null; private String corbaloc = null; //private ImRInfo info = null; /** * <code>ImRAccessImpl</code> private; use the static connect method. */ private ImRAccessImpl () { // use the static connect method } /** * <code>connect</code> resolves the IMR and returns a new ImRAccessImpl. * * @param orb an <code>org.omg.CORBA.ORB</code> value * @return an <code>ImRAccessImpl</code> value */ public static ImRAccessImpl connect (org.jacorb.orb.ORB orb) { final ImRAccessImpl result = new ImRAccessImpl (); result.orb_ = orb; try { result.imrLocator = org.jacorb.tao_imr.ImplementationRepository.AdministrationHelper.narrow ( orb.resolve_initial_references("ImplRepoService")); } catch (org.omg.CORBA.ORBPackage.InvalidName e) { throw new INTERNAL ("ImRAccessImpl.connect: unable to resolve TAO ImplRepoService: " + e.toString()); } boolean non_exist = true; if (result.imrLocator != null) { try { non_exist = result.imrLocator._non_existent (); } catch (org.omg.CORBA.SystemException e) { non_exist = true; } } if (non_exist) { throw new INTERNAL ("ImRAccessImpl.connect: Unable to resolve reference to TAO ImplRepoService"); } result.setImRInfo(); return result; } /** * This function setup all informations that will be needed later */ private void setImRInfo () { try { org.omg.CORBA.Object ref = this.orb_.resolve_initial_references("ImplRepoService"); this.pior = new ParsedIOR(this.orb_, this.orb_.object_to_string (ref)); this.corbaloc = CorbaLoc.generateCorbalocForMultiIIOPProfiles (this.orb_, ref); this.profile = (IIOPProfile) this.pior.getEffectiveProfile(); } catch (org.omg.CORBA.ORBPackage.InvalidName e) { throw new INTERNAL ("ImRAccessImpl.setImRInfo: unable to resolve TAO ImplRepoService: " + e.toString()); } } /** * * @return the primary address of the ImR of type org.jacorb.orb.etf.ProtocolAddressBase */ @Override public org.jacorb.orb.etf.ProtocolAddressBase getImRAddress () { if (this.profile == null) { setImRInfo(); } return this.profile.getAddress(); } /** * * @return a list of the ImR profiles of type <code>List<Profile></code> */ @Override public List<Profile> getImRProfiles () { if (this.profile == null) { setImRInfo(); } return this.pior.getProfiles(); } /** * This function is just a place holder. * @return */ @Override public String getImRHost () { return null; } /** * This function is just a place holder. * @return */ @Override public int getImRPort () { return -1; } /** * This function returns the TAO ImR's corbaloc IOR string * @return */ @Override public String getImRCorbaloc () { if (this.corbaloc == null) { setImRInfo(); } return this.corbaloc; } /** * This function is just a place holder. */ @Override public void registerPOA (String name, String server, org.jacorb.orb.etf.ProtocolAddressBase address) throws INTERNAL { // throw new INTERNAL("Not implemented"); } /** * This function is just a place holder. */ @Override public void registerPOA (String name, String server, String host, int port) throws INTERNAL { // throw new INTERNAL("Not implemented"); } /** * This function provides a hook for registering the POA upon being created. * @param orb * @param poa * @param address * @param implname * @throws INTERNAL */ @Override public void registerPOA ( org.jacorb.orb.ORB orb, org.jacorb.poa.POA poa, org.jacorb.orb.etf.ProtocolAddressBase address, String implname) throws INTERNAL { if (address instanceof IIOPAddress) { if (orb == null) { throw new INTERNAL ( "ImRAccessImpl.registerPOA: orb must not be null"); } if (poa == null) { throw new INTERNAL ( "ImRAccessImpl.registerPOA: poa must not be null"); } registerPOA_TaoImR_i (orb, poa, implname); } else { throw new INTERNAL ("ImRAccessImpl.registerPOA: TAO ImR only supports IIOP based POAs"); } } /** * This function performs POA registration with the TAO ImR server hy * calling the TAO ImR locator's server_is_running function. * * @param orb * @param poa * @param implname */ private void registerPOA_TaoImR_i ( org.jacorb.orb.ORB orb, org.jacorb.poa.POA poa, String implname) { this.orb_ = orb; this.poa_ = poa; // build the server name for registering with the ImR in the form // JACORB:<implName>/<qualified POA name> String theName = "JACORB:" + implname + "/" + this.poa_._getQualifiedName(); try { // instantiate an instance of ServerObjectImpl. // org.jacorb.poa.POA root_poa = this.orb_.getRootPOA(); this.root_poa_ = this.orb_.getRootPOA(); this.serverObjImpl = new ServerObjectImpl (this.orb_, this.poa_, this.root_poa_); if (this.serverObjImpl == null) { throw new INTERNAL ("ImRAccessImpl.registerPOA_TaoImR_i: can't create an instance of ServerObjectImpl"); } // activate it in rootPOA this.root_poa_.activate_object (this.serverObjImpl); org.omg.CORBA.Object objRef = this.root_poa_.servant_to_reference (this.serverObjImpl); String corbaLoc = CorbaLoc.generateCorbalocForMultiIIOPProfiles (this.orb_, objRef); int slash = corbaLoc.indexOf("/"); // save the endpoint part and discard the object_key part String partialCorbaLoc = corbaLoc; if (slash > 0) { partialCorbaLoc = corbaLoc.substring(0, slash+1); } ServerObject svr = ServerObjectHelper.narrow(objRef); // notfy TAO ImR that we are running this.imrLocator.server_is_running (theName, partialCorbaLoc, svr); } catch (Exception e) { e.printStackTrace(); throw new INTERNAL ( "ImRAccessImpl.registerPOA_TaoImR_i: got an exception while registering " + theName + " with TAO ImR, " + e.toString()); } } @Override public void setServerDown (String implname) throws INTERNAL { } /** * This function will unregister the server from the TAO ImR by calling * the TAO ImR locator's server_is_shutting_down function. * @param orb * @param poa * @param implname * @throws INTERNAL */ @Override public void setServerDown ( org.jacorb.orb.ORB orb, org.jacorb.poa.POA poa, String implname) throws INTERNAL { if (this.imrLocator != null) { try { // notify ImR of being shutdown this.imrLocator.server_is_shutting_down (poa._getQualifiedName()); } catch (Exception e1) { // ignored e1.printStackTrace(); } // deactivate the ServerObjectImpl if (this.serverObjImpl != null) { try { // get root_poa from the ServerObject org.omg.PortableServer.POA root_poa = this.serverObjImpl._default_POA(); if (root_poa != null) { byte[] id = root_poa.servant_to_id (this.serverObjImpl); root_poa.deactivate_object (id); this.serverObjImpl = null; } } catch (Exception e2) { e2.printStackTrace(); // force to exit System.exit(1); } } } } }