/** * Describes {@code /things} SSE route. * * @return {@code /things} SSE route. */ @SuppressWarnings("squid:S1172") // allow unused ctx-Param in order to have a consistent route-"interface" public Route buildThingsSseRoute(final RequestContext ctx, final Supplier<DittoHeaders> dittoHeadersSupplier) { return rawPathPrefix(mergeDoubleSlashes().concat(PATH_THINGS), () -> pathEndOrSingleSlash(() -> get(() -> headerValuePF(AcceptHeaderExtractor.INSTANCE, accept -> doBuildThingsSseRoute(dittoHeadersSupplier.get()) ) ) ) ); }
/** * 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 /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 /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)) ) ) ); }
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 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 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)) ) ) ) ) ); }
/** * Builds the {@code /status} route. * * @return the {@code /status} route. */ public Route buildOverallStatusRoute() { return rawPathPrefix(mergeDoubleSlashes().concat(PATH_OVERALL), () -> // /overall/* authenticateDevopsBasic(REALM_DEVOPS, get(() -> // GET // /overall/status // /overall/status/health // /overall/status/cluster rawPathPrefix(mergeDoubleSlashes().concat(PATH_STATUS), () -> route( // /status pathEndOrSingleSlash( () -> completeWithFuture(createOverallStatusResponse())), // /status/health path(PATH_HEALTH, () -> completeWithFuture(createOverallHealthResponse())), path(PATH_CLUSTER, () -> complete( // /status/cluster HttpResponse.create().withStatus(StatusCodes.OK) .withEntity(ContentTypes.APPLICATION_JSON, clusterStateSupplier.get().toJson().toString())) ) )) ))); }
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)) ) ) ); }
private Route thingsEntryAttributes(final RequestContext ctx, final DittoHeaders dittoHeaders, final String thingId) { return rawPathPrefix(mergeDoubleSlashes().concat(PATH_ATTRIBUTES), () -> pathEndOrSingleSlash(() -> route( get(() -> // GET /things/<thingId>/attributes?fields=<fieldsString> parameterOptional(ThingsParameter.FIELDS.toString(), fieldsString -> handlePerRequest(ctx, RetrieveAttributes .of(thingId, calculateSelectedFields(fieldsString).orElse( null), dittoHeaders)) ) ), put(() -> // PUT /things/<thingId>/attributes extractDataBytes(payloadSource -> handlePerRequest(ctx, dittoHeaders, payloadSource, attributesJson -> ModifyAttributes.of(thingId, ThingsModelFactory.newAttributes( attributesJson), dittoHeaders)) ) ), delete(() -> // DELETE /things/<thingId>/attributes handlePerRequest(ctx, DeleteAttributes.of(thingId, dittoHeaders)) ) ) ) ); }
private Route claimMessages(final RequestContext ctx, final DittoHeaders dittoHeaders, final String thingId) { return rawPathPrefix(mergeDoubleSlashes().concat(PATH_INBOX), () -> // /inbox rawPathPrefix(mergeDoubleSlashes().concat(PATH_CLAIM), () -> // /inbox/claim post(() -> pathEndOrSingleSlash(() -> parameterOptional(Unmarshaller.sync(Long::parseLong), TIMEOUT_PARAMETER, optionalTimeout -> withCustomRequestTimeout(optionalTimeout, this::checkClaimTimeout, defaultClaimTimeout, timeout -> extractDataBytes(payloadSource -> handleMessage(ctx, payloadSource, buildSendClaimMessage( ctx, dittoHeaders, thingId, timeout ) ) ) ) ) ) ) ) ); }
private Route thingsEntry(final RequestContext ctx, final DittoHeaders dittoHeaders, final String thingId) { return pathEndOrSingleSlash(() -> route( get(() -> // GET /things/things/<thingId>?fields=<fieldsString> parameterOptional(ThingsParameter.FIELDS.toString(), fieldsString -> handlePerRequest(ctx, RetrieveThing.getBuilder(thingId, dittoHeaders) .withSelectedFields(calculateSelectedFields(fieldsString).orElse(null)) .build()) ) ), put(() -> // PUT /things/things/<thingId> extractDataBytes(payloadSource -> handlePerRequest(ctx, dittoHeaders, payloadSource, thingJson -> ModifyThing.of(thingId, ThingsModelFactory.newThing( createThingJsonObjectForPut(thingJson, thingId)), createInlinePolicyJson(thingJson), getCopyPolicyFrom(thingJson), dittoHeaders)) ) ), delete(() -> // DELETE /things/things/<thingId> handlePerRequest(ctx, DeleteThing.of(thingId, dittoHeaders)) ) ) ); }
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))) ) ); }
private Route featuresEntry(final RequestContext ctx, final DittoHeaders dittoHeaders, final String thingId) { return rawPathPrefix(mergeDoubleSlashes().concat(PathMatchers.segment()), featureId -> pathEndOrSingleSlash(() -> route(
private Route featuresEntryDefinition(final RequestContext ctx, final DittoHeaders dittoHeaders, final String thingId) { return rawPathPrefix(mergeDoubleSlashes().concat(PathMatchers.segment()), featureId -> rawPathPrefix(mergeDoubleSlashes().concat(PATH_DEFINITION), () -> pathEndOrSingleSlash(() -> route( get(() -> // GET /features/{featureId}/definition handlePerRequest(ctx, RetrieveFeatureDefinition.of(thingId, featureId, dittoHeaders)) ), put(() -> // PUT /features/{featureId}/definition extractDataBytes(payloadSource -> handlePerRequest(ctx, dittoHeaders, payloadSource, definitionJson -> ModifyFeatureDefinition.of(thingId, featureId, ThingsModelFactory. newFeatureDefinition( definitionJson), dittoHeaders)) ) ), delete(() -> // DELETE /features/{featureId}/definition handlePerRequest(ctx, DeleteFeatureDefinition.of(thingId, featureId, dittoHeaders)) ) ) ) ) ); }
private Route thingsEntryPolicyEntry(final RequestContext ctx, final DittoHeaders dittoHeaders, final String policyId) { return rawPathPrefix(mergeDoubleSlashes().concat(PathMatchers.segment()), label -> pathEndOrSingleSlash(() -> route( get(() -> // GET /entries/<label> handlePerRequest(ctx, RetrievePolicyEntry.of(policyId, Label.of(label), dittoHeaders)) ), put(() -> // PUT /entries/<label> extractDataBytes(payloadSource -> handlePerRequest(ctx, dittoHeaders, payloadSource, policyEntryJson -> ModifyPolicyEntry .of(policyId, createPolicyEntryForPut(policyEntryJson, label), dittoHeaders)) ) ), delete(() -> // DELETE /entries/<label> handlePerRequest(ctx, DeletePolicyEntry.of(policyId, Label.of(label), dittoHeaders))) ) ) ); }
private Route thingsEntryPolicyEntrySubjects(final RequestContext ctx, final DittoHeaders dittoHeaders, final String policyId) { return rawPathPrefix(mergeDoubleSlashes().concat(PathMatchers.segment()), label -> rawPathPrefix(mergeDoubleSlashes().concat(PATH_SUFFIX_SUBJECTS), () -> pathEndOrSingleSlash(() -> route( get(() -> // GET /entries/<label>/subjects handlePerRequest(ctx, RetrieveSubjects.of(policyId, Label.of(label), dittoHeaders)) ), put(() -> // PUT /entries/<label>/subjects extractDataBytes(payloadSource -> handlePerRequest(ctx, dittoHeaders, payloadSource, subjectsJson -> ModifySubjects.of(policyId, Label.of(label), PoliciesModelFactory.newSubjects( JsonFactory.newObject( subjectsJson)), dittoHeaders))) ) ) ) ) ); }
return rawPathPrefix(mergeDoubleSlashes().concat(PATH_ACL), () -> rawPathPrefix(mergeDoubleSlashes().concat(PathMatchers.segment()), subject -> pathEndOrSingleSlash(() -> route(
private Route thingsEntryPolicyEntryResources(final RequestContext ctx, final DittoHeaders dittoHeaders, final String policyId) { return rawPathPrefix(mergeDoubleSlashes().concat(PathMatchers.segment()), label -> rawPathPrefix(mergeDoubleSlashes().concat(PATH_SUFFIX_RESOURCES), () -> pathEndOrSingleSlash(() -> route( get(() -> // GET /entries/<label>/resources handlePerRequest(ctx, RetrieveResources.of(policyId, Label.of(label), dittoHeaders)) ), put(() -> // PUT /entries/<label>/resources extractDataBytes(payloadSource -> handlePerRequest(ctx, dittoHeaders, payloadSource, policyEntryResourcesJson -> ModifyResources.of(policyId, Label.of( label), PoliciesModelFactory.newResources( JsonFactory.newObject( policyEntryResourcesJson)), dittoHeaders))) ) ) ) ) ); }