| /** |
| * 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; |
| } |
| } |