package org.stagemonitor.web.tracing; import java.util.AbstractMap; import java.util.Enumeration; import java.util.Iterator; import java.util.Map; import javax.servlet.http.HttpServletRequest; import io.opentracing.propagation.Format; import io.opentracing.propagation.TextMap; /** * A TextMap carrier for a {@link HttpServletRequest} for use with Tracer.extract() ONLY (it has no mutating methods). * * @see io.opentracing.Tracer#extract(Format, Object) */ public class HttpServletRequestTextMapExtractAdapter implements TextMap { private final HttpServletRequest httpServletRequest; public HttpServletRequestTextMapExtractAdapter(HttpServletRequest httpServletRequest) { this.httpServletRequest = httpServletRequest; } @Override public Iterator<Map.Entry<String, String>> iterator() { return new HttpHeaderIterator(httpServletRequest, httpServletRequest.getHeaderNames()); } @Override public void put(String key, String value) { throw new UnsupportedOperationException( "TextMapInjectAdapter should only be used with Tracer.extract()"); } private static class HttpHeaderIterator implements Iterator<Map.Entry<String, String>> { private final HttpServletRequest httpServletRequest; private final Enumeration<String> headerNames; private HttpHeaderIterator(HttpServletRequest httpServletRequest, Enumeration<String> headerNames) { this.httpServletRequest = httpServletRequest; this.headerNames = headerNames; } @Override public boolean hasNext() { return headerNames.hasMoreElements(); } @Override public Map.Entry<String, String> next() { final String nextHeader = headerNames.nextElement(); return new AbstractMap.SimpleEntry<String, String>(nextHeader, httpServletRequest.getHeader(nextHeader)); } @Override public void remove() { throw new UnsupportedOperationException("remove"); } } }