package hudson.plugins.doclinks; import hudson.FilePath; import hudson.Util; import hudson.model.AbstractProject; import hudson.util.FormValidation; import java.io.IOException; import java.io.PrintStream; import java.util.List; import java.util.StringTokenizer; /** * Utilities. * * @author Seiji Sogabe */ public final class DocLinksUtils { private DocLinksUtils() { // } public static void log(final PrintStream logger, final String message) { final StringBuilder builder = new StringBuilder(); builder.append('[').append(Constants.PLUGIN_NAME).append("] ").append(message); logger.println(builder.toString()); } /** * get the id, which has not been used. */ public static synchronized String getNextId(final List<Document> documents) { int max = 0; for (final Document doc : documents) { if (doc.getId() == null) { continue; } final int id = Integer.parseInt(doc.getId()); max = Math.max(max, id); } return String.valueOf(max + 1); } public static boolean isValidDirectory(final String dir) { if (dir == null) { return true; } String d = dir.replace("\\", "/"); if (!d.endsWith("/")) { d = d + "/"; } return d.indexOf("../") == -1; } public static String getDocumentId(final String path) { final StringTokenizer tokenizer = new StringTokenizer(path, "/"); if (tokenizer.hasMoreElements()) { return tokenizer.nextToken(); } return null; } public static FormValidation validateTitle(final String title) { final String t = Util.fixEmptyAndTrim(title); if (t == null) { return FormValidation.error(Messages.DocLinksUtils_Required()); } return FormValidation.ok(); } public static FormValidation validateDirectory(final AbstractProject<?, ?> project, final String directory) throws IOException { final String dir = Util.fixEmptyAndTrim(directory); if (!DocLinksUtils.isValidDirectory(dir)) { return FormValidation.error(Messages.DocLinksUtils_DirectoryInvalid()); } final FilePath ws = project.getSomeWorkspace(); return (ws != null) ? ws.validateRelativeDirectory(dir) : FormValidation.ok(); } public static FormValidation validateFile(final AbstractProject<?, ?> project, final String directory, final String file) throws IOException { final String f = Util.fixEmptyAndTrim(file); if (f == null) { FormValidation.ok(); } // job has not built yet final FilePath ws = project.getSomeWorkspace(); if (ws == null) { return FormValidation.ok(); } final String dir = Util.fixEmptyAndTrim(directory); final FilePath targetDir = (dir != null) ? new FilePath(ws, dir) : ws; return targetDir.validateRelativePath(file, true, true); } public static void publishDocument(final Document doc, final FilePath ws, final FilePath docLinksDir, final PrintStream logger) throws IOException, InterruptedException { final String directory = doc.getDirectory(); if (!DocLinksUtils.isValidDirectory(directory)) { final String cause = Messages.DocLinksUtils_DirectoryInvalid(); DocLinksUtils.log(logger, Messages.DocLinksUtils_SkipDocument(doc.getTitle(), cause)); throw new IOException("directory is invalid."); } final FilePath docDir = (directory != null) ? ws.child(directory) : ws; if (!docDir.exists()) { final String cause = Messages.DocLinksUtils_DirectoryNotExist(docDir.getName()); DocLinksUtils.log(logger, Messages.DocLinksUtils_SkipDocument(doc.getTitle(), cause)); throw new IOException("docDir does not exist."); } final FilePath target = new FilePath(docLinksDir, String.valueOf(doc.getId())); DocLinksUtils.log(logger, Messages.DocLinksUtils_CopyDocument(doc.getTitle(), target.getName())); docDir.copyRecursiveTo("**/*", target); } }