package org.jacorb.notification.queue;
/*
* 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 java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.jacorb.config.*;
import org.jacorb.notification.conf.Attributes;
import org.jacorb.notification.conf.Default;
import org.jacorb.notification.util.QoSPropertySet;
import org.omg.CosNotification.AnyOrder;
import org.omg.CosNotification.DeadlineOrder;
import org.omg.CosNotification.DiscardPolicy;
import org.omg.CosNotification.FifoOrder;
import org.omg.CosNotification.LifoOrder;
import org.omg.CosNotification.MaxEventsPerConsumer;
import org.omg.CosNotification.OrderPolicy;
import org.omg.CosNotification.PriorityOrder;
/**
* @author Alphonse Bendt
*/
public class EventQueueFactory implements Configurable
{
private static final short UNKNOWN_POLICY = Short.MIN_VALUE;
private static final Map mapOrderPolicyNameToValue;
private static final Map mapDiscardPolicyNameToValue;
private String orderPolicy_;
private String discardPolicy_;
static
{
Map orderMap = new HashMap();
orderMap.put("anyorder", new Short(AnyOrder.value));
orderMap.put("fifoorder", new Short(FifoOrder.value));
orderMap.put("priorityorder", new Short(PriorityOrder.value));
orderMap.put("deadlineorder", new Short(DeadlineOrder.value));
mapOrderPolicyNameToValue = Collections.unmodifiableMap(orderMap);
Map discardMap = new HashMap();
discardMap.put("anyorder", new Short(AnyOrder.value));
discardMap.put("fifoorder", new Short(FifoOrder.value));
discardMap.put("lifoorder", new Short(LifoOrder.value));
discardMap.put("priorityorder", new Short(PriorityOrder.value));
discardMap.put("deadlineorder", new Short(DeadlineOrder.value));
mapDiscardPolicyNameToValue = Collections.unmodifiableMap(discardMap);
}
////////////////////////////////////////
public EventQueueFactory(Configuration config) throws ConfigurationException
{
configure(config);
}
////////////////////////////////////////
public void configure(Configuration conf) throws ConfigurationException
{
try
{
setOrderPolicy(conf.getAttribute(Attributes.ORDER_POLICY, Default.DEFAULT_ORDER_POLICY));
setDiscardPolicy(conf.getAttribute(Attributes.DISCARD_POLICY,
Default.DEFAULT_DISCARD_POLICY));
} catch (IllegalArgumentException e)
{
throw new ConfigurationException("Invalid Policy", e);
}
}
private void setDiscardPolicy(String s)
{
final String policy = s.toLowerCase().trim();
if (mapDiscardPolicyNameToValue.containsKey(policy))
{
discardPolicy_ = policy;
}
else
{
throw new IllegalArgumentException("Invalid DiscardPolicy: " + s);
}
}
private void setOrderPolicy(String s)
{
final String policy = s.toLowerCase().trim();
if (mapOrderPolicyNameToValue.containsKey(policy))
{
orderPolicy_ = policy;
}
else
{
throw new IllegalArgumentException("Invalid OrderPolicy: " + s);
}
}
public MessageQueueAdapter newMessageQueue(QoSPropertySet qosProperties)
{
short shortOrderPolicy = orderPolicyNameToValue(orderPolicy_);
short shortDiscardPolicy = discardPolicyNameToValue(discardPolicy_);
int maxEventsPerConsumer;
try
{
maxEventsPerConsumer = qosProperties.get(MaxEventsPerConsumer.value).extract_long();
} catch (Exception e)
{
maxEventsPerConsumer = Default.DEFAULT_MAX_EVENTS_PER_CONSUMER;
}
if (qosProperties.containsKey(OrderPolicy.value))
{
shortOrderPolicy = qosProperties.get(OrderPolicy.value).extract_short();
}
if (qosProperties.containsKey(DiscardPolicy.value))
{
shortDiscardPolicy = qosProperties.get(DiscardPolicy.value).extract_short();
}
final EventQueueOverflowStrategy _overflowStrategy;
switch (shortDiscardPolicy) {
case AnyOrder.value:
// fallthrough. will default to FifoOrder
case FifoOrder.value:
_overflowStrategy = EventQueueOverflowStrategy.FIFO;
break;
case LifoOrder.value:
_overflowStrategy = EventQueueOverflowStrategy.LIFO;
break;
case PriorityOrder.value:
_overflowStrategy = EventQueueOverflowStrategy.LEAST_PRIORITY;
break;
case DeadlineOrder.value:
_overflowStrategy = EventQueueOverflowStrategy.EARLIEST_TIMEOUT;
break;
default:
throw new IllegalArgumentException("Discardpolicy: " + discardPolicy_
+ "DiscardPolicyValue: " + shortDiscardPolicy + " unknown");
}
final AbstractBoundedEventQueue queue;
switch (shortOrderPolicy) {
case AnyOrder.value:
// fallthrough. will default to FifoOrder
case FifoOrder.value:
queue = new BoundedFifoEventQueue(maxEventsPerConsumer, _overflowStrategy);
break;
case PriorityOrder.value:
queue = new BoundedPriorityEventQueue(maxEventsPerConsumer, _overflowStrategy);
break;
case DeadlineOrder.value:
queue = new BoundedDeadlineEventQueue(maxEventsPerConsumer, _overflowStrategy);
break;
default:
throw new IllegalArgumentException("Orderpolicy: " + orderPolicy_
+ " OrderPolicyValue: " + shortOrderPolicy + " unknown");
}
return new DefaultMessageQueueAdapter(queue);
}
private static short orderPolicyNameToValue(String orderPolicyName)
{
if (mapOrderPolicyNameToValue.containsKey(orderPolicyName.toLowerCase()))
{
return ((Short) mapOrderPolicyNameToValue.get(orderPolicyName)).shortValue();
}
return UNKNOWN_POLICY;
}
private static short discardPolicyNameToValue(String discardPolicyName)
{
if (mapDiscardPolicyNameToValue.containsKey(discardPolicyName.toLowerCase()))
{
return ((Short) mapDiscardPolicyNameToValue.get(discardPolicyName)).shortValue();
}
return UNKNOWN_POLICY;
}
}