/*******************************************************************************
 * Copyright (c) 2006 Oracle Corporation.
 * 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:
 *    Gerry Kessler/Oracle - initial API and implementation
 *    
 ********************************************************************************/
package org.eclipse.jst.jsf.taglibprocessing.attributevalues;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jst.jsf.metadataprocessors.features.IDefaultValue;
import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;

/**
 * Meta-data processing type representing a String attribute value runtime type
 * that implements IPossibleValues, IValidValues and IDefaultValues
 * 
 * <p><b>Provisional API - subject to change</b></p>
 * @author Gerry Kessler - Oracle
 */
public class StringType extends EnumerationType implements IValidValues,
		IPossibleValues, IDefaultValue {
	
	/* (non-Javadoc)
	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.EnumerationType#getReturnType()
	 */
	protected String getReturnType(){ return "java.lang.String";} //$NON-NLS-1$

	/* (non-Javadoc)
	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
	 */
	public boolean isValidValue(String value) {		
		List vals = getMDValidValues();
		if (vals.isEmpty())
			return true;
		
		//if the value is empty but there is a default value, consider it valid		
		if (getDefaultValue() != null  && (value == null || value.trim().equals("")))
			return true;
		
		if(! vals.contains(value)){
			addNewValidationMessage(Messages.StringType_invalid_value);
		}
		return getValidationMessages().isEmpty();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues#getPossibleValues()
	 */
	public List getPossibleValues() {
		List pvs = getMDPossibleValues();
		if (pvs.isEmpty())
			return EMPTY_LIST;
		
		List pdvs = getMDPossibleValuesForDisplay();
		
		//if there are no display vals or the meta-data list sizes are different, use the values list for display also
		if (pdvs.isEmpty() || pvs.size() != pdvs.size())
			pdvs = pvs;
	
		ImageDescriptor icon = getImage();
		
		String defaultValue = getDefaultValue();
		List ret = new ArrayList(pvs.size());
		for(int i=0;i<pvs.size();i++){
			PossibleValue pv = new PossibleValue((String)pvs.get(i), (String)pdvs.get(i));
			pv.setIcon(icon);
			pv.setIsDefault(((String)pvs.get(i)).equals(defaultValue));
			ret.add(pv);
		}
		return ret;
	}

}
