package org.eclipse.jst.jsp.ui.internal.hyperlink;

import org.eclipse.jface.text.IDocument;
import org.eclipse.wst.common.contentmodel.util.DOMNamespaceHelper;
import org.eclipse.jst.jsp.ui.internal.Logger;
import org.eclipse.wst.sse.core.IStructuredModel;
import org.eclipse.wst.sse.core.StructuredModelManager;
import org.eclipse.wst.sse.core.util.StringUtils;
import org.eclipse.wst.sse.core.util.URIResolver;
import org.w3c.dom.Attr;
import org.w3c.dom.Node;

/**
 * Detects hyperlinks in tags. Includes detection in DOCTYPE and attribute
 * values. Resolves references to schemas, dtds, href, file, src, etc using the
 * Web Project Resolver.
 * 
 */
public class URIHyperlinkDetector extends XMLHyperlinkDetector {
	// copies of this class exist in:
	// org.eclipse.wst.html.ui.internal.hyperlink
	// org.eclipse.jst.jsp.ui.internal.hyperlink

	private final String SCHEMA_LOCATION = "schemaLocation"; //$NON-NLS-1$
	private final String XMLNS = "xmlns"; //$NON-NLS-1$
	private final String XSI_NAMESPACE_URI = "http://www.w3.org/2001/XMLSchema-instance"; //$NON-NLS-1$

	protected String getURIString(Node node, IDocument document) {
		if (isXMLHandled(node))
			return super.getURIString(node, document);
		
		String resolvedURI = null;
		if (node.getNodeType() == Node.ATTRIBUTE_NODE) {
			// handle attribute node
			Attr attrNode = (Attr) node;
			String attrValue = attrNode.getValue();
			attrValue = StringUtils.strip(attrValue);

			if (attrValue != null && attrValue.length() > 0) {
				// currently using model's URI resolver until a better resolver is
				// extended to common extensible URI resolver
				// future_TODO: should use the new common extensible URI resolver
				// when
				// clients start implementing it
				IStructuredModel sModel = null;
				try {
					sModel = StructuredModelManager.getModelManager().getExistingModelForRead(document);
					if (sModel != null) {
						URIResolver resolver = sModel.getResolver();
						resolvedURI = resolver != null ? resolver.getLocationByURI(attrValue, true) : attrValue;
					}
				}
				catch (Exception e) {
					Logger.logException(e);
				}
				finally {
					if (sModel != null)
						sModel.releaseFromRead();
				}
			}
		}
		return resolvedURI;
	}
	
	/**
	 * Check if this is an xml-related node (schema location, doctype).
	 * @param node
	 * @return
	 */
	private boolean isXMLHandled(Node node) {
		short nodeType = node.getNodeType();
		if (nodeType == Node.DOCUMENT_TYPE_NODE) {
			return true;
		} else if (nodeType == Node.ATTRIBUTE_NODE) {
			Attr attrNode = (Attr) node;
			String attrName = attrNode.getName();

			// handle schemaLocation attribute
			String prefix = DOMNamespaceHelper.getPrefix(attrName);
			String unprefixedName = DOMNamespaceHelper.getUnprefixedName(attrName);
			if ((XMLNS.equals(prefix)) || (XMLNS.equals(unprefixedName))) {
				return true;
			} else if ((XSI_NAMESPACE_URI.equals(DOMNamespaceHelper.getNamespaceURI(attrNode))) && (SCHEMA_LOCATION.equals(unprefixedName))) {
				return true;
			}
		}
		return false;
	}
}
