blob: 8916bf3cd653406415b788ea1f617ab4438698aa [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.yoko.orb.PortableInterceptor;
final public class IMRIORInterceptor_impl extends org.omg.CORBA.LocalObject
implements org.omg.PortableInterceptor.IORInterceptor_3_0 {
private java.util.Hashtable poas_;
private org.apache.yoko.orb.OB.Logger logger_;
private org.apache.yoko.orb.IMR.ActiveState as_;
private String serverInstance_;
private boolean running_;
// ------------------------------------------------------------------
// Private Member Functions
// ------------------------------------------------------------------
private org.apache.yoko.orb.IMR.POAStatus convertState(short state) {
org.apache.yoko.orb.IMR.POAStatus status = org.apache.yoko.orb.IMR.POAStatus.NON_EXISTENT;
switch (state) {
case org.omg.PortableInterceptor.INACTIVE.value:
status = org.apache.yoko.orb.IMR.POAStatus.INACTIVE;
break;
case org.omg.PortableInterceptor.ACTIVE.value:
status = org.apache.yoko.orb.IMR.POAStatus.ACTIVE;
break;
case org.omg.PortableInterceptor.HOLDING.value:
status = org.apache.yoko.orb.IMR.POAStatus.HOLDING;
break;
case org.omg.PortableInterceptor.DISCARDING.value:
status = org.apache.yoko.orb.IMR.POAStatus.DISCARDING;
break;
}
return status;
}
// ------------------------------------------------------------------
// Public Member Functions
// ------------------------------------------------------------------
public IMRIORInterceptor_impl(org.apache.yoko.orb.OB.Logger logger,
org.apache.yoko.orb.IMR.ActiveState as, String serverInstance) {
logger_ = logger;
as_ = as;
serverInstance_ = serverInstance;
running_ = false;
poas_ = new java.util.Hashtable();
}
// ------------------------------------------------------------------
// IDL to Java Mapping
// ------------------------------------------------------------------
public String name() {
return new String("IMRInterceptor");
}
public void destroy() {
}
public void establish_components(org.omg.PortableInterceptor.IORInfo info) {
}
public void components_established(org.omg.PortableInterceptor.IORInfo info) {
//
// This method does nothing if this is not a persistent POA
//
try {
org.omg.CORBA.Policy p = info
.get_effective_policy(org.omg.PortableServer.LIFESPAN_POLICY_ID.value);
org.omg.PortableServer.LifespanPolicy policy = org.omg.PortableServer.LifespanPolicyHelper
.narrow(p);
if (policy.value() != org.omg.PortableServer.LifespanPolicyValue.PERSISTENT)
return;
} catch (org.omg.CORBA.INV_POLICY e) {
//
// Default Lifespan policy is TRANSIENT
//
return;
}
//
// Get the primary object-reference template
//
org.omg.PortableInterceptor.ObjectReferenceTemplate primary = info
.adapter_template();
try {
short state = info.state();
org.apache.yoko.orb.IMR.POAStatus status = convertState(state);
org.omg.PortableInterceptor.ObjectReferenceTemplate secondary = as_
.poa_create(status, primary);
info.current_factory(secondary);
} catch (org.apache.yoko.orb.IMR._NoSuchPOA e) {
String msg = "IMR: POA not registered: ";
for (int i = 0; i < e.poa.length; i++) {
msg += e.poa[i];
if (i != e.poa.length - 1)
msg += "/";
}
logger_.error(msg, e);
throw new org.omg.CORBA.INITIALIZE();
} catch (org.omg.CORBA.SystemException ex) {
String msg = "IMR: Cannot contact: " + ex.getMessage();
logger_.error(msg, ex);
throw new org.omg.CORBA.INITIALIZE(); // TODO: - some exception
}
//
// Update the poa hash table
//
String id = info.manager_id();
String[] name = primary.adapter_name();
java.util.Vector poas = (java.util.Vector) poas_.get(new Integer(id));
if (poas != null) {
//
// Add poa to exiting entry
//
poas.addElement(name);
// XXX Do I have to reput
} else {
//
// Add a new entry for this adapter manager
//
poas = new java.util.Vector();
poas.addElement(name);
poas_.put(new Integer(id), poas);
}
}
public void adapter_state_changed(
org.omg.PortableInterceptor.ObjectReferenceTemplate[] templates,
short state) {
//
// Only update the IMR from this point if the POAs have
// been destroyed.
//
if (state != org.omg.PortableInterceptor.NON_EXISTENT.value)
return;
java.util.Vector poanames = new java.util.Vector();
for (int i = 0; i < templates.length; ++i) {
try {
org.apache.yoko.orb.OBPortableInterceptor.PersistentORT_impl persistentORT = (org.apache.yoko.orb.OBPortableInterceptor.PersistentORT_impl) templates[i];
} catch (ClassCastException ex) {
//
// If not a Persistent ORT continue
//
continue;
}
String[] adpaterName = templates[i].adapter_name();
//
// Add the POA to the list of POAs to send to the
// IMR for the status update
//
poanames.addElement(adpaterName);
//
// Find the POA in the POAManager -> POAs map and
// remove it.
//
java.util.Enumeration e = poas_.elements();
while (e.hasMoreElements()) {
java.util.Vector poas = (java.util.Vector) e.nextElement();
//
// Find the poa being deleted
//
int j;
for (j = 0; j < poas.size(); ++j) {
String[] current = (String[]) poas.elementAt(j);
if (current.length != adpaterName.length)
continue;
boolean found = true;
for (int k = 0; k < adpaterName.length; ++k) {
if (!current[k].equals(adpaterName[k])) {
found = false;
break;
}
}
if (found)
break;
}
//
// Shift back the remaining poas if match found
//
if (j != poas.size()) {
poas.removeElementAt(j);
break;
}
}
}
if (poanames.size() != 0) {
try {
String[][] poaArray = new String[poanames.size()][];
poanames.copyInto(poaArray);
as_.poa_status_update(poaArray,
org.apache.yoko.orb.IMR.POAStatus.NON_EXISTENT);
} catch (org.omg.CORBA.SystemException ex) {
String msg = "IMR: poa_destroy: " + ex.getMessage();
logger_.warning(msg, ex);
}
}
}
//
// Update POA states for this adapter
//
public void adapter_manager_state_changed(String id, short state) {
if (!running_) {
//
// Inform the IMR the server is now running if this
// is the first call.
//
try {
as_.set_status(serverInstance_,
org.apache.yoko.orb.IMR.ServerStatus.RUNNING);
} catch (org.omg.CORBA.OBJECT_NOT_EXIST ex) {
logger_.error("IMR: Not registered", ex);
throw new org.omg.CORBA.INITIALIZE();
} catch (org.omg.CORBA.SystemException ex) {
logger_.error("IMR: Cannot contact", ex);
throw new org.omg.CORBA.INITIALIZE();
}
running_ = true;
}
//
// Inform the IMR of the POA status update
//
java.util.Vector poas = (java.util.Vector) poas_.get(new Integer(id));
if (poas != null && poas.size() != 0) {
try {
String[][] poaArray = new String[poas.size()][];
poas.copyInto(poaArray);
org.apache.yoko.orb.IMR.POAStatus status = convertState(state);
as_.poa_status_update(poaArray, status);
} catch (org.omg.CORBA.SystemException ex) {
//
// XXX ????
//
}
}
}
}