/*******************************************************************************
 * Copyright (c) 2009 by SAP AG, Walldorf. 
 * 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:
 *     SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.ws.jaxws.utils;

import java.text.MessageFormat;

import org.apache.axis.types.NCName;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jst.ws.jaxws.utils.internal.text.JaxWsUtilMessages;


/**
 * Class that contains utility methods to validate names used in WSDL.  
 * 
 * @author Georgi Vachkov
 */
public class WsdlNamesValidator 
{
	/**
	 * Provides validation of NCName 
	 * @param title the title for the error message
	 * @param name the checked name
	 * @return error status in case the name is invalid otherwise {@link Status#OK_STATUS}.
	 */
	public static IStatus validateNCName(final String title, final String name)
	{
		if (name.trim().length() == 0) {
			return StatusUtils.statusError(MessageFormat.format(JaxWsUtilMessages.WsdlNamesValidator_EmptyXmlName, title));
		}
		
		int errPos = checkNCName(name);
		if (errPos > -1) {
			return StatusUtils.statusError(MessageFormat.format(JaxWsUtilMessages.WsdlNamesValidator_InvalidNCName, name.charAt(errPos), title, name));
		}
		
		return Status.OK_STATUS;
	}	
	
	/**
	 * Validates <code>name</code> for NCName
	 * @param name
	 * @return -1 if the name is valid or > -1 which is the position of the wrong character.
	 */
	public static IStatus validateNCName2(final String title, final String name) 
	{
		if (name==null || name.trim().length() == 0) {
			return StatusUtils.statusError(MessageFormat.format(JaxWsUtilMessages.WsdlNamesValidator_EmptyXmlName2, title));
		}
		
		int errPos = checkNCName(name);
		if (errPos > -1) {
			return StatusUtils.statusError(MessageFormat.format(JaxWsUtilMessages.WsdlNamesValidator_InvalidNCName2, name.charAt(errPos), title));
		}
		
		return Status.OK_STATUS;
	}
	
	/**
	 * Checks whether the name specified is a valid NCName
	 * @param name the name to check
	 * @return index of the first symbol which violates the NCName rules or -1 in case the name is a valid NCName
	 * @see NCName#isValid(String)
	 */
	private static int checkNCName(final String name)
	{
		final StringBuilder builder = new StringBuilder();
		for(int i = 0; i < name.length(); i++)
		{
			builder.append(name.charAt(i));
			if(!NCName.isValid(builder.toString()))
			{
				return i;
			}
		}
		
		return -1;
	}
}
