/** * TaskUtils.java * * Copyright (C) 2010, Volker Boerchers * * Translator.java is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Translator.java is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ package org.freeplane.ant; import java.io.BufferedWriter; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.Vector; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.tools.ant.DefaultLogger; import org.apache.tools.ant.Project; import org.apache.tools.ant.Task; import org.apache.tools.ant.input.InputHandler; import org.apache.tools.ant.input.InputRequest; import org.apache.tools.ant.input.MultipleChoiceInputRequest; import org.apache.tools.ant.util.StringUtils; public class TaskUtils { static class IncludeFileFilter implements FileFilter { private ArrayList<Pattern> includePatterns = new ArrayList<Pattern>(); private ArrayList<Pattern> excludePatterns = new ArrayList<Pattern>(); IncludeFileFilter(ArrayList<Pattern> includePatterns, ArrayList<Pattern> excludePatterns) { this.includePatterns = includePatterns; this.excludePatterns = excludePatterns; } public boolean accept(File pathname) { if (pathname.isDirectory()) return false; for (Pattern pattern : excludePatterns) { if (pattern.matcher(pathname.getName()).matches()) return false; } if (includePatterns.isEmpty()) return true; for (Pattern pattern : includePatterns) { if (pattern.matcher(pathname.getName()).matches()) return true; } return false; } } static void writeFile(File outputFile, ArrayList<String> sortedLines, String lineSeparator) throws IOException { BufferedWriter out = null; try { out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile), "US-ASCII")); for (String line : sortedLines) { out.write(line.replaceAll("\\\\[\n\r]+", "\\\\" + lineSeparator)); // change this to write(<sep>) to enforce Unix or Dos or Mac newlines out.write(lineSeparator); } } finally { if (out != null) { try { out.close(); } catch (IOException e) { // can't help it } } } } // adapted from http://www.rgagnon.com/javadetails/java-0515.html, Real Gagnon public static String wildcardToRegex(String wildcard) { StringBuilder s = new StringBuilder(wildcard.length()); s.append('^'); for (int i = 0, is = wildcard.length(); i < is; i++) { char c = wildcard.charAt(i); switch (c) { case '*': s.append(".*"); break; case '?': s.append("."); break; // escape special regexp-characters case '(': case ')': case '$': case '^': case '.': case '{': case '}': case '|': case '\\': s.append("\\"); s.append(c); break; default: s.append(c); break; } } s.append('$'); return (s.toString()); } static String readFile(final File inputFile) throws IOException { InputStreamReader in = null; try { in = new InputStreamReader(new FileInputStream(inputFile), "US-ASCII"); StringBuilder builder = new StringBuilder(); final char[] buf = new char[1024]; int len; while ((len = in.read(buf)) > 0) { builder.append(buf, 0, len); } return builder.toString(); } finally { if (in != null) { try { in.close(); } catch (IOException e) { // can't help it } } } } /** returns true if all eols match <code>lineSep</code>. */ /*package*/static boolean checkEolStyleAndReadLines(String input, ArrayList<String> resultList, String lineSep) { resultList.clear(); boolean eolStyleMatches = true; final Matcher matcher = Pattern.compile("(?<!\\\\)(\r\n?|\n)").matcher(input); int index = 0; while (matcher.find()) { final String match = input.subSequence(index, matcher.start()).toString(); final String separator = matcher.group(1); if (separator.equals("\n") && match.endsWith("\\\r")) { // only windows: catch escaped CRLF (\\r\n) which will be parsed as \\r<split>\n // not setting index will simply skip this match } else { if (!matchEolStyle(separator, lineSep)) { eolStyleMatches = false; } resultList.add(match); index = matcher.end(); } } // Add remaining segment if (input.length() > index) resultList.add(input.subSequence(index, input.length()).toString()); return eolStyleMatches; } /*package*/static boolean matchEolStyle(String eol, String lineSep) { // quick success in the normal case if (lineSep.equals(eol)) return true; int i = 0; for (; i < eol.length(); i += lineSep.length()) { if (eol.indexOf(lineSep, i) != i) return false; } return i == eol.length(); } static String toLine(String key, String value) { return key + "=" + value; } static Project createProject(final Task task) { final Project project = new Project(); final DefaultLogger logger = new DefaultLogger(); logger.setMessageOutputLevel(Project.MSG_INFO); logger.setOutputPrintStream(System.out); logger.setErrorPrintStream(System.err); project.addBuildListener(logger); task.setProject(project); return project; } static String firstToUpper(String string) { if (string == null || string.length() < 2) return string; return string.substring(0, 1).toUpperCase() + string.substring(1); } @SuppressWarnings("unchecked") static String multipleChoice(Project project, String message, String validValues, String defaultValue) { InputRequest request = null; if (validValues != null) { Vector<String> accept = StringUtils.split(validValues, ','); request = new MultipleChoiceInputRequest(message, accept); } else { request = new InputRequest(message); } InputHandler handler = project.getInputHandler(); handler.handleInput(request); final String value = request.getInput(); if ((value == null || value.trim().length() == 0) && defaultValue != null) { return defaultValue; } return value; } static String ask(Project project, String message, String defaultValue) { return multipleChoice(project, message, defaultValue, null); } }