/* * [ScriptItem.java] * * Summary: base class for user-written search/replace Script. * * Copyright: (c) 2014-2017 Roedy Green, Canadian Mind Products, http://mindprod.com * * Licence: This software may be copied and used freely for any purpose but military. * http://mindprod.com/contact/nonmil.html * * Requires: JDK 1.8+ * * Created with: JetBrains IntelliJ IDEA IDE http://www.jetbrains.com/idea/ * * Version History: * 1.0 2014-12-29 initial version */ package com.mindprod.rep; import java.util.regex.Matcher; import java.util.regex.Pattern; import static java.lang.System.*; /** * base class for user-written search/replace Script. * * @author Roedy Green, Canadian Mind Products * @version 1.0 2014-12-29 initial version * @since 2014-12-29 */ public class ScriptItem { // declarations /** * string to replace found text, plain or with $ to copy group */ private final String replaceString; /** * plain search string */ private final String searchString; /** * regex search pattern */ private final Pattern searchPattern; /** * did this script item result in any file changes */ private boolean used = false; // /declarations /** * constructor for plain string search/replace * * @param search plain search string * @param replace string to replace found text */ public ScriptItem( String search, String replace ) { this.searchString = search; this.searchPattern = null; this.replaceString = replace; } /** * constructor for plain string search/replace * * @param search plain regex search pattern * @param replace string to replace found text with $ to copy group */ public ScriptItem( Pattern search, String replace ) { this.searchPattern = search; this.searchString = null; this.replaceString = replace; } // methods /** * do all replacements in one file for one ScriptItem replacement. * * @param prev the file contents as modified so far. * * @return modified string */ String doReplacements( String prev ) { if ( searchString != null ) { final String modified = prev.replace( searchString, replaceString ); if ( modified.equals( prev ) ) { return prev; } else { used = true; return modified; } } else { try { // where we collect the replacement. Must be a StringBuffer, not a StringBuilder. Regex has a legacy problem. final StringBuffer sb = new StringBuffer( prev.length() ); final Matcher m = searchPattern.matcher( prev ); boolean changed = false; while ( m.find() ) { m.appendReplacement( sb, replaceString ); changed = true; used = true; } if ( changed ) { // we have now processed the replacements. m.appendTail( sb ); return sb.toString(); } else { return prev; } } catch ( IndexOutOfBoundsException e ) { err.println( e.getMessage() ); err.println( searchPattern ); err.println( replaceString ); System.exit( 1 ); return prev; } } }// /method /** * did this script item result in any replacements? * * @return true if were replacements. */ public boolean isUsed() { return used; }// /method /** * display ScriptItem as a String * * @return representation of ScriptItem */ public String toString() { if ( searchString != null ) { return searchString + " : " + replaceString; } else { return searchPattern.toString() + " : " + replaceString; } }// /method // /methods }