sxcfilteringoutboundrouter.java

来自「提供ESB 应用mule源代码 提供ESB 应用mule源代码」· Java 代码 · 共 197 行

JAVA
197
字号
/* * $Id: SxcFilteringOutboundRouter.java 12425 2008-07-29 20:17:53Z tcarlson $ * -------------------------------------------------------------------------------------- * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.com * * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */package org.mule.module.sxc;import org.mule.RequestContext;import org.mule.api.MuleMessage;import org.mule.api.routing.RoutingException;import org.mule.api.routing.filter.Filter;import org.mule.api.transformer.TransformerException;import org.mule.module.xml.stax.ReversibleXMLStreamReader;import org.mule.module.xml.transformer.XmlToXMLStreamReader;import org.mule.routing.filters.logic.AndFilter;import org.mule.routing.filters.logic.NotFilter;import org.mule.routing.filters.logic.OrFilter;import org.mule.routing.outbound.FilteringOutboundRouter;import com.envoisolutions.sxc.xpath.XPathBuilder;import com.envoisolutions.sxc.xpath.XPathEvaluator;import java.util.Iterator;import java.util.Map;/** * <code>FilteringRouter</code> is a router that accepts events based on a filter * set. */public class SxcFilteringOutboundRouter extends FilteringOutboundRouter{    private final static ThreadLocal<MuleMessage> messages = new ThreadLocal<MuleMessage>();    private final static XmlToXMLStreamReader transformer = new XmlToXMLStreamReader();    static    {        transformer.setReversible(true);    }    private Map<String, String> namespaces;    private XPathEvaluator evaluator;    private XPathBuilder builder;    @Override    public void setFilter(Filter filter)    {        super.setFilter(filter);    }    protected void addEventHandlers(XPathBuilder builder, Filter filter)    {        if (filter instanceof SxcFilter)        {            SxcFilter sxcFilter = ((SxcFilter) filter);            sxcFilter.addEventHandler(this, builder);        }        else if (filter instanceof AndFilter)        {            AndFilter f = (AndFilter) filter;            for (Iterator<?> itr = f.getFilters().iterator(); itr.hasNext();)            {                addEventHandlers(builder, (Filter) itr.next());            }        }        else if (filter instanceof OrFilter)        {            OrFilter f = (OrFilter) filter;            for (Iterator<?> itr = f.getFilters().iterator(); itr.hasNext();)            {                addEventHandlers(builder, (Filter) itr.next());            }        }        else if (filter instanceof NotFilter)        {            NotFilter f = (NotFilter) filter;            addEventHandlers(builder, f.getFilter());        }        else        {            logger.warn("Filter type " + filter.getClass().toString()                           + " is not recognized by the SXC router. If it contains child "                           + "SXC filters it will not work correctly.");        }    }    protected void initialize() throws Exception    {        if (evaluator == null)        {            doInitialize();        }    }    private synchronized void doInitialize()    {        if (evaluator == null)        {            builder = new XPathBuilder();            addEventHandlers(builder, getFilter());            evaluator = builder.compile();        }    }    @Override    public boolean isMatch(MuleMessage message) throws RoutingException    {        ReversibleXMLStreamReader reader = null;        try        {            initialize();            messages.set(message);            reader = getXMLStreamReader(message);            reader.setTracking(true);            evaluator.evaluate(reader);        }        catch (StopProcessingException e)        {            // stop processing        }        catch (Exception e)        {            throw new RoutingException(message, RequestContext.getEvent().getEndpoint(), e);        }        finally        {            messages.set(null);            if (reader != null)            {                reader.setTracking(false);                reader.reset();            }        }        try        {            return testMatch(message);        }        catch (UndefinedMatchException m)        {            return false;        }    }    public boolean testMatch(MuleMessage message) throws RoutingException    {        return super.isMatch(message);    }    /**     * Gets an XMLStreamReader for this message.     *      * @param message     * @return     * @throws TransformerException     */    protected ReversibleXMLStreamReader getXMLStreamReader(MuleMessage message) throws TransformerException    {         ReversibleXMLStreamReader r = (ReversibleXMLStreamReader) transformer.transform(message);                  if (r != message.getPayload())         {             message.setPayload(r);         }         return r;    }    public Map<String, String> getNamespaces()    {        return namespaces;    }    public void setNamespaces(Map<String, String> namespaces)    {        this.namespaces = namespaces;    }    public static MuleMessage getCurrentMessage()    {        return messages.get();    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?