package hudson.plugins.accurev; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.WeakHashMap; import java.util.logging.Logger; /** * */ public class XmlConsolidateStreamChangeLog { private static final Logger logger = Logger.getLogger(AccurevSCM.class.getName()); private static final Map<Class<XMLOutputFactory>, XMLOutputFactory> OUTPUT_FACTORY_CACHE = new WeakHashMap<>(1); static XMLOutputFactory getFactory() { synchronized (OUTPUT_FACTORY_CACHE) { final XMLOutputFactory existingFactory = OUTPUT_FACTORY_CACHE.get(XMLOutputFactory.class); if (existingFactory != null) { return existingFactory; } XMLOutputFactory newFactory = XMLOutputFactory.newFactory(); OUTPUT_FACTORY_CACHE.put(XMLOutputFactory.class, newFactory); return newFactory; } } public static File getStreamChangeLogFile(File changelogFile, AccurevStream stream) { File dir = changelogFile.getParentFile(); return new File(dir, stream.getName() + "_" + changelogFile.getName()); } public static File getUpdateChangeLogFile(File changelogFile) { File dir = changelogFile.getParentFile(); return new File(dir, "update_" + changelogFile.getName()); } public static void createChangeLog(List<String> streamFiles, File changeLogFile, String updateFile) throws IOException { try (FileOutputStream changeLogStream = new FileOutputStream(changeLogFile)) { XMLOutputFactory outputFactory = getFactory(); XMLStreamWriter streamWriter = outputFactory.createXMLStreamWriter(changeLogStream); streamWriter.writeStartDocument(); streamWriter.writeStartElement("ChangeLogs"); if (updateFile != null) { streamWriter.writeStartElement("UpdateLog"); streamWriter.writeCharacters(updateFile); streamWriter.writeEndElement(); } for (String streamFile : streamFiles) { streamWriter.writeStartElement("ChangeLog"); streamWriter.writeCharacters(streamFile); streamWriter.writeEndElement(); } streamWriter.writeEndElement(); streamWriter.writeEndDocument(); } catch (FileNotFoundException | XMLStreamException ex) { AccurevLauncher.logException("Unable to create consolidated changelog " + XmlConsolidateStreamChangeLog.class.getSimpleName(), ex, logger, null); } } }