blob: c3836d0d2f8a9942d2d3ce90bee05ff4252182d3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2015 Oracle. 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/.
*
* 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.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.IJavaProject;
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.core.internal.libval.LibraryValidatorTools;
import org.eclipse.jpt.common.core.libprov.JptLibraryProviderInstallOperationConfig;
import org.eclipse.jpt.common.utility.internal.iterable.IterableTools;
import org.eclipse.jpt.common.utility.internal.transformer.TransformerAdapter;
import org.eclipse.jpt.common.utility.transformer.Transformer;
import org.eclipse.jpt.jaxb.core.JaxbProject;
import org.eclipse.jst.common.project.facet.core.JavaFacet;
import org.eclipse.jst.common.project.facet.core.StandardJreRuntimeComponent;
import org.eclipse.wst.common.project.facet.core.IFacetedProjectBase;
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;
/**
* JAXB
* {@link org.eclipse.jpt.common.core.libval.LibraryValidator} utility methods.
*/
public class JaxbLibraryValidatorTools {
/**
* The JAXB facet version string 2.1.
* <p>
* Value: {@value}
*/
public static final String FACET_VERSION_STRING_2_1 = "2.1"; //$NON-NLS-1$
/**
* The JAXB facet version 2.1.
*/
public static final IProjectFacetVersion FACET_VERSION_2_1 = JaxbProject.FACET.getVersion(FACET_VERSION_STRING_2_1);
/**
* The JAXB facet version string 2.2.
* <p>
* Value: {@value}
*/
public static final String FACET_VERSION_STRING_2_2 = "2.2"; //$NON-NLS-1$
/**
* The JAXB facet version 2.2.
*/
public static final IProjectFacetVersion FACET_VERSION_2_2 = JaxbProject.FACET.getVersion(FACET_VERSION_STRING_2_2);
/**
* Return the JAXB facet version corresponding to the specified config's
* Java facet version.
* Assume highest update of Java (e.g. Java 1.6 maps to JAXB 2.1)
*/
public static IProjectFacetVersion findJavaJaxbVersion(JptLibraryProviderInstallOperationConfig config) {
IProjectFacetVersion javaVersion = LibraryValidatorTools.getJavaFacetVersion(config);
if (javaVersion == JavaFacet.VERSION_1_6) {
return FACET_VERSION_2_1;
}
if (javaVersion == JavaFacet.VERSION_1_7) {
return FACET_VERSION_2_2;
}
if (javaVersion == JavaFacet.VERSION_1_8) {
return FACET_VERSION_2_2;
}
return null;
}
/**
* Return the JAXB facet version corresponding to the specified config's JRE.
*/
public static IProjectFacetVersion findJreJaxbVersion(JptLibraryProviderInstallOperationConfig config) {
IVMInstall vmInstall = findVMInstall(config.getFacetedProject());
return (vmInstall == null) ? null : findJreJaxbVersion(vmInstall);
}
private static IVMInstall findVMInstall(IFacetedProjectBase facetedProject) {
IVMInstall vm = null;
IRuntime runtime = facetedProject.getPrimaryRuntime();
if (runtime != null) {
for (IRuntimeComponent rc : runtime.getRuntimeComponents()) {
vm = findVMInstall(rc);
if (vm != null) {
return vm;
}
}
}
IJavaProject javaProject = JavaCore.create(facetedProject.getProject());
if (javaProject != null) {
try {
vm = JavaRuntime.getVMInstall(javaProject);
} catch (CoreException ce) {
// do nothing, just use the default install
}
}
return (vm != null) ? vm : JavaRuntime.getDefaultVMInstall();
}
private static IVMInstall findVMInstall(IRuntimeComponent rc) {
String vmInstallTypeId = rc.getProperty(StandardJreRuntimeComponent.PROP_VM_INSTALL_TYPE);
if (vmInstallTypeId == null) {
return null;
}
String vmInstallId = rc.getProperty(StandardJreRuntimeComponent.PROP_VM_INSTALL_ID);
if (vmInstallId == null) {
return null;
}
IVMInstallType vmInstallType = JavaRuntime.getVMInstallType(vmInstallTypeId);
return (vmInstallType == null) ? null : vmInstallType.findVMInstall(vmInstallId);
}
private static IProjectFacetVersion findJreJaxbVersion(IVMInstall vm) {
if (vm instanceof IVMInstall2) {
String javaVersion = ((IVMInstall2) vm).getJavaVersion();
if (javaVersion != null) {
// all other versions except 1.7 and 1.6 have no corresponding version (as of yet)
if (javaVersion.startsWith(JavaCore.VERSION_1_7)) {
return FACET_VERSION_2_2;
}
// 1.6 must be further analyzed
if (! javaVersion.startsWith(JavaCore.VERSION_1_6)) {
return null;
}
}
}
boolean foundXmlSeeAlso = false; // marker for jaxb 2.1 +
for (IPath vmLibPath : buildLibraryPaths(vm)) {
File file = vmLibPath.toFile();
if (file.exists()) {
ZipFile zipFile = null;
try {
zipFile = new ZipFile(file);
if (zipFile.getEntry(JAXB_PERMISSION) != null) {
// short circuit for JAXB 2.2
return FACET_VERSION_2_2;
}
foundXmlSeeAlso |= (zipFile.getEntry(XML_SEE_ALSO) != null);
} catch (IOException ex) {
// ignore
} finally {
if (zipFile != null) {
try {
zipFile.close();
} catch (IOException ex) {
// ignore
}
}
}
}
}
return foundXmlSeeAlso ? FACET_VERSION_2_1 : null;
}
private static Iterable<IPath> buildLibraryPaths(IVMInstall vm) {
return IterableTools.transform(IterableTools.iterable(JavaRuntime.getLibraryLocations(vm)), LIBRARY_LOCATION_TRANSFORMER);
}
private static final Transformer<LibraryLocation, IPath> LIBRARY_LOCATION_TRANSFORMER = new LibraryLocationTransformer();
/* CU private */ static class LibraryLocationTransformer
extends TransformerAdapter<LibraryLocation, IPath>
{
@Override
public IPath transform(LibraryLocation libraryLocation) {
return libraryLocation.getSystemLibraryPath();
}
}
private static final String XML_SEE_ALSO = "javax/xml/bind/annotation/XmlSeeAlso.class"; //$NON-NLS-1$
private static final String JAXB_PERMISSION = "javax/xml/bind/JAXBPermission.class"; //$NON-NLS-1$
}