package org.finra.datagenerator.scaffolding.transformer.service.adapter;
import com.google.common.io.Files;
import org.finra.datagenerator.scaffolding.transformer.utils.ByteClassLoader;
import org.finra.datagenerator.scaffolding.utils.ClassInfo;
import org.finra.datagenerator.scaffolding.utils.Javac;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* Created by dkopel on 10/28/16.
*/
public class XSDAdapter implements TransformerAdapter {
private List<String> generatePOJO(Path output, Path input) throws Exception {
String exec = String.format("/usr/bin/xjc -d %s %s", output, input);
System.out.println(exec);
Process p = Runtime.getRuntime().exec(exec);
p.waitFor();
Path generated = Paths.get(output.toString()+"/generated");
File[] files = generated.toFile().listFiles();
List<String> sourceFiles = Arrays.stream(files).map(f -> f.toString()).collect(Collectors.toList());
return sourceFiles.stream().map((String sf) -> {
System.out.println("Source: "+sf);
try {
return new String(java.nio.file.Files.readAllBytes(Paths.get(sf)));
} catch (IOException e) {
e.printStackTrace();
}
return null;
}).collect(Collectors.toList());
}
private List<Class<?>> compile(List<String> sources) throws IOException {
List<ClassInfo> classInfos = Javac.compile(sources);
Map<String, byte[]> classMap = classInfos.stream().collect(Collectors.toMap(
(ClassInfo c) -> c.className,
(ClassInfo c) -> c.bytes
));
ByteClassLoader cl = new ByteClassLoader(new URL[] {}, ClassLoader.getSystemClassLoader(), classMap);
return classInfos.stream().map((ClassInfo c) -> {
try {
return cl.loadClass(c.className);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}).collect(Collectors.toList());
}
@Override
public List<Class<?>> convert(Path input) {
Path tmpDir = Files.createTempDir().toPath();
try {
List<String> sources = generatePOJO(tmpDir, input);
return compile(sources);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}