com.evrythng.java.wrapper.service.ActionService.java Source code

Java tutorial

Introduction

Here is the source code for com.evrythng.java.wrapper.service.ActionService.java

Source

/*
 * (c) Copyright Reserved EVRYTHNG Limited 2016. All rights reserved.
 * Use of this material is subject to license.
 * Copying and unauthorised use of this material strictly prohibited.
 */
package com.evrythng.java.wrapper.service;

import com.evrythng.commons.domain.SortOrder;
import com.evrythng.java.wrapper.ApiManager;
import com.evrythng.java.wrapper.core.EvrythngApiBuilder.Builder;
import com.evrythng.java.wrapper.core.EvrythngServiceBase;
import com.evrythng.java.wrapper.exception.EvrythngClientException;
import com.evrythng.java.wrapper.mapping.ActionDeserializer;
import com.evrythng.java.wrapper.mapping.EvrythngJacksonModule;
import com.evrythng.thng.resource.model.store.action.Action;
import com.evrythng.thng.resource.model.store.action.ActionType;
import com.evrythng.thng.resource.model.store.action.Actions;
import com.evrythng.thng.resource.model.store.action.CustomAction;
import com.fasterxml.jackson.core.type.TypeReference;
import org.pcollections.PVector;

import java.util.Iterator;
import java.util.List;

/**
 * Service wrapper for the {@code /actions} endpoint of the EVRYTHNG API.
 */
public class ActionService extends EvrythngServiceBase {

    private static final TypeReference<List<Action>> ACTIONS_TYPE_REFERENCE = new TypeReference<List<Action>>() {
    };

    public static final String PATH_ACTIONS = "/actions";
    public static final String PATH_ALL_ACTIONS = PATH_ACTIONS + "/all";
    public static final String PATH_ALL_ACTION = PATH_ALL_ACTIONS + "/%s";
    public static final String PATH_TYPED_ACTIONS = PATH_ACTIONS + "/%s";
    public static final String PATH_TYPED_ACTION = PATH_TYPED_ACTIONS + "/%s";
    protected ActionDeserializer deserializer;

    /**
     * @param apiManager {@link ApiManager} instance
     */
    public ActionService(final ApiManager apiManager, final EvrythngJacksonModule evrythngJacksonModule) {

        super(apiManager);
        deserializer = evrythngJacksonModule.getActionDeserializer();
    }

    /**
     * Gets the custom types and the built-in action types.
     */
    public Builder<List<ActionType>> actionTypesReader() throws EvrythngClientException {

        return get(PATH_ACTIONS, new TypeReference<List<ActionType>>() {

        });
    }

    /**
     * Creates an action type.
     */
    public Builder<ActionType> actionTypeCreator(final ActionType type) throws EvrythngClientException {

        return post(PATH_ACTIONS, type, new TypeReference<ActionType>() {

        });
    }

    /**
     * Deletes an action type and all actions of this type.
     */
    public Builder<Boolean> actionTypeDeleter(final String type) throws EvrythngClientException {

        return delete(String.format(PATH_TYPED_ACTIONS, type));
    }

    /**
     * Creates an action.
     */
    public <T extends Action> Builder<T> actionCreator(final T action) throws EvrythngClientException {

        return (Builder<T>) post(String.format(PATH_TYPED_ACTIONS, action.getType()), action,
                new TypeReference<Action>() {

                });
    }

    /**
     * Creates an action.
     */
    public Builder<Actions> actionsCreator(final Actions actions) throws EvrythngClientException {

        return post(PATH_ALL_ACTIONS, actions, new TypeReference<Actions>() {

        });
    }

    /**
     * Gets all the actions.
     * @deprecated use {@link #iterator()} instead.
     */
    public Builder<List<Action>> actionsReader() throws EvrythngClientException {

        return get(PATH_ALL_ACTIONS, ACTIONS_TYPE_REFERENCE);
    }

    /**
     * Gets all the action of a type.
     */
    @SuppressWarnings("unchecked")
    public <T extends Action> Builder<List<T>> actionsReader(final Class<T> actionClass)
            throws EvrythngClientException {

        String type = getType(actionClass);
        return (Builder<List<T>>) (Builder<?>) get(String.format(PATH_TYPED_ACTIONS, type), ACTIONS_TYPE_REFERENCE);
    }

    /**
     * Gets all the action of a type.
     * @deprecated use {@link #iterator(String)} instead.
     */
    public Builder<List<CustomAction>> actionsReader(final String customType) throws EvrythngClientException {

        checkCustomType(customType);
        return get(String.format(PATH_TYPED_ACTIONS, customType), new TypeReference<List<CustomAction>>() {

        });
    }

    /**
     * Gets one action by id.
     */
    public Builder<Action> actionReader(final String id) throws EvrythngClientException {

        return get(String.format(PATH_ALL_ACTION, id), new TypeReference<Action>() {

        });
    }

    /**
     * Gets one action by id and type.
     */
    @SuppressWarnings("unchecked")
    public <T extends Action> Builder<T> actionReader(final Class<T> actionClass, final String id)
            throws EvrythngClientException {

        String type = getType(actionClass);
        return (Builder<T>) get(String.format(PATH_TYPED_ACTION, type, id), new TypeReference<Action>() {

        });
    }

    /**
     * Gets one action by id and type.
     */
    public Builder<CustomAction> actionReader(final String customType, final String id)
            throws EvrythngClientException {

        checkCustomType(customType);
        return get(String.format(PATH_TYPED_ACTION, customType, id), new TypeReference<CustomAction>() {

        });
    }

    /**
     * Deletes one action by id and type.
     */
    public <T extends Action> Builder<Boolean> actionDeleter(final Class<T> actionClass, final String id)
            throws EvrythngClientException {

        String type = getType(actionClass);
        return delete(String.format(PATH_TYPED_ACTION, type, id));
    }

    /**
     * Deletes one action by id and type.
     */
    public Builder<Boolean> actionDeleter(final String customType, final String id) throws EvrythngClientException {

        checkCustomType(customType);
        return delete(String.format(PATH_TYPED_ACTION, customType, id));
    }

    /**
     * Updates an action type.
     */
    public Builder<ActionType> actionTypeUpdater(final String actionTypeName, final ActionType update)
            throws EvrythngClientException {

        return put(String.format(PATH_TYPED_ACTIONS, actionTypeName), update, new TypeReference<ActionType>() {

        });
    }

    protected void checkCustomType(final String customType) {

        if (!customType.startsWith("_")) {
            throw new IllegalArgumentException("Custom types must start with '_' (underscore).");
        }
    }

    public <T extends Action> String getType(final Class<T> actionClass) {

        String type = deserializer.getActionType(actionClass);
        if (type == null) {
            throw new IllegalArgumentException("The action type is not recognized.");
        }
        return type;
    }

    public Builder<Iterator<PVector<Action>>> iterator() {

        return iterator(PATH_ALL_ACTIONS, ACTIONS_TYPE_REFERENCE).sortOrder(SortOrder.descending());
    }

    public Builder<Iterator<PVector<Action>>> iterator(final String actionTypeName) {

        return iterator(String.format(PATH_TYPED_ACTIONS, actionTypeName), ACTIONS_TYPE_REFERENCE)
                .sortOrder(SortOrder.descending());
    }
}