/**********************************************************************
* Copyright (c) 2005-2009 ant4eclipse project team.
*
* 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:
* Nils Hartmann, Daniel Kasmeroglu, Gerd Wuetherich
**********************************************************************/
package org.ant4eclipse.lib.jdt.internal.tools.container;
import org.ant4eclipse.lib.core.logging.A4ELogging;
import org.ant4eclipse.lib.core.service.ServiceRegistryAccess;
import org.ant4eclipse.lib.jdt.model.ClasspathEntry;
import org.ant4eclipse.lib.jdt.model.ContainerTypes;
import org.ant4eclipse.lib.jdt.model.jre.JavaRuntime;
import org.ant4eclipse.lib.jdt.model.jre.JavaRuntimeRegistry;
import org.ant4eclipse.lib.jdt.tools.ResolvedClasspathEntry;
import org.ant4eclipse.lib.jdt.tools.ResolvedClasspathEntry.AccessRestrictions;
import org.ant4eclipse.lib.jdt.tools.container.ClasspathContainerResolver;
import org.ant4eclipse.lib.jdt.tools.container.ClasspathResolverContext;
import java.io.File;
import java.util.LinkedHashSet;
import java.util.Set;
public class JreContainerResolver implements ClasspathContainerResolver {
/**
* {@inheritDoc}
*/
public boolean canResolveContainer(ClasspathEntry classpathEntry) {
return classpathEntry.getPath().startsWith(ContainerTypes.JRE_CONTAINER);
}
/**
* @param resolver
*/
public void resolveContainer(ClasspathEntry classpathEntry, ClasspathResolverContext context) {
//
if (!context.isCurrentProjectRoot()) {
return;
}
JavaRuntimeRegistry javaRuntimeRegistry = ServiceRegistryAccess.instance().getService(JavaRuntimeRegistry.class);
String path = classpathEntry.getPath();
// issue AE-116: re-replace '%' with ' '
if (path.contains("%")) {
path = path.replace('%', ' ');
}
JavaRuntime javaRuntime = null;
if (path.equals(ContainerTypes.JRE_CONTAINER)) {
javaRuntime = javaRuntimeRegistry.getDefaultJavaRuntime();
} else if (path.startsWith(ContainerTypes.VMTYPE_PREFIX)) {
String key = path.substring(ContainerTypes.VMTYPE_PREFIX.length());
javaRuntime = javaRuntimeRegistry.getJavaRuntime(key);
if (javaRuntime == null) {
// TODO
javaRuntime = javaRuntimeRegistry.getDefaultJavaRuntime();
A4ELogging.warn("Could not find JRE for %s. Using default JRE (Version: %s, Location: %s).", path, javaRuntime
.getJavaVersion(), javaRuntime.getLocation());
// the default runtime has been chosen since there's no other possibility.
// registering the runtime prevents successive fallbacks and annoying redundant warnings.
javaRuntimeRegistry.registerJavaRuntime(key, javaRuntime.getLocation());
}
} else {
javaRuntime = javaRuntimeRegistry.getDefaultJavaRuntime();
}
// TODO
AccessRestrictions accessRestrictions = null;
File[] libraries = javaRuntime.getLibraries();
if (!path.equals(ContainerTypes.JRE_CONTAINER)) {
String profileKey = path.substring(ContainerTypes.VMTYPE_PREFIX.length());
if (javaRuntimeRegistry.hasJavaProfile(profileKey)) {
Set<String> publicPackages = new LinkedHashSet<String>();
publicPackages.add("java");
publicPackages.addAll(javaRuntimeRegistry.getJavaProfile(profileKey).getSystemPackages());
accessRestrictions = new AccessRestrictions(publicPackages, new LinkedHashSet<String>(), true);
}
}
context.setBootClasspathEntry(new ResolvedClasspathEntry(libraries, accessRestrictions));
}
}