package org.marketcetera.util.ws.wrappers; import java.io.Serializable; import javax.xml.bind.annotation.XmlTransient; import org.apache.commons.lang.ObjectUtils; import org.marketcetera.util.log.I18NBoundMessage; import org.marketcetera.util.misc.ClassVersion; /** * A wrapper for an {@link I18NBoundMessage}. The message is * marshalled using JAXB or Java serialization as both a bound * internationalized message and a server-localized string. If the * message can be serialized on the server side and recreated on the * client side (which requires all necessary message files and * parameter classes to be available, though no check is made to * ensure the message handle is present in these message files), then * {@link #getText()} localizes the message on the client; otherwise, * it returns the server-localized string. * * <p>Equality and hash code generation rely only upon the result of * {@link #getText()}.</p> * * @author tlerios@marketcetera.com * @since 2.0.0 * @version $Id: RemoteI18NBoundMessage.java 16154 2012-07-14 16:34:05Z colin $ */ /* $License$ */ @ClassVersion("$Id: RemoteI18NBoundMessage.java 16154 2012-07-14 16:34:05Z colin $") public class RemoteI18NBoundMessage implements Serializable { // CLASS DATA. private static final long serialVersionUID=1L; // INSTANCE DATA. private transient I18NBoundMessage mMessage; private SerWrapper<I18NBoundMessage> mWrapper; private String mString; // CONSTRUCTORS. /** * Creates a new message wrapper that wraps the given message. * * @param message The message, which may be null. */ public RemoteI18NBoundMessage (I18NBoundMessage message) { setTransientMessage(message); if (getTransientMessage()==null) { return; } setWrapper(new SerWrapper<I18NBoundMessage>(getTransientMessage())); setString(getTransientMessage().getText()); } /** * Creates a new message wrapper. This empty constructor is * intended for use by JAXB. */ @SuppressWarnings("unused") private RemoteI18NBoundMessage() {} // INSTANCE METHODS. /** * Sets the receiver's message to the given one. * * @param message The message, which may be null. */ private void setTransientMessage (I18NBoundMessage message) { mMessage=message; } /** * Returns the receiver's message. * * @return The message, which may be null. */ @XmlTransient private I18NBoundMessage getTransientMessage() { return mMessage; } /** * Sets the receiver's message (wrapper) to the given one. * * @param wrapper The message (wrapper), which may be null. */ public void setWrapper (SerWrapper<I18NBoundMessage> wrapper) { mWrapper=wrapper; } /** * Returns the receiver's message (wrapper). * * @return The message (wrapper), which may be null. */ public SerWrapper<I18NBoundMessage> getWrapper() { return mWrapper; } /** * Sets the receiver's (server-localized) message to the given one. * * @param string The (server-localized) message, which may be * null. */ public void setString (String string) { mString=string; } /** * Returns the receiver's (server-localized) message. * * @return The (server-localized) message, which may be null. */ public String getString() { return mString; } /** * Returns the receiver's message text. Preference is given to * localizing the given message on the server; then localizing the * message wrapper on the client, if successfully * unmarshalled/deserialized; otherwise, the server-localized * message is returned. * * @return The text, which may be null. */ public String getText() { if (getTransientMessage()!=null) { return getTransientMessage().getText(); } if (getWrapper()==null) { return null; } if (getWrapper().getRaw()!=null) { return getWrapper().getRaw().getText(); } return getString(); } // Object. @Override public String toString() { return getText(); } @Override public int hashCode() { return ObjectUtils.hashCode(getText()); } @Override public boolean equals (Object other) { if (this==other) { return true; } if ((other==null) || !getClass().equals(other.getClass())) { return false; } RemoteI18NBoundMessage o=(RemoteI18NBoundMessage)other; return ObjectUtils.equals(getText(),o.getText()); } }