/*******************************************************************************
 * Copyright (c) 2000, 2015 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
 *     Frits Jalvingh - Contribution for Bug 459831 - [launching] Support attaching 
 *     	external annotations to a JRE container
 *******************************************************************************/
package org.eclipse.jdt.internal.debug.ui.jres;

import java.net.URL;

import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.debug.ui.IJavaDebugUIConstants;
import org.eclipse.jdt.launching.LibraryLocation;


/**
 * Wrapper for an original library location, to support editing.
 * 
 */
public final class LibraryStandin {
	private IPath fSystemLibrary;
	private IPath fSystemLibrarySource;
	private IPath fExternalAnnotations;
	private IPath fPackageRootPath;
	private URL fJavadocLocation;
	
	/**
	 * Creates a new library standin on the given library location.
	 */	
	public LibraryStandin(LibraryLocation libraryLocation) {
		fSystemLibrary= libraryLocation.getSystemLibraryPath();
		setSystemLibrarySourcePath(libraryLocation.getSystemLibrarySourcePath());
		setPackageRootPath(libraryLocation.getPackageRootPath());
		setJavadocLocation(libraryLocation.getJavadocLocation());
		setExternalAnnotationsPath(libraryLocation.getExternalAnnotationsPath());
	}		
		
	/**
	 * Returns the JRE library jar location.
	 * 
	 * @return The JRE library jar location.
	 */
	public IPath getSystemLibraryPath() {
		return fSystemLibrary;
	}
	
	/**
	 * Returns the JRE library source zip location.
	 * 
	 * @return The JRE library source zip location.
	 */
	public IPath getSystemLibrarySourcePath() {
		return fSystemLibrarySource;
	}	
	
	/**
	 * Sets the source location for this library.
	 * 
	 * @param path path source archive or Path.EMPTY if none
	 */
	void setSystemLibrarySourcePath(IPath path) {
		fSystemLibrarySource = path;
	}
	
	/**
	 * Returns the path to the external annotations.
	 *
	 * @return
	 */
	public IPath getExternalAnnotationsPath() {
		return fExternalAnnotations;
	}

	void setExternalAnnotationsPath(IPath path) {
		fExternalAnnotations = path;
	}

	/**
	 * Returns the path to the default package in the sources zip file
	 * 
	 * @return The path to the default package in the sources zip file.
	 */
	public IPath getPackageRootPath() {
		return fPackageRootPath;
	}
	
	/**
	 * Sets the root source location within source archive.
	 * 
	 * @param path path to root source location or Path.EMPTY if none
	 */
	void setPackageRootPath(IPath path) {
		fPackageRootPath = path;
	}
	
	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (obj instanceof LibraryStandin) {
			LibraryStandin lib = (LibraryStandin)obj;
			return getSystemLibraryPath().equals(lib.getSystemLibraryPath()) 
				&& equals(getSystemLibrarySourcePath(), lib.getSystemLibrarySourcePath())
				&& equals(getPackageRootPath(), lib.getPackageRootPath())
				&& equals(getExternalAnnotationsPath(), lib.getExternalAnnotationsPath())
				&& equalURLs(getJavadocLocation(), lib.getJavadocLocation());
		} 
		return false;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		return getSystemLibraryPath().hashCode();
	}
	
	/**
	 * Returns whether the given paths are equal - either may be <code>null</code>.
	 * @param path1 path to be compared
	 * @param path2 path to be compared
	 * @return whether the given paths are equal
	 */
	protected boolean equals(IPath path1, IPath path2) {
		return equalsOrNull(path1, path2);
	}
	
	/**
	 * Returns whether the given objects are equal - either may be <code>null</code>.
	 * @param o1 object to be compared
	 * @param o2 object to be compared
	 * @return whether the given objects are equal or both null
	 * @since 3.1
	 */	
	private boolean equalsOrNull(Object o1, Object o2) {
		if (o1 == null) {
			return o2 == null;
		}
		if (o2 == null) {
			return false;
		}
		return o1.equals(o2);
	}

	/**
	 * Returns whether the given URLs are equal - either may be <code>null</code>.
	 * @param url1 URL to be compared
	 * @param url2 URL to be compared
	 * @return whether the given URLs are equal
	 */
	protected boolean equalURLs(URL url1, URL url2) {
		if (url1 == null) {
			return url2 == null;
		}
		if (url2 == null) {
			return false;
		}
		return url1.toExternalForm().equals(url2.toExternalForm());
	}
	
	/**
	 * Returns the Javadoc location associated with this Library location.
	 * 
	 * @return a url pointing to the Javadoc location associated with
	 * 	this Library location, or <code>null</code> if none
	 * @since 3.1
	 */
	public URL getJavadocLocation() {
		return fJavadocLocation;
	}
	
	/**
	 * Sets the javadoc location of this library.
	 *  
	 * @param url The location of the javadoc for <code>library</code> or <code>null</code>
	 *  if none
	 */
	void setJavadocLocation(URL url) {
		fJavadocLocation = url;
	}

	/**
	 * Returns an equivalent library location.
	 * 
	 * @return library location
	 */
	LibraryLocation toLibraryLocation() {
		return new LibraryLocation(getSystemLibraryPath(), getSystemLibrarySourcePath(), getPackageRootPath(), getJavadocLocation(), null, getExternalAnnotationsPath());
	}
	
	/**
	 * Returns a status for this library describing any error states
	 * 
	 * @return
	 */
	IStatus validate() {
		if (!getSystemLibraryPath().toFile().exists()) {
			return new Status(IStatus.ERROR, IJavaDebugUIConstants.PLUGIN_ID, IJavaDebugUIConstants.INTERNAL_ERROR,"System library does not exist: " + getSystemLibraryPath().toOSString(), null); //$NON-NLS-1$
		}
		IPath path = getSystemLibrarySourcePath();
		if (!path.isEmpty()) {
			if (!path.toFile().exists()) {
				// check for workspace resource
				IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
				if (resource == null || !resource.exists()) {
					return new Status(IStatus.ERROR, IJavaDebugUIConstants.PLUGIN_ID, IJavaDebugUIConstants.INTERNAL_ERROR, "Source attachment does not exist: " + path.toOSString(), null); //$NON-NLS-1$
				}
			}
		}
		path = getExternalAnnotationsPath();
		if (path != null && !path.isEmpty()) {
			if (!path.toFile().exists()) {
				// check for workspace resource
				IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
				if (resource == null || !resource.exists()) {
					return new Status(IStatus.ERROR, IJavaDebugUIConstants.PLUGIN_ID, IJavaDebugUIConstants.INTERNAL_ERROR, "External Annotations file does not exist: " + path.toOSString(), null); //$NON-NLS-1$
				}
			}
		}

		return Status.OK_STATUS;
	}
	
}
