package org.jacorb.notification.impl;
/*
* 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.
*
*/
import org.jacorb.config.*;
import org.jacorb.notification.AnyMessage;
import org.jacorb.notification.MessageFactory;
import org.jacorb.notification.StructuredEventMessage;
import org.jacorb.notification.TypedEventMessage;
import org.jacorb.notification.interfaces.Disposable;
import org.jacorb.notification.interfaces.Message;
import org.jacorb.notification.servant.IProxyConsumer;
import org.jacorb.notification.util.AbstractObjectPool;
import org.jacorb.notification.util.AbstractPoolablePool;
import org.omg.CORBA.Any;
import org.omg.CORBA.Bounds;
import org.omg.CORBA.NVList;
import org.omg.CORBA.NamedValue;
import org.omg.CORBA.ORB;
import org.omg.CosNotification.Property;
import org.omg.CosNotification.StructuredEvent;
import org.omg.CosNotification.StructuredEventHelper;
/**
* @author Alphonse Bendt
*/
public class DefaultMessageFactory implements Disposable, MessageFactory
{
private final ORB orb;
private final AbstractObjectPool typedEventMessagePool_ =
new AbstractPoolablePool("TypedEventMessagePool")
{
public Object newInstance()
{
return new TypedEventMessage();
}
};
private final AbstractObjectPool anyMessagePool_ =
new AbstractPoolablePool("AnyMessagePool")
{
public Object newInstance()
{
return new AnyMessage();
}
};
private final AbstractObjectPool structuredEventMessagePool_ =
new AbstractPoolablePool("StructuredEventMessagePool")
{
public Object newInstance()
{
return new StructuredEventMessage(orb);
}
};
public DefaultMessageFactory(ORB orb, Configuration conf)
{
this.orb = orb;
anyMessagePool_.configure(conf);
structuredEventMessagePool_.configure(conf);
typedEventMessagePool_.configure(conf);
}
public void dispose()
{
structuredEventMessagePool_.dispose();
anyMessagePool_.dispose();
typedEventMessagePool_.dispose();
}
////////////////////////////////////////
// Used by the Proxies
/**
* create a Message wrapping an unstructured event.
*/
public Message newMessage(Any any, IProxyConsumer consumer)
{
if (StructuredEventHelper.type().equals(any.type()))
{
// received a StructuredEvent wrapped inside an Any
// see Spec. 2-11
return newMessage(StructuredEventHelper.extract(any), consumer);
}
AnyMessage _mesg = newAnyMessage(any);
_mesg.initReceiveTimestamp();
_mesg.setFilterStage(consumer.getFirstStage());
return _mesg.getHandle();
}
/**
* create a Message wrapping a structured event.
*/
public Message newMessage(StructuredEvent structuredEvent, IProxyConsumer consumer)
{
final String _typeName = structuredEvent.header.fixed_header.event_type.type_name;
if (AnyMessage.TYPE_NAME.equals(_typeName))
{
// received an Any wrapped inside a StructuredEvent
// see Spec. 2-11
return newMessage(structuredEvent.remainder_of_body, consumer);
}
StructuredEventMessage _mesg =
(StructuredEventMessage) structuredEventMessagePool_.lendObject();
_mesg.initReceiveTimestamp();
_mesg.setFilterStage(consumer.getFirstStage());
_mesg.setStructuredEvent(structuredEvent, consumer.getStartTimeSupported(), consumer
.getStopTimeSupported());
return _mesg.getHandle();
}
/**
* create a Message wrapping a typed event.
*/
public Message newMessage(String interfaceName, String operationName, NVList args,
IProxyConsumer consumer)
{
try
{
TypedEventMessage _mesg = (TypedEventMessage) typedEventMessagePool_.lendObject();
_mesg.initReceiveTimestamp();
Property[] _props = new Property[args.count()];
for (int x = 0; x < _props.length; ++x)
{
NamedValue _nv = args.item(x);
_props[x] = new Property(_nv.name(), _nv.value());
}
_mesg.setTypedEvent(interfaceName, operationName, _props);
_mesg.setFilterStage(consumer.getFirstStage());
return _mesg.getHandle();
} catch (Bounds e)
{
// this should never happen as NamedValue bounds are checked always.
throw new RuntimeException(e.toString());
}
}
////////////////////////////////////////
// used by the Filters
/**
* create a message wrapping a typed event.
*/
public Message newMessage(Property[] props)
{
TypedEventMessage _mesg = (TypedEventMessage) typedEventMessagePool_.lendObject();
_mesg.setTypedEvent(props);
return _mesg.getHandle();
}
/**
* create a Message wrapping a unstructured event.
*/
public Message newMessage(Any any)
{
if (StructuredEventHelper.type().equals(any.type()))
{
return newMessage(StructuredEventHelper.extract(any));
}
AnyMessage _mesg = newAnyMessage(any);
return _mesg.getHandle();
}
private AnyMessage newAnyMessage(Any any)
{
AnyMessage _mesg = (AnyMessage) anyMessagePool_.lendObject();
_mesg.setAny(any);
return _mesg;
}
/**
* create a message wrapping a structured event.
*/
public Message newMessage(StructuredEvent structuredEvent)
{
String _typeName = structuredEvent.header.fixed_header.event_type.type_name;
if (AnyMessage.TYPE_NAME.equals(_typeName))
{
return newMessage(structuredEvent.remainder_of_body);
}
StructuredEventMessage _mesg =
(StructuredEventMessage) structuredEventMessagePool_.lendObject();
_mesg.setStructuredEvent(structuredEvent, false, false);
return _mesg.getHandle();
}
}