blob: 5f85c9f14d0c9f97620069fad2c5aa7d07afb4b0 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.activemq.filter;
import java.io.IOException;
import org.apache.activemq.broker.region.MessageReference;
import org.apache.activemq.command.ActiveMQDestination;
import org.apache.activemq.command.Message;
/**
* MessageEvaluationContext is used to cache selection results. A message
* usually has multiple selectors applied against it. Some selector have a high
* cost of evaluating against the message. Those selectors may whish to cache
* evaluation results associated with the message in the
* MessageEvaluationContext.
*
*
*/
public class MessageEvaluationContext {
protected MessageReference messageReference;
protected boolean loaded;
protected boolean dropped;
protected Message message;
protected ActiveMQDestination destination;
public MessageEvaluationContext() {
}
public boolean isDropped() throws IOException {
getMessage();
return dropped;
}
public Message getMessage() throws IOException {
if (!dropped && !loaded) {
loaded = true;
messageReference.incrementReferenceCount();
message = messageReference.getMessage();
if (message == null) {
messageReference.decrementReferenceCount();
dropped = true;
loaded = false;
}
}
return message;
}
public void setMessageReference(MessageReference messageReference) {
if (this.messageReference != messageReference) {
clearMessageCache();
}
this.messageReference = messageReference;
}
public void clear() {
clearMessageCache();
destination = null;
}
public ActiveMQDestination getDestination() {
return destination;
}
public void setDestination(ActiveMQDestination destination) {
this.destination = destination;
}
/**
* A strategy hook to allow per-message caches to be cleared
*/
protected void clearMessageCache() {
if (loaded) {
messageReference.decrementReferenceCount();
}
message = null;
dropped = false;
loaded = false;
}
public MessageReference getMessageReference() {
return messageReference;
}
}