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

import org.eclipse.jst.jsf.core.internal.provisional.contentmodel.annotation.ICMAnnotationSourceFileInfo;

/**
 * An internal class implementing ICMAnnotationAdvisor that allows us to decouple the parser
 * from the internal data model (CMAnnotationMap).
 * 
 * @author Gerry Kessler - Oracle
 *
 */
public final class CMAnnotationAdvisor implements ICMAnnotationAdvisor {

	private CMAnnotationMap map;
	private ICMAnnotationSourceFileInfo fileInfo;

	public CMAnnotationAdvisor(CMAnnotationMap map, ICMAnnotationSourceFileInfo fileInfo) {
		this.map = map;
		this.fileInfo = fileInfo;
		setCaseSensitive(true);// default to case sensitive
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jst.jsf.core.internal.contentmodel.annotation.ICMAnnotationAdvisor#addElementAnnotation(java.lang.String, java.lang.String, java.lang.String)
	 */
	public void addElementAnnotation(String elementName, String propertyName, String propertyValue) {

		CMElementAnnotation elem = getElementAnnotation(getStringValueForCaseSensitivity(elementName));
		elem.setProperty(getStringValueForCaseSensitivity(propertyName), propertyValue);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jst.jsf.core.internal.contentmodel.annotation.ICMAnnotationAdvisor#addAttributeAnnotation(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
	 */
	public void addAttributeAnnotation(String elementName, String attributeName,
			String propertyName, String propertyValue) {

		CMElementAnnotation elem = getElementAnnotation(getStringValueForCaseSensitivity(elementName));
		CMAttributeAnnotation attr = getAttributeAnnotation(elem,
				getStringValueForCaseSensitivity(attributeName));
		attr.setProperty(getStringValueForCaseSensitivity(propertyName), propertyValue);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jst.jsf.core.internal.contentmodel.annotation.ICMAnnotationAdvisor#getFileInfo()
	 */
	public ICMAnnotationSourceFileInfo getFileInfo() {
		return fileInfo;
	}

	/**
	 * This implementation is case sensitive by default
	 * 
	 * @see org.eclipse.jst.jsf.core.internal.contentmodel.annotation.ICMAnnotationAdvisor#setCaseSensitive(boolean)
	 */
	public void setCaseSensitive(boolean val) {
		map.setCaseSensitive(val);
	}

	private CMElementAnnotation getElementAnnotation(String elementName) {
		CMElementAnnotation elem = map.getElementAnnotation(elementName);
		if (elem == null) {
			elem = new CMElementAnnotation(elementName);
			map.addCMElementAnnotation(elem);
		}
		return elem;
	}

	private CMAttributeAnnotation getAttributeAnnotation(CMElementAnnotation elem,
			String attributeName) {
		// attrAnnotations map will always be initialized so do not need to check for null
		CMAttributeAnnotation attr = (CMAttributeAnnotation) elem.getAttributeAnnotations().get(
				attributeName);
		if (attr == null) {
			attr = new CMAttributeAnnotation(elem.getName(), attributeName);
			elem.addCMAttributeAnnotation(attr);
		}
		return attr;
	}

	private String getStringValueForCaseSensitivity(String val) {
		return map.getStringValueForCaseSensitivity(val);
	}

}
