/*******************************************************************************
 * Copyright (c) 2003, 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.j2ee.internal.web.locator;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jst.j2ee.internal.web.taglib.TLDDigester;
import org.eclipse.jst.j2ee.internal.web.taglib.TaglibInfo;
import org.eclipse.jst.j2ee.web.taglib.ITaglibInfo;
import org.eclipse.jst.j2ee.web.taglib.ITaglibLocator;

import com.ibm.wtp.common.logger.proxy.Logger;


/**
 * @version 1.0
 * @author
 */
public abstract class AbstractTaglibLocator implements ITaglibLocator {
	protected IProject project;
	static protected final ITaglibInfo[] EMPTY_TAGLIBINFO_ARRAY = new ITaglibInfo[0];

	public AbstractTaglibLocator(IProject project) {
		this.project = project;
	}

	protected String calculateURIForFile(IPath projectRelativePath) {
		IPath result = new Path("/"); //$NON-NLS-1$
		IPath serverRoot = getServerRoot();
		IPath filePath = projectRelativePath;
		result = result.append(filePath.removeFirstSegments(serverRoot.segmentCount()));
		return result.makeAbsolute().toString();
	}

	abstract protected IPath getServerRoot();

	protected TLDDigester getTLDDigester(IFile tldFile) {
		InputStream stream = null;
		try {
			stream = tldFile.getContents();
			return getTLDDigester(stream);
		} catch (CoreException e) {
			Logger.getLogger().log(e);
		} finally {
			if (stream != null) {
				try {
					stream.close();
				} catch (IOException e) {
					Logger.getLogger().log(e);
				}
			}
		}
		return null;
	}

	protected TLDDigester getTLDDigester(InputStream stream) {
		TLDDigester digester = new TLDDigester(stream);
		return digester;
	}

	protected ITaglibInfo createTaglibForTLD(IFile file) {
		TLDDigester digester = getTLDDigester(file);
		try {
			if (digester != null) {
				if (isValidTLD(digester)) {
					String uri = digester.getURI();
					if (uri != null) {
						TaglibInfo taglibInfo = new TaglibInfo(this.project, uri, file.getProjectRelativePath());
						taglibInfo.setPrefix(digester.getShortName());
						taglibInfo.setIsURIFromTLD(true);
						return taglibInfo;
					}
				}
			}
		} finally {
			if (digester != null)
				digester.close();
		}
		return null;
	}

	protected ITaglibInfo createTaglibForTLD(String uri, IPath file) {
		return new TaglibInfo(this.project, uri, file);
	}

	protected ITaglibInfo createTaglibForJar(String uri, IPath jarfile, IPath tldLocation) {
		return new TaglibInfo(this.project, uri, jarfile, tldLocation);
	}

	protected ITaglibInfo createTaglibForLibModuleJar(String uri, IPath jarfile, IResource tldFile) {
		TaglibInfo taglibInfo = new TaglibInfo(tldFile.getProject(), uri, jarfile, tldFile.getProjectRelativePath());
		taglibInfo.setIsLibModule(true);
		return taglibInfo;
	}

	protected boolean hasJarExtension(IPath file) {
		String extension = file.getFileExtension();
		if (extension != null) {
			if (extension.equalsIgnoreCase("jar")) //$NON-NLS-1$
				return true;
			if (extension.equalsIgnoreCase("zip")) //$NON-NLS-1$
				return true;
		}
		return false;
	}


	protected boolean hasJarExtension(String filename) {
		return hasJarExtension(new Path(filename));
	}


	protected boolean hasTLDExtension(IPath file) {
		String extension = file.getFileExtension();
		if (extension != null && extension.equalsIgnoreCase("tld")) //$NON-NLS-1$
			return true;
		return false;
	}

	protected boolean hasTagExtension(String filename) {
		return hasTagExtension(new Path(filename));
	}

	protected boolean hasTagExtension(IPath file) {
		String extension = file.getFileExtension();
		if (extension != null && extension.equalsIgnoreCase("tag")) //$NON-NLS-1$
			return true;
		return false;
	}


	protected boolean hasTLDExtension(String filename) {
		return hasTLDExtension(filename);
	}

	protected boolean isValidTLD(TLDDigester digester) {
		return true;
	}

	/*
	 * @see ITaglibLocator#search(IResource)
	 */
	public ITaglibInfo[] search(IResource resource) {
		final ArrayList results = new ArrayList();

		try {
			resource.accept(new IResourceVisitor() {
				public boolean visit(IResource aresource) throws CoreException {
					if (aresource.getType() != IResource.FILE) {
						if (aresource.getType() != IResource.ROOT && aresource.getProject() != AbstractTaglibLocator.this.project)
							return false;
						return true;
					}
					ITaglibInfo[] taglibs = searchFile((IFile) aresource);
					if (taglibs != null)
						results.addAll(Arrays.asList(taglibs));

					return false;
				}
			});
		} catch (CoreException e) {
			Logger.getLogger().log(e);
		}
		return (ITaglibInfo[]) results.toArray(new ITaglibInfo[results.size()]);
	}

	abstract protected ITaglibInfo[] searchFile(IFile file);



}