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

com.taobao.api.internal.toplink.embedded.websocket.util.StringUtil Maven / Gradle / Ivy

The newest version!
/*
 * The MIT License
 * 
 * Copyright (c) 2011 Takahiro Hashimoto
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
package com.taobao.api.internal.toplink.embedded.websocket.util;

import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * The Class StringUtil.
 *
 * @author Takahiro Hashimoto
 */
public class StringUtil {
	
	/** The log. */
	private static Logger log = Logger.getLogger(StringUtil.class.getName());
	
	/**
	 * Join.
	 *
	 * @param delim the delim
	 * @param collections the collections
	 * @return the string
	 */
	public static String join(String delim, Collection collections) {
		String[] values = new String[collections.size()];
		collections.toArray(values);
		return join(delim, 0, collections.size(), values);
	}

	/**
	 * Join.
	 *
	 * @param delim the delim
	 * @param strings the strings
	 * @return the string
	 */
	public static String join(String delim, String... strings) {
		return join(delim, 0, strings.length, strings);
	}

	/**
	 * Join.
	 *
	 * @param delim the delim
	 * @param start the start
	 * @param end the end
	 * @param strings the strings
	 * @return the string
	 */
	public static String join(String delim, int start, int end,
			String... strings) {
		if (strings.length == 1) {
			return strings[0];
		}
		StringBuilder sb = new StringBuilder(strings[start]);
		for (int i = start + 1; i < end; i++) {
			sb.append(delim).append(strings[i]);
		}
		return sb.toString();
	}

	/**
	 * Adds the header.
	 *
	 * @param sb the sb
	 * @param key the key
	 * @param value the value
	 */
	public static void addHeader(StringBuilder sb, String key, String value) {
		// TODO need folding?
		sb.append(key + ": " + value + "\r\n");
	}
	
	/**
	 * Read line.
	 *
	 * @param buf the buf
	 * @return the string
	 */
	public static String readLine(ByteBuffer buf) {
		boolean completed = false;
		buf.mark();
		while (buf.hasRemaining() && !completed) {
			byte b = buf.get();
			if (b == '\r') {
				if(buf.hasRemaining() && buf.get() == '\n'){
					completed = true;
				}
			}
		}

		if(!completed){
			return null;
		}

		int limit = buf.position();
		buf.reset();
		int length = limit - buf.position();
		byte[] tmp = new byte[length];
		buf.get(tmp, 0, length);
		try {
			String line = new String(tmp, "US-ASCII");
			if (log.isLoggable(Level.FINEST)) {
				log.finest(line.trim());
			}
			return line;
		} catch (UnsupportedEncodingException e) {
			;
		}
		return null;
	}

	/**
	 * Adds the param.
	 *
	 * @param sb the sb
	 * @param key the key
	 * @param param the param
	 * @return the string builder
	 */
	public static StringBuilder addParam(StringBuilder sb, String key, String param){
		sb.append(key).append("=").append(param);
		return sb;
	}

	/**
	 * Adds the quoted param.
	 *
	 * @param sb the sb
	 * @param key the key
	 * @param param the param
	 * @return the string builder
	 */
	public static StringBuilder addQuotedParam(StringBuilder sb, String key, String param){
		sb.append(key).append("=\"").append(param).append("\"");
		return sb;
	}
	
	/**
	 * To m d5 hex string.
	 *
	 * @param str the str
	 * @return the string
	 */
	public static String toMD5HexString(String str){
		try{
			MessageDigest md = MessageDigest.getInstance("MD5");
			md.update(str.getBytes("US-ASCII"));
			return toHexString(md.digest());
		}catch(UnsupportedEncodingException e){
			;
		}catch(NoSuchAlgorithmException e){
			;
		}
		return null;
	}
	
	/** The hex table. */
	private static char[] hexTable = new char[]{'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
	
	/**
	 * toHexString.
	 *
	 * @param b the b
	 * @return the string
	 */
	public static String toHexString(byte b){
		char[] chars = new char[2];
		int d = (b & 0xF0) >> 4;
		int m =  b & 0x0F;
		chars[0] = hexTable[d];
		chars[1] = hexTable[m];
		return new String(chars);
	}
	
	/**
	 * toHexString.
	 *
	 * @param bytes the bytes
	 * @return the string
	 */
	public static String toHexString(byte[] bytes){
		StringBuilder sb = new StringBuilder();
		for(int i = 0; i < bytes.length; i++){
			char[] chars = new char[2];
			int d = (bytes[i] & 0xF0) >> 4;
			int m =  bytes[i] & 0x0F;
			chars[0] = hexTable[d];
			chars[1] = hexTable[m];
			sb.append(chars);
		}
		return sb.toString();
	}
	
	/**
	 * Lpad.
	 *
	 * @param str the str
	 * @param len the len
	 * @param padding the padding
	 * @return the string
	 */
	public static String lpad(Object str, int len, String padding){
		StringBuilder sb = new StringBuilder();
		for(int i = 0; i < len - str.toString().length(); i++){
			sb.append(padding);
		}
		sb.append(str);
		return sb.toString();
	}
	
	/**
	 * Rpad.
	 *
	 * @param str the str
	 * @param len the len
	 * @param padding the padding
	 * @return the string
	 */
	public static String rpad(Object str, int len, String padding){
		StringBuilder sb = new StringBuilder();
		sb.append(str);
		for(int i = 0; i < len - str.toString().length(); i++){
			sb.append(padding);
		}
		return sb.toString();
	}
	

	/**
	 * The Enum State.
	 *
	 * @author Takahiro Hashimoto
	 */
	enum State {
		
		/** The KE y_ start. */
		KEY_START, 
 /** The KEY. */
 KEY,
/** The VALU e_ start. */
VALUE_START, 
 /** The VALUE. */
 VALUE,
/** The DELIM. */
DELIM;
	}
	
	/**
	 * ex. realm="[email protected]", qop="auth,auth-int"
	 *
	 * @param str the str
	 * @param delim the delim
	 * @return the map
	 */
	public static Map parseKeyValues(String str, char delim){
		State state = State.KEY;
		char[] chars = str.toCharArray();
		String key = null;
		String value = null;
		StringBuilder sb = new StringBuilder();
		Map map = new HashMap();
		boolean isQuoted = false;
		for(int i = 0; i < chars.length; i++){
			switch(state){
			case KEY_START:
				if(chars[i] == ' '){
					continue;
				}else{
					sb.append(chars[i]);
					state = State.KEY;
				}
				break;
			case KEY:
				if(chars[i] == '='){
					key = sb.toString().trim();
					sb = new StringBuilder();
					state = State.VALUE_START;
				}else{
					sb.append(chars[i]);
				}
				break;
			case VALUE_START:
				if(chars[i] == ' '){
					continue;
				}else if(chars[i] == '"'){
					state = State.VALUE;
					isQuoted = true;
				}else{
					sb.append(chars[i]);
					state = State.VALUE;
					isQuoted = false;
				}
				break;
			case VALUE:
				if(isQuoted && chars[i] == '"'){
					state = State.DELIM;
					value = sb.toString();
					
					map.put(key, value);
					sb = new StringBuilder();
				}else if(!isQuoted && chars[i] == delim){
					state = State.KEY_START;
					value = sb.toString();
					
					map.put(key, value);
					sb = new StringBuilder();
				}else{
					sb.append(chars[i]);					
				}
				break;
			case DELIM:
				if(chars[i] == ' '){
					continue;
				}else if(chars[i] == ','){
					state = State.KEY_START;
				}else{
					break;
				}
				break;
			}
		}
		return map;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy