package org.jacorb.poa; /* * 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 java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.omg.CORBA.INTERNAL; import org.omg.PortableServer.POAManagerPackage.AdapterInactive; import org.omg.PortableServer.POAManagerPackage.State; /** * The poa manager class, an implementation of org.omg.PortableServer.POAManager * * @author Reimo Tiedemann, FU Berlin */ public class POAManager extends org.omg.PortableServer._POAManagerLocalBase { public State state = State.HOLDING; private final org.jacorb.orb.ORB orb; private final List poas = new ArrayList(); private POAManagerMonitor monitor; protected boolean poaCreationFailed; protected POAManager(org.jacorb.orb.ORB _orb) { orb = _orb; monitor = new POAManagerMonitorLightImpl(); ((POAManagerMonitorLightImpl)monitor).configure(orb.getConfiguration()); monitor.init(this); monitor.openMonitor(); monitor.printMessage("ready"); } public void activate() throws AdapterInactive { checkCreation (); switch (state.value()) { case State._INACTIVE : throw new AdapterInactive(); case State._ACTIVE : break; default: state = State.ACTIVE; monitor.setToActive(); final POA [] poaArray; synchronized (this) { poaArray = (POA[]) poas.toArray(new POA[poas.size()]); } // notify all registered poas Thread thread = new Thread() { public void run() { for (int i=0; i<poaArray.length; i++) { try { poaArray[i].changeToActive(); } catch (Throwable e) {} } } }; thread.setName("POAChangeToActive"); thread.start(); } } public void deactivate (boolean etherealize_objects, boolean wait_for_completion) throws AdapterInactive { checkCreation (); if (wait_for_completion && isInInvocationContext()) { throw new org.omg.CORBA.BAD_INV_ORDER(); } switch (state.value()) { case State._INACTIVE : throw new AdapterInactive(); default : state = State.INACTIVE; monitor.setToInactive(wait_for_completion, etherealize_objects); final boolean etherealize = etherealize_objects; final POA [] poaArray; synchronized (this) { poaArray = (POA[]) poas.toArray(new POA[poas.size()]); } // notify all registered poas Thread thread = new Thread() { public void run() { for (int i=poaArray.length-1; i>=0; i--) { try { poaArray[i].changeToInactive(etherealize); } catch (Throwable e) {} } } }; thread.setName("POAChangeToInactive"); thread.start(); if (wait_for_completion) { try { thread.join(); } catch (InterruptedException e) {} } } } public void discard_requests(boolean wait_for_completion) throws AdapterInactive { checkCreation (); if (wait_for_completion && isInInvocationContext()) { throw new org.omg.CORBA.BAD_INV_ORDER(); } switch (state.value()) { case State._INACTIVE : throw new AdapterInactive(); case State._DISCARDING : break; default : state = State.DISCARDING; monitor.setToDiscarding(wait_for_completion); final POA [] poaArray; synchronized (this) { poaArray = (POA[]) poas.toArray(new POA[poas.size()]); } // notify all registered poas Thread thread = new Thread() { public void run() { for (int i=poaArray.length-1; i>=0; i--) { try { poaArray[i].changeToDiscarding(); } catch (Throwable e) {} } } }; thread.setName("POAChangeToDiscarding"); thread.start(); if (wait_for_completion) { try { thread.join(); } catch (InterruptedException e) {} } } } public State get_state() { return state; } protected synchronized POA getRegisteredPOA(String name) { POA result; Iterator en = poas.iterator(); while (en.hasNext()) { result = (POA) en.next(); if (name.equals(result._getQualifiedName())) { return result; } } throw new INTERNAL ( "POA not registered: " + POAConstants.ROOT_POA_NAME+ POAConstants.OBJECT_KEY_SEPARATOR+ name ); } public void hold_requests(boolean wait_for_completion) throws AdapterInactive { checkCreation (); if (wait_for_completion && isInInvocationContext()) { throw new org.omg.CORBA.BAD_INV_ORDER(); } switch (state.value()) { case State._INACTIVE : throw new AdapterInactive(); case State._HOLDING : break; default : state = State.HOLDING; monitor.setToHolding(wait_for_completion); final POA [] poaArray; synchronized (this) { poaArray = (POA[]) poas.toArray(new POA[poas.size()]); } // notify all registered poas Thread thread = new Thread() { public void run() { for (int i=poaArray.length-1; i>=0; i--) { try { poaArray[i].changeToHolding(); } catch (Throwable e) {} } } }; thread.setName("POAChangeToHolding"); thread.start(); if (wait_for_completion) { try { thread.join(); } catch (InterruptedException e) {} } } } /** * it returns true if the current thread is not in an invocation * context dispatched by some POA belonging to the same ORB as this POAManager. */ private boolean isInInvocationContext() { try { if (orb.getPOACurrent().getORB() == orb) { return true; } } catch (org.omg.PortableServer.CurrentPackage.NoContext e) { } return false; } protected synchronized void registerPOA(POA poa) { if (!poas.contains(poa)) { poas.add(poa); monitor.addPOA(poa._getQualifiedName()); } } protected void setMonitor(POAManagerMonitor _monitor) { monitor = _monitor; } protected synchronized void unregisterPOA(POA poa) { poas.remove(poa); monitor.removePOA(poa._getQualifiedName()); } private void checkCreation () { if (poaCreationFailed) { throw new org.omg.CORBA.INTERNAL ("POA Creation failed; unable to deactive"); } } }