aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/VersionCheck.java
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/VersionCheck.java')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/VersionCheck.java189
1 files changed, 189 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/VersionCheck.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/VersionCheck.java
new file mode 100644
index 000000000..576e9c343
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/VersionCheck.java
@@ -0,0 +1,189 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Eclipse Public License, Version 1.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/org/documents/epl-v10.php
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.ide.eclipse.adt.internal;
+
+import com.android.SdkConstants;
+import com.android.ide.eclipse.adt.AdtPlugin;
+import com.android.ide.eclipse.adt.AdtPlugin.CheckSdkErrorHandler;
+import com.android.ide.eclipse.adt.AdtPlugin.CheckSdkErrorHandler.Solution;
+import com.android.ide.eclipse.adt.Messages;
+import com.android.sdklib.repository.FullRevision;
+import com.android.sdklib.repository.FullRevision.PreviewComparison;
+import com.android.sdklib.repository.PkgProps;
+
+import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Class handling the version check for the plugin vs. the SDK.<br>
+ * The plugin must be able to support all version of the SDK.
+ *
+ * <p/>An SDK can require a new version of the plugin.
+ * <p/>The SDK contains a file with the minimum version for the plugin. This file is inside the
+ * <code>tools/lib</code> directory, and is called <code>plugin.prop</code>.<br>
+ * Inside that text file, there is a line in the format "plugin.version=#.#.#". This is checked
+ * against the current plugin version.<br>
+ *
+ */
+public final class VersionCheck {
+ /**
+ * The minimum version of the SDK Tools that this version of ADT requires.
+ */
+ private final static FullRevision MIN_TOOLS_REV = new FullRevision(24, 0, 2, 0);
+
+ /**
+ * Pattern to get the minimum plugin version supported by the SDK. This is read from
+ * the file <code>$SDK/tools/lib/plugin.prop</code>.
+ */
+ private final static Pattern sPluginVersionPattern = Pattern.compile(
+ "^plugin.version=(\\d+)\\.(\\d+)\\.(\\d+).*$"); //$NON-NLS-1$
+ private final static Pattern sSourcePropPattern = Pattern.compile(
+ "^" + PkgProps.PKG_REVISION + "=(.*)$"); //$NON-NLS-1$
+
+ /**
+ * Checks the plugin and the SDK have compatible versions.
+ * @param osSdkPath The path to the SDK
+ * @return true if compatible.
+ */
+ public static boolean checkVersion(String osSdkPath, CheckSdkErrorHandler errorHandler) {
+ AdtPlugin plugin = AdtPlugin.getDefault();
+ String osLibs = osSdkPath + SdkConstants.OS_SDK_TOOLS_LIB_FOLDER;
+
+ // get the plugin property file, and grab the minimum plugin version required
+ // to work with the sdk
+ int minMajorVersion = -1;
+ int minMinorVersion = -1;
+ int minMicroVersion = -1;
+ BufferedReader reader = null;
+ try {
+ reader = new BufferedReader(new FileReader(osLibs + SdkConstants.FN_PLUGIN_PROP));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ Matcher m = sPluginVersionPattern.matcher(line);
+ if (m.matches()) {
+ minMajorVersion = Integer.parseInt(m.group(1));
+ minMinorVersion = Integer.parseInt(m.group(2));
+ minMicroVersion = Integer.parseInt(m.group(3));
+ break;
+ }
+ }
+ } catch (FileNotFoundException e) {
+ // the build id will be null, and this is handled by the builders.
+ } catch (IOException e) {
+ // the build id will be null, and this is handled by the builders.
+ } finally {
+ if (reader != null) {
+ try {
+ reader.close();
+ } catch (IOException e) {
+ } finally {
+ reader = null;
+ }
+ }
+ }
+
+ // Failed to get the min plugin version number?
+ if (minMajorVersion == -1 || minMinorVersion == -1 || minMicroVersion ==-1) {
+ return errorHandler.handleWarning(
+ Solution.OPEN_SDK_MANAGER,
+ Messages.VersionCheck_Plugin_Version_Failed);
+ }
+
+ // Are the build tools installed? We can't query Sdk#getLatestBuildTool yet, since
+ // SDK initialization typically hasn't completed yet and Sdk.getCurrent() is null.
+ File buildToolsFolder = new File(osSdkPath, SdkConstants.FD_BUILD_TOOLS);
+ if (!buildToolsFolder.isDirectory()) {
+ return errorHandler.handleWarning(
+ Solution.OPEN_SDK_MANAGER,
+ Messages.VersionCheck_Build_Tool_Missing);
+ }
+
+ // test the plugin number
+ String versionString = (String) plugin.getBundle().getHeaders().get(
+ Constants.BUNDLE_VERSION);
+ Version version = new Version(versionString);
+
+ boolean valid = true;
+ if (version.getMajor() < minMajorVersion) {
+ valid = false;
+ } else if (version.getMajor() == minMajorVersion) {
+ if (version.getMinor() < minMinorVersion) {
+ valid = false;
+ } else if (version.getMinor() == minMinorVersion) {
+ if (version.getMicro() < minMicroVersion) {
+ valid = false;
+ }
+ }
+ }
+
+ if (valid == false) {
+ return errorHandler.handleError(
+ Solution.OPEN_P2_UPDATE,
+ String.format(Messages.VersionCheck_Plugin_Too_Old,
+ minMajorVersion, minMinorVersion, minMicroVersion, versionString));
+ }
+
+ // now check whether the tools are new enough.
+ String osTools = osSdkPath + SdkConstants.OS_SDK_TOOLS_FOLDER;
+ FullRevision toolsRevision = new FullRevision(Integer.MAX_VALUE);
+ try {
+ reader = new BufferedReader(new FileReader(osTools + SdkConstants.FN_SOURCE_PROP));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ Matcher m = sSourcePropPattern.matcher(line);
+ if (m.matches()) {
+ try {
+ toolsRevision = FullRevision.parseRevision(m.group(1));
+ } catch (NumberFormatException ignore) {}
+ break;
+ }
+ }
+ } catch (FileNotFoundException e) {
+ // the build id will be null, and this is handled by the builders.
+ } catch (IOException e) {
+ // the build id will be null, and this is handled by the builders.
+ } finally {
+ if (reader != null) {
+ try {
+ reader.close();
+ } catch (IOException e) {
+ } finally {
+ reader = null;
+ }
+ }
+ }
+
+ if (toolsRevision.compareTo(MIN_TOOLS_REV, PreviewComparison.IGNORE) < 0) {
+ // this is a warning only as we need to parse the SDK to allow updating
+ // of the tools!
+ return errorHandler.handleWarning(
+ Solution.OPEN_SDK_MANAGER,
+ String.format(Messages.VersionCheck_Tools_Too_Old,
+ MIN_TOOLS_REV, toolsRevision));
+ }
+
+ return true; // no error!
+ }
+}