/******************************************************************************* * 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.launching; import java.net.URL; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.internal.launching.LaunchingMessages; import org.eclipse.jdt.internal.launching.LaunchingPlugin; /** * The location of a library (for example rt.jar). * <p> * Clients may instantiate this class. * </p> */ public final class LibraryLocation { private IPath fSystemLibrary; private IPath fSystemLibrarySource; private IPath fExternalAnnotations; private IPath fPackageRootPath; private URL fJavadocLocation; private URL fIndexLocation; /** * Creates a new library location. * * @param libraryPath The location of the JAR containing java.lang.Object * Must not be <code>null</code>. * @param sourcePath The location of the zip file containing the sources for <code>library</code> * Must not be <code>null</code> (Use Path.EMPTY instead) * @param packageRoot The path inside the <code>source</code> zip file where packages names * begin. If the source for java.lang.Object source is found at * "src/java/lang/Object.java" in the zip file, the * packageRoot should be "src" * Must not be <code>null</code>. (Use Path.EMPTY or IPath.ROOT) * @throws IllegalArgumentException If the library path is <code>null</code>. */ public LibraryLocation(IPath libraryPath, IPath sourcePath, IPath packageRoot) { this(libraryPath, sourcePath, packageRoot, null); } /** * Creates a new library location. * * @param libraryPath The location of the JAR containing java.lang.Object * Must not be <code>null</code>. * @param sourcePath The location of the zip file containing the sources for <code>library</code> * Must not be <code>null</code> (Use Path.EMPTY instead) * @param packageRoot The path inside the <code>source</code> zip file where packages names * begin. If the source for java.lang.Object source is found at * "src/java/lang/Object.java" in the zip file, the * packageRoot should be "src" * Must not be <code>null</code>. (Use Path.EMPTY or IPath.ROOT) * @param javadocLocation The location of the javadoc for <code>library</code> * @throws IllegalArgumentException If the library path is <code>null</code>. * @since 3.1 */ public LibraryLocation(IPath libraryPath, IPath sourcePath, IPath packageRoot, URL javadocLocation) { this(libraryPath, sourcePath, packageRoot, javadocLocation, null, null); } /** * Creates a new library location. * * @param libraryPath The location of the JAR containing java.lang.Object * Must not be <code>null</code>. * @param sourcePath The location of the zip file containing the sources for <code>library</code> * Must not be <code>null</code> (Use Path.EMPTY instead) * @param packageRoot The path inside the <code>source</code> zip file where packages names * begin. If the source for java.lang.Object source is found at * "src/java/lang/Object.java" in the zip file, the * packageRoot should be "src" * Must not be <code>null</code>. (Use Path.EMPTY or IPath.ROOT) * @param javadocLocation The location of the javadoc for <code>library</code> * @param indexLocation The location of the index for <code>library</code> * @throws IllegalArgumentException If the library path is <code>null</code>. * @since 3.7 */ public LibraryLocation(IPath libraryPath, IPath sourcePath, IPath packageRoot, URL javadocLocation, URL indexLocation) { this(libraryPath, sourcePath, packageRoot, javadocLocation, indexLocation, null); } /** * Creates a new library location. * * @param libraryPath The location of the JAR containing java.lang.Object * Must not be <code>null</code>. * @param sourcePath The location of the zip file containing the sources for <code>library</code> * Must not be <code>null</code> (Use Path.EMPTY instead) * @param packageRoot The path inside the <code>source</code> zip file where packages names * begin. If the source for java.lang.Object source is found at * "src/java/lang/Object.java" in the zip file, the * packageRoot should be "src" * Must not be <code>null</code>. (Use Path.EMPTY or IPath.ROOT) * @param javadocLocation The location of the javadoc for <code>library</code> * @param indexLocation The location of the index for <code>library</code> * @param externalAnnotations The file or directory containing external annotations, or <code>null</code> if not applicable. * @throws IllegalArgumentException If the library path is <code>null</code>. * @since 3.8 */ public LibraryLocation(IPath libraryPath, IPath sourcePath, IPath packageRoot, URL javadocLocation, URL indexLocation, IPath externalAnnotations) { if (libraryPath == null) { throw new IllegalArgumentException(LaunchingMessages.libraryLocation_assert_libraryNotNull); } fSystemLibrary= libraryPath; fSystemLibrarySource= sourcePath; fPackageRootPath= packageRoot; fJavadocLocation= javadocLocation; fIndexLocation = indexLocation; fExternalAnnotations = externalAnnotations == null ? Path.EMPTY : externalAnnotations; } /** * 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; } /** * Return the JRE library external annotations location. * * @since 3.8 * @return The file or directory holding external annotations, or Path.EMPTY if not applicable. This will never be null. */ public IPath getExternalAnnotationsPath() { return fExternalAnnotations; } /** * 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; } /** * Returns the Javadoc location associated with this Library location. * * @return a {@link 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; } /** * Returns the index location associated with this library location. * * @return a {@link URL} pointing to the index location associated with * this Library location, or <code>null</code> if none * @since 3.7 */ public URL getIndexLocation() { return fIndexLocation; } /* (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (obj instanceof LibraryLocation) { LibraryLocation lib = (LibraryLocation)obj; return getSystemLibraryPath().equals(lib.getSystemLibraryPath()) && equals(getSystemLibrarySourcePath(), lib.getSystemLibrarySourcePath()) && equals(getExternalAnnotationsPath(), lib.getExternalAnnotationsPath()) && equals(getPackageRootPath(), lib.getPackageRootPath()) && LaunchingPlugin.sameURL(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); } /** * Sets the JRE library source zip location. * * @param source the source to set * @since 3.4 */ public void setSystemLibrarySource(IPath source) { fSystemLibrarySource = source; } /** * Sets the index location to the given {@link URL}. * * @param indexLoc * @since 3.7 */ public void setIndexLocation(URL indexLoc) { fIndexLocation = indexLoc; } }