Bug 571758: [preferences] Add defaults (enabled/disabled) in Type
Filters preferences

Change-Id: I75a374ffe4a8bed7ccfaa01f800804d559125e47
Reviewed-on: https://git.eclipse.org/r/c/jdt/eclipse.jdt.ui/+/184251
Tested-by: Kalyan Prasad Tatavarthi <kalyan_prasad@in.ibm.com>
Tested-by: JDT Bot <jdt-bot@eclipse.org>
Reviewed-by: Kalyan Prasad Tatavarthi <kalyan_prasad@in.ibm.com>
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/JavaPlugin.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/JavaPlugin.java
index 3148585..42a5ee4 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/JavaPlugin.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/JavaPlugin.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2020 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -14,12 +14,15 @@
 package org.eclipse.jdt.internal.ui;
 
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
 import java.util.Set;
 import java.util.StringTokenizer;
+import java.util.stream.Collectors;
 
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
@@ -208,6 +211,8 @@
 
 	private static final String CODE_ASSIST_MIGRATED= "code_assist_migrated"; //$NON-NLS-1$
 
+	private static final String TYPEFILTER_MIGRATED= "typefilter_migrated"; //$NON-NLS-1$
+
 	/**
 	 * @deprecated to avoid deprecation warning
 	 */
@@ -434,6 +439,7 @@
 		JavaManipulation.setCodeTemplateStore(getCodeTemplateStore());
 		JavaManipulation.setCodeTemplateContextRegistry(getCodeTemplateContextRegistry());
 		disableNewCodeAssistCategoryPreferences();
+		setTypeFilterPreferences();
 	}
 
 	private void createOrUpdateWorkingSet(String name, String oldname, String label, final String id) {
@@ -1105,4 +1111,84 @@
 			JavaPlugin.log(e);
 		}
 	}
+
+	/**
+	 * Add the new default type filters in old workspaces that already have non-default type
+	 * filters. Only do this once, so that users have a way to opt-out if they don't want the new
+	 * filters.
+	 */
+	private void setTypeFilterPreferences() {
+		Set<String> enabledFiltersToAdd= new LinkedHashSet<>();
+		enabledFiltersToAdd.add("com.sun.*"); //$NON-NLS-1$
+		enabledFiltersToAdd.add("sun.*"); //$NON-NLS-1$
+		enabledFiltersToAdd.add("jdk.*"); //$NON-NLS-1$
+		enabledFiltersToAdd.add("org.graalvm.*"); //$NON-NLS-1$
+		enabledFiltersToAdd.add("java.awt.*"); //$NON-NLS-1$
+		enabledFiltersToAdd.add("io.micrometer.shaded.*"); //$NON-NLS-1$
+
+		Set<String> disabledFiltersToAdd= new LinkedHashSet<>();
+		disabledFiltersToAdd.add("java.rmi.*"); //$NON-NLS-1$
+
+		// default value - enabled
+		Set<String> defaultEnabled= new LinkedHashSet<>();
+		String defaultEnabledString= PreferenceConstants.getPreferenceStore().getDefaultString(PreferenceConstants.TYPEFILTER_ENABLED);
+		defaultEnabled.addAll(Arrays.asList(defaultEnabledString.split(";"))); //$NON-NLS-1$
+		defaultEnabled.addAll(enabledFiltersToAdd);
+		String newDefaultEnabledString= defaultEnabled.stream().collect(Collectors.joining(";")); //$NON-NLS-1$
+		PreferenceConstants.getPreferenceStore().setDefault(PreferenceConstants.TYPEFILTER_ENABLED, newDefaultEnabledString);
+
+		// default value - disabled
+		Set<String> defaultDisabled= new LinkedHashSet<>();
+		String defaultDisabledString= PreferenceConstants.getPreferenceStore().getDefaultString(PreferenceConstants.TYPEFILTER_DISABLED);
+		defaultDisabled.addAll(Arrays.asList(defaultDisabledString.split(";"))); //$NON-NLS-1$
+		defaultDisabled.addAll(disabledFiltersToAdd);
+		String newDefaultDisabledString= defaultDisabled.stream().collect(Collectors.joining(";")); //$NON-NLS-1$
+		PreferenceConstants.getPreferenceStore().setDefault(PreferenceConstants.TYPEFILTER_DISABLED, newDefaultDisabledString);
+
+		if (isTypeFilterMigrated()) {
+			return;
+		}
+
+		// current values
+		Set<String> currentEnabled= new LinkedHashSet<>();
+		String currentEnabledString= PreferenceConstants.getPreferenceStore().getString(PreferenceConstants.TYPEFILTER_ENABLED);
+		currentEnabled.addAll(Arrays.asList(currentEnabledString.split(";"))); //$NON-NLS-1$
+
+		Set<String> currentDisabled= new LinkedHashSet<>();
+		String currentDisabledString= PreferenceConstants.getPreferenceStore().getString(PreferenceConstants.TYPEFILTER_DISABLED);
+		currentDisabled.addAll(Arrays.asList(currentDisabledString.split(";"))); //$NON-NLS-1$
+
+		enabledFiltersToAdd.removeAll(currentEnabled);
+		enabledFiltersToAdd.removeAll(currentDisabled);
+
+		disabledFiltersToAdd.removeAll(currentEnabled);
+		disabledFiltersToAdd.removeAll(currentDisabled);
+
+		if (!enabledFiltersToAdd.isEmpty()) {
+			String newEnabledString= currentEnabledString + ";" + enabledFiltersToAdd.stream().collect(Collectors.joining(";")); //$NON-NLS-1$ //$NON-NLS-2$
+			PreferenceConstants.getPreferenceStore().setValue(PreferenceConstants.TYPEFILTER_ENABLED, newEnabledString);
+		}
+
+		if (!disabledFiltersToAdd.isEmpty()) {
+			String newDisabledString= currentDisabledString + ";" + disabledFiltersToAdd.stream().collect(Collectors.joining(";")); //$NON-NLS-1$ //$NON-NLS-2$
+			PreferenceConstants.getPreferenceStore().setValue(PreferenceConstants.TYPEFILTER_DISABLED, newDisabledString);
+		}
+
+		// set as migrated
+		setTypeFilterMigrated();
+	}
+
+	private boolean isTypeFilterMigrated() {
+		return Platform.getPreferencesService().getBoolean(JavaPlugin.getPluginId(), TYPEFILTER_MIGRATED, false, null);
+	}
+
+	private void setTypeFilterMigrated() {
+		IEclipsePreferences preferences= InstanceScope.INSTANCE.getNode(JavaPlugin.getPluginId());
+		preferences.putBoolean(TYPEFILTER_MIGRATED, true);
+		try {
+			preferences.flush();
+		} catch (BackingStoreException e) {
+			JavaPlugin.log(e);
+		}
+	}
 }