org.glassfish.jersey.message.internal.InterceptorExecutor Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jaxrs-ri Show documentation
Show all versions of jaxrs-ri Show documentation
A bundle project producing JAX-RS RI bundles. The primary artifact is an "all-in-one" OSGi-fied JAX-RS RI bundle
(jaxrs-ri.jar).
Attached to that are two compressed JAX-RS RI archives. The first archive (jaxrs-ri.zip) consists of binary RI bits and
contains the API jar (under "api" directory), RI libraries (under "lib" directory) as well as all external
RI dependencies (under "ext" directory). The secondary archive (jaxrs-ri-src.zip) contains buildable JAX-RS RI source
bundle and contains the API jar (under "api" directory), RI sources (under "src" directory) as well as all external
RI dependencies (under "ext" directory). The second archive also contains "build.xml" ANT script that builds the RI
sources. To build the JAX-RS RI simply unzip the archive, cd to the created jaxrs-ri directory and invoke "ant" from
the command line.
/*
* Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/
package org.glassfish.jersey.message.internal;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.Collection;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.ext.InterceptorContext;
import jakarta.ws.rs.ext.ReaderInterceptorContext;
import jakarta.ws.rs.ext.WriterInterceptorContext;
import org.glassfish.jersey.internal.PropertiesDelegate;
/**
* Abstract class with implementation of {@link InterceptorContext} which is common for {@link ReaderInterceptorContext}
* and {@link WriterInterceptorContext} implementations.
*
* @author Miroslav Fuksa
*/
abstract class InterceptorExecutor implements InterceptorContext, PropertiesDelegate {
private final PropertiesDelegate propertiesDelegate;
private Annotation[] annotations;
private Class type;
private Type genericType;
private MediaType mediaType;
private final TracingLogger tracingLogger;
private InterceptorTimestampPair lastTracedInterceptor;
/**
* Holder of interceptor instance and timestamp of the interceptor invocation (in ns).
*/
private static class InterceptorTimestampPair {
private final T interceptor;
private final long timestamp;
private InterceptorTimestampPair(final T interceptor, final long timestamp) {
this.interceptor = interceptor;
this.timestamp = timestamp;
}
private T getInterceptor() {
return interceptor;
}
private long getTimestamp() {
return timestamp;
}
}
/**
* Constructor initializes common properties of this abstract class.
*
* @param rawType raw Java entity type.
* @param type generic Java entity type.
* @param annotations Annotations on the formal declaration of the resource
* method parameter that is the target of the message body
* conversion. See {@link InterceptorContext#getAnnotations()}.
* @param mediaType MediaType of HTTP entity. See {@link InterceptorContext#getMediaType()}.
* @param propertiesDelegate request-scoped properties delegate.
*/
public InterceptorExecutor(final Class rawType, final Type type, final Annotation[] annotations, final MediaType mediaType,
final PropertiesDelegate propertiesDelegate) {
super();
this.type = rawType;
this.genericType = type;
this.annotations = annotations;
this.mediaType = mediaType;
this.propertiesDelegate = propertiesDelegate;
this.tracingLogger = TracingLogger.getInstance(propertiesDelegate);
}
@Override
public Object getProperty(final String name) {
return propertiesDelegate.getProperty(name);
}
@Override
public Collection getPropertyNames() {
return propertiesDelegate.getPropertyNames();
}
@Override
public void setProperty(final String name, final Object object) {
propertiesDelegate.setProperty(name, object);
}
@Override
public void removeProperty(final String name) {
propertiesDelegate.removeProperty(name);
}
/**
* Get tracing logger instance configured in via properties.
*
* @return tracing logger instance.
*/
protected final TracingLogger getTracingLogger() {
return tracingLogger;
}
/**
* Tracing support - log invocation of interceptor BEFORE context.proceed() call.
*
* @param interceptor invoked interceptor
* @param event event type to be tested
*/
protected final void traceBefore(final T interceptor, final TracingLogger.Event event) {
if (tracingLogger.isLogEnabled(event)) {
if ((lastTracedInterceptor != null) && (interceptor != null)) {
tracingLogger.logDuration(event, lastTracedInterceptor.getTimestamp(), lastTracedInterceptor.getInterceptor());
}
lastTracedInterceptor = new InterceptorTimestampPair(interceptor, System.nanoTime());
}
}
/**
* Tracing support - log invocation of interceptor AFTER context.proceed() call.
*
* @param interceptor invoked interceptor
* @param event event type to be tested
*/
protected final void traceAfter(final T interceptor, final TracingLogger.Event event) {
if (tracingLogger.isLogEnabled(event)) {
if ((lastTracedInterceptor != null) && (lastTracedInterceptor.getInterceptor() != null)) {
tracingLogger.logDuration(event, lastTracedInterceptor.getTimestamp(), interceptor);
}
lastTracedInterceptor = new InterceptorTimestampPair(interceptor, System.nanoTime());
}
}
/**
* Clear last traced interceptor information.
*/
protected final void clearLastTracedInterceptor() {
lastTracedInterceptor = null;
}
@Override
public Annotation[] getAnnotations() {
return annotations;
}
@Override
public void setAnnotations(final Annotation[] annotations) {
if (annotations == null) {
throw new NullPointerException("Annotations must not be null.");
}
this.annotations = annotations;
}
@Override
public Class getType() {
return this.type;
}
@Override
public void setType(final Class type) {
this.type = type;
}
@Override
public Type getGenericType() {
return genericType;
}
@Override
public void setGenericType(final Type genericType) {
this.genericType = genericType;
}
@Override
public MediaType getMediaType() {
return mediaType;
}
@Override
public void setMediaType(final MediaType mediaType) {
this.mediaType = mediaType;
}
}