package ch.x42.terye.persistence;
import java.util.Map;
import java.util.Set;
import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
import javax.jcr.Value;
import ch.x42.terye.value.ValueImpl;
public class PropertyState extends ItemState {
private Object value;
private Integer propertyType;
public PropertyState() {
super(ItemType.PROPERTY);
}
public PropertyState(String path, Value value) throws RepositoryException {
this();
put("path", path);
putValue(value);
put("propertyType", value.getType());
}
/**
* Since there is no way to directly get to the underlying data object..
*/
private void putValue(Value value) throws RepositoryException {
Object v = null;
switch (value.getType()) {
case PropertyType.STRING:
v = value.getString();
break;
case PropertyType.LONG:
v = value.getLong();
break;
case PropertyType.DOUBLE:
v = value.getDouble();
break;
case PropertyType.DECIMAL:
v = value.getDecimal().toString();
break;
case PropertyType.DATE:
v = value.getDate().getTime();
break;
case PropertyType.BOOLEAN:
v = value.getBoolean();
break;
case PropertyType.BINARY:
case PropertyType.NAME:
case PropertyType.PATH:
case PropertyType.REFERENCE:
case PropertyType.WEAKREFERENCE:
case PropertyType.URI:
throw new UnsupportedOperationException(
"Value type not suppored");
}
put("value", v);
}
@Override
public boolean containsField(String s) {
if (s.equals("value") && value != null) {
return true;
} else if (s.equals("propertyType") && propertyType != null) {
return true;
}
return super.containsField(s);
}
@Override
public Object get(String key) {
if (key.equals("value")) {
return value;
} else if (key.equals("propertyType")) {
return propertyType;
}
return super.get(key);
}
@Override
public Set<String> keySet() {
Set<String> set = super.keySet();
set.add("value");
set.add("propertyType");
return set;
}
@Override
public Object put(String key, Object v) {
if (key.equals("value")) {
value = v;
return v;
} else if (key.equals("propertyType")) {
propertyType = (Integer) v;
return v;
}
return super.put(key, v);
}
@Override
public Object removeField(String key) {
Object ret = null;
if (key.equals("value")) {
ret = value;
value = null;
} else if (key.equals("propertyType")) {
ret = propertyType;
propertyType = null;
} else {
return super.removeField(key);
}
return ret;
}
@Override
@SuppressWarnings({ "rawtypes", "unchecked" })
public Map toMap() {
Map<String, Object> ret = super.toMap();
ret.put("value", value);
ret.put("propertyType", propertyType);
return ret;
}
public Value getValue() {
return new ValueImpl(value, propertyType);
}
public void setValue(Value value) throws RepositoryException {
putValue(value);
put("propertyType", value.getType());
}
}