Skip to content

Commit

Permalink
Separate tests using jmockit from jersey core (eclipse-ee4j#4125)
Browse files Browse the repository at this point in the history
Signed-off-by: Jan Supol <jan.supol@oracle.com>
  • Loading branch information
jansupol committed May 14, 2019
1 parent 8c60fd2 commit 081d294
Show file tree
Hide file tree
Showing 3 changed files with 183 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,10 @@ private int compare(List<MediaType> mediaTypeList1, List<MediaType> mediaTypeLis
}
}

/* package */ Set<String> getHttpMethods() {
return consumesProducesAcceptors.keySet();
}

/**
* Represents a 1-1-1 relation between input and output media type and an methodAcceptorPair.
* <p>E.g. for a single resource method
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2010, 2019 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
Expand All @@ -16,9 +16,11 @@

package org.glassfish.jersey.server.internal.routing;

import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.regex.MatchResult;
import java.util.stream.Collectors;

import org.glassfish.jersey.message.internal.TracingLogger;
import org.glassfish.jersey.server.internal.ServerTraceEvent;
Expand All @@ -34,6 +36,7 @@
final class PathMatchingRouter implements Router {

private final List<Route> acceptedRoutes;
private static final RouteComparator ROUTE_COMPARATOR = new RouteComparator();

/**
* Constructs route methodAcceptorPair that uses {@link PathPattern} instances for
Expand All @@ -56,15 +59,19 @@ public Router.Continuation apply(final RequestProcessingContext context) {
tracingLogger.log(ServerTraceEvent.MATCH_PATH_FIND, path);

Router.Continuation result = null;
final Iterator<Route> iterator = acceptedRoutes.iterator();
final Iterator<ComparableRoute> iterator = acceptedRoutes
.stream()
.map(a -> new ComparableRoute(a, context, path))
.sorted(ROUTE_COMPARATOR)
.iterator();

while (iterator.hasNext()) {
final Route acceptedRoute = iterator.next();
final PathPattern routePattern = acceptedRoute.routingPattern();
final MatchResult m = routePattern.match(path);
if (m != null) {
final ComparableRoute acceptedRoute = iterator.next();
final PathPattern routePattern = acceptedRoute.route.routingPattern();
if (acceptedRoute.matchResult != null) {
// Push match result information and rest of path to match
rc.pushMatchResult(m);
result = Router.Continuation.of(context, acceptedRoute.next());
rc.pushMatchResult(acceptedRoute.matchResult);
result = Router.Continuation.of(context, acceptedRoute.route.next());

//tracing
tracingLogger.log(ServerTraceEvent.MATCH_PATH_SELECTED, routePattern.getRegex());
Expand All @@ -76,7 +83,7 @@ public Router.Continuation apply(final RequestProcessingContext context) {

if (tracingLogger.isLogEnabled(ServerTraceEvent.MATCH_PATH_SKIPPED)) {
while (iterator.hasNext()) {
tracingLogger.log(ServerTraceEvent.MATCH_PATH_SKIPPED, iterator.next().routingPattern().getRegex());
tracingLogger.log(ServerTraceEvent.MATCH_PATH_SKIPPED, iterator.next().route.routingPattern().getRegex());
}
}

Expand All @@ -87,4 +94,45 @@ public Router.Continuation apply(final RequestProcessingContext context) {

return result;
}

private static class RouteComparator implements Comparator<ComparableRoute> {

@Override
public int compare(ComparableRoute o1, ComparableRoute o2) {
if (o2.matchResult == null) {
return -1;
}
if (!o2.hasMethodSelectingRouter) {
return o1.matchResult == null ? 1 : -1;
}
if (!o2.hasRequestedMethodDesignator) {
return o1.matchResult == null || !o1.hasRequestedMethodDesignator ? 1 : -1;
}
if (o1.matchResult == null || !o1.hasMethodSelectingRouter || !o1.hasRequestedMethodDesignator) {
return 1;
}
return 0;
}
}

private static class ComparableRoute {
private final Route route;
private final MatchResult matchResult;
private final boolean hasMethodSelectingRouter;
private final boolean hasRequestedMethodDesignator;

private ComparableRoute(Route route, RequestProcessingContext context, String path) {
this.route = route;
this.matchResult = route.routingPattern().match(path);
final List<MethodSelectingRouter> routers = matchResult == null ? null : route
.next()
.stream()
.filter(MethodSelectingRouter.class::isInstance)
.map(MethodSelectingRouter.class::cast)
.collect(Collectors.toList());
this.hasMethodSelectingRouter = !(routers == null || routers.isEmpty());
this.hasRequestedMethodDesignator = !hasMethodSelectingRouter ?
false : routers.stream().anyMatch(a -> a.getHttpMethods().contains(context.request().getMethod()));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
/*
* Copyright (c) 2013, 2019 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.tests.e2e.server.routing;

import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.glassfish.jersey.tests.e2e.server.A;
import org.junit.Test;

import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;

public class RegularExpressionsTest extends JerseyTest {
public static String GET_VALUE = "get value";
public static String POST_VALUE = "post value";


@Path("one")
public static class ResourceOne {
@POST
public String post(String entity) {
return entity;
}

@GET
@Path("x")
public Response get() {
return Response.ok(GET_VALUE).build();

}

@POST
@Path("{name:[a-zA-Z][a-zA-Z_0-9]*}")
public Response post() {
return Response.ok(POST_VALUE).build();

}

@Path("{x:[a-z]}")
public A.SubGet doAnything4() {
return new A.SubGet();
}
}

@Path("two")
public static class ResourceTwo {
@GET
@Path("{Prefix}{p:/?}{id: ((\\d+)?)}/abc{p2:/?}{number: (([A-Za-z0-9]*)?)}")
public Response get() {
return Response.ok(GET_VALUE).build();

}

@POST
@Path("{Prefix}{p:/?}{id: ((\\d+)?)}/abc/{yeah}")
public Response post() {
return Response.ok(POST_VALUE).build();

}
}

public static class SubGet {
@PUT
public String get() {
return "TEST";
}
}

@Override
protected Application configure() {
return new ResourceConfig(ResourceOne.class, ResourceTwo.class);
}

@Test
public void testPostOne() {
String entity = target("one").path("x").request()
.buildPost(Entity.entity("AA", MediaType.TEXT_PLAIN_TYPE)).invoke().readEntity(String.class);
assertThat(entity, is(POST_VALUE));
}

@Test
public void testGetOne() {
String entity = target("one").path("x").request().buildGet().invoke().readEntity(String.class);
assertThat(entity, is(GET_VALUE));
}

@Test
public void testPostTwo() {
String entity = target("two").path("P/abc/MyNumber").request()
.buildPost(Entity.entity("AA", MediaType.TEXT_PLAIN_TYPE)).invoke().readEntity(String.class);
assertThat(entity, is(POST_VALUE));
}

@Test
public void testGetTwo() {
String entity = target("two").path("P/abc/MyNumber").request().buildGet().invoke().readEntity(String.class);
assertThat(entity, is(GET_VALUE));
}
}

0 comments on commit 081d294

Please # to comment.