Skip to content

Commit

Permalink
feat: Make the kit compatible with Vaadin 14 (#145)
Browse files Browse the repository at this point in the history
These changes allow the agent to be used with a V14 application.
  • Loading branch information
MatthewVaadin authored Jan 10, 2023
1 parent 15d3416 commit 14186ce
Show file tree
Hide file tree
Showing 9 changed files with 313 additions and 17 deletions.
2 changes: 2 additions & 0 deletions src/main/java/com/vaadin/extension/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,6 @@ public class Constants {
public static final String SESSION_ID = "vaadin.session.id";
public static final String REQUEST_TYPE = "vaadin.request.type";
public static final String FLOW_VERSION = "vaadin.flow.version";

public static final String REQUEST_LOCATION_PARAMETER = "location";
}
299 changes: 299 additions & 0 deletions src/main/java/com/vaadin/extension/HttpStatusCode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,299 @@
package com.vaadin.extension;

import java.util.stream.Stream;

public enum HttpStatusCode {

/**
* Status code (100) indicating the client can continue.
*/
CONTINUE(100),

/**
* Status code (101) indicating the server is switching protocols according
* to Upgrade header.
*/
SWITCHING_PROTOCOLS(101),

/**
* Status code (200) indicating the request succeeded normally.
*/
OK(200),

/**
* Status code (201) indicating the request succeeded and created a new
* resource on the server.
*/
CREATED(201),

/**
* Status code (202) indicating that a request was accepted for processing,
* but was not completed.
*/
ACCEPTED(202),

/**
* Status code (203) indicating that the meta information presented by the
* client did not originate from the server.
*/
NON_AUTHORITATIVE_INFORMATION(203),

/**
* Status code (204) indicating that the request succeeded but that there
* was no new information to return.
*/
NO_CONTENT(204),

/**
* Status code (205) indicating that the agent <em>SHOULD</em> reset the
* document view which caused the request to be sent.
*/
RESET_CONTENT(205),

/**
* Status code (206) indicating that the server has fulfilled the partial
* GET request for the resource.
*/
PARTIAL_CONTENT(206),

/**
* Status code (300) indicating that the requested resource corresponds to
* any one of a set of representations, each with its own specific location.
*/
MULTIPLE_CHOICES(300),

/**
* Status code (301) indicating that the resource has permanently moved to a
* new location, and that future references should use a new URI with their
* requests.
*/
MOVED_PERMANENTLY(301),

/**
* Status code (302) indicating that the resource has temporarily moved to
* another location, but that future references should still use the
* original URI to access the resource.
*
* This definition is being retained for backwards compatibility. FOUND is
* now the preferred definition.
*/
MOVED_TEMPORARILY(302),

/**
* Status code (302) indicating that the resource reside temporarily under a
* different URI. Since the redirection might be altered on occasion, the
* client should continue to use the Request-URI for future
* requests.(HTTP/1.1) To represent the status code (302), it is recommended
* to use this variable.
*/
FOUND(302),

/**
* Status code (303) indicating that the response to the request can be
* found under a different URI.
*/
SEE_OTHER(303),

/**
* Status code (304) indicating that a conditional GET operation found that
* the resource was available and not modified.
*/
NOT_MODIFIED(304),

/**
* Status code (305) indicating that the requested resource <em>MUST</em> be
* accessed through the proxy given by the <code><em>Location</em></code>
* field.
*/
USE_PROXY(305),

/**
* Status code (307) indicating that the requested resource resides
* temporarily under a different URI. The temporary URI <em>SHOULD</em> be
* given by the <code><em>Location</em></code> field in the response.
*/
TEMPORARY_REDIRECT(307),

/**
* Status code (400) indicating the request sent by the client was
* syntactically incorrect.
*/
BAD_REQUEST(400),

/**
* Status code (401) indicating that the request requires HTTP
* authentication.
*/
UNAUTHORIZED(401),

/**
* Status code (402) reserved for future use.
*/
PAYMENT_REQUIRED(402),

/**
* Status code (403) indicating the server understood the request but
* refused to fulfill it.
*/
FORBIDDEN(403),

/**
* Status code (404) indicating that the requested resource is not
* available.
*/
NOT_FOUND(404),

/**
* Status code (405) indicating that the method specified in the
* <code><em>Request-Line</em></code> is not allowed for the resource
* identified by the <code><em>Request-URI</em></code>.
*/
METHOD_NOT_ALLOWED(405),

/**
* Status code (406) indicating that the resource identified by the request
* is only capable of generating response entities which have content
* characteristics not acceptable according to the accept headers sent in
* the request.
*/
NOT_ACCEPTABLE(406),

/**
* Status code (407) indicating that the client <em>MUST</em> first
* authenticate itself with the proxy.
*/
PROXY_AUTHENTICATION_REQUIRED(407),

/**
* Status code (408) indicating that the client did not produce a request
* within the time that the server was prepared to wait.
*/
REQUEST_TIMEOUT(408),

/**
* Status code (409) indicating that the request could not be completed due
* to a conflict with the current state of the resource.
*/
CONFLICT(409),

/**
* Status code (410) indicating that the resource is no longer available at
* the server and no forwarding address is known. This condition
* <em>SHOULD</em> be considered permanent.
*/
GONE(410),

/**
* Status code (411) indicating that the request cannot be handled without a
* defined <code><em>Content-Length</em></code>.
*/
LENGTH_REQUIRED(411),

/**
* Status code (412) indicating that the precondition given in one or more
* of the request-header fields evaluated to false when it was tested on the
* server.
*/
PRECONDITION_FAILED(412),

/**
* Status code (413) indicating that the server is refusing to process the
* request because the request entity is larger than the server is willing
* or able to process.
*/
REQUEST_ENTITY_TOO_LARGE(413),

/**
* Status code (414) indicating that the server is refusing to service the
* request because the <code><em>Request-URI</em></code> is longer than the
* server is willing to interpret.
*/
REQUEST_URI_TOO_LONG(414),

/**
* Status code (415) indicating that the server is refusing to service the
* request because the entity of the request is in a format not supported by
* the requested resource for the requested method.
*/
UNSUPPORTED_MEDIA_TYPE(415),

/**
* Status code (416) indicating that the server cannot serve the requested
* byte range.
*/
REQUESTED_RANGE_NOT_SATISFIABLE(416),

/**
* Status code (417) indicating that the server could not meet the
* expectation given in the Expect request header.
*/
EXPECTATION_FAILED(417),

/**
* Status code (500) indicating an error inside the HTTP server which
* prevented it from fulfilling the request.
*/
INTERNAL_SERVER_ERROR(500),

/**
* Status code (501) indicating the HTTP server does not support the
* functionality needed to fulfill the request.
*/
NOT_IMPLEMENTED(501),

/**
* Status code (502) indicating that the HTTP server received an invalid
* response from a server it consulted when acting as a proxy or gateway.
*/
BAD_GATEWAY(502),

/**
* Status code (503) indicating that the HTTP server is temporarily
* overloaded, and unable to handle the request.
*/
SERVICE_UNAVAILABLE(503),

/**
* Status code (504) indicating that the server did not receive a timely
* response from the upstream server while acting as a gateway or proxy.
*/
GATEWAY_TIMEOUT(504),

/**
* Status code (505) indicating that the server does not support or refuses
* to support the HTTP protocol version that was used in the request
* message.
*/
HTTP_VERSION_NOT_SUPPORTED(505);

private final int code;

HttpStatusCode(int code) {
this.code = code;
}

/**
* Gets the integer representation of the HTTP status code.
*
* @return integer representation of the HTTP status code.
*/
public int getCode() {
return code;
}

/**
* Checks if the given status code is valid.
*
* The only valid status codes are the ones listed in this enumeration.
*
* @param statusCode
* status code to be checked
* @return {@literal true} if the status code is valid, otherwise
* {@literal false}.
*/
public static boolean isValidStatusCode(int statusCode) {
return Stream.of(HttpStatusCode.values())
.anyMatch(st -> st.code == statusCode);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
import com.vaadin.flow.component.UI;
import com.vaadin.flow.router.RouteConfiguration;
import com.vaadin.flow.server.HandlerHelper;
import com.vaadin.flow.server.HttpStatusCode;
import com.vaadin.flow.server.Version;
import com.vaadin.flow.shared.ApplicationConstants;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
import static net.bytebuddy.matcher.ElementMatchers.named;

import com.vaadin.extension.Constants;
import com.vaadin.extension.InstrumentationHelper;
import com.vaadin.flow.server.VaadinRequest;
import com.vaadin.flow.shared.ApplicationConstants;

import io.opentelemetry.api.trace.Span;
import io.opentelemetry.context.Context;
Expand Down Expand Up @@ -70,8 +70,8 @@ public static void onEnter(@Advice.Argument(1) VaadinRequest request,
Span localRootSpan = LocalRootSpan
.fromContextOrNull(Context.current());
if (localRootSpan != null) {
String location = request.getParameter(
ApplicationConstants.REQUEST_LOCATION_PARAMETER);
String location = request
.getParameter(Constants.REQUEST_LOCATION_PARAMETER);
String route = "/" + InstrumentationHelper
.getRouteTemplateForLocation(location).orElse("");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,7 @@ public void transform(TypeTransformer transformer) {
named("java.lang.reflect.Method")))
.and(takesArgument(2,
named("elemental.json.JsonArray")))
.and(takesArgument(3, int.class))
.and(takesArgument(4, boolean.class)),
.and(takesArgument(3, int.class)),
this.getClass().getName() + "$InvokeAdvice");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;

import com.vaadin.extension.HttpStatusCode;
import com.vaadin.extension.InstrumentationHelper;
import com.vaadin.flow.server.HttpStatusCode;

import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.StatusCode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

import static org.junit.jupiter.api.Assertions.*;

import com.vaadin.extension.Constants;
import com.vaadin.extension.instrumentation.AbstractInstrumentationTest;
import com.vaadin.flow.server.VaadinRequest;
import com.vaadin.flow.shared.ApplicationConstants;

import io.opentelemetry.sdk.trace.data.SpanData;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
Expand All @@ -24,8 +24,7 @@ public void setup() {

@Test
public void synchronizedHandleRequest_createsSpan() {
Mockito.when(request
.getParameter(ApplicationConstants.REQUEST_LOCATION_PARAMETER))
Mockito.when(request.getParameter(Constants.REQUEST_LOCATION_PARAMETER))
.thenReturn("test-route");

JavaScriptBootstrapHandlerInstrumentation.SynchronizedHandleRequestAdvice
Expand All @@ -39,8 +38,7 @@ public void synchronizedHandleRequest_createsSpan() {

@Test
public void synchronizedHandleRequest_updatesRootSpan() {
Mockito.when(request
.getParameter(ApplicationConstants.REQUEST_LOCATION_PARAMETER))
Mockito.when(request.getParameter(Constants.REQUEST_LOCATION_PARAMETER))
.thenReturn("test-route");

try (var ignored = withRootContext()) {
Expand All @@ -58,8 +56,7 @@ public void synchronizedHandleRequest_updatesRootSpan() {

@Test
public void synchronizedHandleRequest_withException_setsErrorStatus() {
Mockito.when(request
.getParameter(ApplicationConstants.REQUEST_LOCATION_PARAMETER))
Mockito.when(request.getParameter(Constants.REQUEST_LOCATION_PARAMETER))
.thenReturn("test-route");

JavaScriptBootstrapHandlerInstrumentation.SynchronizedHandleRequestAdvice
Expand Down
Loading

0 comments on commit 14186ce

Please sign in to comment.