/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.framework.util; import java.io.UnsupportedEncodingException; import java.net.URL; import java.net.URLEncoder; import java.util.StringTokenizer; import org.apache.commons.codec.EncoderException; import org.apache.commons.codec.net.URLCodec; public class UrlPathEncoder { private static URLCodec URL_CODEC = new URLCodec( "UTF-8" ); public static String encode( String anyString ) { try { return URL_CODEC.encode( anyString ); } catch ( EncoderException e ) { throw new RuntimeException( "Failed to encode string: " + anyString, e ); } } /** * Encodes given url (like http://www.salg.no/båt) to ensure all special characters are within the generally understood character set. * * @param url The URL to encode. * @return The encoded URL. */ public static String encodeURL( String url ) { try { // this trick converts any non us ascii char to toASCIIString return new URL( url ).toURI().toASCIIString(); } catch ( Exception e ) { throw new RuntimeException( "Failed to encode url using URI.toASCIIString, url was: " + url, e ); } } /** * Encodes each element in path with given encoding using java.net.URLEncoder. Parameters and other parts of the URL that is not in the * path, are just kept like they are passed in. * * @param path The path to be translated. * @param encoding The name of a supported character encoding. * @return The translated path. */ public static String encodeUrlPath( String path, String encoding ) { if ( path.equals( "/" ) ) { return path; } // Parameters should not be encoded String parameters = null; if ( path.indexOf( "?" ) > -1 ) { parameters = path.substring( path.indexOf( "?" ) + 1 ); path = path.substring( 0, path.indexOf( "?" ) ); } StringBuffer encodedPath = doEncodePath( path, encoding ); if ( parameters != null ) { encodedPath.append( "?" ); encodedPath.append( parameters ); } return encodedPath.toString(); } public static String encodeUrlPathNoParameters( final String localPath ) { return encodeUrlPathNoParameters( localPath, "UTF-8" ); } public static String encodeUrlPathNoParameters( final String localPath, final String encoding ) { if ( localPath.equals( "/" ) ) { return localPath; } StringBuffer encodedPath = doEncodePath( localPath, encoding ); return encodedPath.toString(); } private static StringBuffer doEncodePath( String localPath, String encoding ) { StringBuffer encodedPath = new StringBuffer( localPath.length() * 2 ); if ( localPath.startsWith( "/" ) ) { encodedPath.append( "/" ); } StringTokenizer st = new StringTokenizer( localPath, "/" ); int i = 0; while ( st.hasMoreTokens() ) { String pathElement = st.nextToken(); i++; if ( i > 1 ) { encodedPath.append( "/" ); } try { encodedPath.append( URLEncoder.encode( pathElement, encoding ) ); } catch ( UnsupportedEncodingException e ) { throw new RuntimeException( "Failed to encode path '" + localPath + "' with encoding '" + encoding + "'", e ); } } if ( localPath.endsWith( "/" ) ) { encodedPath.append( "/" ); } return encodedPath; } }