Merge remote-tracking branch 'origin/master' clion/140.2434
authorRoman Shevchenko <roman.shevchenko@jetbrains.com>
Thu, 12 Feb 2015 15:01:51 +0000 (16:01 +0100)
committerRoman Shevchenko <roman.shevchenko@jetbrains.com>
Thu, 12 Feb 2015 15:01:51 +0000 (16:01 +0100)
build/scripts/utils.gant
platform/platform-api/src/com/intellij/util/net/NetUtils.java
platform/platform-impl/src/com/intellij/errorreport/itn/ITNProxy.java
platform/platform-impl/src/com/intellij/ide/plugins/RepositoryHelper.java
platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateChecker.java
platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateCheckerComponent.java
platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateInfoDialog.java
platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateSettings.java
platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateSettingsConfigurable.java
platform/platform-resources-en/src/messages/IdeBundle.properties

index 5a10eaa016a2c95350d7f72ba0ffb73ebc7b0458..117fa4a957f3b5ebf10f04f1beca668e386998cc 100644 (file)
@@ -64,9 +64,8 @@ binding.setVariable("isEap", {
 
 binding.setVariable("mem32", "-server -Xms128m -Xmx512m -XX:MaxPermSize=250m -XX:ReservedCodeCacheSize=150m")
 binding.setVariable("mem64", "-Xms128m -Xmx750m -XX:MaxPermSize=350m -XX:ReservedCodeCacheSize=225m")
-binding.setVariable("common_vmoptions", "-ea -Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true " +
-                                        "-Djsse.enableSNIExtension=false " +
-                                        "-XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50")
+binding.setVariable("common_vmoptions", "-XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -ea " +
+                                        "-Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true")
 
 binding.setVariable("vmOptions", { "$common_vmoptions ${isEap() ? '-XX:+HeapDumpOnOutOfMemoryError' : ''}".trim() })
 binding.setVariable("vmOptions32", { "$mem32 ${vmOptions()}".trim() })
index 6e04d130468d8d6649aa01212c410a83e83f7c98..5e77085e5d4ee34c1cc033d01f7660117a15564f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2015 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@ import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.progress.ProcessCanceledException;
 import com.intellij.openapi.progress.ProgressIndicator;
 import com.intellij.openapi.util.SystemInfo;
+import com.intellij.util.SystemProperties;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -31,8 +32,7 @@ import java.net.*;
 public class NetUtils {
   private static final Logger LOG = Logger.getInstance(NetUtils.class);
 
-  private NetUtils() {
-  }
+  private NetUtils() { }
 
   public static boolean canConnectToSocket(String host, int port) {
     return canConnectToSocket(host, port, false);
@@ -224,4 +224,8 @@ public class NetUtils {
 
     return total;
   }
+
+  public static boolean isSniEnabled() {
+    return SystemInfo.isJavaVersionAtLeast("1.7") && SystemProperties.getBooleanProperty("jsse.enableSNIExtension", true);
+  }
 }
index ad030b0c9e7fb29abc73523ddf33a42d39bed1cd..9984e472329aabed397f5cf39b7c60e9974106db 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2015 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -32,12 +32,12 @@ import com.intellij.openapi.progress.ProgressManager;
 import com.intellij.openapi.progress.Task;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.updateSettings.impl.UpdateSettings;
-import com.intellij.openapi.util.SystemInfo;
 import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.util.Consumer;
 import com.intellij.util.SystemProperties;
 import com.intellij.util.containers.ContainerUtil;
+import com.intellij.util.net.NetUtils;
 import com.intellij.util.net.ssl.CertificateUtil;
 import org.jetbrains.annotations.NotNull;
 
@@ -218,7 +218,7 @@ public class ITNProxy {
     HttpsURLConnection connection = (HttpsURLConnection)url.openConnection();
 
     connection.setSSLSocketFactory(ourSslContext.getSocketFactory());
-    if (!(SystemInfo.isJavaVersionAtLeast("1.7") && SystemProperties.getBooleanProperty("jsse.enableSNIExtension", true))) {
+    if (!NetUtils.isSniEnabled()) {
       connection.setHostnameVerifier(new EaHostnameVerifier(url.getHost(), "ftp.intellij.net"));
     }
 
index 5a4168e152463dbb3fc497b4e30f98087e6d42ce..204cbd2ff2cb07a2e2deaac8d62b560da4f337f3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2015 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -83,7 +83,7 @@ public class RepositoryHelper {
   public static List<IdeaPluginDescriptor> loadPlugins(@Nullable String repositoryUrl,
                                                        @Nullable BuildNumber buildnumber,
                                                        @Nullable final ProgressIndicator indicator) throws IOException {
-    boolean forceHttps = repositoryUrl == null && IdeaApplication.isLoaded() && UpdateSettings.getInstance().SECURE_CONNECTION;
+    boolean forceHttps = repositoryUrl == null && IdeaApplication.isLoaded() && UpdateSettings.getInstance().canUseSecureConnection();
     return loadPlugins(repositoryUrl, buildnumber, forceHttps, indicator);
   }
 
index 1ced92ad9f9786971acbf1864bfc8ce06a048900..bed4e4e11fe4371bdface49dddee3981d0ad8a1f 100644 (file)
@@ -68,10 +68,6 @@ import java.util.*;
 public final class UpdateChecker {
   private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.updateSettings.impl.UpdateChecker");
 
-  public enum DownloadPatchResult {
-    SUCCESS, FAILED, CANCELED
-  }
-
   public static final NotificationGroup NOTIFICATIONS =
     new NotificationGroup(IdeBundle.message("update.notifications.group"), NotificationDisplayType.STICKY_BALLOON, true);
 
@@ -218,7 +214,7 @@ public final class UpdateChecker {
       String updateUrl = uriBuilder.toString();
       LogUtil.debug(LOG, "load update xml (UPDATE_URL='%s')", updateUrl);
 
-      info = HttpRequests.request(updateUrl).forceHttps(settings.SECURE_CONNECTION).connect(new HttpRequests.RequestProcessor<UpdatesInfo>() {
+      info = HttpRequests.request(updateUrl).forceHttps(settings.canUseSecureConnection()).connect(new HttpRequests.RequestProcessor<UpdatesInfo>() {
         @Override
         public UpdatesInfo process(@NotNull HttpRequests.Request request) throws IOException {
           try {
@@ -289,7 +285,7 @@ public final class UpdateChecker {
     outer:
     for (String host : hosts) {
       try {
-        boolean forceHttps = host == null && updateSettings.SECURE_CONNECTION;
+        boolean forceHttps = host == null && updateSettings.canUseSecureConnection();
         List<IdeaPluginDescriptor> list = RepositoryHelper.loadPlugins(host, buildNumber, forceHttps, indicator);
         for (IdeaPluginDescriptor descriptor : list) {
           PluginId id = descriptor.getPluginId();
@@ -409,7 +405,7 @@ public final class UpdateChecker {
       Runnable runnable = new Runnable() {
         @Override
         public void run() {
-          new UpdateInfoDialog(updatedChannel, enableLink, updateSettings.SECURE_CONNECTION, updatedPlugins, incompatiblePlugins).show();
+          new UpdateInfoDialog(updatedChannel, enableLink, updateSettings.canUseSecureConnection(), updatedPlugins, incompatiblePlugins).show();
         }
       };
 
@@ -535,28 +531,15 @@ public final class UpdateChecker {
     return "";
   }
 
-  public static DownloadPatchResult installPlatformUpdate(final PatchInfo patch, final BuildNumber toBuild, final boolean forceHttps) {
-    final Ref<DownloadPatchResult> result = Ref.create(DownloadPatchResult.CANCELED);
-
-    if (!ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() {
+  public static void installPlatformUpdate(final PatchInfo patch, final BuildNumber toBuild, final boolean forceHttps) throws IOException {
+    ProgressManager.getInstance().runProcessWithProgressSynchronously(new ThrowableComputable<Void, IOException>() {
       @Override
-      public void run() {
-        try {
-          ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator();
-          downloadAndInstallPatch(patch, toBuild, forceHttps, indicator);
-          result.set(DownloadPatchResult.SUCCESS);
-        }
-        catch (IOException e) {
-          LOG.info(e);
-          result.set(DownloadPatchResult.FAILED);
-          Notifications.Bus.notify(new Notification("Updater", "Failed to download patch file", e.getMessage(), NotificationType.ERROR));
-        }
+      public Void compute() throws IOException {
+        ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator();
+        downloadAndInstallPatch(patch, toBuild, forceHttps, indicator);
+        return null;
       }
-    }, IdeBundle.message("update.downloading.patch.progress.title"), true, null)) {
-      return DownloadPatchResult.CANCELED;
-    }
-
-    return result.get();
+    }, IdeBundle.message("update.downloading.patch.progress.title"), true, null);
   }
 
   private static void downloadAndInstallPatch(PatchInfo patch, BuildNumber toBuild, boolean forceHttps, final ProgressIndicator indicator) throws IOException {
index edeac1746e12478356852d967b39a994f2e778d9..162a2a499f10466218fa2a603ee2b77418d7d9ce 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2015 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 package com.intellij.openapi.updateSettings.impl;
 
 import com.intellij.ide.AppLifecycleListener;
+import com.intellij.ide.IdeBundle;
+import com.intellij.notification.NotificationType;
 import com.intellij.openapi.application.Application;
 import com.intellij.openapi.application.ApplicationInfo;
+import com.intellij.openapi.application.ModalityState;
 import com.intellij.openapi.components.ApplicationComponent;
 import com.intellij.openapi.updateSettings.impl.pluginsAdvertisement.PluginsAdvertiser;
 import com.intellij.openapi.util.Disposer;
 import com.intellij.openapi.util.Ref;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.util.Alarm;
+import com.intellij.util.net.NetUtils;
 import com.intellij.util.text.DateFormatUtil;
 import org.jetbrains.annotations.NotNull;
 
@@ -49,6 +53,18 @@ public class UpdateCheckerComponent implements ApplicationComponent {
 
   public UpdateCheckerComponent(@NotNull Application app, @NotNull UpdateSettings settings) {
     mySettings = settings;
+
+    if (mySettings.SECURE_CONNECTION && !NetUtils.isSniEnabled()) {
+      app.invokeLater(new Runnable() {
+        @Override
+        public void run() {
+          String title = IdeBundle.message("update.notifications.title");
+          String message = IdeBundle.message("update.sni.disabled.notification");
+          UpdateChecker.NOTIFICATIONS.createNotification(title, message, NotificationType.WARNING, null).notify(null);
+        }
+      }, ModalityState.NON_MODAL);
+    }
+
     app.getMessageBus().connect(app).subscribe(AppLifecycleListener.TOPIC, new AppLifecycleListener.Adapter() {
       @Override
       public void appFrameCreated(String[] commandLineArgs, @NotNull Ref<Boolean> willOpenProject) {
index e3d62b3afcc4dd2d4f93fdcd32d804e3ed0febd9..99e3d59c43f261bf47a6d44ead2c915525fbef09 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2015 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,6 +15,7 @@
  */
 package com.intellij.openapi.updateSettings.impl;
 
+import com.intellij.CommonBundle;
 import com.intellij.ide.BrowserUtil;
 import com.intellij.ide.IdeBundle;
 import com.intellij.ide.plugins.IdeaPluginDescriptor;
@@ -23,6 +24,8 @@ import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.application.ApplicationNamesInfo;
 import com.intellij.openapi.application.PathManager;
 import com.intellij.openapi.application.ex.ApplicationInfoEx;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.ui.Messages;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.ui.BrowserHyperlinkListener;
 import com.intellij.ui.JBColor;
@@ -34,6 +37,7 @@ import org.jetbrains.annotations.NotNull;
 import javax.swing.*;
 import java.awt.event.ActionEvent;
 import java.io.File;
+import java.io.IOException;
 import java.util.Collection;
 import java.util.List;
 
@@ -139,15 +143,22 @@ class UpdateInfoDialog extends AbstractUpdateDialog {
   }
 
   private void downloadPatch() {
-    UpdateChecker.DownloadPatchResult result = UpdateChecker.installPlatformUpdate(myPatch, myLatestBuild.getNumber(), myForceHttps);
-    if (result == UpdateChecker.DownloadPatchResult.SUCCESS) {
-      if (myUpdatedPlugins != null && !myUpdatedPlugins.isEmpty()) {
-        new PluginUpdateInfoDialog(getContentPanel(), myUpdatedPlugins).show();
+    try {
+      UpdateChecker.installPlatformUpdate(myPatch, myLatestBuild.getNumber(), myForceHttps);
+    }
+    catch (IOException e) {
+      Logger.getInstance(UpdateChecker.class).warn(e);
+      if (Messages.showOkCancelDialog(IdeBundle.message("update.downloading.patch.error", e.getMessage()),
+                                      IdeBundle.message("updates.error.connection.title"),
+                                      IdeBundle.message("updates.download.page.button"), CommonBundle.message("button.cancel"),
+                                      Messages.getErrorIcon()) == Messages.OK) {
+        openDownloadPage();
       }
-      restart();
+      return;
     }
-    else if (result == UpdateChecker.DownloadPatchResult.FAILED) {
-      openDownloadPage();
+
+    if (myUpdatedPlugins != null && !myUpdatedPlugins.isEmpty()) {
+      new PluginUpdateInfoDialog(getContentPanel(), myUpdatedPlugins).show();
     }
   }
 
index b3cf1c639f377f00b1c1cea9f587ad02fc181729..14d63c9d6bd54dc9b4632ff00a64cc75be50f52b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2015 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,6 +24,7 @@ import com.intellij.openapi.util.InvalidDataException;
 import com.intellij.openapi.util.JDOMExternalizableStringList;
 import com.intellij.openapi.util.WriteExternalException;
 import com.intellij.util.containers.ContainerUtil;
+import com.intellij.util.net.NetUtils;
 import org.jdom.Element;
 import org.jetbrains.annotations.NotNull;
 
@@ -140,4 +141,8 @@ public class UpdateSettings implements PersistentStateComponent<Element>, UserUp
     LAST_TIME_CHECKED = System.currentTimeMillis();
     LAST_BUILD_CHECKED = ApplicationInfo.getInstance().getBuild().asString();
   }
+
+  public boolean canUseSecureConnection() {
+    return SECURE_CONNECTION && NetUtils.isSniEnabled();
+  }
 }
index 21aca44c74aef0131d267833f66402590ffcb169..9da0dbd415ead2df2b2f5c19db12364ccfe13c81 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2015 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,6 +26,7 @@ import com.intellij.openapi.options.ConfigurationException;
 import com.intellij.openapi.options.SearchableConfigurable;
 import com.intellij.openapi.project.Project;
 import com.intellij.ui.CollectionComboBoxModel;
+import com.intellij.util.net.NetUtils;
 import com.intellij.util.text.DateFormatUtil;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -131,11 +132,11 @@ public class UpdateSettingsConfigurable extends BaseConfigurable implements Sear
     private JCheckBox myUseSecureConnection;
 
     public UpdatesSettingsPanel() {
-      final ApplicationInfo appInfo = ApplicationInfo.getInstance();
-      final String majorVersion = appInfo.getMajorVersion();
+      ApplicationInfo appInfo = ApplicationInfo.getInstance();
+      String majorVersion = appInfo.getMajorVersion();
       String versionNumber = "";
       if (majorVersion != null && majorVersion.trim().length() > 0) {
-        final String minorVersion = appInfo.getMinorVersion();
+        String minorVersion = appInfo.getMinorVersion();
         if (minorVersion != null && minorVersion.trim().length() > 0) {
           versionNumber = majorVersion + "." + minorVersion;
         }
@@ -163,6 +164,11 @@ public class UpdateSettingsConfigurable extends BaseConfigurable implements Sear
       UpdateSettings settings = UpdateSettings.getInstance();
       //noinspection unchecked
       myUpdateChannels.setModel(new CollectionComboBoxModel(ChannelStatus.all(), ChannelStatus.fromCode(settings.UPDATE_CHANNEL_TYPE)));
+
+      if (!NetUtils.isSniEnabled()) {
+        myUseSecureConnection.setEnabled(false);
+        myUseSecureConnection.setToolTipText(IdeBundle.message("update.sni.disabled.notification"));
+      }
     }
 
     private void updateLastCheckedLabel() {
index 105cd16d548241dbd5ea100a7518e5607975bbbb..b010f2373daa621a38be826826e11da9d52e9f74 100644 (file)
@@ -917,6 +917,7 @@ updates.incompatible.plugins.found={0,choice,1#Plugin|2#Plugins} incompatible wi
 updates.download.and.install.button=&Download Patch and Shutdown
 updates.download.and.restart.button=Up&date and Restart
 updates.more.info.button=&More Info...
+updates.download.page.button=Open &Download Page
 updates.ignore.update.button=&Ignore This Update
 updates.remind.later.button=&Remind Me Later
 updates.buy.online.button=&Buy Upgrade Online
@@ -934,6 +935,16 @@ updates.settings.secure=Use secure connection
 updates.settings.build.number=Build number:
 updates.settings.current.version=Current version:
 updates.settings.last.check=Last checked:
+update.plugin.host.url.message=Repository URL:
+update.no.update.hosts=No plugin repositories configured
+update.edit.plugin.host.title=Edit Repository
+update.add.new.plugin.host.title=Add Repository
+update.downloading.patch.progress.title=Downloading Patch File
+update.downloading.patch.error=Failed to download patch file:\n{0}
+update.plugins.update.action=&Update
+update.restart.plugins.update.action=&Update and Restart
+update.shutdown.plugins.update.action=&Update and Shutdown
+update.sni.disabled.notification=Secure update is impossible with SNI disabled
 
 hierarchy.method.next.occurence.name=Go to next method
 hierarchy.method.prev.occurence.name=Go to previous method
@@ -1067,15 +1078,8 @@ project.new.wizard.project.identification=project
 project.new.wizard.module.identification=module
 changelist.todo.title={0} Changelist
 hierarchy.scope.test=Test
-update.plugin.host.url.message=Repository URL:
-update.no.update.hosts=No plugin repositories configured
-update.edit.plugin.host.title=Edit Repository
-update.add.new.plugin.host.title=Add Repository
-update.downloading.patch.progress.title=Downloading Patch file
+
 file.structure.toggle.show.inherited=&Show inherited members
-update.plugins.update.action=&Update
-update.restart.plugins.update.action=&Update and Restart
-update.shutdown.plugins.update.action=&Update and Shutdown
 fail.open.project.message=Unable to open project from ''{0}''
 checkbox.show.icons.in.menu.items=Display icons in menu items
 custom.icon.validation.message=Icon is too big to appear in menu