@Override protected final RegistrationResult getResult( final int status, final String contentType, final Buffer payload, final CacheDirective cacheDirective) { if (payload == null) { return RegistrationResult.from(status); } else { try { return RegistrationResult.from(status, new JsonObject(payload), cacheDirective); } catch (final DecodeException e) { LOG.warn("received malformed payload from Device Registration service", e); return RegistrationResult.from(HttpURLConnection.HTTP_INTERNAL_ERROR); } } }
/** * Creates an exception for a registration result. * * @param result The result containing the status code. * @return The exception. * @throws NullPointerException if response is {@code null}. */ public static final ServiceInvocationException from(final RegistrationResult result) { final String detailMessage = Optional.ofNullable(result.getPayload()) .map(payload -> payload.getString(RegistrationConstants.FIELD_ERROR)).orElse(null); return StatusCodeMapper.from(result.getStatus(), detailMessage); }
/** * Creates a new result for a status code and a payload. * * @param status The status code. * @param payload The payload to include in the result. * @param cacheDirective Restrictions regarding the caching of the payload. * @return The result. */ public static RegistrationResult from(final int status, final JsonObject payload, final CacheDirective cacheDirective) { return new RegistrationResult(status, payload, cacheDirective); }
private boolean isDeviceEnabled(final RegistrationResult registrationResult) { return registrationResult.isOk() && isDeviceEnabled(registrationResult.getPayload().getJsonObject(RegistrationConstants.FIELD_DATA)); }
return Future.succeededFuture(RegistrationResult.from(HttpURLConnection.HTTP_NOT_FOUND)); } else if (!isDeviceEnabled(gatewayResult)) { return Future.succeededFuture(RegistrationResult.from(HttpURLConnection.HTTP_FORBIDDEN)); } else { final JsonObject deviceData = deviceResult.getPayload().getJsonObject(RegistrationConstants.FIELD_DATA, new JsonObject()); final JsonObject gatewayData = gatewayResult.getPayload().getJsonObject(RegistrationConstants.FIELD_DATA, new JsonObject()); return Future.succeededFuture(RegistrationResult.from( HttpURLConnection.HTTP_OK, getAssertionPayload(tenantId, deviceId, deviceData), CacheDirective.maxAgeDirective(assertionFactory.getAssertionLifetime()))); } else { return Future.succeededFuture(RegistrationResult.from(HttpURLConnection.HTTP_FORBIDDEN));
private Future<EventBusMessage> processGetRequest(final EventBusMessage request) { final String tenantId = request.getTenant(); final String deviceId = request.getDeviceId(); if (tenantId == null || deviceId == null) { return Future.failedFuture(new ClientErrorException(HttpURLConnection.HTTP_BAD_REQUEST)); } else { log.debug("retrieving device [{}] of tenant [{}]", deviceId, tenantId); final Future<RegistrationResult> result = Future.future(); getDevice(tenantId, deviceId, result.completer()); return result.map(res -> { return request.getResponse(res.getStatus()) .setDeviceId(deviceId) .setJsonPayload(res.getPayload()) .setCacheDirective(res.getCacheDirective()); }); } }
private Future<EventBusMessage> processDeregisterRequest(final EventBusMessage request) { final String tenantId = request.getTenant(); final String deviceId = request.getDeviceId(); if (tenantId == null || deviceId == null) { return Future.failedFuture(new ClientErrorException(HttpURLConnection.HTTP_BAD_REQUEST)); } else { log.debug("deregistering device [{}] of tenant [{}]", deviceId, tenantId); final Future<RegistrationResult> result = Future.future(); removeDevice(tenantId, deviceId, result.completer()); return result.map(res -> { return request.getResponse(res.getStatus()) .setDeviceId(deviceId) .setCacheDirective(res.getCacheDirective()); }); } }
/** * Invokes the <em>Deregister Device</em> operation of Hono's * <a href="https://www.eclipse.org/hono/api/Device-Registration-API">Device Registration API</a> * on the service represented by the <em>sender</em> and <em>receiver</em> links. */ @Override public final Future<Void> deregister(final String deviceId) { Objects.requireNonNull(deviceId); final Future<RegistrationResult> regResultTracker = Future.future(); createAndSendRequest( RegistrationConstants.ACTION_DEREGISTER, createDeviceIdProperties(deviceId), null, regResultTracker.completer()); return regResultTracker.map(response -> { switch(response.getStatus()) { case HttpURLConnection.HTTP_NO_CONTENT: return null; default: throw StatusCodeMapper.from(response); } }); }
/** * {@inheritDoc} * <p> * Subclasses may override this method in order to implement a more sophisticated approach for asserting registration status, e.g. * using cached information etc. * This method requires a functional {@link #getDevice(String, String, Handler) getDevice} method to work. */ @Override public void assertRegistration( final String tenantId, final String deviceId, final Handler<AsyncResult<RegistrationResult>> resultHandler) { Objects.requireNonNull(tenantId); Objects.requireNonNull(deviceId); Objects.requireNonNull(resultHandler); final Future<RegistrationResult> getResultTracker = Future.future(); getDevice(tenantId, deviceId, getResultTracker.completer()); getResultTracker.map(result -> { if (isDeviceEnabled(result)) { return RegistrationResult.from( HttpURLConnection.HTTP_OK, getAssertionPayload(tenantId, deviceId, result.getPayload().getJsonObject(RegistrationConstants.FIELD_DATA)), CacheDirective.maxAgeDirective(assertionFactory.getAssertionLifetime())); } else { return RegistrationResult.from(HttpURLConnection.HTTP_NOT_FOUND); } }).setHandler(resultHandler); }
private Future<EventBusMessage> processGetRequest(final EventBusMessage request) { final String tenantId = request.getTenant(); final String deviceId = request.getDeviceId(); if (tenantId == null || deviceId == null) { return Future.failedFuture(new ClientErrorException(HttpURLConnection.HTTP_BAD_REQUEST)); } else { log.debug("retrieving device [{}] of tenant [{}]", deviceId, tenantId); final Future<RegistrationResult> result = Future.future(); getDevice(tenantId, deviceId, result.completer()); return result.map(res -> { return request.getResponse(res.getStatus()) .setDeviceId(deviceId) .setJsonPayload(res.getPayload()) .setCacheDirective(res.getCacheDirective()); }); } }
private Future<EventBusMessage> processDeregisterRequest(final EventBusMessage request) { final String tenantId = request.getTenant(); final String deviceId = request.getDeviceId(); if (tenantId == null || deviceId == null) { return Future.failedFuture(new ClientErrorException(HttpURLConnection.HTTP_BAD_REQUEST)); } else { log.debug("deregistering device [{}] of tenant [{}]", deviceId, tenantId); final Future<RegistrationResult> result = Future.future(); removeDevice(tenantId, deviceId, result.completer()); return result.map(res -> { return request.getResponse(res.getStatus()) .setDeviceId(deviceId) .setCacheDirective(res.getCacheDirective()); }); } }
/** * Invokes the <em>Update Device Registration</em> operation of Hono's * <a href="https://www.eclipse.org/hono/api/Device-Registration-API">Device Registration API</a> * on the service represented by the <em>sender</em> and <em>receiver</em> links. */ @Override public final Future<Void> update(final String deviceId, final JsonObject data) { Objects.requireNonNull(deviceId); final Future<RegistrationResult> regResultTracker = Future.future(); createAndSendRequest( RegistrationConstants.ACTION_UPDATE, createDeviceIdProperties(deviceId), data != null ? data.toBuffer() : null, regResultTracker.completer()); return regResultTracker.map(response -> { switch(response.getStatus()) { case HttpURLConnection.HTTP_NO_CONTENT: return null; default: throw StatusCodeMapper.from(response); } }); }
private boolean isDeviceEnabled(final RegistrationResult registrationResult) { return registrationResult.isOk() && isDeviceEnabled(registrationResult.getPayload().getJsonObject(RegistrationConstants.FIELD_DATA)); }
/** * Invokes the <em>Get Registration Information</em> operation of Hono's * <a href="https://www.eclipse.org/hono/api/Device-Registration-API">Device Registration API</a> * on the service represented by the <em>sender</em> and <em>receiver</em> links. */ @Override public final Future<JsonObject> get(final String deviceId) { Objects.requireNonNull(deviceId); final Future<RegistrationResult> resultTracker = Future.future(); createAndSendRequest( RegistrationConstants.ACTION_GET, createDeviceIdProperties(deviceId), null, resultTracker.completer()); return resultTracker.map(regResult -> { switch (regResult.getStatus()) { case HttpURLConnection.HTTP_OK: return regResult.getPayload(); default: throw StatusCodeMapper.from(regResult); } }); }
/** * Handles an unimplemented operation by failing the given handler * with a {@link ClientErrorException} having a <em>501 Not Implemented</em> status code. * * @param resultHandler The handler. */ protected void handleUnimplementedOperation(final Handler<AsyncResult<RegistrationResult>> resultHandler) { resultHandler.handle(Future.succeededFuture(RegistrationResult.from(HttpURLConnection.HTTP_NOT_IMPLEMENTED))); }
return RegistrationResult.from( HttpURLConnection.HTTP_OK, getAssertionPayload(tenantId, deviceId, result.getPayload().getJsonObject(RegistrationConstants.FIELD_DATA)), CacheDirective.maxAgeDirective(assertionFactory.getAssertionLifetime())); } else { TracingHelper.logError(span, "device not enabled"); return RegistrationResult.from(HttpURLConnection.HTTP_NOT_FOUND);
private Future<EventBusMessage> processAssertRequest(final EventBusMessage request) { final String tenantId = request.getTenant(); final String deviceId = request.getDeviceId(); final String gatewayId = request.getGatewayId(); if (tenantId == null || deviceId == null) { return Future.failedFuture(new ClientErrorException(HttpURLConnection.HTTP_BAD_REQUEST)); } else if (gatewayId == null) { log.debug("asserting registration of device [{}] with tenant [{}]", deviceId, tenantId); final Future<RegistrationResult> result = Future.future(); assertRegistration(tenantId, deviceId, result.completer()); return result.map(res -> { return request.getResponse(res.getStatus()) .setDeviceId(deviceId) .setJsonPayload(res.getPayload()) .setCacheDirective(res.getCacheDirective()); }); } else { log.debug("asserting registration of device [{}] with tenant [{}] for gateway [{}]", deviceId, tenantId, gatewayId); final Future<RegistrationResult> result = Future.future(); assertRegistration(tenantId, deviceId, gatewayId, result.completer()); return result.map(res -> { return request.getResponse(res.getStatus()) .setDeviceId(deviceId) .setJsonPayload(res.getPayload()) .setCacheDirective(res.getCacheDirective()); }); } }
private Future<EventBusMessage> processUpdateRequest(final EventBusMessage request) { final String tenantId = request.getTenant(); final String deviceId = request.getDeviceId(); final JsonObject payload = getRequestPayload(request.getJsonPayload()); if (tenantId == null || deviceId == null) { return Future.failedFuture(new ClientErrorException(HttpURLConnection.HTTP_BAD_REQUEST)); } else { log.debug("updating registration information for device [{}] of tenant [{}]", deviceId, tenantId); final Future<RegistrationResult> result = Future.future(); updateDevice(tenantId, deviceId, payload, result.completer()); return result.map(res -> { return request.getResponse(res.getStatus()) .setDeviceId(deviceId) .setCacheDirective(res.getCacheDirective()); }); } }
/** * Invokes the <em>Register Device</em> operation of Hono's * <a href="https://www.eclipse.org/hono/api/Device-Registration-API">Device Registration API</a> * on the service represented by the <em>sender</em> and <em>receiver</em> links. */ @Override public final Future<Void> register(final String deviceId, final JsonObject data) { Objects.requireNonNull(deviceId); final Future<RegistrationResult> regResultTracker = Future.future(); createAndSendRequest( RegistrationConstants.ACTION_REGISTER, createDeviceIdProperties(deviceId), data != null ? data.toBuffer() : null, regResultTracker.completer()); return regResultTracker.map(response -> { switch(response.getStatus()) { case HttpURLConnection.HTTP_CREATED: return null; default: throw StatusCodeMapper.from(response); } }); }
/** * Creates a new result for a status code and a payload. * * @param status The status code. * @param payload The payload to include in the result. * @return The result. */ public static RegistrationResult from(final int status, final JsonObject payload) { return new RegistrationResult(status, payload, null); }