org.eclipse.hono.util.CredentialsConstants.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.hono.util.CredentialsConstants.java

Source

/**
 * Copyright (c) 2017 Bosch Software Innovations GmbH.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Bosch Software Innovations GmbH - initial creation
 */
package org.eclipse.hono.util;

import io.vertx.core.json.JsonObject;
import io.vertx.proton.ProtonHelper;
import org.apache.qpid.proton.amqp.Symbol;
import org.apache.qpid.proton.amqp.messaging.AmqpValue;
import org.apache.qpid.proton.amqp.messaging.ApplicationProperties;
import org.apache.qpid.proton.amqp.messaging.MessageAnnotations;
import org.apache.qpid.proton.message.Message;

import java.util.*;

import static org.eclipse.hono.util.MessageHelper.*;

/**
 * Constants & utility methods used throughout the Credentials API.
 */

public final class CredentialsConstants {
    /* registration actions */
    public static final String OPERATION_GET = "get";
    public static final String OPERATION_ADD = "add";
    public static final String OPERATION_UPDATE = "update";
    public static final String OPERATION_REMOVE = "remove";

    /* message payload fields */
    public static final String FIELD_PAYLOAD = "payload";
    public static final String FIELD_ENABLED = "enabled";
    public static final String FIELD_TYPE = "type";
    public static final String FIELD_AUTH_ID = "auth-id";
    public static final String FIELD_DEVICE_ID = "device-id";
    public static final String FIELD_SECRETS = "secrets";

    /* secrets fields */
    public static final String FIELD_SECRETS_PWD_HASH = "pwd-hash";
    public static final String FIELD_SECRETS_SALT = "salt";
    public static final String FIELD_SECRETS_HASH_FUNCTION = "hash-function";
    public static final String FIELD_SECRETS_NOT_BEFORE = "not-before";
    public static final String FIELD_SECRETS_NOT_AFTER = "not-after";

    public static final String CREDENTIALS_ENDPOINT = "credentials";

    private static final List<String> OPERATIONS = Arrays.asList(OPERATION_GET, OPERATION_ADD, OPERATION_UPDATE,
            OPERATION_REMOVE);

    /**
     * The vert.x event bus address to which inbound credentials messages are published.
     */
    public static final String EVENT_BUS_ADDRESS_CREDENTIALS_IN = "credentials.in";

    private CredentialsConstants() {
        // prevent instantiation
    }

    public static JsonObject getCredentialsMsg(final Message message) {
        Objects.requireNonNull(message);
        final String subject = message.getSubject();
        final String tenantId = MessageHelper.getTenantIdAnnotation(message);
        final JsonObject payload = MessageHelper.getJsonPayload(message);
        return getCredentialsJson(subject, tenantId, payload);
    }

    public static JsonObject getCredentialsJson(final String subject, String tenantId, final JsonObject payload) {
        final JsonObject msg = new JsonObject();
        msg.put(MessageHelper.SYS_PROPERTY_SUBJECT, subject);
        msg.put(MessageHelper.APP_PROPERTY_TENANT_ID, tenantId);
        if (payload != null) {
            msg.put(FIELD_PAYLOAD, payload);
        }
        return msg;
    }

    public static JsonObject getReply(final String tenantId, final String deviceId,
            final CredentialsResult result) {
        return getReply(result.getStatus(), tenantId, deviceId, result.getPayload());
    }

    public static JsonObject getReply(final int status, final String tenantId, final String deviceId,
            final JsonObject payload) {
        final JsonObject jsonObject = new JsonObject();
        jsonObject.put(MessageHelper.APP_PROPERTY_TENANT_ID, tenantId);
        if (deviceId != null) {
            jsonObject.put(MessageHelper.APP_PROPERTY_DEVICE_ID, deviceId);
        }
        jsonObject.put(MessageHelper.APP_PROPERTY_STATUS, Integer.toString(status));
        if (payload != null) {
            jsonObject.put(FIELD_PAYLOAD, payload);
        }
        return jsonObject;
    }

    // called from onLinkAttach in sender role
    public static Message getAmqpReply(final io.vertx.core.eventbus.Message<JsonObject> message) {
        final String tenantId = message.body().getString(MessageHelper.APP_PROPERTY_TENANT_ID);
        final String deviceId = message.body().getString(MessageHelper.APP_PROPERTY_DEVICE_ID);
        final String status = message.body().getString(MessageHelper.APP_PROPERTY_STATUS);
        final JsonObject correlationIdJson = message.body()
                .getJsonObject(MessageHelper.SYS_PROPERTY_CORRELATION_ID);
        final Object correlationId = decodeIdFromJson(correlationIdJson);
        final boolean isApplCorrelationId = message.body()
                .getBoolean(MessageHelper.ANNOTATION_X_OPT_APP_CORRELATION_ID, false);
        return getAmqpReply(status, correlationId, tenantId, deviceId, isApplCorrelationId,
                message.body().getJsonObject(FIELD_PAYLOAD));
    }

    public static Message getAmqpReply(final String status, final Object correlationId, final String tenantId,
            final String deviceId, final boolean isApplCorrelationId, final JsonObject payload) {

        final ResourceIdentifier address = ResourceIdentifier.from(CredentialsConstants.CREDENTIALS_ENDPOINT,
                tenantId, deviceId);
        final Message message = ProtonHelper.message();
        message.setMessageId(UUID.randomUUID().toString());
        message.setCorrelationId(correlationId);
        message.setAddress(address.toString());

        final Map<String, Object> map = new HashMap<>();
        map.put(MessageHelper.APP_PROPERTY_DEVICE_ID, deviceId);
        map.put(MessageHelper.APP_PROPERTY_TENANT_ID, tenantId);
        map.put(MessageHelper.APP_PROPERTY_STATUS, status);
        message.setApplicationProperties(new ApplicationProperties(map));

        if (isApplCorrelationId) {
            Map<Symbol, Object> annotations = new HashMap<>();
            annotations.put(Symbol.valueOf(MessageHelper.ANNOTATION_X_OPT_APP_CORRELATION_ID), isApplCorrelationId);
            message.setMessageAnnotations(new MessageAnnotations(annotations));
        }

        if (payload != null) {
            message.setContentType("application/json; charset=utf-8");
            message.setBody(new AmqpValue(payload.encode()));
        }
        return message;
    }

    public static boolean isValidSubject(final String subject) {
        if (subject == null) {
            return false;
        } else {
            return OPERATIONS.contains(subject);
        }
    }

}