package org.hl7.fhir.instance.model; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.hl7.fhir.instance.model.api.IBaseHasExtensions; import org.hl7.fhir.instance.model.api.IPrimitiveType; public abstract class PrimitiveType<T> extends Type implements IPrimitiveType<T>, IBaseHasExtensions { private static final long serialVersionUID = 3L; private T myCoercedValue; private String myStringValue; public T getValue() { return myCoercedValue; } public String asStringValue() { return myStringValue; } @Override public int hashCode() { return new HashCodeBuilder().append(getValue()).toHashCode(); } public PrimitiveType<T> setValue(T theValue) { myCoercedValue = theValue; updateStringValue(); return this; } protected void updateStringValue() { if (myCoercedValue == null) { myStringValue = null; } else { // NB this might be null myStringValue = encode(myCoercedValue); } } @Override public boolean isEmpty() { return super.isEmpty() && StringUtils.isBlank(getValueAsString()); } public void fromStringValue(String theValue) { if (theValue == null) { myCoercedValue = null; } else { // NB this might be null myCoercedValue = parse(theValue); } myStringValue = theValue; } /** * Subclasses must override to convert an encoded representation of this datatype into a "coerced" one * * @param theValue * Will not be null * @return May return null if the value does not correspond to anything */ protected abstract T parse(String theValue); /** * Subclasses must override to convert a "coerced" value into an encoded one. * * @param theValue * Will not be null * @return May return null if the value does not correspond to anything */ protected abstract String encode(T theValue); @Override public String toString() { return getClass().getSimpleName() + "[" + asStringValue() + "]"; } public boolean hasValue() { return !StringUtils.isBlank(getValueAsString()); } public String getValueAsString() { return asStringValue(); } public void setValueAsString(String theValue) { fromStringValue(theValue); } protected Type typedCopy() { return copy(); } public abstract Type copy(); @Override public boolean equalsDeep(Base obj) { if (!super.equalsDeep(obj)) return false; if (obj == null) { return false; } if (!(obj.getClass() == getClass())) { return false; } PrimitiveType<?> o = (PrimitiveType<?>) obj; EqualsBuilder b = new EqualsBuilder(); b.append(getValue(), o.getValue()); return b.isEquals(); } @Override public boolean equalsShallow(Base obj) { if (obj == null) { return false; } if (!(obj.getClass() == getClass())) { return false; } PrimitiveType<?> o = (PrimitiveType<?>) obj; EqualsBuilder b = new EqualsBuilder(); b.append(getValue(), o.getValue()); return b.isEquals(); } }