All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fr.lteconsulting.hexa.client.tools.URLEncoderEx Maven / Gradle / Ivy

The newest version!
package fr.lteconsulting.hexa.client.tools;

import com.google.gwt.core.client.GWT;

/*
 * MIGHT NOT BE USED ANYMORE, COMES FROM AN OLD FILE THAT I DID NOT DELETE
 */

public class URLEncoderEx
{
	private static int ROTATION = 7;

	private static int[] codeToEncode = null;
	private static int[] encodeToCode = null;

	static
	{
		codeToEncode = new int[123];
		encodeToCode = new int[123];

		for( int i = 0; i < 123; i++ )
		{
			int encode = _codeToEncode( i );
			codeToEncode[i] = encode;
			encodeToCode[encode] = i;
		}
	}

	public static String encode( String input )
	{
		StringBuilder b = new StringBuilder();

		int checkSum = 0;

		int inputLen = input.length();
		for( int i = 0; i < inputLen; i++ )
		{
			int n = charCodeAt( input, i );

			checkSum += n;

			n = codeToEncode( n );

			pushToList( n, b );
		}

		b.append( (char) encodeToCode( checkSum % 61 ) );

		return b.toString();
	}

	static class StringReader
	{
		int idx = 0;
		String string;

		public StringReader( String string )
		{
			this.string = string;
		}

		public boolean finished()
		{
			return idx >= string.length();
		}

		public int get()
		{
			return charCodeAt( string, idx++ );
		}
	}

	public static String decode( String encoded )
	{
		if( encoded == null || encoded.length() == 0 )
			return "";

		int checkSum = codeToEncode( charCodeAt( encoded.substring( encoded.length() - 1 ), 0 ) );
		int control = 0;

		encoded = encoded.substring( 0, encoded.length() - 1 );

		StringReader reader = new StringReader( encoded );

		StringBuilder b = new StringBuilder();

		while( !reader.finished() )
		{
			int n = encodeToCode( consumeList( reader ) );

			control += n;

			b.append( (char) n );
		}

		if( control % 61 != checkSum )
		{
			GWT.log( "Badly formatted encoded string ! " + encoded + " key is " + checkSum + " and processed : " + (control % 61) );
			return null;
		}

		return b.toString();
	}

	private static int consumeList( StringReader encodedList )
	{
		assert !encodedList.finished();

		int n = codeToEncode( rotateCode( encodedList.get(), -ROTATION ) );

		if( n < 61 )
		{
			return n;
		}
		else
		{
			// it is the marker, IT SHOULD
			assert n == 61;

			int reste = codeToEncode( rotateCode( encodedList.get(), -ROTATION ) );

			return reste + 61 * consumeList( encodedList );
		}
	}

	private static void pushToList( int n, StringBuilder b )
	{
		if( n < 61 )
		{
			// empiler n directement
			b.append( (char) rotateCode( encodeToCode( n ), ROTATION ) );
		}
		else
		{
			// empiler le markeur (61)
			b.append( (char) rotateCode( encodeToCode( 61 ), ROTATION ) );

			// empiler le reste
			int reste = n % 61;
			b.append( (char) rotateCode( encodeToCode( reste ), ROTATION ) );

			// recursion avec (n-reste)/61
			pushToList( (n - reste) / 61, b );
		}
	}

	private static int codeToEncode( int code )
	{
		if( code < 123 )
			return codeToEncode[code];
		return code;
	}

	private static int encodeToCode( int encode )
	{
		if( encode < 123 )
			return encodeToCode[encode];
		return encode;
	}

	private static int rotateCode( int charCode, int rotation )
	{
		if( charCode >= 48 && charCode <= 57 )
			return 48 + (((charCode - 48) + (rotation + 10)) % 10);

		if( charCode >= 65 && charCode <= 90 )
			return 65 + (((charCode - 65) + (rotation + (90 - 65 + 1))) % (90 - 65 + 1));

		if( charCode >= 97 && charCode <= 122 )
			return 97 + (((charCode - 97) + (rotation + (122 - 97 + 1))) % (122 - 97 + 1));

		return charCode;
	}

	private static int _codeToEncode( int code )
	{
		if( code >= 0 && code <= 47 )
			return 62 + code;
		if( code >= 48 && code <= 57 )
			return code - 48;
		if( code >= 58 && code <= 64 )
			return code - 58 + 62 + 48;
		if( code >= 65 && code <= 90 )
			return code - 65 + 10;
		if( code >= 91 && code <= 96 )
			return code - 91 + 117;// 62 + 48 + 26;
		if( code >= 97 && code <= 122 )
			return code - 97 + 36;

		return code;// - 123 + 162;//62 + 48 + 26 + 26;
	}

	private static native int charCodeAt( String s, int i )
	/*-{
		return s.charCodeAt( i );
	}-*/;

	private static native String fromCharCode( int code )
	/*-{
		return String.fromCharCode( code );
	}-*/;
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy