package coreservlets.filters;

/** Filtr zastępuje wszystkie wystąpienia ciągu znaków target
 *  ciągiem zastępczym replacement. Ciągi target oraz
 *  replacement są zdefiniowane jako parametry inicjalizacyjne
 *  filtra w pliku web.xml.
 *  <P>
 *  Taken from Core Servlets and JavaServer Pages Volume II
 *  from Prentice Hall and Sun Microsystems Press,
 *  http://volume2.coreservlets.com/.
 *  (C) 2007 Marty Hall, Larry Brown, and Yaakov Chaikin;
 *  may be freely used or adapted.
 */
public class ReplaceSiteNameFilter extends ModificationFilter {
	private boolean isCaseInsensitive = false;
	
  /** Ciąg znaków przeznaczony do zastąpienia.
   */
  public String getTarget() {
  	return getInitParameter("target");
  }

  /** Ciąg znaków zastępujący ciąg znaków target.
   */
  public String getReplacement() {
  	return getInitParameter("replacement");
  }
  
  /** Zwraca wartość parametru inicjalizacyjnego wskazanego przez
   * 'param' lub wartość null, jeśli parametr nie występuje
   *  bądź też jest pustym ciągiem znaków.
   */
  private String getInitParameter(String param) {
  	String value = config.getInitParameter(param);
  	if ((value == null) || (value.trim().equals(""))) {
  		value = null;
  	}
  	
  	return value;
  }
  
  /** Wskazanie, czy w trakcie wyszukiwania ciągu target
   *  ma być uwzględniana wielkość znaków.
   */
  public void setCaseInsensitive(boolean flag) {
    isCaseInsensitive = flag;
  }

  /** Zwraca wartość true lub false wskazującą, czy
   *  w wyszukiwaniu ciągu target uwzględniana ma być
   *  wielkość znaków.
   */
  public boolean isCaseInsensitive() {
    return(isCaseInsensitive);
  }

  /** Zastępuje wszystkie ciągi odpowiadające ciągowi target
   *  ciągiem zastępującym replacement.
   */
  public String doModification(String orig) {
    if ((getTarget() == null) || (getReplacement() == null)) {
      return(orig);
    } else {
      String target = getTarget();
      if (isCaseInsensitive()) {
        target = "(?i)" + target;
      }
      String replacement = getReplacement();
      return(orig.replaceAll(target, replacement));
    }
  }
}
