Package demo.interceptors.interceptor

Source Code of demo.interceptors.interceptor.DemoInterceptor

/**
* Copyright (C) 2010 Talend Inc. - www.talend.com
*/
package demo.interceptors.interceptor;

import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.xml.stream.XMLStreamReader;

import org.apache.cxf.BusFactory;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.InterceptorChain;
import org.apache.cxf.interceptor.InterceptorProvider;
import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageUtils;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.phase.PhaseInterceptor;
import org.apache.cxf.phase.PhaseInterceptorChain;
import org.apache.cxf.phase.PhaseManager;

/**
* The DemoInterceptor just prints out various aspects of the Message that is
* passed into the handleMessage call. That includes the contents, the
* properties, the interceptors in the Chain, etc... By adding this interceptor
* into various phases of the chain, you can see exactly how the Message
* "changes" and is manipulated as it moves through the chain.
*/
public class DemoInterceptor implements PhaseInterceptor<Message> {
    private final String phase;

    public DemoInterceptor(String p) {
        phase = p;
    }

    /**
     * This method will add a DemoInterceptor into every in and every out phase
     * of the interceptor chains.
     *
     * @param provider
     */
    public static void addInterceptors(InterceptorProvider provider) {
        PhaseManager phases = BusFactory.getDefaultBus().getExtension(PhaseManager.class);
        for (Phase p : phases.getInPhases()) {
            provider.getInInterceptors().add(new DemoInterceptor(p.getName()));
            provider.getInFaultInterceptors().add(new DemoInterceptor(p.getName()));
        }
        for (Phase p : phases.getOutPhases()) {
            provider.getOutInterceptors().add(new DemoInterceptor(p.getName()));
            provider.getOutFaultInterceptors().add(new DemoInterceptor(p.getName()));
        }
    }

    public void handleMessage(Message message) throws Fault {
        PhaseInterceptorChain pic = (PhaseInterceptorChain)message.getInterceptorChain();
        if (!somethingMayHaveChanged(pic)) {
            return;
        }
        System.out.println("Phase: " + phase);
        System.out.println("        out: " + MessageUtils.isOutbound(message));
        System.out.println("   contents: " + message.getContentFormats());
        System.out.println("       keys: " + message.keySet());
        XMLStreamReader reader = message.getContent(XMLStreamReader.class);
        if (reader != null) {
            // On an incoming message, once we have the XMLStreamReader,
            // we can get the current event and the element Name
            int event = reader.getEventType();
            switch (event) {
            case XMLStreamReader.START_ELEMENT:
            case XMLStreamReader.END_ELEMENT:
                System.out.println("      reader: " + event + "   qname: " + reader.getName());
                break;
            default:
                System.out.println("      reader: " + event);
            }
        }
        List<?> params = message.getContent(List.class);
        if (params != null) {
            System.out.println("      params: " + params);
        }
        System.out.println("      chain: ");
        printInterceptorChain(pic);
        System.out.println();
        System.out.println();
    }

    //just check to see if the previous interceptor was also an instanceof
    //DemoInterceptor.  If so, we don't really need to print anything
    //as we know nothing has changed.
    private boolean somethingMayHaveChanged(PhaseInterceptorChain pic) {
        Iterator<Interceptor<? extends Message>> it = pic.iterator();
        Interceptor<? extends Message> last = null;
        while (it.hasNext()) {
            Interceptor<? extends Message> cur = it.next();
            if (cur == this) {
                if (last instanceof DemoInterceptor) {
                    return false;
                }
                return true;
            }
            last = cur;
        }
        return true;
    }

    /**
     * Prints out the interceptor chain in a format that is easy to read. It
     * also filters out instances of the DemoInterceptor so you can see what the
     * chain would look like in a normal invokation.
     *
     * @param chain
     */
    public void printInterceptorChain(InterceptorChain chain) {
        Iterator<Interceptor<? extends Message>> it = chain.iterator();
        String phase = "";
        StringBuilder builder = null;
        while (it.hasNext()) {
            Interceptor<? extends Message> interceptor = it.next();
            if (interceptor instanceof DemoInterceptor) {
                continue;
            }
            if (interceptor instanceof PhaseInterceptor) {
                PhaseInterceptor pi = (PhaseInterceptor)interceptor;
                if (!phase.equals(pi.getPhase())) {
                    if (builder != null) {
                        System.out.println(builder.toString());
                    } else {
                        builder = new StringBuilder(100);
                    }
                    builder.setLength(0);
                    builder.append("             ");
                    builder.append(pi.getPhase());
                    builder.append(": ");
                    phase = pi.getPhase();
                }
                String id = pi.getId();
                int idx = id.lastIndexOf('.');
                if (idx != -1) {
                    id = id.substring(idx + 1);
                }
                builder.append(id);
                builder.append(' ');
            }
        }

    }

    public void handleFault(Message message) {
    }

    public Set<String> getAfter() {
        return Collections.emptySet();
    }

    public Set<String> getBefore() {
        return Collections.emptySet();
    }

    public String getId() {
        return DemoInterceptor.class.getName() + "." + phase;
    }

    public String getPhase() {
        return phase;
    }

    public Collection<PhaseInterceptor<? extends Message>> getAdditionalInterceptors() {
        return null;
    }

}
TOP

Related Classes of demo.interceptors.interceptor.DemoInterceptor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.