All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.microsoft.rest.v2.ExpandableStringEnum Maven / Gradle / Ivy

/**
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License. See License.txt in the project root for
 * license information.
 */

package com.microsoft.rest.v2;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import com.fasterxml.jackson.annotation.JsonValue;

/**
 * Base implementation for expandable, single string enums.
 * @param  a specific expandable enum type
 */
public abstract class ExpandableStringEnum> {
    private static ConcurrentMap> valuesByName = null;

    private String name;
    private Class clazz;

    private static String uniqueKey(Class clazz, String name) {
        if (clazz != null) {
            return (clazz.getName() + "#" + name).toLowerCase();
        } else {
            throw new IllegalArgumentException();
        }
    }

    @SuppressWarnings("unchecked")
    protected T withNameValue(String name, T value, Class clazz) {
        if (valuesByName == null) {
            valuesByName = new ConcurrentHashMap();
        }
        this.name = name;
        this.clazz = clazz;
        ((ConcurrentMap) valuesByName).put(uniqueKey(clazz, name), value);
        return (T) this;
    }

    @SuppressWarnings("unchecked")
    protected static > T fromString(String name, Class clazz) {
        if (name == null) {
            return null;
        } else if (valuesByName != null) {
            T value = (T) valuesByName.get(uniqueKey(clazz, name));
            if (value != null) {
                return value;
            }
        }

        try {
            T value = clazz.newInstance();
            return value.withNameValue(name, value, clazz);
        } catch (InstantiationException e) {
            return null;
        } catch (IllegalAccessException e) {
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    protected static > Collection values(Class clazz) {
        // Make a copy of all values
        Collection> values = new ArrayList<>(valuesByName.values());

        Collection list = new HashSet();
        for (ExpandableStringEnum value : values) {
            if (value.getClass().isAssignableFrom(clazz)) {
                list.add((T) value);
            }
        }

        return list;
    }

    @Override
    @JsonValue
    public String toString() {
        return this.name;
    }

    @Override
    public int hashCode() {
        return uniqueKey(this.clazz, this.name).hashCode();
    }

    @SuppressWarnings("unchecked")
    @Override
    public boolean equals(Object obj) {
        if (!clazz.isAssignableFrom(obj.getClass())) {
            return false;
        } else if (obj == this) {
            return true;
        } else if (this.name == null) {
            return ((ExpandableStringEnum) obj).name == null;
        } else {
            return this.name.equals(((ExpandableStringEnum) obj).name);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy