// first do some paranoid sanity checks
if (!walker.getName().equals(PROPERTY_ELEMENT)) {
String msg = "invalid serialization format (unexpected element: "
+ walker.getName() + ")";
log.debug(msg);
throw new ItemStateException(msg);
}
// check name
if (!state.getName().equals(QName.valueOf(walker.getAttribute(NAME_ATTRIBUTE)))) {
String msg = "invalid serialized state: name mismatch";
log.debug(msg);
throw new ItemStateException(msg);
}
// check parentUUID
NodeId parentId = NodeId.valueOf(walker.getAttribute(PARENTUUID_ATTRIBUTE));
if (!parentId.equals(state.getParentId())) {
String msg = "invalid serialized state: parentUUID mismatch";
log.debug(msg);
throw new ItemStateException(msg);
}
// now we're ready to read state
// type
String typeName = walker.getAttribute(TYPE_ATTRIBUTE);
int type;
try {
type = PropertyType.valueFromName(typeName);
} catch (IllegalArgumentException iae) {
// should never be getting here
throw new ItemStateException("unexpected property-type: " + typeName, iae);
}
state.setType(type);
// multiValued
String multiValued = walker.getAttribute(MULTIVALUED_ATTRIBUTE);
state.setMultiValued(Boolean.getBoolean(multiValued));
// definition id
String definitionId = walker.getAttribute(DEFINITIONID_ATTRIBUTE);
state.setDefinitionId(PropDefId.valueOf(definitionId));
// modification count
String modCount = walker.getAttribute(MODCOUNT_ATTRIBUTE);
state.setModCount(Short.parseShort(modCount));
// values
ArrayList values = new ArrayList();
if (walker.enterElement(VALUES_ELEMENT)) {
while (walker.iterateElements(VALUE_ELEMENT)) {
// read serialized value
String content = walker.getContent();
if (PropertyType.STRING == type) {
// STRING value can be empty; ignore length
values.add(InternalValue.valueOf(content, type));
} else if (content.length() > 0) {
// non-empty non-STRING value
if (type == PropertyType.BINARY) {
try {
// special handling required for binary value:
// the value stores the id of the BLOB data
// in the BLOB store
if (blobStore instanceof ResourceBasedBLOBStore) {
// optimization: if the BLOB store is resource-based
// retrieve the resource directly rather than having
// to read the BLOB from an input stream
FileSystemResource fsRes =
((ResourceBasedBLOBStore) blobStore).getResource(content);
values.add(InternalValue.create(fsRes));
} else {
InputStream in = blobStore.get(content);
try {
values.add(InternalValue.create(in, false));
} finally {
try {
in.close();
} catch (IOException e) {
// ignore
}
}
}
} catch (Exception e) {
String msg = "error while reading serialized binary value";
log.debug(msg);
throw new ItemStateException(msg, e);
}
} else {
// non-empty non-STRING non-BINARY value
values.add(InternalValue.valueOf(content, type));
}