package org.jacorb.notification.util; /* * 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.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.jacorb.config.Configuration; import org.jacorb.config.ConfigurationException; import org.jacorb.notification.conf.Attributes; import org.jacorb.notification.conf.Default; import org.omg.CORBA.Any; import org.omg.CORBA.BAD_OPERATION; import org.omg.CORBA.INTERNAL; import org.omg.CosNotification.AnyOrder; import org.omg.CosNotification.BestEffort; import org.omg.CosNotification.ConnectionReliability; import org.omg.CosNotification.DeadlineOrder; import org.omg.CosNotification.DiscardPolicy; import org.omg.CosNotification.EventReliability; import org.omg.CosNotification.FifoOrder; import org.omg.CosNotification.LifoOrder; import org.omg.CosNotification.MaxEventsPerConsumer; import org.omg.CosNotification.MaximumBatchSize; import org.omg.CosNotification.NamedPropertyRangeSeqHolder; import org.omg.CosNotification.OrderPolicy; import org.omg.CosNotification.PacingInterval; import org.omg.CosNotification.Persistent; import org.omg.CosNotification.Priority; import org.omg.CosNotification.PriorityOrder; import org.omg.CosNotification.Property; import org.omg.CosNotification.PropertyError; import org.omg.CosNotification.PropertyRange; import org.omg.CosNotification.QoSError_code; import org.omg.CosNotification.StartTime; import org.omg.CosNotification.StartTimeSupported; import org.omg.CosNotification.StopTime; import org.omg.CosNotification.StopTimeSupported; import org.omg.CosNotification.Timeout; import org.omg.CosNotification.UnsupportedQoS; import org.omg.TimeBase.TimeTHelper; /** * @author Alphonse Bendt */ public class QoSPropertySet extends PropertySet { public static final int CHANNEL_QOS = 0; public static final int ADMIN_QOS = 1; public static final int PROXY_QOS = 2; private Property[] defaultChannelQoS_; private Property[] defaultAdminQoS_; private static final Set<String> sValidChannelQoSNames_; private static final Set<String> sValidAdminQoSNames_; private static final Set<String> sValidProxyQoSNames_; private static final Any connectionReliabilityLow_; private static final Any connectionReliabilityHigh_; private static final Any eventReliabilityLow_; private static final Any eventReliabilityHigh_; private static Any orderPolicyLow_; //private Any orderPolicyDefault_; private static Any orderPolicyHigh_; private static Any discardPolicyLow_; private static Any discardPolicyHigh_; private static Any priorityLow_; private static Any priorityDefault_; private static Any priorityHigh_; private Any maxEventsPerConsumerLow_; private Any maxEventsPerConsumerDefault_; private Any maxEventsPerConsumerHigh_; //private Any timeoutHigh_; private Any timeoutDefault_; //private Any timeoutLow_; private static final Any trueAny; private static final Any falseAny; //////////////////////////////////////// static { trueAny = sORB.create_any(); falseAny = sORB.create_any(); trueAny.insert_boolean(true); falseAny.insert_boolean(false); ////////////////////////////// HashSet<String> _validChannelQoS = new HashSet<String>(); _validChannelQoS.add(EventReliability.value); _validChannelQoS.add(ConnectionReliability.value); _validChannelQoS.add(Priority.value); _validChannelQoS.add(Timeout.value); _validChannelQoS.add(StartTimeSupported.value); _validChannelQoS.add(StopTimeSupported.value); _validChannelQoS.add(MaxEventsPerConsumer.value); _validChannelQoS.add(OrderPolicy.value); _validChannelQoS.add(DiscardPolicy.value); _validChannelQoS.add(MaximumBatchSize.value); _validChannelQoS.add(PacingInterval.value); sValidChannelQoSNames_ = Collections.unmodifiableSet(_validChannelQoS); //////////////////// HashSet<String> _adminNames = new HashSet<String>(sValidChannelQoSNames_); _adminNames.remove(EventReliability.value); sValidAdminQoSNames_ = Collections.unmodifiableSet(_adminNames); //////////////////// sValidProxyQoSNames_ = sValidAdminQoSNames_; //////////////////// HashSet<String> _validMessageQoS = new HashSet<String>(); _validMessageQoS.add(EventReliability.value); _validMessageQoS.add(Priority.value); _validMessageQoS.add(StartTime.value); _validMessageQoS.add(StopTime.value); _validMessageQoS.add(Timeout.value); //////////////////// connectionReliabilityHigh_ = sORB.create_any(); connectionReliabilityHigh_.insert_short(Persistent.value); connectionReliabilityLow_ = sORB.create_any(); connectionReliabilityLow_.insert_short(BestEffort.value); //////////////////// eventReliabilityLow_ = sORB.create_any(); eventReliabilityLow_.insert_short(BestEffort.value); eventReliabilityHigh_ = sORB.create_any(); eventReliabilityHigh_.insert_short(BestEffort.value); //////////////////// orderPolicyLow_ = sORB.create_any(); orderPolicyLow_.insert_short(AnyOrder.value); orderPolicyHigh_ = sORB.create_any(); orderPolicyHigh_.insert_short(DeadlineOrder.value); //////////////////// discardPolicyLow_ = sORB.create_any(); discardPolicyLow_.insert_short(AnyOrder.value); discardPolicyHigh_ = sORB.create_any(); discardPolicyHigh_.insert_short(DeadlineOrder.value); //////////////////// priorityLow_ = sORB.create_any(); priorityLow_.insert_short(Short.MIN_VALUE); priorityDefault_ = sORB.create_any(); priorityDefault_.insert_short((short)0); priorityHigh_ = sORB.create_any(); priorityHigh_.insert_short(Short.MAX_VALUE); } private void configure (Configuration conf) { int _maxEventsPerConsumerDefault; int _maxBatchSize; try { _maxEventsPerConsumerDefault = conf.getAttributeAsInteger( Attributes.MAX_EVENTS_PER_CONSUMER, Default.DEFAULT_MAX_EVENTS_PER_CONSUMER ); _maxBatchSize = conf.getAttributeAsInteger(Attributes.MAX_BATCH_SIZE, Default.DEFAULT_MAX_BATCH_SIZE); } catch (ConfigurationException ex) { logger_.error ("Error configuring QoSPropertySet ", ex); throw new INTERNAL ("Error configuring QoSPropertySet " + ex); } maxEventsPerConsumerDefault_ = sORB.create_any(); maxEventsPerConsumerDefault_.insert_long(_maxEventsPerConsumerDefault); maxEventsPerConsumerHigh_ = sORB.create_any(); maxEventsPerConsumerLow_ = sORB.create_any(); maxEventsPerConsumerLow_.insert_long(0); maxEventsPerConsumerHigh_.insert_long(Integer.MAX_VALUE); //////////////////// timeoutDefault_ = sORB.create_any(); TimeTHelper.insert(timeoutDefault_, 0); //////////////////// Any _isStartTimeSupportedDefault = sORB.create_any(); boolean _isStartTimeSupported = conf.getAttribute(Attributes.START_TIME_SUPPORTED, Default.DEFAULT_START_TIME_SUPPORTED). equalsIgnoreCase("on"); _isStartTimeSupportedDefault.insert_boolean(_isStartTimeSupported); //////////////////// Any _isStopTimeSupportedDefault = sORB.create_any(); boolean _isStopTimeSupported = conf.getAttribute(Attributes.STOP_TIME_SUPPORTED, Default.DEFAULT_STOP_TIME_SUPPORTED). equalsIgnoreCase("on"); _isStopTimeSupportedDefault.insert_boolean(_isStopTimeSupported); //////////////////// Any _maxBatchSizeDefault = sORB.create_any(); _maxBatchSizeDefault.insert_long(_maxBatchSize); //////////////////// defaultChannelQoS_ = new Property[] { new Property(EventReliability.value, eventReliabilityLow_), new Property(ConnectionReliability.value, connectionReliabilityLow_), new Property(Priority.value, priorityDefault_), new Property(MaxEventsPerConsumer.value, maxEventsPerConsumerDefault_), new Property(Timeout.value, timeoutDefault_), new Property(StartTimeSupported.value, _isStartTimeSupportedDefault), new Property(StopTimeSupported.value, _isStartTimeSupportedDefault), new Property(MaximumBatchSize.value, _maxBatchSizeDefault) }; defaultAdminQoS_ = new Property[] { new Property(ConnectionReliability.value, connectionReliabilityLow_), new Property(Priority.value, priorityDefault_), new Property(MaxEventsPerConsumer.value, maxEventsPerConsumerDefault_), new Property(Timeout.value, timeoutDefault_), new Property(StartTimeSupported.value, _isStartTimeSupportedDefault), new Property(StopTimeSupported.value, _isStartTimeSupportedDefault), new Property(MaximumBatchSize.value, _maxBatchSizeDefault) }; } //////////////////////////////////////// private final Set<String> validNames_; //////////////////////////////////////// public QoSPropertySet(Configuration configuration, int type) { super(); configure(configuration); switch (type) { case CHANNEL_QOS: validNames_ = sValidChannelQoSNames_; set_qos(defaultChannelQoS_); break; case ADMIN_QOS: validNames_ = sValidAdminQoSNames_; set_qos(defaultAdminQoS_); break; case PROXY_QOS: validNames_ = sValidProxyQoSNames_; break; default: throw new IllegalArgumentException("Type " + type + " is invalid"); } } //////////////////////////////////////// protected Set<String> getValidNames() { return validNames_; } public void set_qos(Property[] ps) { set_properties(ps); } public Property[] get_qos() { return toArray(); } public void validate_qos(Property[] props, NamedPropertyRangeSeqHolder namedPropertyRange) throws UnsupportedQoS { List<PropertyError> _errors = new ArrayList<PropertyError>(); checkPropertyExistence(props, _errors); if (!_errors.isEmpty()) { throw new UnsupportedQoS((PropertyError[])_errors.toArray(PROPERTY_ERROR_ARRAY_TEMPLATE)); } checkPropertyValues(props, _errors); if (!_errors.isEmpty()) { throw new UnsupportedQoS((PropertyError[])_errors.toArray(PROPERTY_ERROR_ARRAY_TEMPLATE)); } } private short checkIsShort(String name, Any value, List<PropertyError> errors) throws BAD_OPERATION { try { return value.extract_short(); } catch (BAD_OPERATION e) { errors.add(badType(name)); throw e; } } private void logError(List<PropertyError> errors, QoSError_code error_code, String name, Any value, Any high, Any low) { if (logger_.isInfoEnabled()) { logger_.info("wrong value for Property '" +name + "': " + value); } errors.add(new PropertyError(error_code, name, new PropertyRange(high, low))); } private void checkPropertyValues(Property[] props, List<PropertyError> errors) { for (int x = 0; x < props.length; ++x) { final String _name = props[x].name; final Any _value = props[x].value; try { if (ConnectionReliability.value.equals(_name)) { final short _connectionReliability = checkIsShort(_name, _value, errors); switch (_connectionReliability) { case BestEffort.value: // fallthrough case Persistent.value: break; default: logError(errors, QoSError_code.BAD_VALUE, _name, _value, connectionReliabilityLow_, connectionReliabilityHigh_ ); } } else if (EventReliability.value.equals(_name)) { final short _eventReliability = checkIsShort(_name, _value, errors); switch (_eventReliability) { case BestEffort.value: // fallthrough case Persistent.value: break; default: logError(errors, QoSError_code.BAD_VALUE, _name, _value, eventReliabilityLow_, eventReliabilityHigh_); } } else if (OrderPolicy.value.equals(_name)) { final short _orderPolicy = checkIsShort(_name, _value, errors); switch (_orderPolicy) { case AnyOrder.value: break; case FifoOrder.value: break; case PriorityOrder.value: break; case DeadlineOrder.value: break; default: logError(errors, QoSError_code.BAD_VALUE, _name, _value, orderPolicyLow_, orderPolicyHigh_); } } else if (DiscardPolicy.value.equals(_name)) { final short _discardPolicy = checkIsShort(_name, _value, errors); switch (_discardPolicy) { case AnyOrder.value: break; case FifoOrder.value: break; case LifoOrder.value: break; case PriorityOrder.value: break; case DeadlineOrder.value: break; default: logError(errors, QoSError_code.BAD_VALUE, _name, _value, discardPolicyLow_, discardPolicyHigh_); } } } catch (BAD_OPERATION e) { // Nothing to do. an error has already been added to // List 'errors'. } } } }