private static Route buildRouteWithOptionalServiceNameAndInstance(final RequestContext ctx, final DittoHeaders dittoHeaders, final RouteBuilderWithOptionalServiceNameAndInstance routeBuilder) { return route( // /devops/<logging|piggyback>/<serviceName> buildRouteWithServiceNameAndOptionalInstance(ctx, dittoHeaders, routeBuilder), // /devops/<logging|piggyback>/ routeBuilder.build(ctx, null, null, dittoHeaders) ); }
private Route thingsEntryPolicyId(final RequestContext ctx, final DittoHeaders dittoHeaders, final String thingId) { return path(PATH_POLICY_ID, () -> // /things/<thingId>/policyId route( get(() -> // GET /things/<thingId>/policyId handlePerRequest(ctx, RetrievePolicyId.of(thingId, dittoHeaders)) ), put(() -> // GET /things/<thingId>/policyId extractDataBytes(payloadSource -> handlePerRequest(ctx, dittoHeaders, payloadSource, policyIdJson -> ModifyPolicyId.of(thingId, Optional.of(JsonFactory.readFrom(policyIdJson)) .filter(JsonValue::isString) .map(JsonValue::asString) .orElse(policyIdJson), dittoHeaders) ) ) ) ) ); }
private static Route buildRouteWithServiceNameAndOptionalInstance(final RequestContext ctx, final DittoHeaders dittoHeaders, final RouteBuilderWithOptionalServiceNameAndInstance routeBuilder) { return rawPathPrefix(mergeDoubleSlashes().concat(PathMatchers.segment()), serviceName -> route( // /devops/<logging|piggyback>/<serviceName>/<instance> buildRouteWithServiceNameAndInstance(ctx, serviceName, dittoHeaders, routeBuilder), // /devops/<logging|piggyback>/<serviceName> routeBuilder.build(ctx, serviceName, null, dittoHeaders) ) ); }
/** * Builds the {@code /entries} route. * * @return the {@code /entries} route. */ Route buildPolicyEntriesRoute(final RequestContext ctx, final DittoHeaders dittoHeaders, final String policyId) { return Directives.route( thingsEntryPolicyEntries(ctx, dittoHeaders, policyId), thingsEntryPolicyEntry(ctx, dittoHeaders, policyId), thingsEntryPolicyEntrySubjects(ctx, dittoHeaders, policyId), thingsEntryPolicyEntrySubjectsEntry(ctx, dittoHeaders, policyId), thingsEntryPolicyEntryResources(ctx, dittoHeaders, policyId), thingsEntryPolicyEntryResourcesEntry(ctx, dittoHeaders, policyId) ); }
/** * Builds the {@code /{inbox|outbox}} sub route for the things route. * * @return the {@code /{inbox|outbox}} route. */ public Route buildThingsInboxOutboxRoute(final RequestContext ctx, final DittoHeaders dittoHeaders, final String thingId) { return route( claimMessages(ctx, dittoHeaders, thingId), // /inbox/claim rawPathPrefix(mergeDoubleSlashes().concat(PathMatchers.segment(INBOX_OUTBOX_PATTERN)), inboxOutbox -> // /<inbox|outbox> post(() -> thingMessages(ctx, dittoHeaders, thingId, inboxOutbox)) ) ); }
private Route buildApiSubRoutes(final RequestContext ctx, final DittoHeaders dittoHeaders, final AuthorizationContext authorizationContext) { final Route customApiSubRoutes = customApiRoutesProvider.authorized(dittoHeaders); return Directives.route( // /api/{apiVersion}/policies policiesRoute.buildPoliciesRoute(ctx, dittoHeaders), // /api/{apiVersion}/things SSE support sseThingsRoute.buildThingsSseRoute(ctx, () -> overwriteDittoHeaders(ctx, dittoHeaders, CustomHeadersHandler.RequestType.SSE, authorizationContext)), // /api/{apiVersion}/things thingsRoute.buildThingsRoute(ctx, dittoHeaders), // /api/{apiVersion}/search/things thingSearchRoute.buildSearchRoute(ctx, dittoHeaders) ).orElse(customApiSubRoutes); }
/** * Builds the {@code /policies} route. * * @return the {@code /policies} route. */ public Route buildPoliciesRoute(final RequestContext ctx, final DittoHeaders dittoHeaders) { return rawPathPrefix(mergeDoubleSlashes().concat(PATH_POLICIES), () -> rawPathPrefix(mergeDoubleSlashes().concat(PathMatchers.segment()), policyId -> // /policies/<policyId> route( policyEntry(ctx, dittoHeaders, policyId), policyEntryEntries(ctx, dittoHeaders, policyId) ) ) ); }
private Route buildSubRoutes(final RequestContext ctx, final String correlationId) { return route( pathPrefix(THINGS_PATH, () -> // /stats/things route( path(DETAILS_PATH, () -> authenticateDevopsBasic(REALM_DEVOPS, handleDevOpsPerRequest(ctx, RetrieveStatisticsDetails.of( buildDevOpsDittoHeaders(correlationId)))) ), pathEndOrSingleSlash(() -> handleDevOpsPerRequest(ctx, RetrieveStatistics.of( buildDevOpsDittoHeaders(correlationId))) ) ) ), path(SEARCH_PATH, () -> // /stats/search handleSudoCountThingsPerRequest(ctx, SudoCountThings.of( buildDevOpsDittoHeaders(correlationId))) ) ); }
/** * Builds the {@code /status} route. * * @return the {@code /status} route. */ public Route buildStatusRoute() { return pathPrefix(PATH_STATUS, () -> // /status/* get(() -> // GET route( pathEndOrSingleSlash(() -> // /status complete( HttpResponse.create().withStatus(StatusCodes.OK) .withEntity(ContentTypes.APPLICATION_JSON, Status.provideStaticStatus().toString()) ) ), path(PATH_HEALTH, healthRouteSupplier), // /status/health path(PATH_CLUSTER, () -> complete( // /status/cluster HttpResponse.create().withStatus(StatusCodes.OK) .withEntity(ContentTypes.APPLICATION_JSON, clusterStateSupplier.get().toJson().toString())) ) ) ).orElse(complete(StatusCodes.METHOD_NOT_ALLOWED))); }
/** * Builds the {@code /features} route. * * @return the {@code /features} route. */ public Route buildFeaturesRoute(final RequestContext ctx, final DittoHeaders dittoHeaders, final String thingId) { return rawPathPrefix(mergeDoubleSlashes().concat(PATH_PREFIX), () -> Directives.route( features(ctx, dittoHeaders, thingId), featuresEntry(ctx, dittoHeaders, thingId), featuresEntryDefinition(ctx, dittoHeaders, thingId), featuresEntryProperties(ctx, dittoHeaders, thingId), featuresEntryPropertiesEntry(ctx, dittoHeaders, thingId), featuresEntryInboxOutbox(ctx, dittoHeaders, thingId) ) ); }
/** * Builds the {@code /things} route. * * @return the {@code /things} route. */ public Route buildThingsRoute(final RequestContext ctx, final DittoHeaders dittoHeaders) { return rawPathPrefix(mergeDoubleSlashes().concat(PATH_THINGS), () -> route( things(ctx, dittoHeaders), rawPathPrefix(mergeDoubleSlashes().concat(PathMatchers.segment()), thingId -> // /things/<thingId> route( thingsEntry(ctx, dittoHeaders, thingId), thingsEntryPolicyId(ctx, dittoHeaders, thingId), thingsEntryAcl(ctx, dittoHeaders, thingId), thingsEntryAclEntry(ctx, dittoHeaders, thingId), thingsEntryAttributes(ctx, dittoHeaders, thingId), thingsEntryAttributesEntry(ctx, dittoHeaders, thingId), thingsEntryFeatures(ctx, dittoHeaders, thingId), thingsEntryInboxOutbox(ctx, dittoHeaders, thingId) ) ) ) ); }
/** * Builds the {@code /search} route. * * @return the {@code /search}} route. */ public Route buildSearchRoute(final RequestContext ctx, final DittoHeaders dittoHeaders) { return Directives.rawPathPrefix(CustomPathMatchers.mergeDoubleSlashes().concat(PATH_SEARCH), () -> Directives.rawPathPrefix(CustomPathMatchers.mergeDoubleSlashes().concat(PATH_THINGS), () -> // /search/things Directives.route( // /search/things/count path(PATH_COUNT, () -> countThings(ctx, dittoHeaders)), // /search/things pathEndOrSingleSlash(() -> searchThings(ctx, dittoHeaders)) ) ) ); }
/** * Builds the {@code /} route. * * @return the {@code /} route. */ public Route buildRoute() { return wrapWithRootDirectives(correlationId -> extractRequestContext(ctx -> route( statsRoute.buildStatsRoute(correlationId), // /stats cachingHealthRoute.buildHealthRoute(), // /health api(ctx, correlationId), // /api ws(ctx, correlationId), // /ws ownStatusRoute.buildStatusRoute(), // /status overallStatusRoute.buildOverallStatusRoute(), // /overall devopsRoute.buildDevopsRoute(ctx) // /devops ) ) ); }
private Route things(final RequestContext ctx, final DittoHeaders dittoHeaders) { return pathEndOrSingleSlash(() -> route( // get(() -> // GET /things?ids=<idsString>&fields=<fieldsString> buildRetrieveThingsRoute(ctx, dittoHeaders) ), post(() -> // POST /things extractDataBytes(payloadSource -> handlePerRequest(ctx, dittoHeaders, payloadSource, thingJson -> CreateThing.of(createThingForPost(thingJson), createInlinePolicyJson(thingJson), getCopyPolicyFrom(thingJson), dittoHeaders) ) ) ) ) ); }
private Route thingsEntryPolicyEntries(final RequestContext ctx, final DittoHeaders dittoHeaders, final String policyId) { return pathEndOrSingleSlash(() -> Directives.route( get(() -> // GET /entries handlePerRequest(ctx, RetrievePolicyEntries.of(policyId, dittoHeaders)) ), put(() -> // PUT /entries extractDataBytes(payloadSource -> handlePerRequest(ctx, dittoHeaders, payloadSource, policyEntriesJson -> ModifyPolicyEntries.of(policyId, PoliciesModelFactory.newPolicyEntries( policyEntriesJson), dittoHeaders)) ) ) ) ); }
private Route routeLogging(final RequestContext ctx, final String serviceName, final Integer instance, final DittoHeaders dittoHeaders) { return route( get(() -> handlePerRequest(ctx, RetrieveLoggerConfig.ofAllKnownLoggers(serviceName, instance, dittoHeaders), transformResponse(serviceName, instance) ) ), put(() -> extractDataBytes(payloadSource -> handlePerRequest(ctx, dittoHeaders, payloadSource, loggerConfigJson -> ChangeLogLevel.of(serviceName, instance, ImmutableLoggerConfig.fromJson(loggerConfigJson), dittoHeaders), transformResponse(serviceName, instance) ) ) ) ); }
private Route features(final RequestContext ctx, final DittoHeaders dittoHeaders, final String thingId) { return pathEndOrSingleSlash(() -> Directives.route( get(() -> // GET /features?fields=<fieldsString> parameterOptional(ThingsParameter.FIELDS.toString(), fieldsString -> handlePerRequest(ctx, RetrieveFeatures .of(thingId, calculateSelectedFields(fieldsString).orElse( null), dittoHeaders)) ) ), put(() -> // PUT /features extractDataBytes(payloadSource -> handlePerRequest(ctx, dittoHeaders, payloadSource, featuresJson -> ModifyFeatures .of(thingId, ThingsModelFactory.newFeatures( featuresJson), dittoHeaders)) ) ), delete(() -> // DELETE /features handlePerRequest(ctx, DeleteFeatures.of(thingId, dittoHeaders)) ) ) ); }
private Route thingsEntryAcl(final RequestContext ctx, final DittoHeaders dittoHeaders, final String thingId) { return rawPathPrefix(mergeDoubleSlashes().concat(PATH_ACL), () -> // /things/<thingId>/acl pathEndOrSingleSlash(() -> route( get(() -> // GET /things/<thingId>/acl handlePerRequest(ctx, RetrieveAcl.of(thingId, dittoHeaders)) ), put(() -> // PUT /things/<thingId>/acl extractDataBytes(payloadSource -> handlePerRequest(ctx, dittoHeaders, payloadSource, aclJson -> ModifyAcl.of(thingId, ThingsModelFactory.newAcl(aclJson), dittoHeaders)) ) ) ) ) ); }
private Route policyEntry(final RequestContext ctx, final DittoHeaders dittoHeaders, final String policyId) { return pathEndOrSingleSlash(() -> Directives.route( get(() -> // GET /policies/<policyId> handlePerRequest(ctx, RetrievePolicy.of(policyId, dittoHeaders)) ), put(() -> // PUT /policies/<policyId> extractDataBytes(payloadSource -> handlePerRequest(ctx, dittoHeaders, payloadSource, policyJson -> ModifyPolicy .of(policyId, PoliciesModelFactory.newPolicy( createPolicyJsonObjectForPut(policyJson, policyId)), dittoHeaders) ) ) ), delete(() -> // DELETE /policies/<policyId> handlePerRequest(ctx, DeletePolicy.of(policyId, dittoHeaders)) ) ) ); }
/** * @return the {@code /devops} route. */ public Route buildDevopsRoute(final RequestContext ctx) { return rawPathPrefix(mergeDoubleSlashes().concat(PATH_DEVOPS), () -> // /devops authenticateDevopsBasic(REALM_DEVOPS, parameterOptional(Unmarshaller.sync(Long::parseLong), TIMEOUT_PARAMETER, optionalTimeout -> route( rawPathPrefix(mergeDoubleSlashes().concat(PATH_LOGGING), () -> // /devops/logging logging(ctx, createHeaders(optionalTimeout)) ), rawPathPrefix(mergeDoubleSlashes().concat(PATH_PIGGYBACK), () -> // /devops/piggyback piggyback(ctx, createHeaders(optionalTimeout)) ) ) ) )); }