/*******************************************************************************
 * Copyright (c) 2000, 2007 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
 *
 
 *******************************************************************************/
package org.eclipse.dltk.core.search.indexing;

import java.util.Date;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.dltk.core.IScriptFolder;
import org.eclipse.dltk.core.ISourceElementParser;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.core.search.IDLTKSearchScope;
import org.eclipse.dltk.core.search.SearchDocument;
import org.eclipse.dltk.internal.core.ModelManager;

/**
 * A SourceIndexer indexes script files using a script parser. The following
 * items are indexed: Declarations of: - Classes<br> - Interfaces; <br> -
 * Methods;<br> - Fields;<br>
 * References to: - Methods (with number of arguments); <br> - Fields;<br> -
 * Types;<br> - Constructors.
 */
public class SourceIndexer extends AbstractIndexer {

	static long maxWorkTime = 0;

	public SourceIndexer(SearchDocument document) {
		super(document);
	}

	public void indexDocument() {

		long started = (new Date()).getTime();

		// Create a new Parser
		SourceIndexerRequestor requestor = ((InternalSearchDocument) this.document).requestor;
		String documentPath = this.document.getPath();
		IPath path = new Path(documentPath);
		ISourceElementParser parser = ((InternalSearchDocument) this.document).parser;
		if (!this.document.isExternal()) {
			IProject project = ResourcesPlugin.getWorkspace().getRoot()
					.getProject(path.segment(0));
			IScriptProject scriptProject = DLTKCore.create(project);

			if (requestor == null) {
				requestor = ModelManager.getModelManager().indexManager
						.getSourceRequestor(scriptProject);
			}
			requestor.setIndexer(this);

			if (parser == null) {
				parser = ModelManager.getModelManager().indexManager
						.getSourceElementParser(scriptProject, requestor);
			} else {
				parser.setRequestor(requestor);
			}
			String pkgName = "";
			IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
			// ISourceModule sourceModule = null;
			if (file.exists()) {
				ISourceModule module = (ISourceModule) DLTKCore.create(file);
				if (module != null) {
					// sourceModule = module;
					IScriptFolder folder = (IScriptFolder) module.getParent();
					pkgName = folder.getElementName();
				}
			}
			requestor.setPackageName(pkgName);
			// Launch the parser
			char[] source = null;
			char[] name = null;
			try {
				source = document.getCharContents();
				name = documentPath.toCharArray();
			} catch (Exception e) {
				// ignore
			}
			if (source == null || name == null)
				return; // could not retrieve document info (e.g. resource was
			// discarded)
			parser.parseSourceModule(source, null, name);

		} else { // This is for external documents
			if (parser == null || requestor == null) {
				// parser =
				// ModelManager.getModelManager().indexManager.getSourceElementParser(scriptProject,
				// requestor);
				if (DLTKCore.DEBUG) {
					System.err
							.println("TODO: Add getSourceElementParser here.");
				}
				return;
			} else {
				parser.setRequestor(requestor);
			}
			requestor.setIndexer(this);
			String ppath = path.toString();
			if (DLTKCore.DEBUG) {
				System.err.println("TODO: Correct me please...");
			}
			String pkgName = (new Path(ppath.substring(ppath
					.indexOf(IDLTKSearchScope.FILE_ENTRY_SEPARATOR) + 1))
					.removeLastSegments(1)).toString();
			requestor.setPackageName(pkgName);
			// Launch the parser
			char[] source = null;
			char[] name = null;
			try {
				source = document.getCharContents();
				name = documentPath.toCharArray();
			} catch (Exception e) {
				// ignore
			}
			if (source == null || name == null)
				return; // could not retrieve document info (e.g. resource was
			// discarded)
			parser.parseSourceModule(source, null, name);

			long ended = (new Date()).getTime();

			if (ended - started > maxWorkTime) {
				maxWorkTime = ended - started;
				if (DLTKCore.VERBOSE) {
					System.err.println("Max indexDocument() work time "
							+ maxWorkTime + " on " + document.getPath());
				}
			}
		}
	}
}
