/*
* Copyright (c) 2012-2015, Luigi R. Viggiano
* All rights reserved.
*
* This software is distributable under the BSD license.
* See the terms of the BSD license in the documentation provided with this software.
*/
package org.aeonbits.owner.serializable;
import org.aeonbits.owner.Config.HotReload;
import org.aeonbits.owner.Config.Sources;
import org.aeonbits.owner.ConfigFactory;
import org.aeonbits.owner.Mutable;
import org.aeonbits.owner.TestConstants;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import static java.io.File.createTempFile;
import static org.aeonbits.owner.util.Collections.map;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
/**
* @author Luigi R. Viggiano
*/
public class TestSerialization implements TestConstants {
private static final String PROPERTY_FILE_NAME = "AsyncAutoReloadConfig.properties";
private static final String SPEC = "file:"+ RESOURCES_DIR + "/" + PROPERTY_FILE_NAME;
private File target;
@HotReload
@Sources(SPEC)
public static interface MyConfig extends Mutable {
@DefaultValue("someText")
public String someText();
@DefaultValue("some,array")
public String[] someArray();
}
@Before
public void before() throws IOException {
File parent = new File(RESOURCES_DIR);
parent.mkdirs();
target = createTempFile("TestSerialization", ".ser", parent);
}
@After
public void after() throws IOException {
target.delete();
}
@Test
public void testSerialization() throws IOException, ClassNotFoundException {
MyConfig cfg = ConfigFactory.create(MyConfig.class, map("foo", "bar"));
assertEquals("someText", cfg.someText());
assertArrayEquals(new String[] {"some", "array"}, cfg.someArray());
cfg.addPropertyChangeListener("someText", new MyPropertyChangeListener());
serialize(cfg, target);
MyConfig deserialized = deserialize(target);
assertEquals(cfg, deserialized);
}
private MyConfig deserialize(File target) throws IOException, ClassNotFoundException {
FileInputStream fin = new FileInputStream(target);
try {
ObjectInputStream oin = new ObjectInputStream(fin);
try {
return (MyConfig) oin.readObject();
} finally {
oin.close();
}
} finally {
fin.close();
}
}
private void serialize(MyConfig cfg, File target) throws IOException {
FileOutputStream fout = new FileOutputStream(target);
try {
ObjectOutputStream oout = new ObjectOutputStream(fout);
try {
oout.writeObject(cfg);
oout.flush();
} finally {
oout.close();
}
} finally {
fout.close();
}
}
private static class MyPropertyChangeListener implements PropertyChangeListener, Serializable {
public void propertyChange(PropertyChangeEvent evt) {
}
}
}