/* ******************************************************************************* * Copyright (C) 2006-2010, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* */ package com.ibm.icu.dev.tool.docs; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; public class SwatDeprecated { private File srcFile; private File dstFile; private int maxLength = 85; private String srcPrefix; private String dstPrefix; private String srcTag; private String trgTag; private boolean overwrite; private int verbosity; private int cc; // changed file count //private boolean inPlace; private String copyYear; private PrintWriter pw = new PrintWriter(System.out); private static FilenameFilter ff = new FilenameFilter() { public boolean accept(File dir, String name) { return (new File(dir, name).isDirectory() && !"CVS".equals(name)) || (!name.equals("SwatDeprecated.java") && name.endsWith(".java")); } }; public static void main(String[] args) { String src = System.getProperty("user.dir"); String dst = src; boolean dep = true; boolean ovr = false; int vrb = 1; for (int i = 0; i < args.length; ++i) { String arg = args[i].toLowerCase(); if (arg.charAt(0) == '-') { if (arg.equals("-src")) { src = args[++i]; } else if (arg.equals("-dst")) { dst = args[++i]; } else if (arg.equals("-dep")) { dep = true; } else if (arg.equals("-prov")) { dep = false; } else if (arg.equals("-overwrite")) { ovr = true; } else if (arg.equals("-silent")) { // no output vrb = 0; } else if (arg.equals("-quiet")) { // output parameters and count of changed files (default) vrb = 1; } else if (arg.equals("-verbose")) { // output names of modified files vrb = 2; } else if (arg.equals("-noisy")) { // output names of files not modified vrb = 3; } else if (arg.equals("-copydebug")) { // output copyright debugging vrb = 4; } else if (arg.equals("-debug")) { // output all debugging vrb = 5; } } } new SwatDeprecated(src, dst, dep, ovr, vrb).run(); } public SwatDeprecated(String src, String dst, boolean dep, boolean overwrite, int verbosity) { this.srcFile = new File(src); this.dstFile = new File(dst); this.overwrite = overwrite; this.verbosity = verbosity; this.copyYear = new SimpleDateFormat("yyyy").format(new Date()); this.srcTag = "@deprecated This is a draft API and might change in a future release of ICU."; this.trgTag = "@provisional This API might change or be removed in a future release."; if (!dep) { String temp = srcTag; srcTag = trgTag; trgTag = temp; } try { this.srcPrefix = srcFile.getCanonicalPath(); this.dstPrefix = dstFile.getCanonicalPath(); } catch (IOException e) { RuntimeException re = new RuntimeException(e.getMessage()); re.initCause(e); throw re; } //this.inPlace = srcPrefix.equals(dstPrefix); this.cc = 0; if (verbosity >= 1) { pw.println("replacing '" + srcTag + "'"); pw.println(" with '" + trgTag + "'"); pw.println(); pw.println(" source: '" + srcPrefix + "'"); pw.println("destination: '" + dstPrefix + "'"); pw.println(" overwrite: " + overwrite); pw.println(" verbosity: " + verbosity); pw.flush(); } } public void run() { if (!srcFile.exists()) { throw new RuntimeException("file " + srcFile.getPath() + " does not exist."); } doList(srcFile); if (verbosity >= 1) { pw.println("changed " + cc + " file(s)"); pw.flush(); } } public void doList(File file) { String[] filenames = file.list(ff); if (verbosity >= 5) { pw.println(file.getPath()); dumpList(filenames); pw.flush(); } for (int i = 0; i < filenames.length; ++i) { File f = new File(file, filenames[i]); if (f.isDirectory()) { doList(f); } else { processFile(f); } } } public void processFile(File inFile) { File bakFile = null; try { String inPath = inFile.getCanonicalPath(); if (verbosity >= 5) { pw.println("processFile: " + inPath); } String outPath = dstPrefix + inPath.substring(srcPrefix.length()); File outFile = new File(outPath); File tmpFile = null; if (outFile.exists()) { if (!overwrite) { throw new RuntimeException("no permission to overwrite file: " + outPath); } else { bakFile = outFile; tmpFile = File.createTempFile(inFile.getName(), null, inFile.getParentFile()); } } else { tmpFile = outFile; File parent = tmpFile.getParentFile(); parent.mkdirs(); tmpFile.createNewFile(); } String tmpPath = tmpFile.getPath(); if (verbosity >= 5) { pw.println("tmpFile: " + tmpPath); } InputStream is = new FileInputStream(inFile); OutputStream os = new FileOutputStream(tmpFile); PrintStream ps = new PrintStream(os); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line; int n = 0; int tc = 0; // boolean debug = false; while (null != (line = br.readLine())) { // int temp = line.indexOf("@deprecated"); int ix = line.indexOf(srcTag); // if (temp != -1 && ix == -1) { // if (debug == false) { // debug = true; // pw.println("file: " + name); // } // pw.println("[" + n + "] " + line); // pw.flush(); // } if (ix != -1) { if (verbosity >= 5) { pw.println("[" + n + "] " + line); } line = line.substring(0,ix) + trgTag; ++tc; } else if (n < 20) { // swat copyrights in the first 20 lines while we're at it ix = line.indexOf("opyright"); if (ix != -1) { String nline = null; do { if (verbosity == 4) { pw.println("[" + n + "] " + line); } ix = line.indexOf("-200"); if (ix != -1) { nline = line.substring(0, ix) + "-" + copyYear + line.substring(ix+5); break; } ix = line.indexOf("- 200"); if (ix != -1) { nline = line.substring(0, ix) + "-" + copyYear + line.substring(ix+6); break; } ix = line.indexOf("-199"); if (ix != -1) { nline = line.substring(0, ix) + "-" + copyYear + line.substring(ix+5); break; } ix = line.indexOf(copyYear); if (ix != -1) { break; // nothing needs changing } ix = line.indexOf("200"); if (ix != -1) { nline = line.substring(0, ix+4) + "-" + copyYear + line.substring(ix+4); break; } ix = line.indexOf("199"); if (ix != -1) { nline = line.substring(0, ix+4) + "-" + copyYear + line.substring(ix+4); break; } } while (false); if (nline != null) { if (verbosity >= 4) { pw.println(" --> " + nline); } line = nline; } } } ps.println(line); ++n; } ps.flush(); is.close(); os.close(); if (tc == 0) { // nothing changed, forget this file if (verbosity >= 3) { pw.println("no changes in file: " + inPath); } if (!tmpFile.delete()) { throw new RuntimeException("unable to delete unneeded temporary file: " + tmpPath); } return; } if (bakFile != null) { if (bakFile.exists()) { bakFile.delete(); } if (!tmpFile.renameTo(bakFile)) { pw.println("warning: couldn't rename temp file to: " + outPath); } } outFile.setLastModified(inFile.lastModified()); if (verbosity >= 2) { pw.println(inPath); pw.flush(); } } catch (IOException e) { RuntimeException re = new RuntimeException(e.getMessage()); re.initCause(e); throw re; } finally { pw.flush(); } ++cc; } public void dumpList(String[] names) { if (names == null) { pw.print("null"); } else { pw.print("{"); int lc = 0; if (names.length > 0) { pw.println(); pw.print(" "); lc = 4; } for (int i = 0; i < names.length; ++i) { String name = names[i]; int nl = name.length(); if (lc + nl > maxLength) { pw.println(); pw.print(" "); lc = 4; } pw.print(name); pw.print(", "); lc += nl + 2; } if (names.length > 0) { pw.println(); } pw.print("} "); } } }