| /******************************************************************************* |
| * 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; |
| } |
| } |