// Copyright (C) 2002 IAIK
// email: jce-info@iaik.tu-graz.ac.at
//
// All rights reserved.
//
// This source is provided for inspection purposes and recompilation only,
// unless specified differently in a contract with IAIK. This source has to
// be kept in strict confidence and must not be disclosed to any third party
// under any circumstances. Redistribution in source and binary forms, with
// or without modification, are <not> permitted in any case!
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
// SUCH DAMAGE.
//

package at.gv.egovernment.moa.util;

import java.util.StringTokenizer;

/**
 * Utitility functions for string manipulations.
 * 
 * @author Harald Bratko
 */
public class StringUtils {

  /**
   * Removes all blanks and tabs from the given string.
   * 
   * @param s The string to remove all blanks and tabs from.
   * @return  The input string with all blanks and tabs removed from. 
   */
  public static String removeBlanks(String s) {
    StringTokenizer st = new StringTokenizer(s);
    StringBuffer sb = new StringBuffer(s.length());
    while (st.hasMoreTokens()) {
      sb.append(st.nextToken());
    }
    return sb.toString();
  }
  
  /**
   * Removes all occurences of the specified token from the the given string.
   * 
   * @param s The string to remove all occurences of the specified token from.
   * @return  The input string with all occurences of the specified token removed from. 
   */
  public static String removeToken(String s, String token) {
    StringTokenizer st = new StringTokenizer(s, token);
    StringBuffer sb = new StringBuffer(s.length());
    while (st.hasMoreTokens()) {
      sb.append(st.nextToken());
    }
    return sb.toString();
  }
  
  /**
   * Removes all leading zeros from the input string.
   * 
   * @param s       The string remove the leading zeros from.
   * @return        The input string with the leading zeros removed from.
   */
  public static String deleteLeadingZeros(String s) {
    StringBuffer sb = new StringBuffer(s);
    int l = sb.length();
    int j = 0;
    for (int i=0; i<l; i++) {
      if (sb.charAt(i) == '0') {
        j++;
      } else {
        break;
      }
    }
    return sb.substring(j, l);
  }
  
  /**
   * Replaces each substring of string <code>s</code> that matches the given
   * <code>search</code> string by the given <code>replace</code> string.
   * 
   * @param s         The string where the replacment should take place.
   * @param search    The pattern that should be replaced.
   * @param replace   The string that should replace all each <code>search</code>
   *                  string within <code>s</code>.
   * @return          A string whrer all occurrence of <code>search</code> are
   *                  replaced with <code>replace</code>.
   */
  public static String replaceAll (String s, String search, String replace)
  {
     StringBuffer sb = new StringBuffer();
     int i = 0, j = 0;
     int len = search.length();
     while (j > -1)
     {
         j = s.indexOf(search, i);

         if (j > -1)
         {
           sb.append(s.substring(i,j));
           sb.append(replace);
           i = j + len;
         }
     }
     
     sb.append(s.substring(i, s.length()));

     return sb.toString();
  }
  
  /**
   * Changes the SecurityLayer version in the given string.
   * This method usually takes as input an XML structure represented in a string
   * format and changes the SecurityLayer namespaces prefixes and URIs from
   * one SecurityLayer version to another.
   * e.g.: code>sl10</code> to <code>sl</code> and 
   * <code>http://www.buergerkarte.at/namespaces/securitylayer/20020225#</code>
   * to
   * <code>http://www.buergerkarte.at/namespaces/securitylayer/1.2#</code> 
   * 
   * @param s             The string (usally an XML structure) where the
   *                      SecurityLayer version should be changed.
   * @param slPrefixOld   The SecurityLayer namespace prefix that should be  
   *                      replaced by the new one.
   * @param slPrefixNew   The new SecurityLayer namespace prefix that should 
   *                      replace the old one.
   * @param slNSUriOld    The SecurityLayer namespace URI that should be  
   *                      replaced by the new one.
   * @param slNSUriNew    The new SecurityLayer namespace URI that should 
   *                      replace the old one.
   * @return              A string where the SecurityLayer namespace prefixes
   *                      and URIs are replaced by new ones.
   */
  public static String changeSLVersion(String s, String slPrefixOld, String slPrefixNew, String slNSUriOld, String slNSUriNew) {
    String retString = replaceAll(s, slPrefixOld, slPrefixNew);
    retString = replaceAll(retString, slNSUriOld, slNSUriNew);
    return retString ;
  }
  
  /**
   * Removes the XML declaration from an XML expression.
   * 
   * @param xmlString XML expression as String
   * 
   * @return XML expression, XML declaration removed
   */
  public static String removeXMLDeclaration(String xmlString) {
    if (xmlString.startsWith("<?xml")) {
      int firstElement = xmlString.indexOf("<", 1);
      return xmlString.substring(firstElement);
    } else {
      return xmlString;
    }
  }
  
}