Bug 399798 - StandardVMType should allow to contribute default source
and Javadoc locations for ext libraries
diff --git a/org.eclipse.jdt.debug.tests/plugin.xml b/org.eclipse.jdt.debug.tests/plugin.xml
index d79e836..9652786 100644
--- a/org.eclipse.jdt.debug.tests/plugin.xml
+++ b/org.eclipse.jdt.debug.tests/plugin.xml
@@ -463,5 +463,11 @@
            id="org.eclipse.jdt.debug.tests.listener.global">
      </breakpointListener>
   </extension>
+  <extension
+        point="org.eclipse.jdt.launching.libraryLocationResolvers">
+     <resolver
+           class="org.eclipse.jdt.debug.testplugin.launching.TestLibraryResolver">
+     </resolver>
+  </extension>
 
 </plugin>
diff --git a/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestLibraryResolver.java b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestLibraryResolver.java
new file mode 100644
index 0000000..611ac9e
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/test plugin/org/eclipse/jdt/debug/testplugin/launching/TestLibraryResolver.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.jdt.debug.testplugin.launching;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.URIUtil;
+import org.eclipse.jdt.debug.testplugin.JavaTestPlugin;
+import org.eclipse.jdt.launching.ILibraryLocationResolver;
+
+/**
+ * A test {@link ILibraryLocationResolver} that always return a <code>root</code> and <code>src.zip</code>
+ * in the current working directory
+ */
+public class TestLibraryResolver implements ILibraryLocationResolver {
+
+	public TestLibraryResolver() {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jdt.launching.ILibraryLocationResolver#getPackageRoot(org.eclipse.core.runtime.IPath)
+	 */
+	public IPath getPackageRoot(IPath libraryPath) {
+		if(libraryPath.toString().indexOf("ext") > -1) {
+	 		return new Path("src");
+		}
+		return Path.EMPTY;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jdt.launching.ILibraryLocationResolver#getSourcePath(org.eclipse.core.runtime.IPath)
+	 */
+	public IPath getSourcePath(IPath libraryPath) {
+		if(libraryPath.toString().indexOf("ext") > -1) {
+			File file = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/test_resolver_src.zip"));
+			if(file.isFile()) {
+				return new Path(file.getAbsolutePath());
+			}
+		}
+		return Path.EMPTY;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jdt.launching.ILibraryLocationResolver#getJavadocLocation(org.eclipse.core.runtime.IPath)
+	 */
+	public URL getJavadocLocation(IPath libraryPath) {
+		if(libraryPath.toString().indexOf("ext") > -1) {
+			File file = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/test_resolver_javadoc.zip"));
+			if(file.isFile()) {
+				URI uri;
+				try {
+					uri = new URI("file", null, file.getAbsolutePath(), null);
+					return URIUtil.toURL(uri);
+				}
+				catch (MalformedURLException e) {
+					e.printStackTrace();
+				}
+				catch (URISyntaxException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jdt.launching.ILibraryLocationResolver#getIndexLocation(org.eclipse.core.runtime.IPath)
+	 */
+	public URL getIndexLocation(IPath libraryPath) {
+		if(libraryPath.toString().indexOf("ext") > -1) {
+			File file = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/test_resolver_index.index"));
+			if(file.isFile()) {
+				URI uri;
+				try {
+					uri = new URI("file", null, file.getAbsolutePath(), null);
+					return URIUtil.toURL(uri);
+				}
+				catch (MalformedURLException e) {
+					e.printStackTrace();
+				}
+				catch (URISyntaxException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		return null;
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.jdt.debug.tests/testresources/test_resolver_index.index b/org.eclipse.jdt.debug.tests/testresources/test_resolver_index.index
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/testresources/test_resolver_index.index
diff --git a/org.eclipse.jdt.debug.tests/testresources/test_resolver_javadoc.zip b/org.eclipse.jdt.debug.tests/testresources/test_resolver_javadoc.zip
new file mode 100644
index 0000000..a89f8ae
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/testresources/test_resolver_javadoc.zip
Binary files differ
diff --git a/org.eclipse.jdt.debug.tests/testresources/test_resolver_src.zip b/org.eclipse.jdt.debug.tests/testresources/test_resolver_src.zip
new file mode 100644
index 0000000..a89f8ae
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/testresources/test_resolver_src.zip
Binary files differ
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/VMInstallTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/VMInstallTests.java
index 14f0718..788f9e5 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/VMInstallTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/VMInstallTests.java
@@ -10,17 +10,21 @@
  *******************************************************************************/
 package org.eclipse.jdt.debug.tests.core;
 
+import java.net.URL;
 import java.util.Map;
 
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.jdt.debug.tests.AbstractDebugTest;
 import org.eclipse.jdt.internal.launching.LaunchingPlugin;
+import org.eclipse.jdt.launching.ILibraryLocationResolver;
 import org.eclipse.jdt.launching.IVMInstall;
 import org.eclipse.jdt.launching.IVMInstall2;
 import org.eclipse.jdt.launching.IVMInstall3;
 import org.eclipse.jdt.launching.JavaRuntime;
+import org.eclipse.jdt.launching.LibraryLocation;
 
 /**
  * Tests for installed VMs
@@ -85,6 +89,40 @@
 	}
 	
 	/**
+	 * Test the new support for {@link ILibraryLocationResolver}s
+	 * 
+	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=399798
+	 * @throws Exception
+	 */
+	public void testLibraryResolver1() throws Exception { 
+		IVMInstall vm = JavaRuntime.getDefaultVMInstall();
+		assertNotNull("There must be a default VM", vm);
+		LibraryLocation[] locs = JavaRuntime.getLibraryLocations(vm);
+		assertNotNull("there must be some default library locations", locs);
+		//try to find an 'ext' dir to see if it has some lib infos
+		//the test resolver sets a source path of ../test_resolver_src.zip on
+		//any libs in the ext dir
+		String locpath = null;
+		for (int i = 0; i < locs.length; i++) {
+			locpath = locs[i].getSystemLibraryPath().toString();
+			if(locpath.indexOf("ext") > -1) {
+				assertTrue("There should be a source path ending in test_resolver_src.zip on the ext lib ["+locpath+"]", 
+						locpath.indexOf("test_resolver_src.zip") > -1);
+				IPath root = locs[i].getPackageRootPath();
+				assertTrue("The source root path should be 'src' for ext lib ["+locpath+"]", root.toString().equals("src"));
+				URL url = locs[i].getJavadocLocation();
+				assertNotNull("There should be a Javadoc URL set for ext lib ["+locpath+"]", url);
+				assertTrue("There should be a javadoc path of test_resolver_javadoc.zip on the ext lib ["+locpath+"]", 
+						url.getPath().indexOf("test_resolver_javadoc.zip") > -1);
+				url = locs[i].getIndexLocation();
+				assertNotNull("There should be an index path of test_resolver_index.index on the ext lib ["+locpath+"]", url);
+				assertTrue("There should be an index path of test_resolver_index.index on the ext lib ["+locpath+"]", 
+						url.getPath().indexOf("test_resolver_index.index") > -1);
+			}
+		}
+	}
+	
+	/**
 	 * Generates a key used to cache system property for this VM in this plug-ins
 	 * preference store.
 	 * 
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMType.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMType.java
index 7ea1808..01d456f 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMType.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMType.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -8,6 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Michael Allman - Bug 211648, Bug 156343 - Standard VM not supported on MacOS
+ *     Thomas Schindl - Bug 399798, StandardVMType should allow to contribute default source and Javadoc locations for ext libraries 
  *******************************************************************************/
 package org.eclipse.jdt.internal.launching;
 
@@ -26,6 +27,8 @@
 import java.util.Map.Entry;
 
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionPoint;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Path;
@@ -38,7 +41,9 @@
 import org.eclipse.debug.core.model.IStreamsProxy;
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.launching.AbstractVMInstallType;
+import org.eclipse.jdt.launching.ILibraryLocationResolver;
 import org.eclipse.jdt.launching.IVMInstall;
+import org.eclipse.jdt.launching.JavaRuntime;
 import org.eclipse.jdt.launching.LibraryLocation;
 import org.eclipse.osgi.service.environment.Constants;
 import org.eclipse.osgi.util.NLS;
@@ -90,6 +95,8 @@
 	private static final String[] fgCandidateJavaFiles = {"javaw", "javaw.exe", "java", "java.exe", "j9w", "j9w.exe", "j9", "j9.exe"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
 	private static final String[] fgCandidateJavaLocations = {"bin" + File.separatorChar, JRE + File.separatorChar + "bin" + File.separatorChar}; //$NON-NLS-1$ //$NON-NLS-2$ 
 	
+	private static ILibraryLocationResolver[] fgLibraryLocationResolvers = null;
+	
 	/**
 	 * Starting in the specified VM install location, attempt to find the 'java' executable
 	 * file.  If found, return the corresponding <code>File</code> object, otherwise return
@@ -111,6 +118,31 @@
 		return null;							
 	}
 	
+	/**
+	 * Returns the listing of {@link ILibraryLocationResolver}s
+	 * 
+	 * @return the known list of {@link ILibraryLocationResolver}s
+	 * @since 3.7.0
+	 */
+	private static ILibraryLocationResolver[] getLibraryLocationResolvers() {
+		if( fgLibraryLocationResolvers == null ) {
+			IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(LaunchingPlugin.ID_PLUGIN, JavaRuntime.EXTENSION_POINT_LIBRARY_LOCATION_RESOLVERS);
+			IConfigurationElement[] configs = extensionPoint.getConfigurationElements();
+			List<ILibraryLocationResolver> resolvers = new ArrayList<ILibraryLocationResolver>(configs.length);
+			for( int i = 0; i < configs.length; i++ ) {
+				IConfigurationElement e = configs[i];
+				try {
+					resolvers.add((ILibraryLocationResolver) e.createExecutableExtension("class")); //$NON-NLS-1$
+				}
+				catch (CoreException e1) {
+					LaunchingPlugin.log(e1.getStatus());
+				}
+			}
+			fgLibraryLocationResolvers = resolvers.toArray(new ILibraryLocationResolver[0]);
+		}
+		return fgLibraryLocationResolvers;
+	}
+	
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.launching.IVMInstallType#getName()
 	 */
@@ -432,7 +464,22 @@
 								if (suffix.equalsIgnoreCase(".zip") || suffix.equalsIgnoreCase(".jar")) { //$NON-NLS-1$ //$NON-NLS-2$
 									try {
 										IPath libPath = new Path(jar.getCanonicalPath());
-										LibraryLocation library = new LibraryLocation(libPath, Path.EMPTY, Path.EMPTY, null);
+										IPath sourcePath = Path.EMPTY;
+										IPath packageRoot = Path.EMPTY;
+										URL javadocLocation = null;
+										URL indexLocation = null;
+										for( ILibraryLocationResolver resolver : getLibraryLocationResolvers() ) {
+											try {
+												sourcePath = resolver.getSourcePath(libPath);
+												packageRoot = resolver.getPackageRoot(libPath);
+												javadocLocation = resolver.getJavadocLocation(libPath);
+												indexLocation = resolver.getIndexLocation(libPath);
+												break;
+											} catch(Exception e) {
+												LaunchingPlugin.log(e);
+											}
+										}
+										LibraryLocation library = new LibraryLocation(libPath, sourcePath, packageRoot, javadocLocation, indexLocation);
 										libraries.add(library);
 									} catch (IOException e) {
 										LaunchingPlugin.log(e);
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/ILibraryLocationResolver.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/ILibraryLocationResolver.java
new file mode 100644
index 0000000..b74818e
--- /dev/null
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/ILibraryLocationResolver.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2013 BestSolution.at 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:
+ *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
+ *     IBM Corporation - Bug 399798, StandardVMType should allow to contribute default source and Javadoc locations for ext libraries
+ *******************************************************************************/
+package org.eclipse.jdt.launching;
+
+import java.net.URL;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+
+/**
+ * This resolver allows contributors to provide {@link LibraryLocation} information for 
+ * non-standard JRE / JDK libraries. 
+ * <br><br>
+ * For example this resolver could be used to provide 
+ * Javadoc and source locations for jars in the <code>/ext</code> location of a JRE / JDK
+ * 
+ * @see JavaRuntime#EXTENSION_POINT_LIBRARY_LOCATION_RESOLVERS
+ * 
+ * @since 3.7
+ */
+public interface ILibraryLocationResolver {
+
+	/**
+	 * Returns the path inside the <code>source</code> zip file where packages names begin, must not be 
+	 * <code>null</code> - use {@link Path#EMPTY}
+	 * <br><br>
+	 * For example, if the source for <code>java.lang.Object</code> source is found at <code>src/java/lang/Object.java</code> in the zip file, the package root 
+	 * would be <code>src</code>.
+	 * 
+	 * @param the path to the library
+	 * @return the {@link IPath} to the root of the source or the empty path, never <code>null</code>
+	 */
+	public IPath getPackageRoot(IPath libraryPath);
+	
+	/**
+	 * Returns the {@link IPath} of the <code>zip</code> or <code>jar</code> file containing the sources for <code>library</code>.
+	 * <br><br>
+	 * Must not be <code>null</code> - use {@link Path#EMPTY}
+	 * 
+	 * @param libraryPath the path to the library, must not be <code>null</code>
+	 * @return the {@link IPath} to the source or the empty path, never <code>null</code>
+	 */
+	public IPath getSourcePath(IPath libraryPath);
+	
+	/**
+	 * Returns the {@link URL} of the Javadoc for this library or <code>null</code>
+	 * 
+	 * @param libraryPath the path to the library, must not be <code>null</code>
+	 * @return the Javadoc {@link URL} or <code>null</code>
+	 */
+	public URL getJavadocLocation(IPath libraryPath);
+	
+	/**
+	 * Returns the {@link URL} of the index for the given library or <code>null</code>.
+	 * 
+	 * @param libraryPath the path to the library, must not be <code>null</code>
+	 * @return the index {@link URL} or <code>null</code>
+	 */
+	public URL getIndexLocation(IPath libraryPath);
+}
\ No newline at end of file
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaRuntime.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaRuntime.java
index ee4b0eb..9a3f9d8 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaRuntime.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaRuntime.java
@@ -152,7 +152,15 @@
 	 * @since 3.2
 	 */
 	public static final String EXTENSION_POINT_VM_INSTALLS = "vmInstalls";	 //$NON-NLS-1$
-		
+	
+	/**
+	 * Simple identifier constant (value <code>"libraryLocationResolvers"</code>) for the
+	 * Library Resolvers extension point
+	 * 
+	 * @since 3.7
+	 */
+	public static final String EXTENSION_POINT_LIBRARY_LOCATION_RESOLVERS = "libraryLocationResolvers"; //$NON-NLS-1$
+	
 	/**
 	 * Classpath container used for a project's JRE
 	 * (value <code>"org.eclipse.jdt.launching.JRE_CONTAINER"</code>). A
diff --git a/org.eclipse.jdt.launching/plugin.properties b/org.eclipse.jdt.launching/plugin.properties
index bdb463c..ac853c7 100644
--- a/org.eclipse.jdt.launching/plugin.properties
+++ b/org.eclipse.jdt.launching/plugin.properties
@@ -23,6 +23,7 @@
 classpathProviders = Runtime Classpath Providers
 javaSourceLocatorName = Basic Java Source Locator
 executionEnvironments = Execution Environments
+libraryLocationResolvers = Library Location Resolvers
 
 providerName=Eclipse.org
 
diff --git a/org.eclipse.jdt.launching/plugin.xml b/org.eclipse.jdt.launching/plugin.xml
index a9afc7e..313a94c 100644
--- a/org.eclipse.jdt.launching/plugin.xml
+++ b/org.eclipse.jdt.launching/plugin.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?eclipse version="3.0"?>
 <!--
-     Copyright (c) 2005, 2010 IBM Corporation and others.
+     Copyright (c) 2005, 2013 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
@@ -22,6 +22,7 @@
    <extension-point id="vmInstallTypes" name="%vmInstallTypes" schema="schema/vmInstallTypes.exsd"/>
    <extension-point id="executionEnvironments" name="%executionEnvironments" schema="schema/executionEnvironments.exsd"/>
    <extension-point id="vmInstalls" name="%vmInstalls" schema="schema/vmInstalls.exsd"/>
+   <extension-point id="libraryLocationResolvers" name="%libraryLocationResolvers" schema="schema/libraryLocationResolvers.exsd"/>
 
 <!-- Extensions -->
    <extension
diff --git a/org.eclipse.jdt.launching/schema/libraryLocationResolvers.exsd b/org.eclipse.jdt.launching/schema/libraryLocationResolvers.exsd
new file mode 100644
index 0000000..61f02d5
--- /dev/null
+++ b/org.eclipse.jdt.launching/schema/libraryLocationResolvers.exsd
@@ -0,0 +1,127 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.jdt.launching" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.jdt.launching" id="libraryLocationResolvers" name="Library Location Resolver"/>
+      </appInfo>
+      <documentation>
+         This extension point allows to resolve additional information for libraries in a JRE / SDK
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appInfo>
+            <meta.element />
+         </appInfo>
+      </annotation>
+      <complexType>
+         <sequence>
+            <element ref="resolver" minOccurs="1" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="resolver">
+      <complexType>
+         <attribute name="class" type="string">
+            <annotation>
+               <documentation>
+                  The class that implements this resolver. The class must implement &lt;code&gt;org.eclipse.jdt.launching.ILibraryLocationResolver&lt;/code&gt;
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn=":org.eclipse.jdt.launching.ILibraryLocationResolver"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         3.7
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         The following is an example of the resolver:
+
+&lt;p&gt;
+&lt;pre&gt;
+  &lt;extension
+         point=&quot;org.eclipse.jdt.launching.libraryLocationResolvers&quot;&gt;
+      &lt;resolver
+            class=&quot;com.example.ExtLibraryInfoResolver&quot;&gt;
+      &lt;/resolver&gt;
+  &lt;/extension&gt;
+&lt;/pre&gt;
+&lt;/p&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiinfo"/>
+      </appInfo>
+      <documentation>
+         
+
+
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         JDT does not provide any specific library location resolvers.
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2013 BestSolution.at and others.&lt;br&gt;
+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 
+&lt;a href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>