blob: 8d3a913fd99a93d5c2be606430e1a728c14b8045 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 Oracle. 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:
* Oracle - initial API and implementation
*******************************************************************************/
package org.eclipse.jpt.jaxb.core.internal.libval;
import java.io.File;
import java.io.IOException;
import java.util.zip.ZipFile;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.launching.IVMInstall;
import org.eclipse.jdt.launching.IVMInstall2;
import org.eclipse.jdt.launching.IVMInstallType;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.jdt.launching.LibraryLocation;
import org.eclipse.jpt.common.utility.internal.iterables.ArrayIterable;
import org.eclipse.jpt.common.utility.internal.iterables.TransformationIterable;
import org.eclipse.jpt.jaxb.core.JaxbFacet;
import org.eclipse.jpt.jaxb.core.libprov.JaxbLibraryProviderInstallOperationConfig;
import org.eclipse.jst.common.project.facet.core.StandardJreRuntimeComponent;
import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
import org.eclipse.wst.common.project.facet.core.runtime.IRuntime;
import org.eclipse.wst.common.project.facet.core.runtime.IRuntimeComponent;
public class JaxbLibValUtil {
static IProjectFacetVersion findJreJaxbVersion(JaxbLibraryProviderInstallOperationConfig config) {
IRuntime runtime = config.getFacetedProject().getPrimaryRuntime();
if (runtime != null) {
for (IRuntimeComponent rc : runtime.getRuntimeComponents()) {
IVMInstall vm = findVMInstall(rc);
if (vm != null) {
return findJreJaxbVersion(vm);
}
}
}
IVMInstall vm = JavaRuntime.getDefaultVMInstall();
if (vm != null) {
return findJreJaxbVersion(vm);
}
return null;
}
private static IVMInstall findVMInstall(IRuntimeComponent rc) {
String vmInstallTypeId
= rc.getProperty(StandardJreRuntimeComponent.PROP_VM_INSTALL_TYPE);
String vmInstallId
= rc.getProperty(StandardJreRuntimeComponent.PROP_VM_INSTALL_ID);
if (vmInstallTypeId == null || vmInstallId == null) {
return null;
}
IVMInstallType vmInstallType = JavaRuntime.getVMInstallType(vmInstallTypeId);
if( vmInstallType == null ) {
return null;
}
return vmInstallType.findVMInstall(vmInstallId);
}
private static IProjectFacetVersion findJreJaxbVersion(IVMInstall vm) {
if (vm instanceof IVMInstall2) {
String javaVersion = ((IVMInstall2) vm).getJavaVersion();
if (javaVersion != null) {
if (javaVersion.startsWith(JavaCore.VERSION_1_7)) {
return JaxbFacet.VERSION_2_2;
}
// all other versions except 1.6 have no corresponding version (as of yet)
// 1.6 must be further analyzed
if (! javaVersion.startsWith(JavaCore.VERSION_1_6)) {
return null;
}
}
}
Iterable<IPath> vmLibPaths
= new TransformationIterable<LibraryLocation, IPath>(
new ArrayIterable<LibraryLocation>(JavaRuntime.getLibraryLocations(vm))) {
@Override
protected IPath transform(LibraryLocation o) {
return o.getSystemLibraryPath();
}
};
boolean foundXmlSeeAlso = false; // marker for jaxb 2.1 +
boolean foundJAXBPermission = false; // marker for jaxb 2.2 +
for (IPath vmLibPath : vmLibPaths) {
File file = vmLibPath.toFile();
if (file.exists()) {
ZipFile zip = null;
try {
zip = new ZipFile(file);
foundXmlSeeAlso |= zip.getEntry("javax/xml/bind/annotation/XmlSeeAlso.class") != null;
foundJAXBPermission |= zip.getEntry("javax/xml/bind/JAXBPermission.class") != null;
// short circuit for JAXB 2.2
if (foundJAXBPermission) {
return JaxbFacet.VERSION_2_2;
}
}
catch (IOException e) {}
finally {
if (zip != null) {
try {
zip.close();
}
catch (IOException e) {}
}
}
}
}
if (foundXmlSeeAlso) {
return JaxbFacet.VERSION_2_1;
}
return null;
}
}