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

com.github.ykrasik.jaci.Identifier Maven / Gradle / Ivy

/******************************************************************************
 * Copyright (C) 2015 Yevgeny Krasik                                          *
 *                                                                            *
 * Licensed under the Apache License, Version 2.0 (the "License");            *
 * you may not use this file except in compliance with the License.           *
 * You may obtain a copy of the License at                                    *
 *                                                                            *
 * http://www.apache.org/licenses/LICENSE-2.0                                 *
 *                                                                            *
 * Unless required by applicable law or agreed to in writing, software        *
 * distributed under the License is distributed on an "AS IS" BASIS,          *
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   *
 * See the License for the specific language governing permissions and        *
 * limitations under the License.                                             *
 ******************************************************************************/

package com.github.ykrasik.jaci;

import java.util.Comparator;
import java.util.Objects;

/**
 * An identifier for an entity - it's name and description.
 *
 * @author Yevgeny Krasik
 */
public final class Identifier {
    private final String name;
    private final String description;

    public Identifier(String name, String description) {
        this.name = assertValidName(name);
        this.description = Objects.requireNonNull(description, "description");
    }

    private String assertValidName(String name) {
        Objects.requireNonNull(name, "name");
        if (name.isEmpty()) {
            throw new IllegalArgumentException("Invalid name: Names cannot be empty!");
        }
        if (!Character.isLetter(name.charAt(0))) {
            throw new IllegalArgumentException("Invalid name: Names must start with a letter: " + name);
        }
        for (int i = 1; i < name.length(); i++) {
            if (!Character.isLetterOrDigit(name.charAt(i))) {
                throw new IllegalArgumentException("Invalid name: Names must be alpha-number: " + name);
            }
        }
        return name;
    }

    /**
     * @return The name of this entity.
     */
    public String getName() {
        return name;
    }

    /**
     * @return  The description of this entity.
     */
    public String getDescription() {
        return description;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }

        final Identifier that = (Identifier) o;

        if (!name.equals(that.name)) {
            return false;
        }
        return description.equals(that.description);

    }

    @Override
    public int hashCode() {
        int result = name.hashCode();
        result = 31 * result + description.hashCode();
        return result;
    }

    @Override
    public String toString() {
        return name + " : " + description;
    }


    private static Comparator NAME_COMPARATOR = new Comparator() {
        @Override
        public int compare(Identifier o1, Identifier o2) {
            return o1.getName().compareTo(o2.getName());
        }
    };

    /**
     * @return A {@link Comparator} that compares {@link Identifier}s according to {@link Identifier#getName()}.
     */
    public static Comparator nameComparator() {
        return NAME_COMPARATOR;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy