From 6d673960b01f97a11eefb5c33979d4ffe6d31660 Mon Sep 17 00:00:00 2001 From: Xavier Ducrohet Date: Wed, 5 Aug 2009 17:09:35 -0700 Subject: [PATCH] Fix NPE that prevented any package w/o license to be installed. java.util.Properties#setProperty() doesn't like it when the value is null which was the case when a package had no license. Made sure it won't happen on other properties than the license as well. Also improved error display when an unexpected Throwable is thrown during install (Stack Call is now display if the Throwable has no message). BUG:2037085 --- .../internal/repository/AddonPackage.java | 8 ++++++-- .../sdklib/internal/repository/Package.java | 12 +++++++++--- .../internal/repository/PlatformPackage.java | 4 +++- .../internal/repository/UpdaterData.java | 17 ++++++++++++++++- 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/tools/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/AddonPackage.java b/tools/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/AddonPackage.java index 4a19206d1..3c7b8c68e 100755 --- a/tools/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/AddonPackage.java +++ b/tools/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/AddonPackage.java @@ -126,8 +126,12 @@ public class AddonPackage extends Package { super.saveProperties(props); mVersion.saveProperties(props); - props.setProperty(PROP_NAME, mName); - props.setProperty(PROP_VENDOR, mVendor); + if (mName != null) { + props.setProperty(PROP_NAME, mName); + } + if (mVendor != null) { + props.setProperty(PROP_VENDOR, mVendor); + } } /** diff --git a/tools/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/Package.java b/tools/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/Package.java index 1fcd6b10c..a637fdeaf 100755 --- a/tools/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/Package.java +++ b/tools/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/Package.java @@ -145,9 +145,15 @@ public abstract class Package implements IDescription { */ void saveProperties(Properties props) { props.setProperty(PROP_REVISION, Integer.toString(mRevision)); - props.setProperty(PROP_LICENSE, mLicense); - props.setProperty(PROP_DESC, mDescription); - props.setProperty(PROP_DESC_URL, mDescUrl); + if (mLicense != null) { + props.setProperty(PROP_LICENSE, mLicense); + } + if (mDescription != null) { + props.setProperty(PROP_DESC, mDescription); + } + if (mDescUrl != null) { + props.setProperty(PROP_DESC_URL, mDescUrl); + } if (mSource != null) { props.setProperty(PROP_SOURCE_URL, mSource.getUrl()); diff --git a/tools/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/PlatformPackage.java b/tools/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/PlatformPackage.java index 324f51d73..c9a58f7f5 100755 --- a/tools/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/PlatformPackage.java +++ b/tools/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/PlatformPackage.java @@ -87,7 +87,9 @@ public class PlatformPackage extends Package { super.saveProperties(props); mVersion.saveProperties(props); - props.setProperty(PROP_VERSION, mVersionName); + if (mVersionName != null) { + props.setProperty(PROP_VERSION, mVersionName); + } } /** Returns the version, a string, for platform packages. */ diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java index 321f5ca97..a9e8afae3 100755 --- a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java +++ b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java @@ -36,6 +36,8 @@ import com.android.sdkuilib.repository.UpdaterWindow.ISdkListener; import org.eclipse.swt.widgets.Shell; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -304,8 +306,21 @@ class UpdaterData { } catch (Throwable t) { // Display anything unexpected in the monitor. - monitor.setResult("Unexpected Error: %1$s", t.getMessage()); + String msg = t.getMessage(); + if (msg != null) { + monitor.setResult("Unexpected Error installing '%1%s: %2$s", + archive.getParentPackage().getShortDescription(), msg); + } else { + // no error info? get the stack call to display it + // At least that'll give us a better bug report. + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + t.printStackTrace(new PrintStream(baos)); + // and display it + monitor.setResult("Unexpected Error installing '%1$s\n%2$s", + archive.getParentPackage().getShortDescription(), + baos.toString()); + } } finally { // Always move the progress bar to the desired position.