/*******************************************************************************
 * 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.contentmodel.annotation;

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

import org.eclipse.jst.jsf.contentmodel.annotation.internal.CMAnnotationFileRegistry;
import org.eclipse.jst.jsf.contentmodel.annotation.internal.CMAnnotationMap;

/**
 * Class meant for all public access to the design-time meta-data (CMAnnotations) values.
 * 
 * <li>Annotation files are registered against a uri (eg. http://java.sun.com/jsf/core) 
 * using the extension-point <code>org.eclipse.jst.jsf.contentmodel.annotations.annotationFiles</code>.</li>
 * <li>Any number of annotation files can be associated with the uri and against any element or attribute.</li>
 * <li>It is recommended that a single plugin should avoid registering meta-data for the same attribute or element 
 * from different annotationFiles.</li>
 * <li>A CMAnnotation allows for a collection of property values for a named property.</li>  
 * <li>Querying the registry using this helper class can return lists of <code>CMAnnotationPropertyValue</code> 
 * which allows the caller to make the determination of whether the property value is of interest or not.</li> 
 * <li>The caller can also query the registry for specific plugin supplied annotation meta-data.</li>
 * 
 * <li>-- include link to doc--</li>
 * 
 * @see org.eclipse.jst.jsf.contentmodel.annotation.internal.CMElementAnnotation
 * @see org.eclipse.jst.jsf.contentmodel.annotation.internal.CMAttributeAnnotation
 * @see CMAnnotationPropertyValue
 * 
 * also see org.eclipse.jst.jsf.contentmodel.annotations.annotationFiles extension-point
 * 
 * @deprecated see common.metadata package
 */
public class CMAnnotationHelper {
	private static List EMPTY_LIST = new ArrayList(0);
	
	/**
	 * Returns a list of CMAnnotationPropertyValue objects for a given property name and uri/tag/tag attribute combo.
	 * A list is being returned because it is possible that there are multiple annotation files with the same 
	 * named property.  Caller can decide what to do.
	 * 
	 * Will return empty if annotation is not found or meta-data property name not present.
	 * 
	 * @param uri
	 * @param cmElementName
	 * @param cmAttrName
	 * @param meta_prop_name
	 * @return list of CMAnnotationPropertyValue objects
	 */
	public static List getCMAttributeProperties(String uri, String cmElementName, String cmAttrName, String meta_prop_name) {
		return getCMAttributeProperties(null, uri, cmElementName, cmAttrName, meta_prop_name);
	}
	

	/**
	 * Returns a list of CMAnnotationPropertyValue objects for a given bundleId, property name and uri/tag/tag attribute combo.
	 * A list is being returned because it is possible that there are multiple annotation files with the same 
	 * named property.  Caller can decide what to do.
	 * 
	 * Use this method if you are not looking for a property value from a specific bundle.  Usually the caller.
	 * 
	 * Will return empty if annotation is not found or meta-data property name not present.
	 * 
	 * @param bundleId
	 * @param uri
	 * @param cmElementName
	 * @param cmAttrName
	 * @param meta_prop_name
	 * @return list of CMAnnotationPropertyValue objects
	 */
	public static List getCMAttributeProperties(String bundleId, String uri, String cmElementName, String cmAttrName, String meta_prop_name) {
		if (!CMAnnotationFileRegistry.getInstance().hasAnnotations(uri))			
			return EMPTY_LIST;
		
		List list = new ArrayList();
		List maps = CMAnnotationFileRegistry.getInstance().getAnnotationMaps(uri);
		if (maps != null){
			Iterator it = maps.iterator();
			while (it.hasNext()){
				CMAnnotationMap map = (CMAnnotationMap)it.next();
				if (bundleId == null || map.getFileInfo().getBundleId().equals(bundleId)){
					CMAnnotationPropertyValue propVal =  map.getCMAttributePropertyValue(cmElementName, cmAttrName, meta_prop_name);
					if (propVal != null){
						list.add(propVal);
					}
				}
			}
		}
		return list;
	}
	
	/**
	 * Convenience method to return the first string value for a given bundle, uri, element, attr, and meta_prop_name.
	 * Caller needs to be aware that this could be a multi-value property.  If so, <code>getCMAttributePropertyValues</code>
	 * should probably be called.
	 * 
	 * Caller must be sure that only one annotation meta-data file is associated with this uri from the specified bundle.  
	 * If there are multiple annotations, only the first bundle's values will be returned.
	 * 
	 * Will return null if annotation is not found or meta-data property name not present.
	 * 
	 * @param bundleId
	 * @param uri
	 * @param cmElementName
	 * @param cmAttrName
	 * @param meta_prop_name
	 * @return property value as String
	 */
	public static String getCMAttributePropertyValue(String bundleId, String uri, String cmElementName, String cmAttrName, String meta_prop_name){
		List vals = getCMAttributeProperties(bundleId, uri, cmElementName, cmAttrName, meta_prop_name);
		if (vals != null && !vals.isEmpty()){
			return((CMAnnotationPropertyValue)vals.get(0)).getPropertyValue();
		}
		return null;
	}
	
	/**
	 * Convenience method to return the list of property values for a given bundle, uri, element, attr, and meta_prop_name.
	 * 
	 * Caller must be sure that only one annotation meta-data file is associated with this uri from the specified bundle.  
	 * If there are multiple annotations, only the first bundle's values will be returned.
	 * 
	 * Will return empty list if annotation is not found or meta-data property name not present.
	 * 
	 * @param bundleId
	 * @param uri
	 * @param cmElementName
	 * @param cmAttrName
	 * @param meta_prop_name
	 * @return property values as List
	 */
	public static List getCMAttributePropertyValues(String bundleId, String uri, String cmElementName, String cmAttrName, String meta_prop_name){
		List vals = getCMAttributeProperties(bundleId, uri, cmElementName, cmAttrName, meta_prop_name);
		if (!vals.isEmpty()){
			return((CMAnnotationPropertyValue)vals.get(0)).getPropertyValues();
		}
		return EMPTY_LIST;
	}
	/**
	 * Returns a list of CMAnnotationPropertyValue objects for a given property name and uri/tag element combo.
	 * A list is being returned because it is possible that there are multiple annotation files with the same 
	 * named property.  Caller can decide what to do.
	 * 
	 * Will return empty list if annotation is not found or meta-data property name not present.
	 * 
	 * @param uri
	 * @param cmElementName
	 * @param meta_prop_name
	 * @return list of CMAnnotationPropertyValue objects
	 */
	public static List getCMElementProperties(String uri, String cmElementName, String meta_prop_name) {
		return getCMElementProperties(null, uri, cmElementName, meta_prop_name);
	}

	
	/**
	 * Returns a list of CMAnnotationPropertyValue objects for a given bundle, property name and uri/tag element combo.
	 * A list is being returned because it is possible that there are multiple annotation files with the same 
	 * named property.  Caller can decide what to do.
	 * 
	 * Use this method if you are not looking for a property value from a specific bundle.  Usually the caller.
	 * 
	 * Will return empty list if annotation is not found or meta-data property name not present.
	 * 
	 * @param bundleId
	 * @param uri
	 * @param cmElementName
	 * @param meta_prop_name
	 * @return list of CMAnnotationPropertyValue objects
	 */
	public static List getCMElementProperties(String bundleId, String uri, String cmElementName, String meta_prop_name) {
		if (!CMAnnotationFileRegistry.getInstance().hasAnnotations(uri))			
			return EMPTY_LIST;
		
		List list = new ArrayList();
		List maps = CMAnnotationFileRegistry.getInstance().getAnnotationMaps(uri);
		if (maps != null){
			Iterator it = maps.iterator();
			while (it.hasNext()){
				CMAnnotationMap map = (CMAnnotationMap)it.next();
				if (bundleId == null || map.getFileInfo().getBundleId().equals(bundleId)){
					CMAnnotationPropertyValue propVal =  map.getCMElementPropertyValue(cmElementName, meta_prop_name);
					if (propVal != null){
						list.add(propVal);
					}
				}
			}
		}
		return list;
	}
	
	/**
	 * Convenience method to return the first string value for a given bundle, uri, element, and meta_prop_name.
	 * Caller needs to be aware that this could be a multi-value property.  If so, <code>getCMAttributePropertyValues</code>
	 * should probably be called.
	 * 
	 * Caller must be sure that only one annotation meta-data file is associated with this uri from the specified bundle.  
	 * If there are multiple annotations, only the first bundle's values will be returned.
	 * 
	 * Will return null if annotation is not found or meta-data property name not present.
	 * 
	 * @param bundleId
	 * @param uri
	 * @param cmElementName
	 * @param meta_prop_name
	 * @return property value as String
	 */
	public static String getCMElementPropertyValue(String bundleId, String uri, String cmElementName, String meta_prop_name){
		List vals = getCMElementProperties(bundleId, uri, cmElementName, meta_prop_name);
		if (vals != null && !vals.isEmpty()){
			return((CMAnnotationPropertyValue)vals.get(0)).getPropertyValue();
		}
		return null;
	}
	
	/**
	 * Convenience method to return the list of property values for a given bundle, uri, element, and meta_prop_name.
	 * 
	 * Caller must be sure that only one annotation meta-data file is associated with this uri from the specified bundle.  
	 * If there are multiple annotations, only the first bundle's values will be returned.
	 * 
	 * Will return empty list if annotation is not found or meta-data property name not present.
	 * 
	 * @param bundleId
	 * @param uri
	 * @param cmElementName
	 * @param meta_prop_name
	 * @return List of property values as Strings 
	 */
	public static List getCMElementPropertyValues(String bundleId, String uri, String cmElementName, String meta_prop_name){
		List vals = getCMElementProperties(bundleId, uri, cmElementName, meta_prop_name);
		if (vals != null && !vals.isEmpty()){
			return((CMAnnotationPropertyValue)vals.get(0)).getPropertyValues();
		}
		return null;
	}
	
	/**
	 * Return whether or not there are annotation files for a given uri and bundleId.
	 * @param bundleId
	 * @param uri
	 * @return boolean
	 */
	public static boolean hasAnnotations(String bundleId, String uri) {
		return CMAnnotationFileRegistry.getInstance().hasAnnotations(bundleId, uri);
	}
	
	/**
	 * Return whether or not there are annotation files for a given uri.
	 * @param uri
	 * @return boolean 
	 */
	public static boolean hasAnnotations(String uri) {
		return CMAnnotationFileRegistry.getInstance().hasAnnotations(uri);
	}
}
