package org.async.rmi;
import org.async.rmi.config.Configuration;
import org.async.rmi.config.PropertiesReader;
import org.async.rmi.server.MarshalInputStream;
import org.async.rmi.server.MarshalOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.yaml.snakeyaml.Yaml;
import java.beans.IntrospectionException;
import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.net.MalformedURLException;
import java.util.Collection;
import java.util.Map;
import java.util.stream.Stream;
/**
* Created by Barak Bar Orion
* 05/10/14.
*/
public class Util {
@SuppressWarnings("UnusedDeclaration")
private static final Logger logger = LoggerFactory.getLogger(Util.class);
public static <T> T writeAndRead(T object) throws IOException, ClassNotFoundException {
byte[] bytes;
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); MarshalOutputStream out = new MarshalOutputStream(byteArrayOutputStream)) {
out.writeObject(object);
bytes = byteArrayOutputStream.toByteArray();
}
try (InputStream is = new ByteArrayInputStream(bytes); MarshalInputStream ois = new MarshalInputStream(is)) {
//noinspection unchecked
return (T) ois.readObject();
}
}
public static byte[] asByteArray(InputStream in) throws IOException {
try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
int nRead;
byte[] data = new byte[16384];
while ((nRead = in.read(data, 0, data.length)) != -1) {
out.write(data, 0, nRead);
}
out.flush();
return out.toByteArray();
}
}
public static void writeToFile(Object object, File file) throws IOException {
try (FileOutputStream fileOutputStream = new FileOutputStream(file); MarshalOutputStream out = new MarshalOutputStream(fileOutputStream)) {
out.writeObject(object);
}
}
public static Object readFromFile(File file) throws IOException, ClassNotFoundException {
try (FileInputStream fileInputStream = new FileInputStream(file); MarshalInputStream in = new MarshalInputStream(fileInputStream)) {
return in.readObject();
}
}
public static <T> T readYmlFile(File file, T instance) throws IOException, IllegalAccessException, IntrospectionException, InvocationTargetException, InstantiationException {
try (InputStream is = new FileInputStream(file)) {
return readYmlFile(is, instance);
}
}
public static <T> T readYmlContent(String content, T instance) throws IOException, IllegalAccessException, IntrospectionException, InvocationTargetException, InstantiationException {
try (InputStream is = new ByteArrayInputStream(content.getBytes())) {
return readYmlFile(is, instance);
}
}
public static <T> T readYmlFile(InputStream is, T instance) throws MalformedURLException, IntrospectionException, IllegalAccessException, InvocationTargetException, InstantiationException {
Yaml yaml = new Yaml();
Map map = (Map) yaml.load(is);
return read(map, instance);
}
private static <T> Stream<T> toStream(Collection<T> collection) {
if (collection == null) {
return Stream.empty();
} else {
return collection.stream();
}
}
public static <T> T read(Map properties, T instance) throws IntrospectionException, InvocationTargetException, IllegalAccessException, MalformedURLException, InstantiationException {
return PropertiesReader.read(properties, instance);
}
public static Configuration readConfiguration(File ymlFile) throws InvocationTargetException, IntrospectionException, InstantiationException, IllegalAccessException, IOException {
return readYmlFile(ymlFile, new Configuration());
}
public static Configuration readConfiguration(String configuration) throws InvocationTargetException, IntrospectionException, InstantiationException, IllegalAccessException, IOException {
return readYmlContent(configuration, new Configuration());
}
}