| /** |
| * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany) |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * Florian Pirchner - Initial implementation |
| */ |
| package org.eclipse.osbp.xtext.builder.ui.access.jdt.impl; |
| |
| import java.net.MalformedURLException; |
| import java.net.URL; |
| import java.net.URLClassLoader; |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.jdt.core.IJavaProject; |
| import org.eclipse.jdt.core.JavaModelException; |
| import org.eclipse.jdt.launching.JavaRuntime; |
| import org.eclipse.osbp.xtext.builder.ui.access.jdt.IJdtTypeLoader; |
| |
| // TODO: Auto-generated Javadoc |
| /** |
| * The Class JdtTypeLoader. |
| */ |
| public class JdtTypeLoader implements IJdtTypeLoader { |
| |
| /** The java project. */ |
| private final IJavaProject javaProject; |
| |
| /** The class loader. */ |
| private URLClassLoader classLoader; |
| |
| /** |
| * Instantiates a new jdt type loader. |
| * |
| * @param javaProject |
| * the java project |
| * @since 2.4 |
| * @noreference This constructor is not intended to be referenced by |
| * clients. |
| */ |
| public JdtTypeLoader(IJavaProject javaProject) { |
| if (javaProject == null) |
| throw new IllegalArgumentException("javaProject may not be null"); |
| this.javaProject = javaProject; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.osbp.xtext.builder.types.loader.api.ITypeLoader#findTypeByName(java.lang.String) |
| */ |
| public Class<?> findTypeByName(String fullyQualifiedName) { |
| if (fullyQualifiedName == null || fullyQualifiedName.equals("")) { |
| return null; |
| } |
| try { |
| synchronized (this) { |
| ClassLoader classloader = getClassloader(); |
| return classloader.loadClass(fullyQualifiedName); |
| } |
| } catch (JavaModelException e) { |
| throw new IllegalStateException(e); |
| } catch (ClassNotFoundException e) { |
| // nothing to do |
| } catch (CoreException e) { |
| throw new IllegalStateException(e); |
| } catch (MalformedURLException e) { |
| throw new IllegalStateException(e); |
| } catch(NoClassDefFoundError e){ |
| // nothing to do |
| } |
| |
| return null; |
| } |
| |
| /** |
| * Returns the class loader if not available. |
| * |
| * @return the classloader |
| * @throws CoreException |
| * the core exception |
| * @throws MalformedURLException |
| * the malformed url exception |
| */ |
| private ClassLoader getClassloader() throws CoreException, |
| MalformedURLException { |
| if (classLoader != null) { |
| return classLoader; |
| } |
| |
| String[] classPathEntries = JavaRuntime |
| .computeDefaultRuntimeClassPath(javaProject); |
| |
| Set<URL> urlList = new HashSet<URL>(); |
| for (int i = 0; i < classPathEntries.length; i++) { |
| String entry = classPathEntries[i]; |
| IPath path = new Path(entry); |
| URL url = path.toFile().toURI().toURL(); |
| urlList.add(url); |
| } |
| |
| // the parentClassLoader contains references to required ECView classes |
| ClassLoader parentClassLoader = getClass().getClassLoader(); |
| URL[] urls = (URL[]) urlList.toArray(new URL[urlList.size()]); |
| classLoader = new URLClassLoader(urls, parentClassLoader); |
| |
| return classLoader; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.osbp.xtext.builder.types.loader.api.ITypeLoader#dispose() |
| */ |
| @Override |
| public void dispose() { |
| synchronized (this) { |
| // try { |
| if (classLoader != null) { |
| // classLoader.close(); |
| classLoader = null; |
| } |
| // } catch (IOException e) { |
| // throw new IllegalStateException(e); |
| // } |
| } |
| } |
| } |