001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.activemq.filter;
018    
019    import java.io.IOException;
020    
021    import org.apache.activemq.broker.region.MessageReference;
022    import org.apache.activemq.command.ActiveMQDestination;
023    import org.apache.activemq.command.Message;
024    
025    /**
026     * MessageEvaluationContext is used to cache selection results. A message
027     * usually has multiple selectors applied against it. Some selector have a high
028     * cost of evaluating against the message. Those selectors may whish to cache
029     * evaluation results associated with the message in the
030     * MessageEvaluationContext.
031     * 
032     * 
033     */
034    public class MessageEvaluationContext {
035    
036            protected MessageReference messageReference;
037        protected boolean loaded;
038        protected boolean dropped;
039        protected Message message;
040        protected ActiveMQDestination destination;
041    
042        public MessageEvaluationContext() {
043        }
044    
045        public boolean isDropped() throws IOException {
046            getMessage();
047            return dropped;
048        }
049    
050        public Message getMessage() throws IOException {
051            if (!dropped && !loaded) {
052                loaded = true;
053                messageReference.incrementReferenceCount();
054                message = messageReference.getMessage();
055                if (message == null) {
056                    messageReference.decrementReferenceCount();
057                    dropped = true;
058                    loaded = false;
059                }
060            }
061            return message;
062        }
063    
064        public void setMessageReference(MessageReference messageReference) {
065            if (this.messageReference != messageReference) {
066                clearMessageCache();
067            }
068            this.messageReference = messageReference;
069        }
070    
071        public void clear() {
072            clearMessageCache();
073            destination = null;
074        }
075    
076        public ActiveMQDestination getDestination() {
077            return destination;
078        }
079    
080        public void setDestination(ActiveMQDestination destination) {
081            this.destination = destination;
082        }
083    
084        /**
085         * A strategy hook to allow per-message caches to be cleared
086         */
087        protected void clearMessageCache() {
088            if (loaded) {
089                messageReference.decrementReferenceCount();
090            }
091            message = null;
092            dropped = false;
093            loaded = false;
094        }
095    
096        public MessageReference getMessageReference() {
097            return messageReference;
098        }
099    }