/*******************************************************************************
 * Copyright (c) 2002, 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 - Initial API and implementation
 *   Jens Lukowski/Innoopract - initial renaming/restructuring
 * 	 Gerry Kessler/Oracle - code borrowed and repurposed for JSF subproject
 *
 *******************************************************************************/
package org.eclipse.jst.jsf.contentmodel.annotation.internal;

import java.io.IOException;
import java.io.InputStream;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.eclipse.jst.jsf.common.JSFCommonPlugin;
import org.eclipse.jst.jsf.contentmodel.annotation.CMAnnotationSourceFileLocator;
import org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationFileParser;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * Default implementation of ICMAnnotationFileParser that will parse xml files conforming to 
 * http://org.eclipse.jst.jsf.contentmodel.annotations/grammarAnnotationSchema.   
 * 
 * @author Gerry Kessler - Oracle
 * 
 * also see http://org.eclipse.jst.jsf.contentmodel.annotations/grammarAnnotationSchema
 * @deprecated see common.metadata package
 */
public class CMAnnotationFileParser implements ICMAnnotationFileParser {
	
	private static final String TAG_ID_ANNOTATIONS = "grammar-annotations"; //$NON-NLS-1$
	private static final String TAG_ID_ELEMENT = "cm-element"; //$NON-NLS-1$
	private static final String TAG_ID_ATTRIBUTE = "cm-attribute"; //$NON-NLS-1$
	private static final String TAG_ID_PROPERTY = "property"; //$NON-NLS-1$
	private static final String TAG_ID_PROPERTY_VALUE = "value"; //$NON-NLS-1$

	/**
	 * This method is called to parse an annotation file and store the contents
	 * into an annotationMap via the advisor
	 */
	private void parse(ICMAnnotationAdvisor advisor, InputStream input) throws Exception {
		ClassLoader prevClassLoader = Thread.currentThread().getContextClassLoader();
		try {
			SAXParserFactory factory = SAXParserFactory.newInstance();
			factory.setNamespaceAware(true);
			SAXParser parser = factory.newSAXParser();
			parser.parse(new InputSource(input), new CMAnnotationMapContentHandler(advisor));
		} finally {
			Thread.currentThread().setContextClassLoader(prevClassLoader);
			if (input != null){
				try {
					input.close();
				} catch (IOException e) {
                    JSFCommonPlugin.log(e, "error closing annotation file");
				}
			}
		}
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationFileParser#parse(org.eclipse.jst.jsf.contentmodel.annotation.internal.ICMAnnotationAdvisor, org.eclipse.jst.jsf.contentmodel.annotation.CMAnnotationSourceFileLocator)
	 */
	public void parse(ICMAnnotationAdvisor advisor, CMAnnotationSourceFileLocator locator)
			throws Exception {
		
		InputStream inputStream = locator.getAnnotationSourceInputStream();
		parse(advisor, inputStream);
	}

	/**
	 * Default content handler for annotation files following grammar-annotations schema
	 * 
	 * @author Gerry Kessler - Oracle
	 */
	protected class CMAnnotationMapContentHandler extends DefaultHandler {
		private ICMAnnotationAdvisor advisor;
		private String elementName;
		private String attributeName;
		private String currentPropertyName;
		private String currentPropertyValue;
		private StringBuffer propertyValueBuffer;

		private boolean isInCMAttribute = false;

		private boolean doCaptureNodeText;

		/**
		 * Constructor
		 * @param advisor
		 */
		public CMAnnotationMapContentHandler(ICMAnnotationAdvisor advisor) {
			this.advisor = advisor;
		}

		public void startElement(String uri, String localName, String qName, Attributes attributes)
				throws SAXException {
			if (localName.equals(TAG_ID_ANNOTATIONS)) {
				int attributesLength = attributes.getLength();
				for (int i = 0; i < attributesLength; i++) {
					String attributeName_ = attributes.getLocalName(i);
					String attributeValue = attributes.getValue(i);
					if (attributeName_.equals("caseSensitive")) { //$NON-NLS-1$					
						if (attributeValue.trim().equals("false")) {//$NON-NLS-1$
							advisor.setCaseSensitive(false);
						}
					}
				}
			} else if (localName.equals(TAG_ID_ELEMENT)) {
				isInCMAttribute = false;
				elementName = attributes.getValue("name"); //$NON-NLS-1$
			} else if (localName.equals(TAG_ID_ATTRIBUTE)) {
				isInCMAttribute = true;
				attributeName = attributes.getValue("name"); //$NON-NLS-1$
			} else if (localName.equals(TAG_ID_PROPERTY)) {
				currentPropertyName = attributes.getValue("name"); //$NON-NLS-1$					
			} else if (localName.equals(TAG_ID_PROPERTY_VALUE)) {
				propertyValueBuffer = new StringBuffer();
				doCaptureNodeText = true;
			}
		}

		public void endElement(String uri, String localName, String qName) throws SAXException {
			if (currentPropertyName != null && localName.equals(TAG_ID_PROPERTY_VALUE)) {
				doCaptureNodeText = false;
				currentPropertyValue = propertyValueBuffer.toString();
				if (currentPropertyValue != null) {					
					if (isInCMAttribute)
						advisor.addAttributeAnnotation(elementName, attributeName,
								currentPropertyName, currentPropertyValue);
					else
						advisor.addElementAnnotation(elementName, currentPropertyName,
								currentPropertyValue);
				}
			}

			if (localName.equals(TAG_ID_ELEMENT)) {
				elementName = null;
			} else if (localName.equals(TAG_ID_ATTRIBUTE)) {
				isInCMAttribute = false;
				attributeName = null;
			} else if (localName.equals(TAG_ID_PROPERTY)) {
				currentPropertyName = null;
			} else if (localName.equals(TAG_ID_PROPERTY_VALUE)) {
				currentPropertyValue = null;
			}
		}

		public void characters(char[] ch, int start, int length) {
			if (doCaptureNodeText)
				propertyValueBuffer.append(ch, start, length);
		}

	}
}
