diff --git a/README.md b/README.md index 3af89ae..13840ac 100644 --- a/README.md +++ b/README.md @@ -2,5 +2,6 @@ 1. Download and install plugin from [Release Page](https://gitee.com/pengzhile/ide-eval-resetter/attach_files/516690/download/ide-eval-resetter-2.0.3.zip). 2. Click `Help` or `Get Help` -> `Eval Reset` menu. -3. Restart your IDE. -4. Now you have another 30 days eval time :) +3. Click `Reset` -> `Yes` button. +4. Restart your IDE. +5. Now you have another 30 days eval time :) diff --git a/build.gradle b/build.gradle index 6a82759..8e529e0 100644 --- a/build.gradle +++ b/build.gradle @@ -4,10 +4,10 @@ plugins { } group 'io.zhile.research.intellij' -version '2.0.3' +version '2.0.4' -sourceCompatibility = 1.7 -targetCompatibility = 1.7 +sourceCompatibility = 1.8 +targetCompatibility = 1.8 repositories { mavenCentral() @@ -29,6 +29,9 @@ intellij { patchPluginXml { changeNotes """
+Release v2.0.4
+  1. fix plugins reset
+  2. reset more gracefully
 Release v2.0.3
   1. more friendly "Reload" icon
 Release v2.0.2
diff --git a/src/main/java/io/zhile/research/intellij/ier/action/RestartAction.java b/src/main/java/io/zhile/research/intellij/ier/action/RestartAction.java
index 38aa413..6bdec23 100644
--- a/src/main/java/io/zhile/research/intellij/ier/action/RestartAction.java
+++ b/src/main/java/io/zhile/research/intellij/ier/action/RestartAction.java
@@ -14,6 +14,6 @@ public class RestartAction extends AnAction implements DumbAware {
 
     @Override
     public void actionPerformed(@NotNull AnActionEvent e) {
-        ApplicationManager.getApplication().restart();
+        ApplicationManager.getApplication().invokeLater(() -> ApplicationManager.getApplication().restart());
     }
 }
diff --git a/src/main/java/io/zhile/research/intellij/ier/common/EvalRecord.java b/src/main/java/io/zhile/research/intellij/ier/common/EvalRecord.java
new file mode 100644
index 0000000..493ef06
--- /dev/null
+++ b/src/main/java/io/zhile/research/intellij/ier/common/EvalRecord.java
@@ -0,0 +1,5 @@
+package io.zhile.research.intellij.ier.common;
+
+public interface EvalRecord {
+    void reset() throws Exception;
+}
diff --git a/src/main/java/io/zhile/research/intellij/ier/common/LicenseFileRecord.java b/src/main/java/io/zhile/research/intellij/ier/common/LicenseFileRecord.java
new file mode 100644
index 0000000..578bc64
--- /dev/null
+++ b/src/main/java/io/zhile/research/intellij/ier/common/LicenseFileRecord.java
@@ -0,0 +1,39 @@
+package io.zhile.research.intellij.ier.common;
+
+import com.intellij.openapi.util.io.FileUtil;
+import io.zhile.research.intellij.ier.helper.DateTime;
+
+import java.io.*;
+import java.util.Date;
+
+public class LicenseFileRecord implements EvalRecord {
+    private final String type = "LICENSE";
+    private final File file;
+    private final Date expireDate;
+
+    public LicenseFileRecord(File file) {
+        this.file = file;
+
+        try (DataInputStream dis = new DataInputStream(new FileInputStream(file))) {
+            expireDate = new Date(~dis.readLong() + 2592000000L);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public void reset() throws Exception {
+        if (!FileUtil.delete(file)) {
+            throw new Exception("Remove " + type + " failed: " + file.getAbsolutePath());
+        }
+
+        try (DataOutputStream dos = new DataOutputStream(new FileOutputStream(file))) {
+            dos.writeLong(~System.currentTimeMillis());
+        }
+    }
+
+    @Override
+    public String toString() {
+        return type + ": " + file.getName() + ", UNTIL: " + DateTime.DF_DATETIME.format(expireDate);
+    }
+}
diff --git a/src/main/java/io/zhile/research/intellij/ier/common/NormalFileRecord.java b/src/main/java/io/zhile/research/intellij/ier/common/NormalFileRecord.java
new file mode 100644
index 0000000..bb2c120
--- /dev/null
+++ b/src/main/java/io/zhile/research/intellij/ier/common/NormalFileRecord.java
@@ -0,0 +1,26 @@
+package io.zhile.research.intellij.ier.common;
+
+import com.intellij.openapi.util.io.FileUtil;
+
+import java.io.File;
+
+public class NormalFileRecord implements EvalRecord {
+    private final String type = "FILE";
+    private final File file;
+
+    public NormalFileRecord(File file) {
+        this.file = file;
+    }
+
+    @Override
+    public void reset() throws Exception {
+        if (!FileUtil.delete(file)) {
+            throw new Exception("Remove " + type + " failed: " + file.getAbsolutePath());
+        }
+    }
+
+    @Override
+    public String toString() {
+        return type + ": " + file.getName();
+    }
+}
diff --git a/src/main/java/io/zhile/research/intellij/ier/common/PreferenceRecord.java b/src/main/java/io/zhile/research/intellij/ier/common/PreferenceRecord.java
new file mode 100644
index 0000000..2674a96
--- /dev/null
+++ b/src/main/java/io/zhile/research/intellij/ier/common/PreferenceRecord.java
@@ -0,0 +1,48 @@
+package io.zhile.research.intellij.ier.common;
+
+import com.intellij.ide.Prefs;
+
+import java.util.prefs.Preferences;
+
+public class PreferenceRecord implements EvalRecord {
+    private static final String DEFAULT_VALUE = null;
+
+    private final String type = "PREFERENCE";
+    private final String key;
+    private final String value;
+    private final boolean isRaw;
+
+    public PreferenceRecord(String key) {
+        this(key, false);
+    }
+
+    public PreferenceRecord(String key, boolean isRaw) {
+        this.key = key;
+        this.isRaw = isRaw;
+        this.value = isRaw ? Preferences.userRoot().get(key, DEFAULT_VALUE) : Prefs.get(key, DEFAULT_VALUE);
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    @Override
+    public void reset() throws Exception {
+        if (isRaw) {
+            Preferences.userRoot().remove(key);
+        } else {
+            Prefs.remove(key);
+        }
+
+        Resetter.syncPrefs();
+    }
+
+    @Override
+    public String toString() {
+        return type + ": " + key + " = " + (null == value ? "" : value);
+    }
+}
diff --git a/src/main/java/io/zhile/research/intellij/ier/common/PropertyRecord.java b/src/main/java/io/zhile/research/intellij/ier/common/PropertyRecord.java
new file mode 100644
index 0000000..1479dd1
--- /dev/null
+++ b/src/main/java/io/zhile/research/intellij/ier/common/PropertyRecord.java
@@ -0,0 +1,35 @@
+package io.zhile.research.intellij.ier.common;
+
+import com.intellij.ide.util.PropertiesComponent;
+import com.intellij.ide.util.PropertiesComponentImpl;
+
+public class PropertyRecord implements EvalRecord {
+    public static final PropertiesComponentImpl PROPS = (PropertiesComponentImpl) PropertiesComponent.getInstance();
+
+    private final String type = "PROPERTY";
+    private final String key;
+    private final String value;
+
+    public PropertyRecord(String key) {
+        this.key = key;
+        this.value = PROPS.getValue(key);
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    @Override
+    public void reset() throws Exception {
+        PROPS.unsetValue(key);
+    }
+
+    @Override
+    public String toString() {
+        return type + ": " + key + " = " + (null == value ? "" : value);
+    }
+}
diff --git a/src/main/java/io/zhile/research/intellij/ier/common/RecordItem.java b/src/main/java/io/zhile/research/intellij/ier/common/RecordItem.java
deleted file mode 100644
index ff00df4..0000000
--- a/src/main/java/io/zhile/research/intellij/ier/common/RecordItem.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package io.zhile.research.intellij.ier.common;
-
-public class RecordItem {
-    private final RecordType type;
-    private final String key;
-    private final String value;
-
-    public RecordItem(RecordType type, String key, String value) {
-        this.type = type;
-        this.key = key;
-        this.value = value;
-    }
-
-    public RecordItem(RecordType type, String key) {
-        this(type, key, null);
-    }
-
-    public RecordType getType() {
-        return type;
-    }
-
-    public String getKey() {
-        return key;
-    }
-
-    public String getValue() {
-        return value;
-    }
-}
diff --git a/src/main/java/io/zhile/research/intellij/ier/common/RecordType.java b/src/main/java/io/zhile/research/intellij/ier/common/RecordType.java
deleted file mode 100644
index 6bb668a..0000000
--- a/src/main/java/io/zhile/research/intellij/ier/common/RecordType.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package io.zhile.research.intellij.ier.common;
-
-public enum RecordType {
-    FILE("FILE"),
-    PREFERENCE("PREFERENCE"),
-    PROPERTY("PROPERTY");
-
-    private final String value;
-
-    RecordType(String value) {
-        this.value = value;
-    }
-
-    public String getValue() {
-        return value;
-    }
-}
diff --git a/src/main/java/io/zhile/research/intellij/ier/common/Resetter.java b/src/main/java/io/zhile/research/intellij/ier/common/Resetter.java
index 4a40676..b60ba52 100644
--- a/src/main/java/io/zhile/research/intellij/ier/common/Resetter.java
+++ b/src/main/java/io/zhile/research/intellij/ier/common/Resetter.java
@@ -3,21 +3,18 @@ package io.zhile.research.intellij.ier.common;
 import com.intellij.ide.Prefs;
 import com.intellij.ide.plugins.IdeaPluginDescriptor;
 import com.intellij.ide.plugins.PluginManager;
-import com.intellij.ide.util.PropertiesComponent;
-import com.intellij.ide.util.PropertiesComponentImpl;
 import com.intellij.openapi.application.PathManager;
 import com.intellij.openapi.util.SystemInfo;
-import com.intellij.openapi.util.io.FileUtil;
 import io.zhile.research.intellij.ier.helper.Constants;
 import io.zhile.research.intellij.ier.helper.NotificationHelper;
 import io.zhile.research.intellij.ier.helper.Reflection;
-import org.jdom.Attribute;
 import org.jdom.Element;
 
 import java.io.File;
 import java.lang.reflect.Method;
 import java.nio.file.Paths;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.prefs.BackingStoreException;
 import java.util.prefs.Preferences;
@@ -31,92 +28,73 @@ public class Resetter {
     private static final String EVAL_KEY = "evlsprt";
     private static final String AUTO_RESET_KEY = Constants.PLUGIN_PREFS_PREFIX + ".auto_reset." + Constants.IDE_NAME_LOWER + "." + Constants.IDE_HASH;
 
-    private static final PropertiesComponentImpl PROPS = (PropertiesComponentImpl) PropertiesComponent.getInstance();
-
-    public static List getEvalRecords() {
-        List list = new ArrayList<>();
+    public static List getEvalRecords() {
+        List list = new ArrayList<>();
 
         File evalDir = getEvalDir();
         if (evalDir.exists()) {
-            for (File file : evalDir.listFiles()) {
-                list.add(new RecordItem(RecordType.FILE, file.getAbsolutePath()));
+            File[] files = evalDir.listFiles((dir, name) -> name.endsWith(".key"));
+            if (files == null) {
+                NotificationHelper.showError(null, "List eval license file failed!");
+            } else {
+                Arrays.stream(files).forEach(file -> list.add(new LicenseFileRecord(file)));
             }
         }
 
-        Element state = PROPS.getState();
+        Element state = PropertyRecord.PROPS.getState();
         if (state != null) {
-            Attribute attrName, attrValue;
-            String key, value;
-            for (Element element : state.getChildren()) {
+            state.getChildren().stream().filter(element -> {
                 if (!element.getName().equals("property")) {
-                    continue;
+                    return false;
                 }
 
-                attrName = element.getAttribute("name");
-                attrValue = element.getAttribute("value");
-                if (attrName == null || attrValue == null) {
-                    continue;
+                if (element.getAttribute("name") == null || element.getAttribute("value") == null) {
+                    return false;
                 }
 
-                key = attrName.getValue();
-                value = attrValue.getValue();
-                if (key.startsWith(EVAL_KEY)) {
-                    list.add(new RecordItem(RecordType.PROPERTY, key, value));
-                }
-            }
+                return element.getAttribute("name").getValue().startsWith(EVAL_KEY);
+            }).forEach(element -> list.add(new PropertyRecord(element.getAttribute("name").getValue())));
         }
 
-        RecordItem[] prefsValue = new RecordItem[]{
-                new RecordItem(RecordType.PREFERENCE, OLD_MACHINE_ID_KEY, Preferences.userRoot().get(OLD_MACHINE_ID_KEY, null)),
-                new RecordItem(RecordType.PREFERENCE, NEW_MACHINE_ID_KEY, Prefs.get(NEW_MACHINE_ID_KEY, null)),
-                new RecordItem(RecordType.PREFERENCE, DEVICE_ID_KEY, Prefs.get(DEVICE_ID_KEY, null)),
+        PreferenceRecord[] prefsValue = new PreferenceRecord[]{
+                new PreferenceRecord(OLD_MACHINE_ID_KEY, true),
+                new PreferenceRecord(NEW_MACHINE_ID_KEY),
+                new PreferenceRecord(DEVICE_ID_KEY),
         };
-        for (RecordItem item : prefsValue) {
-            if (null == item.getValue()) {
-                continue;
-            }
-            list.add(item);
-        }
+        Arrays.stream(prefsValue).filter(record -> record.getValue() != null).forEach(list::add);
 
         try {
             List prefsList = new ArrayList<>();
             getAllPrefsKeys(Preferences.userRoot().node(IDE_EVAL_PREFIX), prefsList);
 
             Method methodGetProductCode = Reflection.getMethod(IdeaPluginDescriptor.class, "getProductCode");
-            Method methodGetReleaseVersion = Reflection.getMethod(IdeaPluginDescriptor.class, "getReleaseVersion");
-            if (null != methodGetProductCode && null != methodGetReleaseVersion) {
+            if (null != methodGetProductCode) {
                 for (IdeaPluginDescriptor descriptor : PluginManager.getPlugins()) {
                     String productCode = (String) methodGetProductCode.invoke(descriptor);
                     if (null == productCode || productCode.isEmpty()) {
                         continue;
                     }
 
-                    int releaseVersion = (int) methodGetReleaseVersion.invoke(descriptor);
-                    getAllPrefsKeys(Preferences.userRoot().node(DEFAULT_VENDOR + "/" + productCode.toLowerCase() + "/" + releaseVersion), prefsList);
+                    getAllPrefsKeys(Preferences.userRoot().node(DEFAULT_VENDOR + "/" + productCode.toLowerCase()), prefsList);
                 }
             }
 
-            for (String key : prefsList) {
-                if (!key.contains(EVAL_KEY)) {
-                    continue;
-                }
-
+            prefsList.stream().filter(key -> key.contains(EVAL_KEY)).forEach(key -> {
                 if (key.startsWith("/")) {
                     key = key.substring(1).replace('/', '.');
                 }
-                list.add(new RecordItem(RecordType.PREFERENCE, key, Prefs.get(key, null)));
-            }
+                list.add(new PreferenceRecord(key));
+            });
         } catch (Exception e) {
             NotificationHelper.showError(null, "List eval preferences failed!");
         }
 
         if (SystemInfo.isWindows) {
-            String[] names = new String[]{"PermanentUserId", "PermanentDeviceId"};
-            for (String name : names) {
+            for (String name : new String[]{"PermanentUserId", "PermanentDeviceId"}) {
                 File file = getSharedFile(name);
 
                 if (null != file && file.exists()) {
-                    list.add(new RecordItem(RecordType.FILE, file.getAbsolutePath()));
+                    list.add(new NormalFileRecord(file));
                 }
             }
         }
@@ -124,33 +102,15 @@ public class Resetter {
         return list;
     }
 
-    public static void reset(List recordItems) {
-        for (RecordItem item : recordItems) {
-            reset(item);
-        }
+    public static void reset(List records) {
+        records.forEach(Resetter::reset);
     }
 
-    public static void reset(RecordItem recordItem) {
-        RecordType type = recordItem.getType();
-        String key = recordItem.getKey();
-        switch (type) {
-            case FILE:
-                if (!FileUtil.delete(new File(key))) {
-                    NotificationHelper.showError(null, "Remove " + type.getValue() + " failed: " + key);
-                }
-                break;
-            case PREFERENCE:
-                if (OLD_MACHINE_ID_KEY.equals(key)) {
-                    Preferences.userRoot().remove(key);
-                } else {
-                    Prefs.remove(key);
-                }
-
-                syncPrefs();
-                break;
-            case PROPERTY:
-                PROPS.unsetValue(key);
-                break;
+    public static void reset(EvalRecord record) {
+        try {
+            record.reset();
+        } catch (Exception e) {
+            NotificationHelper.showError(null, e.getMessage());
         }
     }
 
diff --git a/src/main/java/io/zhile/research/intellij/ier/component/ResetTimer.java b/src/main/java/io/zhile/research/intellij/ier/component/ResetTimer.java
index 7a4126f..4fc5f9b 100644
--- a/src/main/java/io/zhile/research/intellij/ier/component/ResetTimer.java
+++ b/src/main/java/io/zhile/research/intellij/ier/component/ResetTimer.java
@@ -12,6 +12,7 @@ import io.zhile.research.intellij.ier.helper.Constants;
 import io.zhile.research.intellij.ier.helper.DateTime;
 import io.zhile.research.intellij.ier.helper.NotificationHelper;
 
+import java.util.Arrays;
 import java.util.Timer;
 import java.util.TimerTask;
 
@@ -77,13 +78,11 @@ public class ResetTimer {
                 if (projects.length == 0) {
                     notification.notify(null);
                 } else {
-                    for (Project project : projects) {
-                        notification.notify(project);
-                    }
+                    Arrays.stream(projects).forEach(notification::notify);
                 }
             } while (false);
 
-            new Timer().schedule(new ResetTimerTask(lastResetTime, resetAction), 3600000); // 60 min
+            new Timer().schedule(new ResetTimerTask(lastResetTime, resetAction), 600000); // 10 min
         }
     }
 }
diff --git a/src/main/java/io/zhile/research/intellij/ier/helper/DateTime.java b/src/main/java/io/zhile/research/intellij/ier/helper/DateTime.java
index 3f6426e..0368c90 100644
--- a/src/main/java/io/zhile/research/intellij/ier/helper/DateTime.java
+++ b/src/main/java/io/zhile/research/intellij/ier/helper/DateTime.java
@@ -5,11 +5,11 @@ import java.text.SimpleDateFormat;
 import java.util.Date;
 
 public class DateTime {
-    public static final DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    public static final DateFormat DF_DATETIME = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
     public static String getStringFromTimestamp(long timestamp) {
         Date date = new Date(timestamp);
 
-        return df.format(date);
+        return DF_DATETIME.format(date);
     }
 }
diff --git a/src/main/java/io/zhile/research/intellij/ier/ui/form/MainForm.java b/src/main/java/io/zhile/research/intellij/ier/ui/form/MainForm.java
index 5465ad0..39854eb 100644
--- a/src/main/java/io/zhile/research/intellij/ier/ui/form/MainForm.java
+++ b/src/main/java/io/zhile/research/intellij/ier/ui/form/MainForm.java
@@ -4,7 +4,7 @@ import com.intellij.icons.AllIcons;
 import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.ui.DialogWrapper;
 import com.intellij.openapi.ui.Messages;
-import io.zhile.research.intellij.ier.common.RecordItem;
+import io.zhile.research.intellij.ier.common.EvalRecord;
 import io.zhile.research.intellij.ier.common.Resetter;
 import io.zhile.research.intellij.ier.component.ResetTimer;
 import io.zhile.research.intellij.ier.helper.Constants;
@@ -79,33 +79,24 @@ public class MainForm {
     private void reloadRecordItems() {
         listModel.clear();
 
-        List recordItemList = Resetter.getEvalRecords();
-        for (RecordItem item : recordItemList) {
-            listModel.addElement(item.getType().getValue() + ": \t" + item.getKey() + (null == item.getValue() ? "" : " = \t" + item.getValue()));
-        }
+        List recordItemList = Resetter.getEvalRecords();
+        recordItemList.forEach(record -> listModel.addElement(record.toString()));
     }
 
     private void resetEvalItems() {
+        if (Messages.YES != Messages.showYesNoDialog("Your IDE will restart after reset!\nAre your sure to reset?", Constants.PLUGIN_NAME, AllIcons.General.Reset)) {
+            return;
+        }
+
         Resetter.reset(Resetter.getEvalRecords());
         ResetTimer.resetLastResetTime();
         listModel.clear();
 
-        if (Messages.YES == Messages.showYesNoDialog("Reset successfully!\nWould like to restart your IDE?", Constants.PLUGIN_NAME, AllIcons.General.Reset)) {
-            if (null != dialogWrapper) {
-                dialogWrapper.close(0);
-            }
-
-            ApplicationManager.getApplication().invokeLater(new Runnable() {
-                @Override
-                public void run() {
-                    ApplicationManager.getApplication().restart();
-                }
-            });
-
-            return;
+        if (null != dialogWrapper) {
+            dialogWrapper.close(0);
         }
 
-        reloadRecordItems();
+        ApplicationManager.getApplication().invokeLater(() -> ApplicationManager.getApplication().restart());
     }
 
     private static void boldFont(Component component) {