/*******************************************************************************
 * Copyright (c) 2003, 2006 IBM Corporation 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:
 * IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.jst.j2ee.application.internal.operations;

import java.util.Set;

import com.ibm.icu.text.UTF16;
import com.ibm.icu.util.StringTokenizer;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.jst.j2ee.datamodel.properties.IAddWebComponentToEnterpriseApplicationDataModelProperties;
import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
import org.eclipse.jst.j2ee.internal.project.ProjectSupportResourceHandler;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;


/**
 * 
 */
public class AddWebComponentToEARDataModelProvider extends AddComponentToEnterpriseApplicationDataModelProvider implements IAddWebComponentToEnterpriseApplicationDataModelProperties {

	@Override
	public Set getPropertyNames() {
		Set propertyNames = super.getPropertyNames();
		propertyNames.add(CONTEXT_ROOT);
		return propertyNames;
	}

	/**
	 * 
	 */
	protected String getDefaultURIExtension() {
		return "war"; //$NON-NLS-1$
	}

	/**
	 * 
	 */
	public boolean isWebModuleArchive() {
		return true;
	}

	/**
	 * 
	 */
	@Override
	public boolean propertySet(String propertyName, Object propertyValue) {
		boolean notify = super.propertySet(propertyName, propertyValue);
		if (notify && propertyName.equals(CONTEXT_ROOT))
			model.notifyPropertyChange(CONTEXT_ROOT, IDataModel.DEFAULT_CHG);
		return notify;
	}

	/**
	 * 
	 */
	@Override
	public Object getDefaultProperty(String propertyName) {
		// if (propertyName.equals(CONTEXT_ROOT))
		// return getDefaultContextRoot();
		return super.getDefaultProperty(propertyName);
	}


	/**
	 * 
	 */
	@Override
	public IStatus validate(String propertyName) {
		if (CONTEXT_ROOT.equals(propertyName)) {
			return validateContextRoot(getStringProperty(CONTEXT_ROOT));
		}
		return super.validate(propertyName);
	}

	/**
	 * 
	 * @param contextRoot
	 * @return
	 */
	public IStatus validateContextRoot(String contextRoot) {
		if (contextRoot.equals("")) { //$NON-NLS-1$
			return J2EEPlugin.newErrorStatus(ProjectSupportResourceHandler.getString(ProjectSupportResourceHandler.Context_Root_cannot_be_empty_2, new Object[]{contextRoot}), null); 
		} else if (contextRoot.trim().equals(contextRoot)) {
			StringTokenizer stok = new StringTokenizer(contextRoot, "."); //$NON-NLS-1$
			while (stok.hasMoreTokens()) {
				String token = stok.nextToken();
				int cp;
		        for (int i = 0; i < token.length(); i += UTF16.getCharCount(cp)) {
		            cp = UTF16.charAt(token, i);
					if (!(token.charAt(i) == '_') && !(token.charAt(i) == '-') && !(token.charAt(i) == '/') && Character.isLetterOrDigit(token.charAt(i)) == false) {
						String invalidCharString = null;
						if (UTF16.getCharCount(cp)>1)
						{
							invalidCharString = UTF16.valueOf(cp); 
						}
						else
						{
							invalidCharString = (new Character(token.charAt(i))).toString();
						}
						Object[] invalidChar = new Object[]{invalidCharString};
						String errorStatus = ProjectSupportResourceHandler.getString(ProjectSupportResourceHandler.The_character_is_invalid_in_a_context_root, invalidChar); 
						return J2EEPlugin.newErrorStatus(errorStatus, null);
					}
				}
			}
		} else
			return J2EEPlugin.newErrorStatus(ProjectSupportResourceHandler.getString(ProjectSupportResourceHandler.Names_cannot_begin_or_end_with_whitespace_5, new Object[]{contextRoot}), null); 
		return OK_STATUS;
	}
}
