package eu.doppel_helix.netbeans.mantisintegration.repository; import eu.doppel_helix.netbeans.mantisintegration.issue.serialization.IssueInfo; import eu.doppel_helix.netbeans.mantisintegration.issue.serialization.IssueInfos; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; import java.math.BigInteger; import java.nio.file.Files; import java.nio.file.StandardCopyOption; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.util.RequestProcessor.Task; public class IssueInfosHandler { private static final Logger LOG = Logger.getLogger(IssueInfosHandler.class.getName()); private static JAXBContext ctx; static { try { ctx = JAXBContext.newInstance( "eu.doppel_helix.netbeans.mantisintegration.issue.serialization", IssueInfosHandler.class.getClassLoader()); } catch (JAXBException ex) { throw new RuntimeException(ex); } } private final IssueInfos infos; private final FileObject storage; private final Task SAVER; public IssueInfosHandler(MantisRepository mr) { storage = mr.getBaseConfigFileObject(); FileObject dataFile = storage.getFileObject("issueInfos.xml"); IssueInfos tempInfos; if (dataFile != null) { try { tempInfos = (IssueInfos) ctx.createUnmarshaller().unmarshal(dataFile.getInputStream()); } catch (JAXBException | FileNotFoundException ex) { LOG.log(Level.WARNING, "Failed to read IssueInfos file, please report this as a bug", ex); tempInfos = new IssueInfos(); } } else { tempInfos = new IssueInfos(); } infos = tempInfos; SAVER = mr.getRequestProcessor().create(new Runnable() { @Override public void run() { FileObject dataFile = storage.getFileObject("issueInfos.xml.new"); try { if (dataFile == null) { dataFile = storage.createData("issueInfos.xml.new"); } try (OutputStream os = dataFile.getOutputStream()) { ctx.createMarshaller().marshal(infos, os); } File baseDir = FileUtil.toFile(storage); Files.move( new File(baseDir, "issueInfos.xml.new").toPath(), new File(baseDir, "issueInfos.xml").toPath(), StandardCopyOption.REPLACE_EXISTING); } catch (JAXBException | IOException ex) { LOG.log(Level.WARNING, "Failed to write IssueInfos file, please report this as a bug", ex); } } }); } public IssueInfo getIssueInfo(BigInteger id) { IssueInfo ii = infos.getIssueInfo(id); if (ii == null) { return null; } return (IssueInfo) (ii.clone()); } public void putIssueInfo(IssueInfo i) { infos.putIssueInfo(i); SAVER.schedule(1000); } }