/*******************************************************************************
 * Copyright (c) 2004 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 Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.jsp.core.internal.java.search;

import java.io.IOException;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.search.SearchParticipant;
import org.eclipse.jst.jsp.core.internal.Logger;
import org.eclipse.jst.jsp.core.internal.java.IJSPTranslation;
import org.eclipse.jst.jsp.core.internal.java.JSPTranslationAdapter;
import org.eclipse.jst.jsp.core.internal.java.JSPTranslationAdapterFactory;
import org.eclipse.jst.jsp.core.internal.java.JSPTranslationExtension;
import org.eclipse.wst.common.encoding.exceptions.UnsupportedCharsetExceptionWithDetail;
import org.eclipse.wst.sse.core.IModelManager;
import org.eclipse.wst.sse.core.IStructuredModel;
import org.eclipse.wst.sse.core.StructuredModelManager;
import org.eclipse.wst.xml.core.document.XMLDocument;
import org.eclipse.wst.xml.core.document.XMLModel;

/**
 * Created with a .jsp file, but should appear to be a .java file for indexing
 * and searching purposes
 * 
 * @author pavery
 */
public class JSPSearchDocument {

	private String UNKNOWN_PATH = "**path unknown**"; //$NON-NLS-1$
	private String jspPath = UNKNOWN_PATH; //for debugging
	private IFile fJSPFile = null;
	private JSPTranslationExtension fJSPTranslation = null;
	private SearchParticipant fParticipant = null;
	private String fCUText = null;
	private String fCUPath = UNKNOWN_PATH;

	/**
	 * @param file
	 * @param participant
	 * @throws CoreException
	 */
	public JSPSearchDocument(IFile file, SearchParticipant participant) throws CoreException {

		this.fJSPFile = file;
		this.jspPath = file.getFullPath().toString();
		
		updateJavaInfo(file);
		
		this.fParticipant = participant;
	}

	public SearchParticipant getParticipant() {
		return this.fParticipant;
	}

	/**
	 * @see org.eclipse.jdt.core.search.SearchDocument#getCharContents()
	 */
	public char[] getCharContents() {
		return this.fCUText.toCharArray();
	}

	public String getJavaText() {
		return new String(getCharContents());
	}
	
	private IModelManager getModelManager() {
//		IModelManager modelManager = null;
//		Bundle mmBundle = Platform.getBundle("org.eclipse.wst.sse.core"); //$NON-NLS-1$
//		int state = mmBundle.getState();
//		// I put in check to active bundle to avoid so many
//		// exceptions during unit tests ... apparently the search
//		// indexing continues, even when being shutdown. We should
//		// fix that "root" problem, but I'm not sure where right now.
//		// Note: the "active" state assume's we're never called early
//		// before already active once.
//		if (state == Bundle.ACTIVE) {
//			//System.out.println("state: " + state);
//			modelManager = StructuredModelManager.getInstance().getModelManager();
//		} else {
//			// occassionally, during unit tests, I've seen this return null, I
//			// suspect because
//			// the workbench is shutting down. So, if we get 'null' back,
//			// we'll though relatively CoreException, just to get it logged.
//			// and cease processing.
//			Logger.log(Logger.INFO, "ModelManager not available, probably due to shutting down"); //$NON-NLS-1$
//			modelManager = new NullModelManager();
//		}
//		return modelManager;
		// none of the above should be necessary since it is already done if you just call the below
		return StructuredModelManager.getInstance().getModelManager();
	}
	
	/**
	 * @param file
	 * @throws CoreException
	 */
	private void updateJavaInfo(IFile file) throws CoreException {
		
		if(!JSPSearchSupport.isJsp(file))
			return;
		
		XMLModel xmlModel = null;
		try {
			// get existing model for read, then get document from it
			xmlModel = (XMLModel) getModelManager().getModelForRead(file);
			// handle unsupported
			if (xmlModel != null) {
				setupAdapterFactory(xmlModel);
				XMLDocument doc = xmlModel.getDocument();
				JSPTranslationAdapter adapter = (JSPTranslationAdapter) doc.getAdapterFor(IJSPTranslation.class);
				this.fJSPTranslation = adapter.getJSPTranslation();

				if (this.fJSPTranslation != null) {
					this.fCUText = this.fJSPTranslation.getJavaText();
					this.fCUPath = this.fJSPTranslation.getJavaPath();
				}
			}
		}
		catch (IOException e) {
			Logger.logException(e);
		}
		catch (CoreException e) {
			Logger.logException(e);
		}
		catch (UnsupportedCharsetExceptionWithDetail e) {
			// no need to log this. Just consider it an invalid file for our
			// purposes.
			//Logger.logException(e);
		}
		finally {
			if (xmlModel != null)
				xmlModel.releaseFromRead();
		}
	}

	/**
	 * add the factory for JSPTranslationAdapter here
	 * 
	 * @param sm
	 */
	private void setupAdapterFactory(IStructuredModel sm) {
		JSPTranslationAdapterFactory factory = new JSPTranslationAdapterFactory();
		sm.getFactoryRegistry().addFactory(factory);
	}

	/**
	 * the path to the Java compilation unit
	 * 
	 * @see org.eclipse.jdt.core.search.SearchDocument#getPath()
	 */
	public String getPath() {
		return this.fCUPath != null ? this.fCUPath : UNKNOWN_PATH;
	}

	public int getJspOffset(int javaOffset) {
		return this.fJSPTranslation != null ? this.fJSPTranslation.getJspOffset(javaOffset) : 0;
	}

	public IFile getFile() {
		return this.fJSPFile;
	}
	
	public void release() {
		
		if (this.fJSPTranslation != null) {
			this.fJSPTranslation.release();
		}
		this.fJSPTranslation = null;
	}

	public JSPTranslationExtension getJspTranslation() {
		return this.fJSPTranslation;
	}

	/**
	 * for debugging
	 */
	public String toString() {
		return "[JSPSearchDocument:" + this.jspPath + "(CU:" + this.fCUPath + ")]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jdt.core.search.SearchDocument#getEncoding()
	 */
	public String getEncoding() {
		// TODO Auto-generated method stub
		return null;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jdt.core.search.SearchDocument#getByteContents()
	 */
	public byte[] getByteContents() {
		// TODO Auto-generated method stub
		return null;
	}
}