Skip to content

Commit

Permalink
eclipse-ditto#60: extend HTTP API with Feature Definition routes
Browse files Browse the repository at this point in the history
Signed-off-by: Thomas Jaeckle <thomas.jaeckle@bosch-si.com>
  • Loading branch information
thjaeckle committed Jan 16, 2018
1 parent 3840aee commit 89d59a3
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,20 @@ public static FeatureDefinition newFeatureDefinition(final JsonArray jsonArray)
}
}

/**
* Returns a new immutable {@link FeatureDefinition} which is initialised with the values of the given JSON string.
* This string is required to be a valid {@link JsonArray}.
*
* @param jsonString provides the initial values of the result;
* @return the new immutable initialised {@code FeatureDefinition}.
* @throws DittoJsonException if {@code jsonString} cannot be parsed to {@code FeatureDefinition}.
*/
public static FeatureDefinition newFeatureDefinition(final String jsonString) {
final JsonArray jsonArray =
DittoJsonException.wrapJsonRuntimeException(() -> JsonFactory.newArray(jsonString));
return newFeatureDefinition(jsonArray);
}

/**
* Returns a new immutable empty {@link FeatureProperties}.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,17 @@
import org.eclipse.ditto.services.gateway.endpoints.routes.AbstractRoute;
import org.eclipse.ditto.services.gateway.endpoints.utils.UriEncoding;
import org.eclipse.ditto.signals.commands.things.modify.DeleteFeature;
import org.eclipse.ditto.signals.commands.things.modify.DeleteFeatureDefinition;
import org.eclipse.ditto.signals.commands.things.modify.DeleteFeatureProperties;
import org.eclipse.ditto.signals.commands.things.modify.DeleteFeatureProperty;
import org.eclipse.ditto.signals.commands.things.modify.DeleteFeatures;
import org.eclipse.ditto.signals.commands.things.modify.ModifyFeature;
import org.eclipse.ditto.signals.commands.things.modify.ModifyFeatureDefinition;
import org.eclipse.ditto.signals.commands.things.modify.ModifyFeatureProperties;
import org.eclipse.ditto.signals.commands.things.modify.ModifyFeatureProperty;
import org.eclipse.ditto.signals.commands.things.modify.ModifyFeatures;
import org.eclipse.ditto.signals.commands.things.query.RetrieveFeature;
import org.eclipse.ditto.signals.commands.things.query.RetrieveFeatureDefinition;
import org.eclipse.ditto.signals.commands.things.query.RetrieveFeatureProperties;
import org.eclipse.ditto.signals.commands.things.query.RetrieveFeatureProperty;
import org.eclipse.ditto.signals.commands.things.query.RetrieveFeatures;
Expand All @@ -56,6 +59,7 @@ final class FeaturesRoute extends AbstractRoute {

static final String PATH_PREFIX = "features";
static final String PATH_PROPERTIES = "properties";
static final String PATH_DEFINITION = "definition";

private final MessagesRoute messagesRoute;

Expand Down Expand Up @@ -95,6 +99,7 @@ public Route buildFeaturesRoute(final RequestContext ctx, final DittoHeaders dit
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)
Expand Down Expand Up @@ -174,6 +179,42 @@ private Route featuresEntry(final RequestContext ctx, final DittoHeaders dittoHe
);
}

/*
* Describes {@code /features/<featureId>/definition} route.
*
* @return {@code /features/<featureId>/definition} 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))
)
)
)
)
);
}

/*
* Describes {@code /features/<featureId>/properties} route.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import org.eclipse.ditto.json.JsonValue;
import org.eclipse.ditto.model.base.headers.DittoHeaders;
import org.eclipse.ditto.model.things.Feature;
import org.eclipse.ditto.model.things.FeatureDefinition;
import org.eclipse.ditto.model.things.FeatureProperties;
import org.eclipse.ditto.model.things.Features;
import org.eclipse.ditto.model.things.ThingsModelFactory;
Expand All @@ -42,6 +43,8 @@ public final class FeaturesRouteTest extends EndpointTestBase {

private static final String FEATURES_PATH = "/" + FeaturesRoute.PATH_PREFIX;
private static final String FEATURE_ENTRY_PATH = FEATURES_PATH + "/" + EndpointTestConstants.KNOWN_FEATURE_ID;
private static final String FEATURE_ENTRY_DEFINITION_PATH =
FEATURE_ENTRY_PATH + "/" + FeaturesRoute.PATH_DEFINITION;
private static final String FEATURE_ENTRY_PROPERTIES_PATH =
FEATURE_ENTRY_PATH + "/" + FeaturesRoute.PATH_PROPERTIES;
private static final String FEATURE_ENTRY_PROPERTIES_ENTRY_PATH = FEATURE_ENTRY_PROPERTIES_PATH + "/" +
Expand Down Expand Up @@ -131,6 +134,33 @@ public void postFeatureEntryReturnsMethodNotAllowed() {
result.assertStatusCode(StatusCodes.METHOD_NOT_ALLOWED);
}

@Test
public void getFeatureEntryDefinition() {
final TestRouteResult result = underTest.run(HttpRequest.GET(FEATURE_ENTRY_DEFINITION_PATH));
result.assertStatusCode(EndpointTestConstants.DUMMY_COMMAND_SUCCESS);
}

@Test
public void putFeatureEntryDefinition() {
final FeatureDefinition featureDefinition = ThingsModelFactory.newFeatureDefinitionBuilder().build();
final TestRouteResult result =
underTest.run(HttpRequest.PUT(FEATURE_ENTRY_DEFINITION_PATH).withEntity(featureDefinition
.toJsonString()));
result.assertStatusCode(EndpointTestConstants.DUMMY_COMMAND_SUCCESS);
}

@Test
public void deleteFeatureEntryDefinition() {
final TestRouteResult result = underTest.run(HttpRequest.DELETE(FEATURE_ENTRY_DEFINITION_PATH));
result.assertStatusCode(EndpointTestConstants.DUMMY_COMMAND_SUCCESS);
}

@Test
public void postFeatureEntryDefinitionReturnsMethodNotAllowed() {
final TestRouteResult result = underTest.run(HttpRequest.POST(FEATURE_ENTRY_DEFINITION_PATH));
result.assertStatusCode(StatusCodes.METHOD_NOT_ALLOWED);
}

@Test
public void getFeatureEntryProperties() {
final TestRouteResult result = underTest.run(HttpRequest.GET(FEATURE_ENTRY_PROPERTIES_PATH));
Expand Down

0 comments on commit 89d59a3

Please sign in to comment.