1ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba/** 2ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * Copyright 2007 Google Inc. 3ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * 4ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * Licensed under the Apache License, Version 2.0 (the "License"); 5ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * you may not use this file except in compliance with the License. 6ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * You may obtain a copy of the License at 7ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * 8ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * http://www.apache.org/licenses/LICENSE-2.0 9ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * 10ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * Unless required by applicable law or agreed to in writing, software 11ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * distributed under the License is distributed on an "AS IS" BASIS, 12ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * See the License for the specific language governing permissions and 14ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * limitations under the License. 15ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba */ 16ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba 17ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosibapackage com.tonicsystems.jarjar; 18ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba 19ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosibaimport java.io.*; 20ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosibaimport java.util.*; 21ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba 22ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosibaclass RulesFileParser 23ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba{ 24ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba private RulesFileParser() { 25ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } 26ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba 27ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba public static List<PatternElement> parse(File file) throws IOException { 28ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba return parse(new FileReader(file)); 29ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } 30ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba 31ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba public static List<PatternElement> parse(String value) throws IOException { 32ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba return parse(new java.io.StringReader(value)); 33ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } 34ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba 35ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba private static String stripComment(String in) { 36ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba int p = in.indexOf("#"); 37ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba return p < 0 ? in : in.substring(0, p); 38ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } 39ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba 40ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba private static List<PatternElement> parse(Reader r) throws IOException { 41ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba try { 42ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba List<PatternElement> patterns = new ArrayList<PatternElement>(); 43ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba BufferedReader br = new BufferedReader(r); 44ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba int c = 1; 45ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba String line; 46ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba while ((line = br.readLine()) != null) { 47ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba line = stripComment(line); 48ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba if (line.isEmpty()) 49ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba continue; 50ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba String[] parts = line.split("\\s+"); 51ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba if (parts.length < 2) 52ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba error(c, parts); 53ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba String type = parts[0]; 54ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba PatternElement element = null; 55ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba if (type.equals("rule")) { 56ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba if (parts.length < 3) 57ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba error(c, parts); 58ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba Rule rule = new Rule(); 59ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba rule.setResult(parts[2]); 60ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba element = rule; 61ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } else if (type.equals("zap")) { 62ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba element = new Zap(); 63ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } else if (type.equals("keep")) { 64ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba element = new Keep(); 65ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } else { 66ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba error(c, parts); 67ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } 68ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba element.setPattern(parts[1]); 69ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba patterns.add(element); 70ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba c++; 71ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } 72ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba return patterns; 73ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } finally { 74ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba r.close(); 75ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } 76ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } 77ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba 78ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba private static void error(int line, String[] parts) { 79ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba throw new IllegalArgumentException("Error on line " + line + ": " + Arrays.asList(parts)); 80ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } 81ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba} 82