[cal10n-dev] Congratulations on a useful project; here's my suggestion

Rick Beton rick.beton at gmail.com
Sat Aug 29 17:42:21 CEST 2009


I have developed the idea a bit further.  I think ResourceMessage is a
better name (Message could mean too many other things). This is my
contribution for you to include in the API if you want to.

Regards,
Rick



package ch.qos.cal10n;

import java.io.Serializable;
import java.util.Locale;

/**
 * Holds a resource message with the locale lookup deferred until it is
needed
 * or until the locale is known. Instances are immutable so are safe to use
as
 * Exception data or share between threads. Note that the immutability is
 * actually dependent on the supplied args themselves being immutable. If
 * ResourceMessage instances are created that contain parameters that are
 * mutable, the results could be unpredictable.
 *
 * @author Rick Beton
 */
public final class ResourceMessage implements Serializable {
    private static final long serialVersionUID = 6660897864328889682L;

    private final Enum<?> e;
    private final Object[] args;
    // cache the result of toString
    private transient String string = null;
    // cache the result of hashCode
    private transient int hashcode = 0;

    /**
     * Constructs an instance.
     *
     * @param e
     *            the key for the corresponding resource.
     * @param args
     *            any message parameters, as required.
     */
    public ResourceMessage(Enum<?> e, Object... args) {
        this.e = e;
        if (args != null) {
            // take defensive copy
            this.args = new Object[args.length];
            System.arraycopy(args, 0, this.args, 0, args.length);
        } else {
            this.args = null;
        }
    }

    /**
     * Gets the localized message from the resource bundle, using the
specified
     * locale.
     *
     * @return the message for the user
     */
    public String getLocalizedMessage(Locale locale) {
        final IMessageConveyor mc = new MessageConveyor(locale);
        return mc.getMessage(e, args);
    }

    @Override
    public String toString() {
        if (string == null) {
            final StringBuilder b = new StringBuilder("Message(");
            b.append(e.name());
            b.append(", [");
            if (args != null) {
                String comma = "";
                for (Object o : args) {
                    b.append(comma).append(o);
                    comma = ", ";
                }
            }
            b.append("])");
            // there may be a thread race here but the outcome is never
            // uncertain
            string = b.toString();
        }
        return string;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj.getClass() != ResourceMessage.class) {
            return false;
        }

        final ResourceMessage other = (ResourceMessage) obj;
        if (!this.e.equals(other.e)) {
            return false;
        } else if (this.args == null && other.args == null) {
            return true;
        } else if (this.args == null || other.args == null) {
            return false;
        } else if (this.args.length != other.args.length) {
            return false;
        }

        for (int i = 0; i < args.length; i++) {
            if (this.args[i] == null && other.args[i] == null) {
                // ok
            } else if (this.args[i] == null && other.args[i] != null) {
                return false;
            } else if (!this.args[i].equals(other.args[i])) {
                return false;
            }
        }
        return true;
    }

    @Override
    public int hashCode() {
        if (hashcode == 0) {
            int newHashCode = 0;
            newHashCode = e.hashCode();
            if (args != null) {
                for (Object o : args) {
                    if (o != null) {
                        newHashCode ^= o.hashCode();
                    }
                }
            }
            // there may be a thread race here but the outcome is never
            // uncertain
            hashcode = newHashCode;
        }
        return hashcode;
    }
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://qos.ch/pipermail/cal10n-dev/attachments/20090829/30ff5d5a/attachment-0002.htm>


More information about the cal10n-dev mailing list