Bug 575365: [Ltk-Issues] Make loading of task tag config more robust

Change-Id: I24551e6876e35f10ddcf29317f1c261855f34154
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/Issues.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/Issues.java
index 45551e0..db3b7ce 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/Issues.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/Issues.java
@@ -21,6 +21,7 @@
 import org.eclipse.statet.jcommons.lang.NonNull;
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
+import org.eclipse.statet.ecommons.preferences.core.Preference;
 import org.eclipse.statet.ecommons.preferences.core.Preference.EnumListPref;
 import org.eclipse.statet.ecommons.preferences.core.Preference.StringArrayPref;
 import org.eclipse.statet.ecommons.preferences.core.PreferenceAccess;
@@ -32,22 +33,20 @@
 public final class Issues {
 	
 	
+	private static final String TASK_TAG_QUALIFIER= "org.eclipse.statet.ide.core/managment"; //$NON-NLS-1$
+	
 	public static final String TASK_TAG_KEYWORD_PREF_KEY= "TaskTags.keyword"; //$NON-NLS-1$
 	public static final String TASK_TAG_PRIORITY_PREF_KEY= "TaskTags.priority"; //$NON-NLS-1$
 	
-	
-	private static StringArrayPref createKeywordPref(final String qualifier) {
-		return new StringArrayPref(qualifier, TASK_TAG_KEYWORD_PREF_KEY);
-	}
-	
-	private static EnumListPref<TaskPriority> createPriorityPref(final String qualifier) {
-		return new EnumListPref<>(qualifier, TASK_TAG_PRIORITY_PREF_KEY, TaskPriority.class);
-	}
+	public static final Preference<@NonNull String[]> TASK_TAG_KEYWORD_PREF=
+			new StringArrayPref(TASK_TAG_QUALIFIER, TASK_TAG_KEYWORD_PREF_KEY);
+	public static final Preference<List<TaskPriority>> TASK_TAG_PRIORITY_PREF=
+			new EnumListPref<>(TASK_TAG_QUALIFIER, TASK_TAG_PRIORITY_PREF_KEY, TaskPriority.class);
 	
 	
-	public static ImList<TaskTag> loadTaskTags(final String qualifier, final PreferenceAccess prefs) {
-		final @NonNull String[] keywords= prefs.getPreferenceValue(createKeywordPref(qualifier));
-		final List<TaskPriority> priorities= prefs.getPreferenceValue(createPriorityPref(qualifier));
+	public static ImList<TaskTag> loadTaskTags(final PreferenceAccess prefs) {
+		final @NonNull String[] keywords= prefs.getPreferenceValue(TASK_TAG_KEYWORD_PREF);
+		final List<TaskPriority> priorities= prefs.getPreferenceValue(TASK_TAG_PRIORITY_PREF);
 		
 		if (keywords.length == priorities.size()) {
 			final var array= new @NonNull TaskTag[keywords.length];
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/impl/TaskTagReporter.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/impl/TaskTagReporter.java
index 70765ef..7ef102a 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/impl/TaskTagReporter.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/issues/core/impl/TaskTagReporter.java
@@ -18,11 +18,12 @@
 import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullLateInit;
 
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.eclipse.statet.jcommons.collections.ImCollections;
+import org.eclipse.statet.jcommons.collections.ImList;
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
 
@@ -36,6 +37,7 @@
 public abstract class TaskTagReporter {
 	
 	
+	private ImList<TaskTag> taskTags= ImCollections.emptyList();
 	private @Nullable Pattern taskTagPattern;
 	private final Map<String, TaskPriority> taskTagMap= new HashMap<>();
 	
@@ -50,7 +52,11 @@
 	}
 	
 	
-	protected void initTaskPattern(final List<TaskTag> taskTags) {
+	protected void initTaskPattern(final ImList<TaskTag> taskTags) {
+		if (taskTags.equals(this.taskTags)) {
+			return;
+		}
+		this.taskTags= taskTags;
 		this.taskTagPattern= null;
 		this.taskTagMap.clear();
 		
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/presentation/CommentScanner.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/presentation/CommentScanner.java
index d6686aa..e208da4 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/presentation/CommentScanner.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/presentation/CommentScanner.java
@@ -75,7 +75,6 @@
 	}
 	
 	
-	private final String prefQualifier;
 	private final PreferenceAccess prefs;
 	
 	private TaskTagRule taskTagRule= nonNullLateInit();
@@ -86,24 +85,17 @@
 	
 	public CommentScanner(final TextStyleManager<?> textStyles,
 			final String commentTokenKey, final String taskTokenKey,
-			final String prefQualifier, final PreferenceAccess prefs) {
+			final PreferenceAccess prefs) {
 		super(textStyles);
 		
 		this.commentTokenKey= commentTokenKey;
 		this.taskTokenKey= taskTokenKey;
 		initRules();
 		
-		this.prefQualifier= prefQualifier;
 		this.prefs= prefs;
 		loadTaskTags();
 	}
 	
-	public CommentScanner(final TextStyleManager<?> textStyles,
-			final String commentTokenKey, final String taskTokenKey,
-			final PreferenceAccess prefs) {
-		this(textStyles, commentTokenKey, taskTokenKey, PREF_QUALIFIER, prefs);
-	}
-	
 	
 	@Override
 	protected void createRules(final List<IRule> rules) {
@@ -120,7 +112,6 @@
 	
 	// TODO
 	private static final String GROUP_ID= "statet.task_tags"; //$NON-NLS-1$
-	private static final String PREF_QUALIFIER= "org.eclipse.statet.ide.core/managment"; //$NON-NLS-1$
 	
 	@Override
 	public void handleSettingsChanged(final Set<String> groupIds, final Map<String, Object> options) {
@@ -131,7 +122,7 @@
 	}
 	
 	private void loadTaskTags() {
-		final var taskTags= Issues.loadTaskTags(this.prefQualifier, this.prefs);
+		final var taskTags= Issues.loadTaskTags(this.prefs);
 		this.taskTagRule.setKeywords(Issues.getKeywords(taskTags));
 	}