Java tutorial
/* * Copyright 2016 The Bazel Authors. All rights reserved. * * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 * * 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.google.idea.blaze.android.plugin; import com.google.common.base.Joiner; import com.google.common.base.Strings; import com.google.common.io.CharStreams; import com.intellij.notification.NotificationDisplayType; import com.intellij.notification.NotificationGroup; import com.intellij.openapi.application.ApplicationInfo; import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.util.BuildNumber; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import javax.annotation.Nullable; import org.jetbrains.annotations.NotNull; /** * Checks META-INF/product-build.txt for a product build number and compares them against the build. * If incompatible, it informs the user. */ public class PluginCompatibilityEnforcer implements ApplicationComponent { private static final Logger LOG = Logger.getInstance(PluginCompatibilityEnforcer.class); private static final NotificationGroup NOTIFICATION_GROUP = new NotificationGroup("ASwB Plugin Version", NotificationDisplayType.BALLOON, true); public void checkPluginCompatibility() { String pluginProductBuildString = readProductBuildTxt(); if (Strings.isNullOrEmpty(pluginProductBuildString)) { return; } // Dev mode? if (pluginProductBuildString.equals("PRODUCT_BUILD")) { return; } BuildNumber pluginProductBuild = BuildNumber.fromString(pluginProductBuildString); if (pluginProductBuild == null) { LOG.warn("Invalid META-INF/product-build.txt"); return; } if (!isCompatible(pluginProductBuild)) { String message = Joiner.on(' ').join("Invalid Android Studio version for the ASwB plugin.", "Android Studio version: " + ApplicationInfo.getInstance().getBuild(), "Compatible version: " + pluginProductBuild, "Please update the ASwB plugin from the plugin manager."); NOTIFICATION_GROUP.createNotification(message, MessageType.ERROR).notify(null); LOG.warn(message); } } private boolean isCompatible(BuildNumber pluginProductBuild) { if (pluginProductBuild.isSnapshot()) { return true; } BuildNumber buildNumber = ApplicationInfo.getInstance().getBuild(); if (buildNumber == null || buildNumber.isSnapshot()) { return true; } return buildNumber.equals(pluginProductBuild); } @Nullable private String readProductBuildTxt() { try (InputStream inputStream = getClass().getClassLoader() .getResourceAsStream("META-INF/product-build.txt")) { if (inputStream == null) { return null; } return CharStreams.toString(new InputStreamReader(inputStream)).trim(); } catch (IOException e) { LOG.error("Could not read META-INF/product-build.txt", e); return null; } } @Override public void initComponent() { checkPluginCompatibility(); } @Override public void disposeComponent() { } @NotNull @Override public String getComponentName() { return "ASwB plugin compatibility enforcer"; } }