Search in sources :

Example 1 with Flow

use of com.predic8.membrane.core.interceptor.Interceptor.Flow in project service-proxy by membrane.

the class LimitedMemoryExchangeStore method oldSnap.

private void oldSnap(AbstractExchange exc, Flow flow) {
    // TODO: [fix me] support multi-snap
    // TODO: [fix me] snap message headers and request *here*, not in observer/response
    exc.addExchangeViewerListener(new AbstractExchangeViewerListener() {

        @Override
        public void setExchangeFinished() {
            inflight.remove(exc);
        }
    });
    if (flow == Flow.REQUEST) {
        exc.getRequest().addObserver(new MessageObserver() {

            @Override
            public void bodyRequested(AbstractBody body) {
            }

            @Override
            public void bodyComplete(AbstractBody body) {
                Response r = exc.getResponse();
                if (r != null) {
                    AbstractBody b = r.getBody();
                    if (b != null && b.isRead())
                        // request-bodyComplete might occur after response-bodyComplete
                        return;
                }
                // System.out.println("Exchange put inflight " + exc.hashCode() + " " + exc.getRequest().getStartLine());
                inflight.put(exc, exc.getRequest());
                modify();
            }
        });
        return;
    }
    try {
        Message m = exc.getResponse();
        if (m != null)
            m.addObserver(new MessageObserver() {

                public void bodyRequested(AbstractBody body) {
                }

                public void bodyComplete(AbstractBody body) {
                    snapInternal(exc, flow);
                    inflight.remove(exc);
                    modify();
                // System.out.println("Exchange remove inflight " + exc.hashCode());
                }
            });
        else {
            inflight.remove(exc);
            modify();
        // System.out.println("Exchange remove inflight " + exc.hashCode() + " (2)");
        }
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
Also used : AbstractExchangeViewerListener(com.predic8.membrane.core.model.AbstractExchangeViewerListener)

Example 2 with Flow

use of com.predic8.membrane.core.interceptor.Interceptor.Flow in project service-proxy by membrane.

the class AdminPageBuilder method createServiceProxyVisualization.

public void createServiceProxyVisualization(AbstractServiceProxy proxy, String relativeRootPath) {
    List<Interceptor> leftStack = new ArrayList<Interceptor>(), rightStack = new ArrayList<Interceptor>();
    List<Interceptor> list = new ArrayList<Interceptor>(proxy.getInterceptors());
    list.add(new // fake interceptor so that both stacks end with the same size
    AbstractInterceptor() {

        @Override
        public EnumSet<Flow> getFlow() {
            return Flow.Set.REQUEST_RESPONSE;
        }
    });
    // build left and right stacks
    for (Interceptor i : list) {
        EnumSet<Flow> f = i.getFlow();
        if (i instanceof ResponseInterceptor) {
            for (Interceptor i2 : ((ResponseInterceptor) i).getInterceptors()) rightStack.add(i2);
        } else if (i instanceof RequestInterceptor) {
            for (Interceptor i3 : ((RequestInterceptor) i).getInterceptors()) leftStack.add(i3);
        } else if (f.contains(Flow.REQUEST)) {
            if (f.contains(Flow.RESPONSE)) {
                // fill left and right to same height
                while (leftStack.size() < rightStack.size()) leftStack.add(null);
                while (rightStack.size() < leftStack.size()) rightStack.add(null);
                // put i into both
                leftStack.add(i);
                rightStack.add(i);
            } else {
                leftStack.add(i);
            }
        } else {
            if (f.contains(Flow.RESPONSE)) {
                rightStack.add(i);
            }
        }
    }
    boolean noTarget = proxy.getTargetURL() == null && proxy.getTargetHost() == null;
    table().cellspacing("0px").cellpadding("0px").classAttr("spv").style("width:662px");
    createListenerRow(proxy);
    if (leftStack.size() > 1 || !noTarget) {
        createBeginArrowsRow();
        for (int i = 0; i < leftStack.size() - 1 - (noTarget ? 1 : 0); i++) {
            tr().style("background:url(\"" + relativeRootPath + "/admin/images/spv-middle.png\");background-repeat:repeat-y;display:inline-table");
            createInterceptorRow(leftStack, rightStack, i, false);
            end();
        }
        createEndArrowsRow();
        if (noTarget) {
            tr();
            createInterceptorRow(leftStack, rightStack, leftStack.size() - 2, true);
            end();
        } else {
            createTargetRow(proxy);
        }
    }
    end();
}
Also used : RequestInterceptor(com.predic8.membrane.core.interceptor.flow.RequestInterceptor) LoadBalancingInterceptor(com.predic8.membrane.core.interceptor.balancer.LoadBalancingInterceptor) Interceptor(com.predic8.membrane.core.interceptor.Interceptor) ResponseInterceptor(com.predic8.membrane.core.interceptor.flow.ResponseInterceptor) RequestInterceptor(com.predic8.membrane.core.interceptor.flow.RequestInterceptor) AbstractInterceptor(com.predic8.membrane.core.interceptor.AbstractInterceptor) Flow(com.predic8.membrane.core.interceptor.Interceptor.Flow) ResponseInterceptor(com.predic8.membrane.core.interceptor.flow.ResponseInterceptor)

Example 3 with Flow

use of com.predic8.membrane.core.interceptor.Interceptor.Flow in project service-proxy by membrane.

the class ElasticSearchExchangeStore method snap.

@Override
public void snap(AbstractExchange exc, Interceptor.Flow flow) {
    AbstractExchangeSnapshot excCopy = null;
    try {
        if (flow == Interceptor.Flow.REQUEST) {
            excCopy = new DynamicAbstractExchangeSnapshot(exc, this::addForElasticSearch);
            addForElasticSearch(excCopy);
        } else {
            excCopy = getExchangeDtoById((int) exc.getId());
            DynamicAbstractExchangeSnapshot.addObservers(exc, excCopy, this::addForElasticSearch);
            excCopy = excCopy.updateFrom(exc);
            addForElasticSearch(excCopy);
        }
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
Also used : DynamicAbstractExchangeSnapshot(com.predic8.membrane.core.exchange.snapshots.DynamicAbstractExchangeSnapshot) AbstractExchangeSnapshot(com.predic8.membrane.core.exchange.snapshots.AbstractExchangeSnapshot) IOException(java.io.IOException) UnknownHostException(java.net.UnknownHostException) DynamicAbstractExchangeSnapshot(com.predic8.membrane.core.exchange.snapshots.DynamicAbstractExchangeSnapshot)

Example 4 with Flow

use of com.predic8.membrane.core.interceptor.Interceptor.Flow in project service-proxy by membrane.

the class LimitedMemoryExchangeStore method addObservers.

private void addObservers(AbstractExchange exc, AbstractExchange excCopy, Flow flow) throws Exception {
    Message msg = null;
    if (flow == Flow.REQUEST) {
        msg = exc.getRequest();
    } else
        msg = exc.getResponse();
    msg.addObserver(new MessageObserver() {

        @Override
        public void bodyRequested(AbstractBody body) {
        }

        @Override
        public void bodyComplete(AbstractBody body) {
            try {
                cleanSnapshot(Exchange.updateCopy(exc, excCopy));
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    });
    exc.addExchangeViewerListener(new AbstractExchangeViewerListener() {

        @Override
        public void setExchangeFinished() {
            try {
                cleanSnapshot(Exchange.updateCopy(exc, excCopy));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
    cleanSnapshot(Exchange.updateCopy(exc, excCopy));
}
Also used : AbstractExchangeViewerListener(com.predic8.membrane.core.model.AbstractExchangeViewerListener)

Example 5 with Flow

use of com.predic8.membrane.core.interceptor.Interceptor.Flow in project service-proxy by membrane.

the class LimitedMemoryExchangeStore method newSnap.

private void newSnap(AbstractExchange exc, Flow flow) {
    AbstractExchange excCopy = null;
    try {
        if (flow == Flow.REQUEST) {
            excCopy = cleanSnapshot(exc.createSnapshot());
            snapInternal(excCopy, flow);
        } else
            excCopy = cleanSnapshot(Exchange.updateCopy(exc, getExchangeById((int) exc.getId())));
        addObservers(exc, excCopy, flow);
        modify();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
Also used : AbstractExchange(com.predic8.membrane.core.exchange.AbstractExchange)

Aggregations

AbstractExchange (com.predic8.membrane.core.exchange.AbstractExchange)2 Interceptor (com.predic8.membrane.core.interceptor.Interceptor)2 AbstractExchangeViewerListener (com.predic8.membrane.core.model.AbstractExchangeViewerListener)2 AbstractExchangeSnapshot (com.predic8.membrane.core.exchange.snapshots.AbstractExchangeSnapshot)1 DynamicAbstractExchangeSnapshot (com.predic8.membrane.core.exchange.snapshots.DynamicAbstractExchangeSnapshot)1 AbstractInterceptor (com.predic8.membrane.core.interceptor.AbstractInterceptor)1 Flow (com.predic8.membrane.core.interceptor.Interceptor.Flow)1 Outcome (com.predic8.membrane.core.interceptor.Outcome)1 LoadBalancingInterceptor (com.predic8.membrane.core.interceptor.balancer.LoadBalancingInterceptor)1 RequestInterceptor (com.predic8.membrane.core.interceptor.flow.RequestInterceptor)1 ResponseInterceptor (com.predic8.membrane.core.interceptor.flow.ResponseInterceptor)1 IExchangesStoreListener (com.predic8.membrane.core.model.IExchangesStoreListener)1 ServiceProxy (com.predic8.membrane.core.rules.ServiceProxy)1 IOException (java.io.IOException)1 UnknownHostException (java.net.UnknownHostException)1 NoSuchElementException (java.util.NoSuchElementException)1 Vector (java.util.Vector)1