/*
* Copyright (c) 2012 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.db.client.model;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URI;
import java.util.*;
/**
* Abstract base for nested types. Uses simple Java properties serialization format
* to de/serialize nested objects from/to byte[].
*
* Note that we only support 'flat' nested types currently - this means nested types may contain
* only primitive fields and no further nesting of other complex types is supported.
*/
public abstract class AbstractSerializableNestedObject {
/**
*
*/
private Properties _field;
public AbstractSerializableNestedObject() {
_field = new Properties();
}
protected void setField(String key, String val) {
_field.setProperty(key, val);
}
protected void setField(String key, int val) {
_field.setProperty(key, Integer.toString(val));
}
protected void setField(String key, long val) {
_field.setProperty(key, Long.toString(val));
}
protected void setField(String key, boolean val) {
_field.setProperty(key, Boolean.toString(val));
}
protected void setField(String key, Calendar val) {
setField(key, val.getTimeInMillis());
}
protected void setListOfStringsField(String key, List<String> val) {
StringBuffer buffer = new StringBuffer();
if (val == null) {
val = new ArrayList<String>();
}
Iterator<String> it = val.iterator();
while (it.hasNext()) {
buffer.append(it.next());
if (it.hasNext()) {
buffer.append(",");
}
}
_field.setProperty(key, buffer.toString());
}
protected List<String> getListOfStringsField(String key) {
List<String> result = new ArrayList<String>();
String val = _field.getProperty(key);
if (val == null) {
return result;
}
StringTokenizer tokenizer = new StringTokenizer(val, ",");
while (tokenizer.hasMoreElements()) {
result.add(tokenizer.nextToken());
}
return result;
}
protected Integer getIntField(String key) {
String val = _field.getProperty(key);
if (val == null) {
return null;
}
return Integer.parseInt(val);
}
protected Long getLongField(String key) {
String val = _field.getProperty(key);
if (val == null) {
return null;
}
return Long.parseLong(val);
}
protected Boolean getBooleanField(String key) {
String val = _field.getProperty(key);
if (val == null) {
return null;
}
return Boolean.parseBoolean(val);
}
protected String getStringField(String key) {
return _field.getProperty(key);
}
protected void setField(String key, URI val) {
_field.setProperty(key, val.toString());
}
protected URI getURIField(String key) {
String val = _field.getProperty(key);
if (val == null) {
return null;
}
return URI.create(val);
}
protected Calendar getDateField(String key) {
Long val = getLongField(key);
if (val == null) {
return null;
}
Calendar c = Calendar.getInstance();
c.setTimeInMillis(val);
return c;
}
/**
* Serializes this nested object into byte[]
*
* @return
*/
public byte[] toBytes() {
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
_field.store(out, null);
return out.toByteArray();
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
/**
* Deserializes byte[]
*
* @param content
*/
public void loadBytes(byte[] content) {
try {
_field = new Properties();
_field.load(new ByteArrayInputStream(content));
} catch (IOException e) {
throw new IllegalArgumentException(e);
}
}
/**
* Needed for use in generic Set
*
* @param obj
* @return
*/
@Override
public boolean equals(Object obj) {
if (!(obj instanceof AbstractSerializableNestedObject)) {
return false;
}
return _field.equals(((AbstractSerializableNestedObject) obj)._field);
}
@Override
public int hashCode() {
return _field.hashCode();
}
}