/* * Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved. * * This program and the accompanying materials are made available * under the terms of the Apache License, Version 2.0, * which accompanies this distribution and is available at * * http://www.apache.org/licenses/LICENSE-2.0 * */ package net.rim.ejde.installer.version; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.StringReader; import java.util.ArrayList; import java.util.Properties; import java.util.jar.Attributes; import java.util.jar.Manifest; /*** * Retrieve corresponding version number for given plugin id * @author jluo * */ public class ProductVersionManager { public static final String PLUGIN_ID_ORG_ECLIPSE_PLATFORM="org.eclipse.platform"; public static final String PLUGIN_ID_ORG_ECLIPSE_SDK="org.eclipse.sdk"; ArrayList _knownEclipseVesions=null; String _productPluginId; public ProductVersionManager() { this(PLUGIN_ID_ORG_ECLIPSE_PLATFORM); } public ProductVersionManager(String productPluginId) { if ((productPluginId != null) && (productPluginId.length() > 0)){ _productPluginId=productPluginId; }else { _productPluginId=PLUGIN_ID_ORG_ECLIPSE_PLATFORM; } // add all know Eclipse versions _knownEclipseVesions=new ArrayList(); addKnownEclipseVersions(); } protected void addKnownEclipseVersions() { // for eclipse 3.3.0 ComplexVersion eclipse330=new ComplexVersion("3.3.0", "3.3.0", "3.3.0"); _knownEclipseVesions.add(eclipse330); // for eclipse 3.3.1 ComplexVersion eclipse331=new ComplexVersion("3.3.1", "3.3.1", "3.3.0"); _knownEclipseVesions.add(eclipse331); // for eclipse 3.3.1.1 ComplexVersion eclipse3311=new ComplexVersion("3.3.1.1", "3.3.2", "3.3.1.1") { @Override protected boolean isMatched(EclipseVersion versionManifest, EclipseVersion versionPluginProperties) { boolean result=false; // for manifest, compare with major.minor.micro // for plugin.properties, compare with major.minor.micro.qualifier if ((versionManifest != null) && (versionPluginProperties != null)){ result=_eclipseVersionManifest.equals(versionManifest, EclipseVersion.TYPE_MAJOR_MINOR_MICRO) && _eclipseVersionPluginProperties.equals(versionPluginProperties, EclipseVersion.TYPE_ALL); } return result; } }; _knownEclipseVesions.add(eclipse3311); } public ArrayList getKnownEclipseVesions() { return _knownEclipseVesions; } public EclipseVersion getEclipseVersion(String eclipseFolder) { EclipseVersion result=null; try { String versionManifest=getVersionFromManifest(eclipseFolder); String versionPluginProperties=getVersionFromPluginProperties(eclipseFolder); for (int i=0; i<_knownEclipseVesions.size(); i++) { result=((ComplexVersion)_knownEclipseVesions.get(i)) .getReleasedVersion(versionManifest, versionPluginProperties); if (result != null) { // find corresponding eclipse break; } } if (result == null) { // no corresponding eclipse, we have to use one found in plugin.properties file result=EclipseVersion.parseVersion(versionPluginProperties); } }catch (Exception ex) { System.out.println("eclipseFolder:" + eclipseFolder); System.out.println("_productPluginId:" + _productPluginId); System.out.println("Exception in getEclipseVersion :" + ex.getMessage()); } return result; } private String getVersionFromManifest(String eclipseFolder) { String result=null; try { File platformPluginFolder=getPluginFolder(eclipseFolder, _productPluginId); if (platformPluginFolder != null) { File manifestFile=new File(platformPluginFolder.getCanonicalPath() + File.separator + "META-INF"+ File.separator + "MANIFEST.MF"); if (manifestFile.exists() && manifestFile.isFile()) { Manifest manifest = new Manifest(); manifest.read(new FileInputStream(manifestFile)); Attributes attributes = manifest.getMainAttributes(); result=attributes.getValue("Bundle-Version").trim(); } } }catch (Exception ex) { System.out.println("Exception in getVersionFromManifest:"+ex.getMessage()); } return result; } private String getVersionFromPluginProperties(String eclipseFolder) { String result=null; try { File platformPluginFolder=getPluginFolder(eclipseFolder, _productPluginId); if (platformPluginFolder != null) { File propertyFile=new File(platformPluginFolder.getCanonicalPath() + File.separator + "plugin.properties"); if (propertyFile.exists() && propertyFile.isFile()) { Properties properties=new Properties(); properties.load(new FileInputStream(propertyFile)); String blurb=properties.getProperty("productBlurb"); if ((blurb != null ) && (blurb.length() > 0)){ result=extractVersion(blurb); } } } }catch (Exception ex) { System.out.println("Exception in getVersionFromManifest:"+ex.getMessage()); } return result; } private String extractVersion(String blurb){ String result=null; try { BufferedReader reader=new BufferedReader(new StringReader(blurb)); String line=reader.readLine(); while (line != null) { line=line.trim(); if (line.startsWith("Version:")) { // find the right line, now get the version number String[] parts=line.split(":"); if (parts.length == 2) { result=parts[1].trim(); } break; } // read next line line=reader.readLine(); } reader.close(); }catch (Exception ex) { System.out.println("Exception in extractVersion:"+ex.getMessage()); } return result; } private File getPluginFolder(String eclipseFolder, String pluginId) { File result=null; String prefix=pluginId+"_"; File pluginsFolder=new File(eclipseFolder+File.separator+"plugins"); if (pluginsFolder.exists() && pluginsFolder.isDirectory()) { File[] files=pluginsFolder.listFiles(); ArrayList candidates=new ArrayList(); for (int i=0; i<files.length; i++) { if (files[i].isDirectory()) { if (files[i].getName().startsWith(prefix)) { // find the right one /* result=files[i]; break; */ candidates.add(files[i]); } } } result=VersionUtil.getFolderBasedOnLatestVersion(candidates); } return result; } /** * @param args */ public static void main(String[] args) { // VersionManager manager=new VersionManager(PLUGIN_ID_ORG_ECLIPSE_PLATFORM); ProductVersionManager manager=new ProductVersionManager(PLUGIN_ID_ORG_ECLIPSE_PLATFORM); EclipseVersion eclipseVersion=manager.getEclipseVersion("C:\\test\\eclipsetest"); if (eclipseVersion != null) { System.out.println(eclipseVersion.toString()); }else { System.out.println("Null"); } } }