/** * Creates an exception for a generic result of a service invocation. * * @param result The result containing the status code. * @param <T> The type of the payload contained in the result. * @return The exception. * @throws NullPointerException if response is {@code null}. */ public static final <T> ServiceInvocationException from(final RequestResponseResult<T> result) { return StatusCodeMapper.from(result.getStatus(), null); }
/** * 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); }
/** * {@inheritDoc} * <p> * This method uses the {@linkplain #createMessageId() message ID} to correlate the response received * from a device with the request. */ @Override public Future<BufferResult> sendCommand(final String command, final String contentType, final Buffer data, final Map<String, Object> properties) { Objects.requireNonNull(command); final Future<BufferResult> responseTracker = Future.future(); createAndSendRequest(command, properties, data, contentType, responseTracker, null); return responseTracker.map(response -> { if (response.isOk()) { return response; } else { throw StatusCodeMapper.from(response); } }); }
/** * Invokes the <em>Get Credentials</em> operation of Hono's * <a href="https://www.eclipse.org/hono/api/Credentials-API">Credentials API</a> * on the service represented by the <em>sender</em> and <em>receiver</em> links. */ @Override public final Future<CredentialsObject> get(final String type, final String authId, final JsonObject clientContext) { Objects.requireNonNull(type); Objects.requireNonNull(authId); final Future<CredentialsResult<CredentialsObject>> responseTracker = Future.future(); final JsonObject specification = new JsonObject() .put(CredentialsConstants.FIELD_TYPE, type) .put(CredentialsConstants.FIELD_AUTH_ID, authId) .mergeIn(clientContext); createAndSendRequest(CredentialsConstants.CredentialsAction.get.toString(), specification.toBuffer(), responseTracker.completer()); return responseTracker.map(response -> { switch(response.getStatus()) { case HttpURLConnection.HTTP_OK: return response.getPayload(); case HttpURLConnection.HTTP_NOT_FOUND: throw new ClientErrorException(response.getStatus(), "no such credentials"); default: throw StatusCodeMapper.from(response); } }); } }
/** * 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); } }); }
/** * 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); } }); }
/** * 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); } }); }
/** * 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); } }); }
LOG.debug("service did not accept request [target address: {}, subject: {}, correlation ID: {}]: {}", targetAddress, request.getSubject(), correlationId, rejected.getError()); failedResult.fail(StatusCodeMapper.from(rejected.getError())); cancelRequest(correlationId, failedResult); } else {
} else { LOG.debug("opening receiver [{}] failed: {} - {}", sourceAddress, error.getCondition(), error.getDescription()); result.tryFail(StatusCodeMapper.from(error));
} else { LOG.debug("opening sender [{}] failed: {} - {}", targetAddress, error.getCondition(), error.getDescription()); result.tryFail(StatusCodeMapper.from(error));
"gateway unknown, disabled or not authorized to act on behalf of device"); default: throw StatusCodeMapper.from(result);
protected Future<Void> addTenant(final String tenantId, final JsonObject payload) { final Future<TenantResult<JsonObject>> result = Future.future(); getCompleteTenantService().add(tenantId, payload, result.completer()); return result.map(response -> { if (response.getStatus() == HttpURLConnection.HTTP_CREATED) { return null; } else { throw StatusCodeMapper.from(response); } }); }
private <T> Future<TenantObject> get( final TriTuple<TenantAction, T, Object> key, final Supplier<JsonObject> payloadSupplier, final Span currentSpan) { TracingHelper.TAG_CACHE_HIT.set(currentSpan, true); return getResponseFromCache(key).recover(cacheMiss -> { TracingHelper.TAG_CACHE_HIT.set(currentSpan, false); final Future<TenantResult<TenantObject>> tenantResult = Future.future(); createAndSendRequest( TenantConstants.TenantAction.get.toString(), customizeRequestApplicationProperties(), payloadSupplier.get().toBuffer(), RegistrationConstants.CONTENT_TYPE_APPLICATION_JSON, tenantResult.completer(), key, currentSpan); return tenantResult; }).map(tenantResult -> { switch(tenantResult.getStatus()) { case HttpURLConnection.HTTP_OK: return tenantResult.getPayload(); case HttpURLConnection.HTTP_NOT_FOUND: throw new ClientErrorException(tenantResult.getStatus(), "no such tenant"); default: throw StatusCodeMapper.from(tenantResult); } }); }