/*******************************************************************************
 * Copyright (c) 2006 Sybase, Inc. and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.jsf.common.ui.internal.utils;

import java.util.regex.Pattern;

/**
 * This is tool class for String processing.
 * 
 * @author mengbo
 */
public class StringUtil {
    
    // pattern to find all end-of-paragraph and end-of-line html tags
    // so they can be converted to newlines
    final private static Pattern htmlToNewline = Pattern.compile("</p>|<br>"); //$NON-NLS-1$
    
    // pattern to strip all <x> and </x> HTML tags
    final private static Pattern removeHTMLTags = Pattern.compile("<[/?\\w\\s=\"\\.\\#]+>"); //$NON-NLS-1$
    
    // pattern to find all runs of spaces longer than one
    final private static Pattern trimInteriorWhitespace = Pattern.compile("[ ]+"); //$NON-NLS-1$
    
	/**
	 * Split a java variable name into words For example, "_aJavaVariable" will
	 * split to "A Java Variable", "_aWTPPackageImplementation" will be "A WTP
	 * Package Implementation"
	 * 
	 * @param variable
	 * @return String
	 */
	public static String splitVariable(String variable) {
		StringBuffer output = new StringBuffer(""); //$NON-NLS-1$
		boolean isCapitalLeading = false;
		boolean isLastSpace = false;

		for (int i = 0, n = variable.length(); i < n; i++) {
			char letter = variable.charAt(i);

			if (letter == '_' || letter == '$') {
				output.append(" "); //$NON-NLS-1$
				isCapitalLeading = false;
				isLastSpace = true;
				continue;
			}

			if (Character.isLowerCase(letter)) {
				int nextIndex = i + 1;
				if (nextIndex < n) {
					char nextLetter = variable.charAt(nextIndex);
					if (Character.isUpperCase(nextLetter)) {
						if (isCapitalLeading) {
							output.append(letter);
							isLastSpace = false;
						} else {
							output.append(Character.toUpperCase(letter));
							isLastSpace = false;
						}
						if (!isLastSpace) {
							output.append(' ');
							isLastSpace = true;
						}
						isCapitalLeading = false;
						continue;
					}
				}
			}
			if (Character.isUpperCase(letter)) {
				int nextIndex = i + 1;
				if (nextIndex < n) {
					char nextLetter = variable.charAt(nextIndex);
					if (Character.isLowerCase(nextLetter)) {
						if (!isLastSpace) {
							output.append(' ');
							isLastSpace = true;
						}
						output.append(letter);
						isCapitalLeading = true;
						isLastSpace = false;
						continue;
					}
				}
			}
			if (isCapitalLeading) {
				output.append(letter);
				isLastSpace = false;
			} else {
				output.append(Character.toUpperCase(letter));
				isCapitalLeading = true;
				isLastSpace = false;
			}
		}

		return output.toString().trim();
	}

	/**
	 * @param str1
	 * @param str2
	 * @return boolean
	 * 
	 * Check if two strings match or not if str1=null and str2=null, it will
	 * return true
	 */
	public static boolean isSameString(String str1, String str2) {
		if (str1 == null) {
			return str2 == null;
		}
        return str1.equals(str2);
	}

	/**
	 * 
	 * @param text
	 * @return String Filter and convert a string, or normalize a string For
	 *         example,
	 *         <p>
	 *         test
	 *         </p>
	 *         test1<a/> will be converted to: test\ntest1
	 * 
	 */
	public static String filterConvertString(String text) {
		if (text == null) {
			return ""; //$NON-NLS-1$
		}
        
		String result = htmlToNewline.matcher(text).replaceAll("\n");  //$NON-NLS-1$
        result = removeHTMLTags.matcher(result).replaceAll(""); //$NON-NLS-1$
        result = trimInteriorWhitespace.matcher(result).replaceAll(" "); //$NON-NLS-1$

		return result;
	}

	/**
	 * Determine whether a string is empty or not Example: null string -> return
	 * true; Example: "" string -> return true; Otherwise, will return false;
	 * @param str 
	 * 
	 * @return true if str is null or empty
	 */
	public static boolean isEmptyString(String str) {
		if (str == null || str.length() == 0) {
			return true;
		}
		return false;
	}
}
