package org.jacorb.notification.engine;
/*
* 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.Iterator;
import java.util.List;
import org.jacorb.notification.interfaces.FilterStage;
/**
* @author Alphonse Bendt
*/
public class FilterConsumerAdminTask extends AbstractFilterTask
{
private static int sCount = 0;
private final int id_ = ++sCount;
/**
* this List contains FilterStages (ProxySuppliers) which have a MessageConsumer associated.
*/
private final List listOfFilterStageWithMessageConsumer_ = new ArrayList();
////////////////////////////////////////
public FilterConsumerAdminTask(TaskFactory taskFactory, TaskExecutor taskExecutor)
{
super(taskFactory, taskExecutor);
}
////////////////////////////////////////
public String toString()
{
return "[FilterConsumerAdminTask#" + id_ + "]";
}
/**
* access the FilterStages that have a Event Consumer associated.
*/
public FilterStage[] getFilterStagesWithMessageConsumer()
{
return (FilterStage[]) listOfFilterStageWithMessageConsumer_.toArray(EMPTY_FILTERSTAGE);
}
private void clearFilterStagesWithMessageConsumer()
{
listOfFilterStageWithMessageConsumer_.clear();
}
public void reset()
{
super.reset();
clearFilterStagesWithMessageConsumer();
arrayCurrentFilterStage_ = EMPTY_FILTERSTAGE;
}
public void doFilter() throws InterruptedException
{
filter();
pushToConsumers();
}
private void pushToConsumers()
{
// if we are filtering Outgoing events its
// possible that deliveries can be made as soon as
// the ConsumerAdmin Filters are eval'd
// (if InterFilterGroupOperator.OR_OP is set !)
final FilterStage[] _filterStagesWithMessageConsumer = getFilterStagesWithMessageConsumer();
if (_filterStagesWithMessageConsumer.length > 0)
{
getTaskFactory().enqueueMessage(_filterStagesWithMessageConsumer, getMessage());
}
final Schedulable _filterTaskToBeScheduled = getTaskFactory().newFilterProxySupplierTask(this);
_filterTaskToBeScheduled.schedule();
}
private void filter() throws InterruptedException
{
for (int x = 0; x < arrayCurrentFilterStage_.length; ++x)
{
checkInterrupt();
boolean _filterForCurrentFilterStageMatched = false;
if (!arrayCurrentFilterStage_[x].isDestroyed())
{
_filterForCurrentFilterStageMatched = getMessage().match(arrayCurrentFilterStage_[x]);
}
if (_filterForCurrentFilterStageMatched)
{
if (arrayCurrentFilterStage_[x].hasInterFilterGroupOperatorOR())
{
// if the destinations
// InterFilterGroupOperator equals OR_OP
// we can add it to
// listOfFilterStageWithMessageConsumer_ as the
// corresponding filters dont need to be eval'd
listOfFilterStageWithMessageConsumer_.addAll(arrayCurrentFilterStage_[x]
.getSubsequentFilterStages());
}
else
{
// the Filters of the ProxySupplier need to be
// eval'd
addFilterStage(arrayCurrentFilterStage_[x].getSubsequentFilterStages());
}
}
else
{
// no filter matched at all. we have to check all subsequent
// destinations if one of them has
// InterFilterGroupOperator.OR_OP enabled. In this
// Case add it to the list of ProxySupplier to be
// eval'd by the next task.
Iterator _i = arrayCurrentFilterStage_[x].getSubsequentFilterStages().iterator();
while (_i.hasNext())
{
FilterStage _filterStage = (FilterStage) _i.next();
if (_filterStage.hasInterFilterGroupOperatorOR())
{
addFilterStage(_filterStage);
}
}
}
}
}
}