package org.jacorb.notification.filter;
/*
* 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.Hashtable;
import java.util.Map;
import org.jacorb.config.Configuration;
import org.jacorb.config.ConfigurationException;
import org.jacorb.notification.conf.Attributes;
import org.jacorb.notification.conf.Default;
import org.jacorb.notification.interfaces.Disposable;
import org.jacorb.notification.interfaces.GCDisposable;
import org.jacorb.notification.util.DisposableManager;
import org.jacorb.notification.util.LogUtil;
import org.omg.CORBA.Any;
import org.omg.CORBA.AnyHolder;
import org.omg.CORBA.INTERNAL;
import org.omg.CORBA.ORB;
import org.omg.CORBA.TypeCode;
import org.omg.CosNotification.Property;
import org.omg.CosNotification.StructuredEvent;
import org.omg.CosNotifyFilter.ConstraintExp;
import org.omg.CosNotifyFilter.ConstraintInfo;
import org.omg.CosNotifyFilter.ConstraintNotFound;
import org.omg.CosNotifyFilter.InvalidConstraint;
import org.omg.CosNotifyFilter.InvalidValue;
import org.omg.CosNotifyFilter.MappingConstraintInfo;
import org.omg.CosNotifyFilter.MappingConstraintPair;
import org.omg.CosNotifyFilter.MappingFilterOperations;
import org.omg.CosNotifyFilter.MappingFilterPOATie;
import org.omg.CosNotifyFilter.UnsupportedFilterableData;
import org.slf4j.Logger;
/**
* @author Alphonse Bendt
*/
public class MappingFilterImpl implements GCDisposable, MappingFilterOperations
{
/**
* map constraint ids used by class FilterImpl to default values used by MappingFilterImpl.
*/
private static class ValueMap
{
private final Map valueMap_ = new Hashtable();
public void put(int key, Any value)
{
valueMap_.put(new Integer(key), value);
}
public Any get(int key)
{
return (Any) valueMap_.get(new Integer(key));
}
public Any remove(int key)
{
return (Any) valueMap_.remove(new Integer(key));
}
public void dispose()
{
valueMap_.clear();
}
}
// //////////////////////////////////////
private final AbstractFilter filterDelegate_;
private final Any defaultValue_;
private final ValueMap valueMap_ = new ValueMap();
private final Logger logger_;
private final MappingFilterPOATie servant_;
private final MappingFilterUsageDecorator usageDecorator_;
private final ORB orb_;
private final DisposableManager disposeHooks_ = new DisposableManager();
private final long maxIdleTime_;
// //////////////////////////////////////
public MappingFilterImpl(ORB orb, Configuration config, AbstractFilter filter, Any defaultValue)
{
orb_ = orb;
logger_ = LogUtil.getLogger(config, getClass().getName());
filterDelegate_ = filter;
defaultValue_ = defaultValue;
usageDecorator_ = new MappingFilterUsageDecorator(this);
servant_ = new MappingFilterPOATie(usageDecorator_.getMappingFilterOperations());
try
{
maxIdleTime_ = config.getAttributeAsLong(Attributes.DEAD_FILTER_INTERVAL,
Default.DEFAULT_DEAD_FILTER_INTERVAL);
}
catch (ConfigurationException ex)
{
logger_.error ("Error configuring " + Attributes.DEAD_FILTER_INTERVAL, ex);
throw new INTERNAL ("Error configuring MappingFilterImpl " + ex);
}
}
// /////////////////////////////////////
public org.omg.CORBA.Object activate()
{
return servant_._this(orb_);
}
public void destroy()
{
logger_.info("destroy MappingFilter");
dispose();
}
public void dispose()
{
disposeHooks_.dispose();
filterDelegate_.dispose();
valueMap_.dispose();
}
public String constraint_grammar()
{
return filterDelegate_.constraint_grammar();
}
public TypeCode value_type()
{
return defaultValue_.type();
}
public Any default_value()
{
return defaultValue_;
}
public MappingConstraintInfo[] add_mapping_constraints(MappingConstraintPair[] mcp)
throws InvalidValue, InvalidConstraint
{
ConstraintExp[] _constraintExpArray = new ConstraintExp[mcp.length];
for (int x = 0; x < mcp.length; ++x)
{
_constraintExpArray[x] = mcp[x].constraint_expression;
}
ConstraintInfo[] _constraintInfo = filterDelegate_.add_constraints(_constraintExpArray);
MappingConstraintInfo[] _mappingConstraintInfo = new MappingConstraintInfo[_constraintInfo.length];
for (int x = 0; x < _constraintInfo.length; ++x)
{
_mappingConstraintInfo[x] = new MappingConstraintInfo(
_constraintInfo[x].constraint_expression, _constraintInfo[x].constraint_id,
mcp[x].result_to_set);
valueMap_.put(_constraintInfo[x].constraint_id, mcp[x].result_to_set);
}
return _mappingConstraintInfo;
}
public void modify_mapping_constraints(int[] intArray,
MappingConstraintInfo[] mappingConstraintInfos) throws ConstraintNotFound,
InvalidValue, InvalidConstraint
{
ConstraintInfo[] _constraintInfo = new ConstraintInfo[mappingConstraintInfos.length];
for (int x = 0; x < _constraintInfo.length; ++x)
{
_constraintInfo[x] = new ConstraintInfo(
mappingConstraintInfos[x].constraint_expression,
mappingConstraintInfos[x].constraint_id);
valueMap_.remove(mappingConstraintInfos[x].constraint_id);
}
filterDelegate_.modify_constraints(intArray, _constraintInfo);
for (int x = 0; x < mappingConstraintInfos.length; ++x)
{
valueMap_.put(mappingConstraintInfos[x].constraint_id, mappingConstraintInfos[x].value);
}
}
public MappingConstraintInfo[] get_mapping_constraints(int[] constraintIds)
throws ConstraintNotFound
{
ConstraintInfo[] _constraintInfo = filterDelegate_.get_constraints(constraintIds);
MappingConstraintInfo[] _mappingConstraintInfo = new MappingConstraintInfo[_constraintInfo.length];
for (int x = 0; x < _constraintInfo.length; ++x)
{
_mappingConstraintInfo[x] = new MappingConstraintInfo(
_constraintInfo[x].constraint_expression, _constraintInfo[x].constraint_id,
valueMap_.get(_constraintInfo[x].constraint_id));
}
return _mappingConstraintInfo;
}
public MappingConstraintInfo[] get_all_mapping_constraints()
{
ConstraintInfo[] _constraintInfo = filterDelegate_.get_all_constraints();
MappingConstraintInfo[] _mappingConstraintInfo = new MappingConstraintInfo[_constraintInfo.length];
for (int x = 0; x < _constraintInfo.length; ++x)
{
_mappingConstraintInfo[x] = new MappingConstraintInfo(
_constraintInfo[x].constraint_expression, _constraintInfo[x].constraint_id,
valueMap_.get(_constraintInfo[x].constraint_id));
}
return _mappingConstraintInfo;
}
public void remove_all_mapping_constraints()
{
filterDelegate_.remove_all_constraints();
valueMap_.dispose();
}
public boolean match(Any any, AnyHolder anyHolder) throws UnsupportedFilterableData
{
int _filterId = filterDelegate_.match_internal(any);
if (_filterId >= 0)
{
anyHolder.value = valueMap_.get(_filterId);
return true;
}
return false;
}
public boolean match_structured(StructuredEvent structuredEvent, AnyHolder anyHolder)
throws UnsupportedFilterableData
{
final int _filterId = filterDelegate_.match_structured_internal(structuredEvent);
if (_filterId >= 0)
{
anyHolder.value = valueMap_.get(_filterId);
return true;
}
return false;
}
public boolean match_typed(Property[] propertyArray, AnyHolder anyHolder)
throws UnsupportedFilterableData
{
final int _filterId = filterDelegate_.match_typed_internal(propertyArray);
if (_filterId >= 0)
{
anyHolder.value = valueMap_.get(_filterId);
return true;
}
return false;
}
public void attemptDispose()
{
AbstractFilter.attemptDispose(this, usageDecorator_.getLastUsage(), maxIdleTime_);
}
public void registerDisposable(Disposable d)
{
disposeHooks_.addDisposable(d);
}
}