/** * Defer execution until a later point. * * @param request the request * @param action the action to defer */ protected Http.RequestHeader defer(final Http.RequestHeader request, final AbstractDeadboltAction<T> action) { if (action != null) { LOGGER.info("Deferring action [{}]", this.getClass().getName()); return request.addAttr(ACTION_DEFERRED, action); } return request; }
/** * Defer execution until a later point. * * @param request the request * @param action the action to defer */ protected Http.RequestHeader defer(final Http.RequestHeader request, final AbstractDeadboltAction<T> action) { if (action != null) { LOGGER.info("Deferring action [{}]", this.getClass().getName()); return request.addAttr(ACTION_DEFERRED, action); } return request; }
@Override public CompletionStage<F.Tuple<Optional<? extends Subject>, Http.RequestHeader>> apply(final DeadboltHandler deadboltHandler, final Http.RequestHeader requestHeader) { if (cacheUserPerRequestEnabled) { final TypedKey<Subject> deadboltHandlerCacheId = this.typedKeyCache.computeIfAbsent(deadboltHandler.getId(), k -> TypedKey.create("deadbolt.java.cache-user." + k)); final Optional<? extends Subject> cachedUser = requestHeader.attrs().getOptional(deadboltHandlerCacheId); if (cachedUser.isPresent()) { return CompletableFuture.completedFuture(F.Tuple(cachedUser, requestHeader)); } else { return deadboltHandler.getSubject(requestHeader).thenApply(subjectOption -> subjectOption.map(s -> F.<Optional<? extends Subject>, Http.RequestHeader>Tuple(Optional.of(s), requestHeader.addAttr(deadboltHandlerCacheId, s))).orElseGet(() -> F.Tuple(Optional.empty(), requestHeader))); } } return deadboltHandler.getSubject(requestHeader).thenApply(subjectOption -> subjectOption.map(s -> F.<Optional<? extends Subject>, Http.RequestHeader>Tuple(Optional.of(s), requestHeader)).orElseGet(() -> F.Tuple(Optional.empty(), requestHeader))); } }
final ConstraintPoint constraintPoint) final Http.RequestHeader requestHeaderWithAttr = requestHeader.addAttr(Constants.PATTERN_INVERT, invert); return deadboltHandler.getDynamicResourceHandler(requestHeaderWithAttr)
@Override public CompletionStage<F.Tuple<Optional<Result>, Http.RequestHeader>> apply(final DeadboltHandler deadboltHandler, final Http.RequestHeader requestHeader, final Optional<String> content) { final CompletionStage<Optional<Result>> promise; if (cacheBeforeAuthCheckPerRequestEnabled) { final TypedKey<Boolean> deadboltHandlerCacheId = this.typedKeyCache.computeIfAbsent(deadboltHandler.getId(), k -> TypedKey.create("deadbolt.java.cache-before-auth-check." + k)); if (requestHeader.attrs().containsKey(deadboltHandlerCacheId)) { return CompletableFuture.completedFuture(F.Tuple(Optional.empty(), requestHeader)); } else { return deadboltHandler.beforeAuthCheck(requestHeader, content) .thenApply(beforeAuthCheckOption -> beforeAuthCheckOption.map(r -> F.Tuple(Optional.of(r), requestHeader)).orElse(F.Tuple(Optional.empty(), requestHeader.addAttr(deadboltHandlerCacheId, true)))); } } return deadboltHandler.beforeAuthCheck(requestHeader, content).thenApply(beforeAuthCheckOption -> beforeAuthCheckOption.map(r -> F.Tuple(Optional.of(r), requestHeader)).orElseGet(() -> F.Tuple(Optional.empty(), requestHeader))); } }
@Override public CompletionStage<F.Tuple<Optional<Result>, Http.RequestHeader>> apply(final DeadboltHandler deadboltHandler, final Http.RequestHeader requestHeader, final Optional<String> content) { final CompletionStage<Optional<Result>> promise; if (cacheBeforeAuthCheckPerRequestEnabled) { final TypedKey<Boolean> deadboltHandlerCacheId = this.typedKeyCache.computeIfAbsent(deadboltHandler.getId(), k -> TypedKey.create("deadbolt.java.cache-before-auth-check." + k)); if (requestHeader.attrs().containsKey(deadboltHandlerCacheId)) { return CompletableFuture.completedFuture(F.Tuple(Optional.empty(), requestHeader)); } else { return deadboltHandler.beforeAuthCheck(requestHeader, content) .thenApply(beforeAuthCheckOption -> beforeAuthCheckOption.map(r -> F.Tuple(Optional.of(r), requestHeader)).orElse(F.Tuple(Optional.empty(), requestHeader.addAttr(deadboltHandlerCacheId, true)))); } } return deadboltHandler.beforeAuthCheck(requestHeader, content).thenApply(beforeAuthCheckOption -> beforeAuthCheckOption.map(r -> F.Tuple(Optional.of(r), requestHeader)).orElseGet(() -> F.Tuple(Optional.empty(), requestHeader))); } }
@Override public CompletionStage<F.Tuple<Optional<? extends Subject>, Http.RequestHeader>> apply(final DeadboltHandler deadboltHandler, final Http.RequestHeader requestHeader) { if (cacheUserPerRequestEnabled) { final TypedKey<Subject> deadboltHandlerCacheId = this.typedKeyCache.computeIfAbsent(deadboltHandler.getId(), k -> TypedKey.create("deadbolt.java.cache-user." + k)); final Optional<? extends Subject> cachedUser = requestHeader.attrs().getOptional(deadboltHandlerCacheId); if (cachedUser.isPresent()) { return CompletableFuture.completedFuture(F.Tuple(cachedUser, requestHeader)); } else { return deadboltHandler.getSubject(requestHeader).thenApply(subjectOption -> subjectOption.map(s -> F.<Optional<? extends Subject>, Http.RequestHeader>Tuple(Optional.of(s), requestHeader.addAttr(deadboltHandlerCacheId, s))).orElseGet(() -> F.Tuple(Optional.empty(), requestHeader))); } } return deadboltHandler.getSubject(requestHeader).thenApply(subjectOption -> subjectOption.map(s -> F.<Optional<? extends Subject>, Http.RequestHeader>Tuple(Optional.of(s), requestHeader)).orElseGet(() -> F.Tuple(Optional.empty(), requestHeader))); } }
/** * Get the deferred action from the request. * * @param request the request * @return a tuple containing the deferred action (or null if it doesn't exist) and the cleaned up request you should pass on */ @SuppressWarnings("unchecked") public F.Tuple<AbstractDeadboltAction<?>, Http.RequestHeader> getDeferredAction(final Http.RequestHeader request) { return request.attrs().getOptional(ACTION_DEFERRED).map(action -> { action.delegate = this; return F.<AbstractDeadboltAction<?>, Http.RequestHeader>Tuple(action, request.removeAttr(ACTION_DEFERRED).addAttr(IGNORE_DEFERRED_FLAG, true)); }).orElseGet(() -> F.Tuple(null, request)); }
/** * Get the deferred action from the request. * * @param request the request * @return a tuple containing the deferred action (or null if it doesn't exist) and the cleaned up request you should pass on */ @SuppressWarnings("unchecked") public F.Tuple<AbstractDeadboltAction<?>, Http.RequestHeader> getDeferredAction(final Http.RequestHeader request) { return request.attrs().getOptional(ACTION_DEFERRED).map(action -> { action.delegate = this; return F.<AbstractDeadboltAction<?>, Http.RequestHeader>Tuple(action, request.removeAttr(ACTION_DEFERRED).addAttr(IGNORE_DEFERRED_FLAG, true)); }).orElseGet(() -> F.Tuple(null, request)); }
/** * Marks the current action as authorised. This allows method-level annotations to override controller-level annotations. * * @param request the request */ private Http.RequestHeader markAsAuthorised(final Http.RequestHeader request) { this.authorised = true; return request.addAttr(ACTION_AUTHORISED, true); }
/** * Marks the current action as authorised. This allows method-level annotations to override controller-level annotations. * * @param request the request */ private Http.RequestHeader markAsAuthorised(final Http.RequestHeader request) { this.authorised = true; return request.addAttr(ACTION_AUTHORISED, true); }
/** * Create a new version of this object with the given transient language set. * The transient language will be taken into account when using {@link MessagesApi#preferred(RequestHeader)}} (It will take precedence over any other language). * * @param lang The language to use. * @return The new version of this object with the given transient language set. */ default RequestHeader withTransientLang(Lang lang) { return addAttr(Messages.Attrs.CurrentLang, lang); }
/** * Create a new version of this object with the given transient language set. * The transient language will be taken into account when using {@link MessagesApi#preferred(RequestHeader)}} (It will take precedence over any other language). * * @param locale The language to use. * @return The new version of this object with the given transient language set. */ default RequestHeader withTransientLang(Locale locale) { return addAttr(Messages.Attrs.CurrentLang, new Lang(locale)); }
/** * Create a new version of this object with the given transient language set. * The transient language will be taken into account when using {@link MessagesApi#preferred(RequestHeader)}} (It will take precedence over any other language). * * @param code The language to use. * @return The new version of this object with the given transient language set. */ default RequestHeader withTransientLang(String code) { return addAttr(Messages.Attrs.CurrentLang, Lang.forCode(code)); }
/** * Create a new version of this object with the given transient language set. * The transient language will be taken into account when using {@link MessagesApi#preferred(RequestHeader)}} (It will take precedence over any other language). * * @param locale The language to use. * @return The new version of this object with the given transient language set. */ default RequestHeader withTransientLang(Locale locale) { return addAttr(Messages.Attrs.CurrentLang, new Lang(locale)); }
/** * Create a new version of this object with the given transient language set. * The transient language will be taken into account when using {@link MessagesApi#preferred(RequestHeader)}} (It will take precedence over any other language). * * @param code The language to use. * @return The new version of this object with the given transient language set. */ default RequestHeader withTransientLang(String code) { return addAttr(Messages.Attrs.CurrentLang, Lang.forCode(code)); }
/** * Create a new version of this object with the given transient language set. * The transient language will be taken into account when using {@link MessagesApi#preferred(RequestHeader)}} (It will take precedence over any other language). * * @param code The language to use. * @return The new version of this object with the given transient language set. */ default RequestHeader withTransientLang(String code) { return addAttr(Messages.Attrs.CurrentLang, Lang.forCode(code)); }
/** * Create a new version of this object with the given transient language set. * The transient language will be taken into account when using {@link MessagesApi#preferred(RequestHeader)}} (It will take precedence over any other language). * * @param lang The language to use. * @return The new version of this object with the given transient language set. */ default RequestHeader withTransientLang(Lang lang) { return addAttr(Messages.Attrs.CurrentLang, lang); }
/** * Create a new version of this object with the given transient language set. * The transient language will be taken into account when using {@link MessagesApi#preferred(RequestHeader)}} (It will take precedence over any other language). * * @param locale The language to use. * @return The new version of this object with the given transient language set. */ default RequestHeader withTransientLang(Locale locale) { return addAttr(Messages.Attrs.CurrentLang, new Lang(locale)); }
/** * Create a new version of this object with the given transient language set. * The transient language will be taken into account when using {@link MessagesApi#preferred(RequestHeader)}} (It will take precedence over any other language). * * @param lang The language to use. * @return The new version of this object with the given transient language set. */ default RequestHeader withTransientLang(Lang lang) { return addAttr(Messages.Attrs.CurrentLang, lang); }