/*******************************************************************************
 * Copyright (c) 2005, 2016 IBM Corporation and others.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 * 
 * SPDX-License-Identifier: EPL-2.0
 *
 *******************************************************************************/
package org.eclipse.dltk.internal.core.mixin;

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

import org.eclipse.core.runtime.CoreException;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.IDLTKLanguageToolkit;
import org.eclipse.dltk.core.caching.IContentCache;
import org.eclipse.dltk.core.caching.MixinModelProcessor;
import org.eclipse.dltk.core.environment.EnvironmentPathUtils;
import org.eclipse.dltk.core.environment.IFileHandle;
import org.eclipse.dltk.core.mixin.IMixinParser;
import org.eclipse.dltk.core.mixin.IMixinRequestor;
import org.eclipse.dltk.core.search.index.MixinIndex;
import org.eclipse.dltk.core.search.indexing.AbstractIndexer;
import org.eclipse.dltk.core.search.indexing.IndexDocument;
import org.eclipse.dltk.internal.core.ModelManager;

public class MixinIndexer extends AbstractIndexer {

	public MixinIndexer(IndexDocument document) {
		super(document);
	}

	@Override
	public void indexDocument() {
		IDLTKLanguageToolkit toolkit = this.document.getToolkit();
		if (toolkit == null) {
			return;
		}
		boolean performed = false;
		// Try to restore index from persistent index
		IFileHandle handle = EnvironmentPathUtils.getFile(document
				.getSourceModule());
		if (handle != null) {
			// handle is null for built-in modules.
			IContentCache coreCache = ModelManager.getModelManager()
					.getCoreCache();
			InputStream stream = coreCache.getCacheEntryAttribute(handle,
					IContentCache.MIXIN_INDEX);
			if (stream != null) {
				// Found cached structure index, try to restore
				try {
					final MixinIndexRequestor requestor = new MixinIndexRequestor();
					MixinModelProcessor processor = new MixinModelProcessor(
							stream, requestor);
					processor.process();
					stream.close();
					performed = true;
					if (requestor.count == 0) {
						((MixinIndex) document.getIndex())
								.addDocumentName(document
										.getContainerRelativePath());
					}
				} catch (IOException e) {
					performed = false;
					if (DLTKCore.DEBUG) {
						e.printStackTrace();
					}
				}
			}
		}

		if (!performed) {
			try {
				IMixinParser parser = MixinManager.getMixinParser(toolkit
						.getNatureId());
				if (parser != null) {
					final MixinIndexRequestor requestor = new MixinIndexRequestor();
					parser.setRequirestor(requestor);
					parser
							.parserSourceModule(false, document
									.getSourceModule());
					if (requestor.count == 0) {
						((MixinIndex) document.getIndex())
								.addDocumentName(document
										.getContainerRelativePath());
					}
				}
			} catch (CoreException e) {
				DLTKCore.error("Error in MixinIndexer", e); //$NON-NLS-1$
			}
		}
	}

	private class MixinIndexRequestor implements IMixinRequestor {
		int count = 0;

		@Override
		public void reportElement(ElementInfo info) {
			if (info.key.length() > 0) {
				addIndexEntry(MIXIN, info.key.toCharArray());
				++count;
			}
		}
	}
}
