/* 
 * Copyright (c) JForum Team 
 * All rights reserved. 
 *  
 * Redistribution and use in source and binary forms,  
 * with or without modification, are permitted provided  
 * that the following conditions are met: 
 *  
 * 1) Redistributions of source code must retain the above  
 * copyright notice, this list of conditions and the  
 * following  disclaimer. 
 * 2)  Redistributions in binary form must reproduce the  
 * above copyright notice, this list of conditions and  
 * the following disclaimer in the documentation and/or  
 * other materials provided with the distribution. 
 * 3) Neither the name of "Rafael Steil" nor  
 * the names of its contributors may be used to endorse  
 * or promote products derived from this software without  
 * specific prior written permission. 
 *  
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT  
 * HOLDERS 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 COPYRIGHT OWNER 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 
 *  
 * Created on 11/07/2005 00:32:01 
 * The JForum Project 
 * http://www.jforum.net 
 */ 
 
/** 
 * Normalizes an URL.  
 * Normalization means replacing blank spaces by underlines,  
 * changing special chars by its regular form and etc. 
 * @author Rafael Steil 
 * @version $Id: URLNormalizer.java,v 1.4 2006/08/20 22:47:42 rafaelsteil Exp $ 
 */ 
public class URLNormalizer 
{ 
  public static final int LIMIT = 30; 
   
  /** 
   * Normalizes an URL. 
   * The url will be truncated at {@link #LIMIT} chars 
   * @param url the url to normalize 
   * @return the normalized url 
   * @see #normalize(String, int, boolean) 
   */ 
  public static String normalize(String url) 
  { 
    return normalize(url, LIMIT, true); 
  } 
   
  /** 
   *  
   * @param url the url to normalize 
   * @param limit do not process more than <code>limit + 1</code> chars 
   * @param friendlyTruncate If <code>true</code>, will try to not cut a word if 
   * more than <code>limit</code> chars were processed. It will stop in the next 
   * special char 
   * @return the normalized url 
   */ 
  public static String normalize(String url, int limit, boolean friendlyTruncate) 
  { 
    char[] chars = url.toCharArray(); 
     
    StringBuffer sb = new StringBuffer(url.length()); 
     
    for (int i = 0; i < chars.length; i++) { 
      if (i <= limit || (friendlyTruncate && i > limit && sb.charAt(sb.length() - 1) != '_')) { 
         
        if (Character.isSpaceChar(chars[i]) || chars[i] == '-') { 
          if (friendlyTruncate && i > limit) { 
            break; 
          } 
           
          if (i > 0 && sb.charAt(sb.length() - 1) != '_') { 
            sb.append('_'); 
          } 
        } 
         
        if (Character.isLetterOrDigit(chars[i])) { 
          sb.append(chars[i]); 
        } 
        else if (friendlyTruncate && i > limit) { 
          break; 
        } 
      } 
    } 
     
    return sb.toString().toLowerCase(); 
  } 
} 
/////////////// 
/* 
 * Created on 11/07/2005 00:25:19 
 */ 
package net.jforum.util; 
 
import junit.framework.TestCase; 
 
/** 
 * Remove special chars, spaces and etc from a string 
 * @author Rafael Steil 
 * @version $Id: URLNormalizerTest.java,v 1.4 2005/07/26 04:01:12 diegopires Exp $ 
 */ 
public class URLNormalizerTest extends TestCase 
{ 
  public void testReplaceSpaceByUnderline() 
  { 
    String s = "this is a test"; 
    String normalized = URLNormalizer.normalize(s); 
     
    assertEquals("this_is_a_test", normalized); 
  } 
   
  public void testFriendlyLimit() 
  { 
    String s = "this is long string used for testing the limit"; 
    String normalized = URLNormalizer.normalize(s); 
     
    assertEquals("this_is_long_string_used_for_testing", normalized); 
  } 
   
  public void testUnfriendlyLimit() 
  { 
    String s = "this is long string used for testing the limit"; 
    String normalized = URLNormalizer.normalize(s, URLNormalizer.LIMIT, false); 
     
    assertEquals("this_is_long_string_used_for_te", normalized); 
  } 
   
  public void testFriendlyLimitWithParentesis() 
  { 
    String s = "this is long string used for testing(the limit)"; 
    String normalized = URLNormalizer.normalize(s); 
     
    assertEquals("this_is_long_string_used_for_testing", normalized); 
  } 
   
  public void testRemovePlusParentesis() 
  { 
    String s = "a test + some + 2 thing(s)"; 
    String normalized = URLNormalizer.normalize(s); 
     
    assertEquals("a_test_some_2_things", normalized); 
  } 
   
  public void testRemovePorcentageDollarStarEtc() 
  { 
    String s = "!@#$%^&*"; 
    String normalized = URLNormalizer.normalize(s); 
     
    assertEquals("", normalized); 
  } 
} 
 
    
     
     
     
  
  |