package ch.x42.terye.value; import java.io.InputStream; import java.math.BigDecimal; import java.util.Calendar; import javax.jcr.Binary; import javax.jcr.PropertyType; import javax.jcr.RepositoryException; import javax.jcr.Value; import javax.jcr.ValueFormatException; public class ValueImpl implements Value { private Object value; private int type; protected ValueImpl(Object value, int type) { this.value = value; this.type = type; } private void validate(int expectedType) throws ValueFormatException { if (getType() != expectedType) { throw new ValueFormatException("Expected a " + PropertyType.nameFromValue(expectedType) + "but found a " + PropertyType.nameFromValue(getType())); } } @Override public Binary getBinary() throws RepositoryException { validate(PropertyType.BINARY); return (Binary) value; } @Override public boolean getBoolean() throws ValueFormatException, RepositoryException { validate(PropertyType.BOOLEAN); return (Boolean) value; } @Override public Calendar getDate() throws ValueFormatException, RepositoryException { validate(PropertyType.DATE); return (Calendar) value; } @Override public BigDecimal getDecimal() throws ValueFormatException, RepositoryException { validate(PropertyType.DECIMAL); return (BigDecimal) value; } @Override public double getDouble() throws ValueFormatException, RepositoryException { validate(PropertyType.DOUBLE); return (Double) value; } @Override public long getLong() throws ValueFormatException, RepositoryException { switch (getType()) { case PropertyType.LONG: return (Long) value; case PropertyType.DATE: return ((Calendar) value).getTimeInMillis(); } throw new ValueFormatException("Couldn't convert value to long"); } @Override public InputStream getStream() throws RepositoryException { validate(PropertyType.BINARY); return ((Binary) value).getStream(); } @Override public String getString() throws ValueFormatException, IllegalStateException, RepositoryException { validate(PropertyType.STRING); return (String) value; } @Override public int getType() { return type; } }