package com.evolveum.midpoint.tools.ninja; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.util.exception.SchemaException; public class FileTransformer extends BaseNinjaAction{ private String outputDirecorty; private String input; private String outputFormat; public void setOutputDirecorty(String outputDirecorty) { this.outputDirecorty = outputDirecorty; } public void setOutputFormat(String outputFormat) { this.outputFormat = outputFormat; } public void setInput(String input) { this.input = input; } public void execute(){ ApplicationContext context = new ClassPathXmlApplicationContext(CONTEXTS); PrismContext prismContext = context.getBean(PrismContext.class); File inFile = new File(input); File[] files = null; if (inFile.isDirectory()){ files = inFile.listFiles(); } String output = getOutput(inFile); String outLang = getOutputLanguage(outputFormat); int errors = 0; int processed = 0; List<String> failedToParse = new ArrayList<String>(); if (files != null){ processed = files.length; for (int i = 0; i < files.length; i++){ try { transform(prismContext, files[i], output, outLang); } catch (SchemaException | IOException e) { System.out.println("failed to transform: " + e.getMessage()+ ". Stack: " + e); errors++; failedToParse.add(files[i].getName()); } } } else { processed = 1; try { transform(prismContext, inFile, output, outLang); } catch (SchemaException | IOException e) { errors++; failedToParse.add(inFile.getName()); } } System.out.println("Processed " + processed +" files, got " +errors+ " errors. Files that was not successfully processed " + failedToParse); } private void transform(PrismContext prismContext, File inFile, String output, String lang) throws SchemaException, IOException{ PrismObject parsed = prismContext.parseObject(inFile); String s = prismContext.serializeObjectToString(parsed, lang); if (StringUtils.isNotBlank(outputDirecorty)){ } String outName = getOutputFileName(inFile, lang); System.out.println("file will be saved as: " + outName); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(outputDirecorty, outName))); PrismObject object = prismContext.parseObject(inFile); String serialized = prismContext.serializeObjectToString(object, lang); bos.write(serialized.getBytes()); bos.flush(); bos.close(); } private String getOutputFileName(File inFile, String outFormat) { String out = inFile.getName(); if (out.endsWith(".xml")){ return out.replace("xml", outFormat); } else if (out.endsWith(".json")){ return out.replace("json", outFormat); } else if (out.endsWith(".yaml")){ return out.replace("yaml", outFormat); } else throw new UnsupportedOperationException("Transformation for file " + inFile.getName() +" not supported."); } private String getOutput(File inFile) { if (outputDirecorty == null){ if (inFile.isDirectory()){ return inFile.getAbsolutePath(); } else{ int end = inFile.getAbsolutePath().lastIndexOf("/"); return inFile.getAbsolutePath().substring(0, end); } } else{ return outputDirecorty; } } private String getOutputLanguage(String outFormat){ if (outFormat.toLowerCase().equals(PrismContext.LANG_JSON)){ return PrismContext.LANG_JSON; } else if (outFormat.toLowerCase().equals(PrismContext.LANG_YAML)){ return PrismContext.LANG_YAML; } else if (outFormat.toLowerCase().equals(PrismContext.LANG_XML)){ return PrismContext.LANG_XML; } else throw new UnsupportedOperationException("Specified output format '"+outFormat+"'not supported"); } }