package com.t3.model.initiative; import com.t3.xstreamversioned.version.SerializationVersion; /** * This class represents one initiative value. It can hold a string or a number and is comparable. * @author Virenerus */ @SerializationVersion(0) public abstract class InitiativeValue implements Comparable<InitiativeValue>{ private InitiativeValue() {} public String getValueAsString() { throw new RuntimeException("This initiative is not of type String"); } public Number getValueAsNumber() { throw new RuntimeException("This initiative is not of type Number"); } public abstract Object getValue(); @Override public abstract String toString(); public static InitiativeValue create(String value) { if(value==null) return null; return new StringInitiativeValue(value); } public static InitiativeValue create(Number value) { if(value==null) return null; return new NumberInitiativeValue(value); } @SerializationVersion(0) private static class StringInitiativeValue extends InitiativeValue { private final String value; public StringInitiativeValue(String value) { this.value=value; } @Override public String getValueAsString() { return value; } @Override public int compareTo(InitiativeValue o) { if(o == null) return 1; else if(o instanceof StringInitiativeValue) return String.CASE_INSENSITIVE_ORDER.compare(value, o.getValueAsString()); else return -1; } @Override public Object getValue() { return value; } @Override public String toString() { return value; } } @SerializationVersion(0) private static class NumberInitiativeValue extends InitiativeValue { private final Number value; public NumberInitiativeValue(Number value) { this.value=value; } @Override public Number getValueAsNumber() { return value; } @Override public int compareTo(InitiativeValue o) { if(o==null) return -1; else if(o instanceof NumberInitiativeValue) return Double.compare(value.doubleValue(),o.getValueAsNumber().doubleValue()); else return 1; } @Override public Object getValue() { return value; } @Override public String toString() { if(value!=null) return value.toString(); else return ""; } } }