001/* 002 GRANITE DATA SERVICES 003 Copyright (C) 2011 GRANITE DATA SERVICES S.A.S. 004 005 This file is part of Granite Data Services. 006 007 Granite Data Services is free software; you can redistribute it and/or modify 008 it under the terms of the GNU Library General Public License as published by 009 the Free Software Foundation; either version 2 of the License, or (at your 010 option) any later version. 011 012 Granite Data Services is distributed in the hope that it will be useful, but 013 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 014 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License 015 for more details. 016 017 You should have received a copy of the GNU Library General Public License 018 along with this library; if not, see <http://www.gnu.org/licenses/>. 019*/ 020 021package org.granite.gravity.selector; 022 023import java.util.HashMap; 024 025import org.jboss.mq.selectors.Identifier; 026import org.jboss.mq.selectors.Operator; 027import org.jboss.mq.selectors.SelectorParser; 028 029import flex.messaging.messages.Message; 030 031/** 032 * @author William DRAI 033 */ 034public class JBossMQMessageSelector implements MessageSelector { 035 036 private Object selector; 037 private HashMap<String, Identifier> identifierMap = new HashMap<String, Identifier>(); 038 039 040 public JBossMQMessageSelector(String selector) { 041 try { 042 this.selector = SelectorParser.doParse(selector, identifierMap); 043 } 044 catch (Exception e) { 045 throw new RuntimeException("JBossMQ SelectorParser error " + selector, e); 046 } 047 } 048 049 public synchronized boolean accept(Message message) { 050 try { 051 for (Identifier identifier : identifierMap.values()) { 052 Object value = message.getHeader(identifier.getName()); 053 identifier.setValue(value); 054 } 055 056 Object res = null; 057 058 if (selector instanceof Identifier) 059 res = ((Identifier)selector).getValue(); 060 else if (selector instanceof Operator) 061 res = ((Operator)selector).apply(); 062 else 063 res = selector; 064 065 if (res == null) 066 return false; 067 068 if (!(res.getClass().equals(Boolean.class))) 069 throw new Exception("Bad selector result type: " + res); 070 071 return ((Boolean)res).booleanValue(); 072 } 073 catch (Exception e) { 074 throw new RuntimeException("JBossMQ selector accept error " + message, e); 075 } 076 } 077 078}