EntityHelper.java

/*
 * The coLAB project
 * Copyright (C) 2021-2023 AlbaSim, MEI, HEIG-VD, HES-SO
 *
 * Licensed under the MIT License
 */
package ch.colabproject.colab.api.model.tools;

import ch.colabproject.colab.generator.model.interfaces.WithId;
import java.util.Objects;

/**
 * Helper to normalize common operations on WithId objects
 *
 * @author maxence
 */
public class EntityHelper {

    /**
     * never-called private constructor
     */
    private EntityHelper() {
        throw new UnsupportedOperationException(
            "This is a utility class and cannot be instantiated");
    }

    /**
     * {@link Object#hashCode} implementation for all WithId implementation
     *
     * @param object object to hash
     *
     * @return a hash code value for the given object.
     */
    public static int hashCode(WithId object) {
        int hash = 7;
        hash = 31 * hash + Objects.hashCode(object.getId());
        return hash;
    }

    /**
     * {@link Object#equals} implementation for all WithId implementation. Objects equal if
     * <ul>
     * <li>it's the same reference (strict == equality)
     * <li>both are null
     * <li>they are instance of the same class and have the same id
     * </ul>
     *
     * @param a first object
     * @param b second object
     *
     * @return {@code true} if both objects represent the same persisted entity
     */
    public static boolean equals(WithId a, Object b) {
        if (a == b) {
            // same object or both are null
            return true;
        }
        if (a == null || b == null) {
            // only one is null
            return false;
        }

        // at this point, both are not null
        if (a.getClass() != b.getClass()) {
            // class mismatch
            return false;
        } else {
            // same class
            WithId otherB = (WithId) b;
            if (a.getId() == null || otherB.getId() == null) {
                // if at least one object has no id, object are not equals
                // if both id are null, objects may equal, but this case is handled by the strict
                // (a == b) equality check
                return false;
            }
            // same class, ids must equals
            return Objects.equals(a.getId(), otherB.getId());
        }
    }
}