package org.marketcetera.algo; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.Serializable; import java.util.regex.Pattern; import javax.persistence.Transient; import javax.xml.bind.annotation.*; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.builder.CompareToBuilder; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.marketcetera.core.CoreException; import org.marketcetera.core.Validator; import org.marketcetera.util.log.I18NBoundMessage1P; import org.marketcetera.util.log.I18NBoundMessage2P; import org.marketcetera.util.misc.ClassVersion; /* $License$ */ /** * Represents a bound {@link BrokerAlgoTagSpec} and value. * * @author <a href="mailto:colin@marketcetera.com">Colin DuPlantis</a> * @version $Id: BrokerAlgoTag.java 16901 2014-05-11 16:14:11Z colin $ * @since 2.4.0 */ @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) @ClassVersion("$Id: BrokerAlgoTag.java 16901 2014-05-11 16:14:11Z colin $") public class BrokerAlgoTag implements Serializable, Comparable<BrokerAlgoTag> { /** * Create a new BrokerAlgoTag instance. */ public BrokerAlgoTag() {} /** * Create a new BrokerAlgoTag instance. * * @param inTagSpec a <code>BrokerAlgoTagSpec</code> value */ public BrokerAlgoTag(BrokerAlgoTagSpec inTagSpec) { setTagSpec(inTagSpec); } /** * Create a new BrokerAlgoTag instance. * * @param inTagSpec a <code>BrokerAlgoTagSpec</code> value * @param inValue a <code>String</code> value */ public BrokerAlgoTag(BrokerAlgoTagSpec inTagSpec, String inValue) { setTagSpec(inTagSpec); setValue(inValue); } /** * Get the tagSpec value. * * @return an <code>AlgoTagSpec</code> value */ public BrokerAlgoTagSpec getTagSpec() { return tagSpec; } /** * Sets the tagSpec value. * * @param inTagSpec an <code>AlgoTagSpec</code> value */ public final void setTagSpec(BrokerAlgoTagSpec inTagSpec) { tagSpec = inTagSpec; } /** * Get the value value. * * @return a <code>String</code> value */ public String getValue() { return value; } /** * Sets the value value. * * @param inValue a <code>String</code> value */ public final void setValue(String inValue) { String oldValue = value; value = StringUtils.trimToNull(inValue); if(oldValue != null){ if(!oldValue.equals(value)){ propertyChangeSupport.firePropertyChange("value", oldValue, value); } }else{ if(value != null) propertyChangeSupport.firePropertyChange("value", oldValue, value); } } /** * Gets the underlying tag spec label. * * @return a <code>String</code> value or <code>null</code> */ public String getLabel() { if(tagSpec == null) { return null; } return tagSpec.getLabel(); } /** * Validates the tag spec and tag value. * * @throws CoreException if a validation error occurs */ public void validate() { String pattern = tagSpec.getPattern(); if(pattern != null) { //Allow validation of empty string String valueToCompare = (value == null)? "" : value; if(!Pattern.compile(pattern).matcher(valueToCompare).matches()) { throw new CoreException(new I18NBoundMessage2P(Messages.ALGO_TAG_VALUE_PATTERN_MISMATCH, tagSpec.getLabel(), valueToCompare)); } } if(tagSpec.getIsMandatory() && value == null) { throw new CoreException(new I18NBoundMessage1P(Messages.ALGO_TAG_VALUE_REQUIRED, tagSpec.getLabel())); } Validator<BrokerAlgoTag> tagValidator = tagSpec.getValidator(); if(tagValidator != null) { tagValidator.validate(this); } } public void addPropertyChangeListener(PropertyChangeListener listener){ propertyChangeSupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener){ propertyChangeSupport.removePropertyChangeListener(listener); } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("BrokerAlgoTag [tagSpec=").append(tagSpec).append(", value=").append(value).append("]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ return builder.toString(); } /* (non-Javadoc) * @see java.lang.Object#hashCode() */ @Override public int hashCode() { return new HashCodeBuilder().append(tagSpec).append(value).toHashCode(); } /* (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; BrokerAlgoTag other = (BrokerAlgoTag) obj; return new EqualsBuilder().append(tagSpec,other.tagSpec).append(value,other.value).isEquals(); } /* (non-Javadoc) * @see java.lang.Comparable#compareTo(java.lang.Object) */ @Override public int compareTo(BrokerAlgoTag inOther) { return new CompareToBuilder().append(tagSpec,inOther.tagSpec).toComparison(); } /** * represents the algo tag template */ @XmlElement private BrokerAlgoTagSpec tagSpec; @Transient private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); /** * contains the value to apply to the given tag spec */ @XmlAttribute private String value; private static final long serialVersionUID = 3428966503023221067L; }