Repository: cxf
Updated Branches:
  refs/heads/master 03d63bca6 -> e4858d27b


[CXF-6360] Introducing an abstract support


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/e4858d27
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/e4858d27
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/e4858d27

Branch: refs/heads/master
Commit: e4858d27b356f577eb31908dd43817681f007a4b
Parents: 03d63bc
Author: Sergey Beryozkin <[email protected]>
Authored: Fri Jun 5 15:04:49 2015 +0100
Committer: Sergey Beryozkin <[email protected]>
Committed: Fri Jun 5 15:04:49 2015 +0100

----------------------------------------------------------------------
 integration/tracing/tracing-htrace/pom.xml      |   1 +
 .../tracing/htrace/AbstractHTraceProvider.java  | 123 +++++++++++++++++++
 .../tracing/htrace/jaxrs/HTraceProvider.java    |  99 ++-------------
 3 files changed, 135 insertions(+), 88 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/e4858d27/integration/tracing/tracing-htrace/pom.xml
----------------------------------------------------------------------
diff --git a/integration/tracing/tracing-htrace/pom.xml 
b/integration/tracing/tracing-htrace/pom.xml
index 8172c60..e856f7c 100644
--- a/integration/tracing/tracing-htrace/pom.xml
+++ b/integration/tracing/tracing-htrace/pom.xml
@@ -52,6 +52,7 @@
             <groupId>org.apache.cxf</groupId>
             <artifactId>cxf-rt-frontend-jaxrs</artifactId>
             <version>${project.version}</version>
+            <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.cxf</groupId>

http://git-wip-us.apache.org/repos/asf/cxf/blob/e4858d27/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/tracing/htrace/AbstractHTraceProvider.java
----------------------------------------------------------------------
diff --git 
a/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/tracing/htrace/AbstractHTraceProvider.java
 
b/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/tracing/htrace/AbstractHTraceProvider.java
new file mode 100644
index 0000000..724f472
--- /dev/null
+++ 
b/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/tracing/htrace/AbstractHTraceProvider.java
@@ -0,0 +1,123 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.tracing.htrace;
+
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.common.util.StringUtils;
+import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.phase.PhaseInterceptorChain;
+import org.apache.cxf.tracing.TracerHeaders;
+import org.apache.htrace.Sampler;
+import org.apache.htrace.Trace;
+import org.apache.htrace.TraceInfo;
+import org.apache.htrace.TraceScope;
+import org.apache.htrace.Tracer;
+
+import static org.apache.cxf.tracing.TracerHeaders.DEFAULT_HEADER_SPAN_ID;
+import static org.apache.cxf.tracing.TracerHeaders.DEFAULT_HEADER_TRACE_ID;
+
+public abstract class AbstractHTraceProvider  { 
+    protected static final Logger LOG = 
LogUtils.getL7dLogger(AbstractHTraceProvider.class);
+    protected static final String TRACE_SPAN = 
"org.apache.cxf.tracing.htrace.span";
+        
+    private final Sampler< ? > sampler;
+    
+    public AbstractHTraceProvider(final Sampler< ? > sampler) {
+        this.sampler = sampler;
+    }
+
+    @SuppressWarnings("unchecked")
+    protected TraceScope startTraceSpan(final Map<String, List<String>> 
requestHeaders, String path) {
+        
+        // Try to extract the Trace Id value from the request header
+        final long traceId = getFirstValueOrDefault(requestHeaders, 
getTraceIdHeader(), 
+            Tracer.DONT_TRACE.traceId);
+        
+        // Try to extract the Span Id value from the request header
+        final long spanId = getFirstValueOrDefault(requestHeaders, 
getSpanIdHeader(), 
+            Tracer.DONT_TRACE.spanId); 
+        
+        if (traceId != Tracer.DONT_TRACE.traceId && spanId != 
Tracer.DONT_TRACE.spanId) {
+            return Trace.startSpan(path, 
+                                   (Sampler< TraceInfo >)sampler, new 
TraceInfo(traceId, spanId));
+        }
+        return null;
+    }
+    
+    protected void stopTraceSpan(final Map<String, List<String>> 
requestHeaders,
+                                 final Map<String, List<Object>> 
responseHeaders,
+                                 final TraceScope span) {
+        final String traceIdHeader = getTraceIdHeader();
+        final String spanIdHeader = getSpanIdHeader();
+
+        // Transfer tracing headers into the response headers
+        if (requestHeaders.containsKey(traceIdHeader) && 
requestHeaders.containsKey(spanIdHeader)) {
+            responseHeaders.put(traceIdHeader, 
CastUtils.cast(requestHeaders.get(traceIdHeader)));
+            responseHeaders.put(spanIdHeader, 
CastUtils.cast(requestHeaders.get(spanIdHeader)));
+        }
+        
+        if (span != null) {
+            span.close();
+        }
+    }
+    
+    private static Long getFirstValueOrDefault(final Map<String, List<String>> 
headers, 
+            final String header, final long defaultValue) {
+        List<String> value = headers.get(header);
+        if (value != null && !value.isEmpty()) {
+            try {
+                return Long.parseLong(value.get(0));
+            } catch (NumberFormatException ex) {
+                LOG.log(Level.FINE, String.format("Unable to parse '%s' header 
value to long number", header), ex);
+            }
+        }
+        return defaultValue;
+    }
+    
+    private static String getSpanIdHeader() {
+        return getHeaderOrDefault(TracerHeaders.HEADER_SPAN_ID, 
DEFAULT_HEADER_SPAN_ID);
+    }
+    
+    private static String getTraceIdHeader() {
+        return getHeaderOrDefault(TracerHeaders.HEADER_TRACE_ID, 
DEFAULT_HEADER_TRACE_ID);
+    }
+
+    private static String getHeaderOrDefault(final String property, final 
String fallback) {
+        final Message message = PhaseInterceptorChain.getCurrentMessage();
+        
+        if (message != null) {
+            final Object header = message.getContextualProperty(property);
+            
+            if (header instanceof String) {
+                final String name = (String)header;
+                if (!StringUtils.isEmpty(name)) {
+                    return name;
+                }
+            }
+        }
+        
+        return fallback;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cxf/blob/e4858d27/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/tracing/htrace/jaxrs/HTraceProvider.java
----------------------------------------------------------------------
diff --git 
a/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/tracing/htrace/jaxrs/HTraceProvider.java
 
b/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/tracing/htrace/jaxrs/HTraceProvider.java
index 2479157..5f0ff2f 100644
--- 
a/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/tracing/htrace/jaxrs/HTraceProvider.java
+++ 
b/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/tracing/htrace/jaxrs/HTraceProvider.java
@@ -19,121 +19,44 @@
 package org.apache.cxf.tracing.htrace.jaxrs;
 
 import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import javax.ws.rs.container.ContainerRequestContext;
 import javax.ws.rs.container.ContainerRequestFilter;
 import javax.ws.rs.container.ContainerResponseContext;
 import javax.ws.rs.container.ContainerResponseFilter;
-import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.ext.Provider;
 
-import org.apache.cxf.common.logging.LogUtils;
-import org.apache.cxf.common.util.StringUtils;
-import org.apache.cxf.jaxrs.utils.JAXRSUtils;
-import org.apache.cxf.message.Message;
-import org.apache.cxf.tracing.TracerHeaders;
+import org.apache.cxf.tracing.htrace.AbstractHTraceProvider;
 import org.apache.htrace.Sampler;
-import org.apache.htrace.Trace;
-import org.apache.htrace.TraceInfo;
 import org.apache.htrace.TraceScope;
-import org.apache.htrace.Tracer;
 import org.apache.htrace.impl.NeverSampler;
 
-import static org.apache.cxf.tracing.TracerHeaders.DEFAULT_HEADER_SPAN_ID;
-import static org.apache.cxf.tracing.TracerHeaders.DEFAULT_HEADER_TRACE_ID;
-
 @Provider
-public class HTraceProvider implements ContainerRequestFilter, 
ContainerResponseFilter { 
-    private static final Logger LOG = 
LogUtils.getL7dLogger(HTraceProvider.class);
-    private static final String TRACE_SPAN = 
"org.apache.cxf.jaxrs.tracing.htrace.span";
-        
-    private final Sampler< ? > sampler;
-    
+public class HTraceProvider extends AbstractHTraceProvider 
+    implements ContainerRequestFilter, ContainerResponseFilter { 
     public HTraceProvider() {
         this(NeverSampler.INSTANCE);
     }
 
     public HTraceProvider(final Sampler< ? > sampler) {
-        this.sampler = sampler;
+        super(sampler);
     }
 
-    @SuppressWarnings("unchecked")
     @Override
     public void filter(final ContainerRequestContext requestContext) throws 
IOException {
-        final MultivaluedMap<String, String> headers = 
requestContext.getHeaders();
+        TraceScope scope = super.startTraceSpan(requestContext.getHeaders(), 
+                                                
requestContext.getUriInfo().getPath());
         
-        // Try to extract the Trace Id value from the request header
-        final long traceId = getFirstValueOrDefault(headers, 
getTraceIdHeader(), 
-            Tracer.DONT_TRACE.traceId);
-        
-        // Try to extract the Span Id value from the request header
-        final long spanId = getFirstValueOrDefault(headers, getSpanIdHeader(), 
-            Tracer.DONT_TRACE.spanId); 
-        
-        if (traceId != Tracer.DONT_TRACE.traceId && spanId != 
Tracer.DONT_TRACE.spanId) {
-            requestContext.setProperty(TRACE_SPAN, 
Trace.startSpan(requestContext.getUriInfo().getPath(), 
-                (Sampler< TraceInfo >)sampler, new TraceInfo(traceId, 
spanId)));
+        if (scope != null) {
+            requestContext.setProperty(TRACE_SPAN, scope);
         }
     }
     
     @Override
     public void filter(final ContainerRequestContext requestContext,
             final ContainerResponseContext responseContext) throws IOException 
{
-        final MultivaluedMap<String, String> headers = 
requestContext.getHeaders();
-        
-        final String traceIdHeader = getTraceIdHeader();
-        final String spanIdHeader = getSpanIdHeader();
-
-        // Transfer tracing headers into the response headers
-        if (headers.containsKey(traceIdHeader) && 
headers.containsKey(spanIdHeader)) {
-            responseContext.getHeaders().add(traceIdHeader, 
headers.getFirst(traceIdHeader));
-            responseContext.getHeaders().add(spanIdHeader, 
headers.getFirst(spanIdHeader));
-        }
-        
-        final Object value = requestContext.getProperty(TRACE_SPAN);
-        if (value instanceof TraceScope) {
-            final TraceScope span = (TraceScope)value;
-            span.close();
-        }
-    }
-    
-    private static Long getFirstValueOrDefault(final MultivaluedMap<String, 
String> headers, 
-            final String header, final long defaultValue) {
-        String value = headers.getFirst(header);
-        if (value != null) {
-            try {
-                return Long.parseLong(value);
-            } catch (NumberFormatException ex) {
-                LOG.log(Level.FINE, String.format("Unable to parse '%s' header 
value to long number", header), ex);
-            }
-        }
-        return defaultValue;
-    }
-    
-    private static String getSpanIdHeader() {
-        return getHeaderOrDefault(TracerHeaders.HEADER_SPAN_ID, 
DEFAULT_HEADER_SPAN_ID);
-    }
-    
-    private static String getTraceIdHeader() {
-        return getHeaderOrDefault(TracerHeaders.HEADER_TRACE_ID, 
DEFAULT_HEADER_TRACE_ID);
-    }
-
-    private static String getHeaderOrDefault(final String property, final 
String fallback) {
-        final Message message = JAXRSUtils.getCurrentMessage();
-        
-        if (message != null) {
-            final Object header = message.getContextualProperty(property);
-            
-            if (header instanceof String) {
-                final String name = (String)header;
-                if (!StringUtils.isEmpty(name)) {
-                    return name;
-                }
-            }
-        }
-        
-        return fallback;
+        super.stopTraceSpan(requestContext.getHeaders(), 
+                            responseContext.getHeaders(), 
+                            
(TraceScope)requestContext.getProperty(TRACE_SPAN));
     }
 }

Reply via email to