/** * JLibs: Common Utilities for Java * Copyright (C) 2009 Santhosh Kumar T <santhosh.tekuri@gmail.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. */ package slacknotifications.teamcity.payload.util; import java.io.*; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author Santhosh Kumar T * * This code is taken from jlibs. * * http://code.google.com/p/jlibs/source/browse/trunk/core/src/main/java/jlibs/core/util/regex/TemplateMatcher.java * */ public class TemplateMatcher{ private Pattern pattern; public TemplateMatcher(String leftBrace, String rightBrace){ leftBrace = Pattern.quote(leftBrace); rightBrace = Pattern.quote(rightBrace); pattern = Pattern.compile(leftBrace+"(.*?)"+rightBrace); } public TemplateMatcher(String prefix){ prefix = Pattern.quote(prefix); pattern = Pattern.compile(prefix+"(\\w*)"); } /*-------------------------------------------------[ Replace ]---------------------------------------------------*/ public String replace(CharSequence input, VariableResolver resolver){ StringBuilder buff = new StringBuilder(); Matcher matcher = pattern.matcher(input); int cursor = 0; while(cursor<input.length() && matcher.find(cursor)){ buff.append(input.subSequence(cursor, matcher.start())); String value = resolver.resolve(matcher.group(1)); buff.append(value!=null ? value : matcher.group()); cursor = matcher.end(); } buff.append(input.subSequence(cursor, input.length())); return buff.toString(); } public String replace(String input, final Map<String, String> variables){ return replace(input, new MapVariableResolver(variables)); } /*-------------------------------------------------[ Character Streams ]---------------------------------------------------*/ public void replace(Reader reader, Writer writer, VariableResolver resolver) throws IOException{ BufferedReader breader = reader instanceof BufferedReader ? (BufferedReader)reader : new BufferedReader(reader); BufferedWriter bwriter = writer instanceof BufferedWriter ? (BufferedWriter)writer : new BufferedWriter(writer); try{ boolean firstLine = true; for(String line; (line=breader.readLine())!=null;){ if(firstLine) firstLine = false; else bwriter.newLine(); bwriter.write(replace(line, resolver)); } }finally{ try{ breader.close(); }finally{ bwriter.close(); } } } public void replace(Reader reader, Writer writer, Map<String, String> variables) throws IOException{ replace(reader, writer, new MapVariableResolver(variables)); } /*-------------------------------------------------[ VariableResolver ]---------------------------------------------------*/ public static interface VariableResolver{ public String resolve(String variable); } public static class MapVariableResolver implements VariableResolver{ private Map<String, String> variables; public MapVariableResolver(Map<String, String> variables){ this.variables = variables; } @Override public String resolve(String variable){ return variables.get(variable); } } }