com.evrythng.thng.resource.model.store.Property.java Source code

Java tutorial

Introduction

Here is the source code for com.evrythng.thng.resource.model.store.Property.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.thng.resource.model.store;

import com.evrythng.thng.resource.model.core.TemporalResourceModel;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Model representation for <em>properties</em>.
 */
public abstract class Property<VALUE_TYPE> extends TemporalResourceModel {

    public enum Type {

        BOOLEAN, STRING, NUMBER, ARRAY, OBJECT;

        public static Type forPropertyValue(final Object value) {

            if (value == null) {
                throw new IllegalArgumentException("Cannot determine the type of null property value");
            }
            if (value instanceof Boolean) {
                return BOOLEAN;
            }
            if (value instanceof Number) {
                return NUMBER;
            }
            if (value instanceof String) {
                return STRING;
            }
            if (value instanceof List<?>) {
                return ARRAY;
            }
            if (value instanceof Map<?, ?>) {
                return OBJECT;
            }
            throw new IllegalArgumentException("Unsupported property type: " + value.getClass().getSimpleName());
        }
    }

    public static List<Property<?>> normalize(final List<Property<?>> denormalized) {

        List<Property<?>> normalized = new ArrayList<>();
        Map<String, Integer> indexes = new HashMap<>();
        int index = 0;
        for (Property<?> property : denormalized) {
            String key = property.getKey() + "-" + (property.getTimestamp() != null ? property.getTimestamp() : "");
            if (indexes.get(key) == null) {
                indexes.put(key, index);
                normalized.add(index, property);
                index++;
            } else {
                normalized.set(indexes.get(key), property);
            }
        }
        return normalized;
    }

    private static final long serialVersionUID = 4241830003414536087L;
    private String key;
    private VALUE_TYPE value;
    public static final String FIELD_VALUE = "value";

    /**
     * Creates a new empty instance of {@link Property}.
     */
    Property() {
        /* Required by jackson. */
    }

    /**
     * Creates a new instance of {@link Property}.
     */
    Property(final String key, final VALUE_TYPE value) {

        this.key = key;
        this.value = value;
    }

    /**
     * Creates a new instance of {@link Property}.
     */
    Property(final String key, final VALUE_TYPE value, final Long timestamp) {

        super(timestamp);
        this.key = key;
        this.value = value;
    }

    public String getKey() {

        return key;
    }

    public void setKey(final String key) {

        this.key = key;
    }

    public VALUE_TYPE getValue() {

        return value;
    }

    public void setValue(final VALUE_TYPE value) {

        this.value = value;
    }

    @Override
    public boolean equals(final Object other) {

        if (other == null || other.getClass() != getClass()) {
            return false;
        }
        Property<VALUE_TYPE> that = (Property<VALUE_TYPE>) other;
        EqualsBuilder equals = new EqualsBuilder();
        equals.append(key, that.key);
        equals.append(value, that.value);
        equals.append(getTimestamp(), that.getTimestamp());
        return equals.build();
    }

    @Override
    public int hashCode() {

        HashCodeBuilder hashCode = new HashCodeBuilder();
        hashCode.append(key);
        hashCode.append(value);
        hashCode.append(getTimestamp());
        return hashCode.build();
    }

    @Override
    public String toString() {

        ToStringBuilder toString = new ToStringBuilder(this, ToStringStyle.SIMPLE_STYLE);
        toString.append("key", key);
        toString.append("value", value);
        toString.append("timestamp", getTimestamp());
        return toString.build();
    }
}