public SpanContext extract()

in geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/GeronimoTracer.java [106:154]


    public <C> SpanContext extract(final Format<C> format, final C carrier) {
        if (JaxRsHeaderTextMap.class.isInstance(carrier)) {
            final MultivaluedMap<String, ?> map = JaxRsHeaderTextMap.class.cast(carrier).getMap();
            final String traceid = (String) map.getFirst(traceIdHeader);
            final String spanid = (String) map.getFirst(spanIdHeader);
            final String parentspanid = (String) map.getFirst(parentSpanIdHeader);
            if (traceid != null && spanid != null) {
                return newContext(traceid, parentspanid, spanid, map.keySet().stream().filter(it -> it.startsWith(baggageHeaderPrefix))
                        .collect(toMap(identity(), k -> String.valueOf(map.getFirst(k)))));
            }
            return null;
        }
        if (ServletHeaderTextMap.class.isInstance(carrier)) {
            final HttpServletRequest req = ServletHeaderTextMap.class.cast(carrier).getRequest();
            final String traceid = req.getHeader(traceIdHeader);
            final String spanid = req.getHeader(spanIdHeader);
            final String parentspanid = req.getHeader(parentSpanIdHeader);
            if (traceid != null && spanid != null) {
                return newContext(traceid, parentspanid, spanid, list(req.getHeaderNames()).stream()
                        .filter(it -> it.startsWith(baggageHeaderPrefix))
                        .collect(toMap(identity(), k -> String.valueOf(req.getHeader(k)))));
            }
            return null;
        }
        if (!TextMap.class.isInstance(carrier)) {
            throw new IllegalArgumentException("Only TextMap are supported");
        }
        final Iterator<Map.Entry<String, String>> textMap = TextMap.class.cast(carrier).iterator();
        String traceId = null;
        String spanId = null;
        String parentSpanId = null;
        final Map<String, String> baggages = new HashMap<>();
        while (textMap.hasNext()) {
            final Map.Entry<String, String> next = textMap.next();
            if (next.getKey().startsWith(baggageHeaderPrefix)) {
                baggages.put(next.getKey(), next.getValue());
            } else if (spanIdHeader.equals(next.getKey())) {
                spanId = next.getValue();
            } else if (traceIdHeader.equals(next.getKey())) {
                traceId = next.getValue();
            } else if (parentSpanIdHeader.equals(next.getKey())) {
                parentSpanId = next.getValue();
            }
        }
        if (traceId != null && spanId != null) {
            return newContext(traceId, parentSpanId, spanId, baggages);
        }
        return null;
    }