package org.jacorb.notification.util; /* * 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.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.omg.CORBA.Any; import org.omg.CORBA.ORB; import org.omg.CosNotification.Property; import org.omg.CosNotification.PropertyError; import org.omg.CosNotification.PropertyRange; import org.omg.CosNotification.QoSError_code; import org.slf4j.Logger; /** * @author Alphonse Bendt */ public abstract class PropertySet { protected static final ORB sORB = org.omg.CORBA.ORBSingleton.init(); protected static final PropertyError[] PROPERTY_ERROR_ARRAY_TEMPLATE = new PropertyError[0]; protected static final PropertyRange EMPTY_PROPERTY_RANGE = new PropertyRange( sORB.create_any(), sORB.create_any()); //////////////////////////////////////// protected final Logger logger_ = LogUtil.getLogger(getClass().getName()); private final HashMap<String, List<PropertySetListener>> listeners_ = new HashMap<String, List<PropertySetListener>>(); private boolean modified_ = true; private final Map<String, Any> properties_ = new HashMap<String, Any>(); private Property[] arrayView_ = null; //////////////////////////////////////// public void addPropertySetListener(String[] props, PropertySetListener listener) { for (int x = 0; x < props.length; ++x) { addPropertySetListener(props[x], listener); } } public void addPropertySetListener(String property, PropertySetListener listener) { final List<PropertySetListener> _list; if (!listeners_.containsKey(property)) { _list = new ArrayList<PropertySetListener>(); listeners_.put(property, _list); } else { _list = (List<PropertySetListener>) listeners_.get(property); } _list.add(listener); } public synchronized Property[] toArray() { if (arrayView_ == null || modified_) { Property[] _props = new Property[properties_.size()]; Iterator<String> i = properties_.keySet().iterator(); int x = 0; while (i.hasNext()) { String _key = (String) i.next(); _props[x++] = new Property(_key, (Any) properties_.get(_key)); } arrayView_ = _props; modified_ = false; } return arrayView_; } public Map<String, Any> toMap() { return Collections.unmodifiableMap(properties_); } public String toString() { return properties_.toString(); } public boolean containsKey(String propertyName) { return properties_.containsKey(propertyName); } public Any get(String propertyName) { return (Any) properties_.get(propertyName); } protected void set_properties(Property[] props) { final HashSet<PropertySetListener> _toBeNotified = new HashSet<PropertySetListener>(); for (int x = 0; x < props.length; ++x) { Any _oldValue = null; if (properties_.containsKey(props[x].name)) { _oldValue = (Any) properties_.get(props[x].name); } properties_.put(props[x].name, props[x].value); if (listeners_.containsKey(props[x].name)) { if (!props[x].value.equals(_oldValue)) { _toBeNotified.addAll(listeners_.get(props[x].name)); } } } synchronized (this) { modified_ = true; } Iterator<?> i = _toBeNotified.iterator(); while (i.hasNext()) { try { ((PropertySetListener) i.next()).actionPropertySetChanged(this); } catch (Exception e) { logger_.error("exception in listener", e); } } } abstract Set<?> getValidNames(); protected void checkPropertyExistence(Property[] props, List<PropertyError> errorList) { for (int x = 0; x < props.length; ++x) { if (!getValidNames().contains(props[x].name)) { errorList.add(badProperty(props[x].name)); } } } protected PropertyError badProperty(String name) { return new PropertyError(QoSError_code.BAD_PROPERTY, name, EMPTY_PROPERTY_RANGE); } protected PropertyError badType(String name) { return new PropertyError(QoSError_code.BAD_TYPE, name, EMPTY_PROPERTY_RANGE); } //////////////////////////////////////// public static Property[] map2Props(Map<?, ?> props) { Property[] _ps = new Property[props.size()]; Iterator<?> i = props.keySet().iterator(); int x = 0; while (i.hasNext()) { String _key = (String) i.next(); _ps[x++] = new Property(_key, (Any) props.get(_key)); } return _ps; } }