/*
* Copyright (c) 2011, 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.server.internal.routing;
import java.util.Collections;
import org.glassfish.jersey.server.internal.process.RequestProcessingContext;
Hierarchical request router that can be used to create dynamic routing tree structures. Each routing tree can be executed using a dedicated routing stage
. Author: Marek Potociar
/**
* Hierarchical request router that can be used to create dynamic routing tree
* structures. Each routing tree can be executed using a dedicated
* {@link RoutingStage routing stage}.
*
* @author Marek Potociar
*/
interface Router {
Hierarchical request routing continuation.
A continuation of a hierarchical request routing is represented
by an ordered collection of next level of routers resulting
in a hierarchical depth-first (depth-only) request routing.
/**
* Hierarchical request routing continuation.
* <p>
* A continuation of a hierarchical request routing is represented
* by an ordered collection of next level of routers resulting
* in a hierarchical depth-first (depth-only) request routing.
* </p>
*/
public static final class Continuation {
private final RequestProcessingContext requestProcessingContext;
private final Iterable<Router> next;
Create a terminal continuation from the routed request.
Params: - result – routed request.
Returns: terminal continuation with no next level routers
in the routing hierarchy and the supplied routed request.
/**
* Create a terminal continuation from the routed request.
*
* @param result routed request.
* @return terminal continuation with no {@link #next() next level routers}
* in the routing hierarchy and the supplied routed request.
*/
static Continuation of(final RequestProcessingContext result) {
return new Continuation(result, null);
}
Create a continuation from the routed request and a collection
of next level routers.
Params: - result – routed request.
- next – next level routers.
Returns: a continuation with the supplied next level routers to be invoked next
in the routing chain and the supplied routed request.
/**
* Create a continuation from the routed request and a collection
* of next level routers.
*
* @param result routed request.
* @param next next level routers.
* @return a continuation with the supplied next level routers to be invoked
* {@link #next() next} in the routing chain and the supplied routed
* request.
*/
static Continuation of(final RequestProcessingContext result, Iterable<Router> next) {
return new Continuation(result, next);
}
Create a continuation from the routed request and a single
of next level routers.
Params: - request – routed request.
- next – next level router.
Returns: a continuation with the supplied next level router to be invoked next
in the routing chain and the supplied routed request.
/**
* Create a continuation from the routed request and a single
* of next level routers.
*
* @param request routed request.
* @param next next level router.
* @return a continuation with the supplied next level router to be invoked
* {@link #next() next} in the routing chain and the supplied routed
* request.
*/
static Continuation of(final RequestProcessingContext request, final Router next) {
return new Continuation(request, Collections.singletonList(next));
}
private Continuation(final RequestProcessingContext request, final Iterable<Router> next) {
this.requestProcessingContext = request;
this.next = (next == null) ? Collections.<Router>emptyList() : next;
}
Get the routed request context.
Returns: routed request context.
/**
* Get the routed request context.
*
* @return routed request context.
*/
RequestProcessingContext requestContext() {
return requestProcessingContext;
}
Get the next level routers to be invoked or an empty
if no next level routers are present. Returns: the next level routers to be invoked or an empty collection if not
present.
/**
* Get the next level routers to be invoked or {@code an empty} if no next
* level routers are present.
*
* @return the next level routers to be invoked or an empty collection if not
* present.
*/
Iterable<Router> next() {
return next;
}
}
Performs a request routing task and returns the routed request together with a routing continuation
. Params: - data – data to be transformed.
Returns: a processing continuation.
/**
* Performs a request routing task and returns the routed request together with
* a {@link Continuation routing continuation}.
*
* @param data data to be transformed.
* @return a processing continuation.
*/
public Continuation apply(RequestProcessingContext data);
}