package pl.piotrsukiennik.whowhen.shared.serializer.util;
import pl.piotrsukiennik.whowhen.shared.serializer.IDataSerializer;
import java.io.File;
import java.io.Serializable;
import java.util.Observable;
import java.util.Observer;
/**
* @author Piotr Sukiennik
*/
public class SerializeOnChangeObserver implements Observer {
private String namePrefix = "serialized";
private IDataSerializer[] dataSerializers;
private File serializersOutputDir;
public SerializeOnChangeObserver( File serializersOutputDir, IDataSerializer dataSerializer, IDataSerializer... dataSerializers ) {
IDataSerializer[] serializers = null;
if ( dataSerializers == null || dataSerializers.length == 0 ) {
serializers = new IDataSerializer[1];
}
else {
serializers = new IDataSerializer[dataSerializers.length + 1];
System.arraycopy( dataSerializers, 0, serializers, 1, dataSerializers.length );
}
serializers[0] = dataSerializer;
this.dataSerializers = dataSerializers;
this.serializersOutputDir = serializersOutputDir;
}
public SerializeOnChangeObserver( File serializersOutputDir, IDataSerializer[] dataSerializers ) {
this.dataSerializers = dataSerializers;
this.serializersOutputDir = serializersOutputDir;
}
public void update( Observable o, Object arg ) {
serializeObservable( o );
}
public void serializeObservable( Observable observable ) {
if ( observable instanceof Serializable ) {
for ( IDataSerializer dataSerializer : dataSerializers ) {
if ( dataSerializer.supportsSerialization( observable.getClass() ) ) {
dataSerializer.serialize( (Serializable) observable, new File( serializersOutputDir, namePrefix + "." + dataSerializer.getExtension() ) );
}
}
}
else {
throw new ObservableNotSerializableException( "Observable of class " + observable.getClass() + " is not serializable." );
}
}
protected class ObservableNotSerializableException extends RuntimeException {
public ObservableNotSerializableException( String message ) {
super( message );
}
}
public String getNamePrefix() {
return namePrefix;
}
public void setNamePrefix( String namePrefix ) {
this.namePrefix = namePrefix;
}
}