package org.jacorb.notification.servant;
/*
* 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.HashMap;
import java.util.Map;
import org.jacorb.config.*;
import org.jacorb.notification.MessageFactory;
import org.jacorb.notification.OfferManager;
import org.jacorb.notification.SubscriptionManager;
import org.jacorb.notification.engine.TaskProcessor;
import org.jacorb.notification.interfaces.Message;
import org.omg.CORBA.Any;
import org.omg.CORBA.InterfaceDef;
import org.omg.CORBA.InterfaceDefHelper;
import org.omg.CORBA.NO_IMPLEMENT;
import org.omg.CORBA.NVList;
import org.omg.CORBA.ORB;
import org.omg.CORBA.OperationDescription;
import org.omg.CORBA.ParameterMode;
import org.omg.CORBA.Repository;
import org.omg.CORBA.ServerRequest;
import org.omg.CORBA.InterfaceDefPackage.FullInterfaceDescription;
import org.omg.CosEventChannelAdmin.AlreadyConnected;
import org.omg.CosEventComm.Disconnected;
import org.omg.CosEventComm.PushSupplier;
import org.omg.CosNotifyChannelAdmin.ProxyType;
import org.omg.CosNotifyChannelAdmin.SupplierAdmin;
import org.omg.CosTypedEventChannelAdmin.InterfaceNotSupported;
import org.omg.CosTypedNotifyChannelAdmin.TypedProxyPushConsumerOperations;
import org.omg.CosTypedNotifyChannelAdmin.TypedProxyPushConsumerPOATie;
import org.omg.PortableServer.DynamicImplementation;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.Servant;
/**
* @jmx.mbean extends = "AbstractProxyConsumerMBean"
* @jboss.xmbean
*
* @author Alphonse Bendt
*/
public class TypedProxyPushConsumerImpl extends AbstractProxyConsumer implements
TypedProxyPushConsumerOperations, ITypedProxy, TypedProxyPushConsumerImplMBean
{
private final String supportedInterface_;
private TypedProxyPushConsumer typedProxyPushConsumer_;
private PushSupplier pushSupplier_;
private final InterfaceDef interfaceDef_;
private final Map fullQualifiedOperationNames_ = new HashMap();
private final FullInterfaceDescription interfaceDescription_;
private class TypedProxyPushConsumer extends DynamicImplementation
{
private final String[] supportedInterfaces_;
TypedProxyPushConsumer()
{
supportedInterfaces_ = new String[] { supportedInterface_ };
}
public void invoke(ServerRequest request)
{
final NVList _params = getExpectedParamList(request.operation());
request.arguments(_params);
final String _operationName = getFullQualifiedName(request.operation());
final Message _mesg = getMessageFactory().newMessage(supportedInterface_, _operationName,
_params, TypedProxyPushConsumerImpl.this);
processMessage(_mesg);
}
public String[] _all_interfaces(POA poa, byte[] oid)
{
return supportedInterfaces_;
}
public POA _default_POA()
{
return getPOA();
}
}
// ////////////////////////////
public TypedProxyPushConsumerImpl(ITypedAdmin admin, SupplierAdmin supplierAdmin, ORB orb,
POA poa, Configuration conf, TaskProcessor taskProcessor, MessageFactory messageFactory,
OfferManager offerManager, SubscriptionManager subscriptionManager,
Repository repository) throws InterfaceNotSupported
{
super(admin, orb, poa, conf, taskProcessor, messageFactory, supplierAdmin, offerManager,
subscriptionManager);
supportedInterface_ = admin.getSupportedInterface();
interfaceDef_ = InterfaceDefHelper.narrow(repository.lookup_id(supportedInterface_));
interfaceDescription_ = interfaceDef_.describe_interface();
ensureOperationOnlyUsesInParams(interfaceDescription_);
}
// ////////////////////////////
private OperationDescription getOperationDescription(String operation)
{
for (int x = 0; x < interfaceDescription_.operations.length; ++x)
{
if (operation.equals(interfaceDescription_.operations[x].name))
{
return interfaceDescription_.operations[x];
}
}
throw new IllegalArgumentException("No OperationDescription for " + operation);
}
private String getFullQualifiedName(String operation)
{
String _fullQualifiedName = (String) fullQualifiedOperationNames_.get(operation);
if (_fullQualifiedName == null)
{
_fullQualifiedName = interfaceDef_.lookup(operation).absolute_name();
fullQualifiedOperationNames_.put(operation, _fullQualifiedName);
}
return _fullQualifiedName;
}
private NVList getExpectedParamList(String operation)
{
final OperationDescription _operation = getOperationDescription(operation);
final NVList _expectedParams = getORB().create_list(_operation.parameters.length);
for (int x = 0; x < _operation.parameters.length; ++x)
{
Any _value = getORB().create_any();
_value.type(_operation.parameters[x].type);
_expectedParams.add_value(_operation.parameters[x].name, _value,
ParameterMode._PARAM_IN);
}
return _expectedParams;
}
private void ensureOperationOnlyUsesInParams(FullInterfaceDescription interfaceDescription) throws InterfaceNotSupported
{
for (int x = 0; x < interfaceDescription.operations.length; ++x)
{
final int _noOfParameters = interfaceDescription.operations[x].parameters.length;
for (int y = 0; y < _noOfParameters; ++y)
{
switch (interfaceDescription.operations[x].parameters[y].mode.value()) {
case ParameterMode._PARAM_IN:
break;
case ParameterMode._PARAM_INOUT:
// fallthrough
case ParameterMode._PARAM_OUT:
throw new InterfaceNotSupported("only IN params allowed");
}
}
}
}
public ProxyType MyType()
{
return ProxyType.PUSH_TYPED;
}
public void connect_typed_push_supplier(PushSupplier pushSupplier) throws AlreadyConnected
{
logger_.info("connect typed_push_supplier");
checkIsNotConnected();
connectClient(pushSupplier);
pushSupplier_ = pushSupplier;
}
public void push(Any any) throws Disconnected
{
throw new NO_IMPLEMENT();
}
public org.omg.CORBA.Object get_typed_consumer()
{
if (typedProxyPushConsumer_ == null)
{
typedProxyPushConsumer_ = new TypedProxyPushConsumer();
}
return typedProxyPushConsumer_._this_object(getORB());
}
public void disconnect_push_consumer()
{
destroy();
}
public void disconnectClient()
{
if (pushSupplier_ != null)
{
pushSupplier_.disconnect_push_supplier();
pushSupplier_ = null;
}
}
public Servant newServant()
{
return new TypedProxyPushConsumerPOATie(this);
}
/**
* @jmx.managed-attribute
* access = "read-only"
*/
public String getSupportedInterface()
{
return supportedInterface_;
}
}