17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
3aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert * Copyright (C) 2002-2015, International Business Machines Corporation and
4aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert * others. All Rights Reserved.
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.util;
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.BufferedReader;
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.IOException;
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.PrintWriter;
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class FileUtilities {
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void appendFile(String filename, String encoding, PrintWriter output) throws IOException {
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        appendFile(filename, encoding, output, null);
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void appendFile(String filename, String encoding, PrintWriter output, String[] replacementList) throws IOException {
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        BufferedReader br = BagFormatter.openReader("", filename, encoding);
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FileInputStream fis = new FileInputStream(filename);
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        InputStreamReader isr = (encoding == UTF8_UNIX || encoding == UTF8_WINDOWS) ? new InputStreamReader(fis, "UTF8") :  new InputStreamReader(fis);
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        BufferedReader br = new BufferedReader(isr, 32*1024);
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        */
26aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert        try {
27aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert            appendBufferedReader(br, output, replacementList);
28aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert        } finally {
29aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert            br.close();
30aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert        }
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void appendBufferedReader(BufferedReader br,
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            PrintWriter output, String[] replacementList) throws IOException {
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        while (true) {
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String line = br.readLine();
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (line == null) break;
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (replacementList != null) {
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                for (int i = 0; i < replacementList.length; i += 2) {
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    line = replace(line, replacementList[i], replacementList[i+1]);
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            output.println(line);
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        br.close();
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Replaces all occurances of piece with replacement, and returns new String
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static String replace(String source, String piece, String replacement) {
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (source == null || source.length() < piece.length()) return source;
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int pos = 0;
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        while (true) {
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            pos = source.indexOf(piece, pos);
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (pos < 0) return source;
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            source = source.substring(0,pos) + replacement + source.substring(pos + piece.length());
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            pos += replacement.length();
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static String replace(String source, String[][] replacements) {
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return replace(source, replacements, replacements.length);
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static String replace(String source, String[][] replacements, int count) {
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < count; ++i) {
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            source = replace(source, replacements[i][0], replacements[i][1]);
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return source;
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static String replace(String source, String[][] replacements, boolean reverse) {
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!reverse) return replace(source, replacements);
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < replacements.length; ++i) {
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            source = replace(source, replacements[i][1], replacements[i][0]);
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return source;
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static String anchorize(String source) {
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String result = source.toLowerCase(Locale.ENGLISH).replaceAll("[^\\p{L}\\p{N}]+", "_");
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (result.endsWith("_")) result = result.substring(0,result.length()-1);
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (result.startsWith("_")) result = result.substring(1);
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return result;
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
88