FluentRoute.java revision 41c1067de1a5fa74255d311e5362548ae41f9a04
842ae4bd224140319ae7feec1872b93dfd491143fielding/*
842ae4bd224140319ae7feec1872b93dfd491143fielding* The contents of this file are subject to the terms of the Common Development and
842ae4bd224140319ae7feec1872b93dfd491143fielding* Distribution License (the License). You may not use this file except in compliance with the
842ae4bd224140319ae7feec1872b93dfd491143fielding* License.
842ae4bd224140319ae7feec1872b93dfd491143fielding*
842ae4bd224140319ae7feec1872b93dfd491143fielding* You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz* specific language governing permission and limitations under the License.
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz*
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz* When distributing Covered Software, include this CDDL Header Notice in each file and include
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz* the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz* Header, with the fields enclosed by brackets [] replaced by your own identifying
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz* information: "Portions copyright [year] [name of copyright owner]".
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz*
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz* Copyright 2014 ForgeRock AS.
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz*/
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantzpackage org.forgerock.openam.rest.fluent;
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantzimport java.util.ArrayList;
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantzimport java.util.List;
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantzimport org.forgerock.authz.filter.crest.api.CrestAuthorizationModule;
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantzimport org.forgerock.guice.core.InjectorHolder;
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantzimport org.forgerock.json.resource.CollectionResourceProvider;
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantzimport org.forgerock.json.resource.RequestHandler;
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantzimport org.forgerock.json.resource.RoutingMode;
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantzimport org.forgerock.json.resource.SingletonResourceProvider;
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantzimport org.forgerock.json.resource.VersionHandler;
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantzimport org.forgerock.openam.rest.authz.LoggingAuthzModule;
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantzimport org.forgerock.openam.rest.resource.CrestRouter;
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz/**
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz * Class representing a Route which can be added to a FluentRouter. The FluentRouter itself is
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz * responsible for creating the FluentRoute (making the API fluent), and the calling method for
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz * adding these FluentRoutes to the FluentRouter adding any necessary filters/versions, etc.
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz *
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz * @see org.forgerock.openam.rest.RestEndpoints
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz * @since 12.0.0
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz */
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantzpublic class FluentRoute implements FluentVersion {
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz private final CrestRouter router;
4bceff39f96a979b76e1dbef0d2e004ca0546f43rpluem private final String uriTemplate;
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz private final List<CrestAuthorizationModule> modules;
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz private VersionHandler versionHandler;
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz FluentRoute(CrestRouter router, String uriTemplate) {
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz this.router = router;
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz this.uriTemplate = uriTemplate;
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz this.modules = new ArrayList<CrestAuthorizationModule>();
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz }
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz FluentRoute(FluentRoute route) {
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz this.router = route.router;
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz this.uriTemplate = route.uriTemplate;
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz this.modules = route.modules;
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz }
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz /**
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz * Add an authorization module through which the request must pass
36ef8f77bffe75d1aa327882be1b5bdbe2ff567asf * if it is to reach its destination.
36ef8f77bffe75d1aa327882be1b5bdbe2ff567asf *
94e21bbbd0f0f960317594da47734c4b7f5d3ec4rpluem * @param module authorization filter for the request.
94e21bbbd0f0f960317594da47734c4b7f5d3ec4rpluem * @param moduleReference the name of the authorization filter, referenced in logs.
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin * @return this FluentRoute (fluent API).
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin */
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz public FluentRoute through(Class<? extends CrestAuthorizationModule> module, String moduleReference) {
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz this.modules.add(new LoggingAuthzModule(get(module), moduleReference));
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz return this;
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin }
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin /**
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin * Sets the version this Route is for.
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin *
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin * @param version the version for this route.
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin * @return a FluentTo connecting this route with this version.
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin */
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin public FluentTo forVersion(String version) {
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin return new FluentTo(this, version);
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin }
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin
0f19881eb155511972cec25a0b554ae0182c6ba1covener /**
ba1858598da91e42b574eee1b69ab485fbd0d1d5ylavic * Return the authorization modules which must be passed for a request to be successfully routed to
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz * its resource provider.
56ab8639aed4d3b2f031d9c1160c5f40af01bdebjerenkrantz *
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin * @return An array of CrestAuthorizationModules
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin */
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin CrestAuthorizationModule[] getModules() {
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin return modules.toArray(new CrestAuthorizationModule[modules.size()]);
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin }
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin /**
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin * Adds a route to a version of the resource pointed at by this FluentRoute, which is
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin * provided by a CollectionResourceProvider.
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin *
836587f1b2cd2cc99ee7dfb0c0f872f03ce8632drpluem * @param version The version of the resource pointed to.
b1cf8b6c70a42f499ea03b61997bb8667810d285minfrin * @param provider The provider of the resource.
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin */
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin void addVersion(String version, CollectionResourceProvider provider) {
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin if (versionHandler == null) {
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin versionHandler = router.addRoute(uriTemplate);
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin }
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin versionHandler.addVersion(version, provider);
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin }
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin /**
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin * Adds a route to a version of the resource pointed at by this FluentRoute, which is
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin * provided by a SingletonResourceProvider.
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin *
dcdce2058e8e657eb3b2f653461cbef0e89d9173niq * @param version The version of the resource pointed to.
470c2663449af7b1ba64f9e67c3709371f6825acrpluem * @param provider The provider of the resource.
470c2663449af7b1ba64f9e67c3709371f6825acrpluem */
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin void addVersion(String version, SingletonResourceProvider provider) {
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin if (versionHandler == null) {
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin versionHandler = router.addRoute(uriTemplate);
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin }
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin versionHandler.addVersion(version, provider);
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin }
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin /**
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin * Adds a route to a version of the resource pointed at by this FluentRoute, which is
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin * provided by a RequestHandler.
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin *
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin * @param version The version of the resource pointed to.
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin * @param handler The provider of the resource.
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin */
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin void addVersion(RoutingMode mode, String version, RequestHandler handler) {
470c2663449af7b1ba64f9e67c3709371f6825acrpluem if (versionHandler == null) {
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin versionHandler = router.addRoute(mode, uriTemplate);
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin }
836587f1b2cd2cc99ee7dfb0c0f872f03ce8632drpluem versionHandler.addVersion(version, handler);
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin }
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin
836587f1b2cd2cc99ee7dfb0c0f872f03ce8632drpluem private <T> T get(Class<T> resourceClass) {
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin return InjectorHolder.getInstance(resourceClass);
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin }
836587f1b2cd2cc99ee7dfb0c0f872f03ce8632drpluem
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin}
74e7f6c55fd67b10cb400b3f6d1dc718a303d944minfrin