Skip to content

Commit 859c687

Browse files
travkin79trancexpress
authored andcommitted
Load marker content generator details from extensions #2193
This change adds missing functionality for the extension 'markerContentGeneratorExtension'. So far, ContentGeneratorDescriptor supports this extension with only getFilterReferences(). I.e. ContentGeneratorDescriptor only lists filter references of extensions, on top of its own filter references. With this change, getAllFields(), getInitialVisible() and getMarkerTypes() are also aggregating values for ContentGeneratorDescriptor and its extensions. As a result, e.g. the problems view and markers view can be extended with new columns. For example, an issue ID and URL to a detailed problem description. Fixes: #2193
1 parent 646fe5c commit 859c687

File tree

4 files changed

+207
-5
lines changed

4 files changed

+207
-5
lines changed

bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ContentGeneratorDescriptor.java

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.HashMap;
2222
import java.util.HashSet;
2323
import java.util.Iterator;
24+
import java.util.List;
2425
import java.util.Map;
2526
import java.util.TreeSet;
2627
import java.util.stream.Stream;
@@ -45,8 +46,10 @@ public class ContentGeneratorDescriptor {
4546

4647
private IConfigurationElement configurationElement;
4748
private MarkerField[] allFields;
49+
private MarkerField[] allFieldsWithExtensions;
4850
private Collection<MarkerType> markerTypes;
4951
private MarkerField[] initialVisible;
52+
private MarkerField[] initialVisibleWithExtensions;
5053
private Collection<MarkerGroup> groups;
5154
private Collection<IConfigurationElement> generatorExtensions = new ArrayList<>();
5255
private Map<String, MarkerType> allTypesTable;
@@ -79,6 +82,7 @@ private void addDefinedGroups(Collection<MarkerGroup> groupss) {
7982
*/
8083
public void addExtensions(Collection<IConfigurationElement> extensions) {
8184
generatorExtensions = extensions;
85+
clearCaches();
8286
}
8387

8488
/**
@@ -97,7 +101,7 @@ private void addGroupsFrom(IConfigurationElement element, Collection<MarkerGroup
97101
* @return boolean
98102
*/
99103
public boolean allTypesSelected(Collection<MarkerType> selectedTypes) {
100-
return selectedTypes.containsAll(markerTypes);
104+
return selectedTypes.containsAll(getMarkerTypes());
101105
}
102106

103107
/**
@@ -106,7 +110,14 @@ public boolean allTypesSelected(Collection<MarkerType> selectedTypes) {
106110
* @return {@link MarkerField}[]
107111
*/
108112
public MarkerField[] getAllFields() {
109-
return allFields;
113+
if (allFieldsWithExtensions == null) {
114+
List<MarkerField> fields = new ArrayList<>();
115+
fields.addAll(Arrays.asList(allFields));
116+
getExtensionsDescriptorsStream().map(d -> Arrays.asList(d.getAllFields())).flatMap(Collection::stream)
117+
.forEach(fields::add);
118+
allFieldsWithExtensions = fields.toArray(MarkerField[]::new);
119+
}
120+
return allFieldsWithExtensions;
110121
}
111122

112123
/**
@@ -157,7 +168,14 @@ public String getId() {
157168
* @return {@link MarkerField}[]
158169
*/
159170
public MarkerField[] getInitialVisible() {
160-
return initialVisible;
171+
if (initialVisibleWithExtensions == null) {
172+
List<MarkerField> fields = new ArrayList<>();
173+
fields.addAll(Arrays.asList(initialVisible));
174+
getExtensionsDescriptorsStream().map(d -> Arrays.asList(d.getInitialVisible())).flatMap(Collection::stream)
175+
.forEach(fields::add);
176+
initialVisibleWithExtensions = fields.toArray(MarkerField[]::new);
177+
}
178+
return initialVisibleWithExtensions;
161179
}
162180

163181
/**
@@ -215,6 +233,8 @@ public Collection<MarkerType> getMarkerTypes() {
215233
MarkerType[] types = MarkerTypesModel.getInstance().getType(IMarker.PROBLEM).getAllSubTypes();
216234
markerTypes.addAll(Arrays.asList(types));
217235
}
236+
getExtensionsDescriptorsStream().map(ContentGeneratorDescriptor::getMarkerTypes).flatMap(Collection::stream)
237+
.forEach(markerTypes::add);
218238
}
219239
return markerTypes;
220240
}
@@ -247,7 +267,7 @@ public Map<String, MarkerType> getTypesTable() {
247267
if (allTypesTable == null) {
248268
allTypesTable = new HashMap<>();
249269

250-
Iterator<MarkerType> allIterator = markerTypes.iterator();
270+
Iterator<MarkerType> allIterator = getMarkerTypes().iterator();
251271
while (allIterator.hasNext()) {
252272
MarkerType next = allIterator.next();
253273
allTypesTable.put(next.getId(), next);
@@ -294,5 +314,28 @@ public void initializeFromConfigurationElement(
294314
*/
295315
public void removeExtension(IConfigurationElement element) {
296316
generatorExtensions.remove(element);
317+
clearCaches();
318+
}
319+
320+
private void clearCaches() {
321+
allFieldsWithExtensions = null;
322+
initialVisibleWithExtensions = null;
323+
markerTypes = null;
324+
groups = null;
325+
allTypesTable = null;
297326
}
327+
328+
private Stream<ContentGeneratorDescriptor> getExtensionsDescriptorsStream() {
329+
if (generatorExtensions != null) {
330+
MarkerSupportRegistry registry = MarkerSupportRegistry.getInstance();
331+
return generatorExtensions.stream()
332+
.map(extensionConfigElem -> extensionConfigElem
333+
.getAttribute(MarkerSupportInternalUtilities.ATTRIBUTE_ID))
334+
.filter(id -> id != null && !id.isBlank())
335+
.map(contentGeneratorId -> registry.getContentGenDescriptor(contentGeneratorId))
336+
.filter(generator -> generator != null);
337+
}
338+
return Stream.empty();
339+
}
340+
298341
}

tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/MarkerSupportViewTest.java

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@
1414

1515
import java.lang.reflect.Field;
1616
import java.lang.reflect.Method;
17+
import java.util.Arrays;
1718
import java.util.Collection;
19+
import java.util.Collections;
20+
import java.util.List;
21+
import java.util.stream.Collectors;
1822

1923
import org.eclipse.jface.viewers.CheckboxTableViewer;
2024
import org.eclipse.swt.widgets.Button;
@@ -25,8 +29,13 @@
2529
import org.eclipse.ui.internal.views.markers.FiltersConfigurationDialog;
2630
import org.eclipse.ui.internal.views.markers.MarkerContentGenerator;
2731
import org.eclipse.ui.tests.harness.util.UITestCase;
32+
import org.eclipse.ui.views.markers.MarkerField;
2833
import org.eclipse.ui.views.markers.MarkerSupportView;
34+
import org.eclipse.ui.views.markers.internal.ContentGeneratorDescriptor;
35+
import org.eclipse.ui.views.markers.internal.MarkerGroup;
2936
import org.eclipse.ui.views.markers.internal.MarkerMessages;
37+
import org.eclipse.ui.views.markers.internal.MarkerSupportRegistry;
38+
import org.eclipse.ui.views.markers.internal.MarkerType;
3039
import org.junit.Test;
3140
import org.junit.runner.RunWith;
3241
import org.junit.runners.JUnit4;
@@ -125,6 +134,70 @@ public void limitDisabled() throws Exception {
125134
assertFalse(isLimitEnabled);
126135
}
127136

137+
@Test
138+
public void markerContentGeneratorExtensionLoaded() throws Exception {
139+
MarkerSupportView view = (MarkerSupportView) PlatformUI.getWorkbench().getActiveWorkbenchWindow()
140+
.getActivePage().showView(PROBLEM_VIEW_ID);
141+
142+
MarkerContentGenerator generator = getMarkerContentGenerator(view);
143+
ContentGeneratorDescriptor descriptor = MarkerSupportRegistry.getInstance()
144+
.getContentGenDescriptor(generator.getId());
145+
146+
assertNotNull(descriptor);
147+
148+
MarkerField[] allFields = descriptor.getAllFields();
149+
List<String> allFieldNames = mapToNames(allFields);
150+
String fieldName1 = "Problem Key";
151+
String fieldName2 = "Problem Key V2";
152+
153+
assertTrue(
154+
"Expected loading marker field '" + fieldName1
155+
+ "' from marker content generator extensions, but got only " + allFieldNames,
156+
allFieldNames.contains(fieldName1));
157+
assertTrue(
158+
"Expected recursively loading marker field '" + fieldName2
159+
+ "' from marker content generator extensions, but got only " + allFieldNames,
160+
allFieldNames.contains(fieldName2));
161+
162+
MarkerField[] initiallyVisibleFields = descriptor.getInitialVisible();
163+
List<String> initiallyVisibleFieldNames = mapToNames(initiallyVisibleFields);
164+
165+
assertTrue("Expected marker field '" + fieldName1
166+
+ "' from marker content generator extension being visible according to 'visible' attribute in the extension,"
167+
+ " but only the following marker fields are visible " + initiallyVisibleFieldNames,
168+
initiallyVisibleFieldNames.contains(fieldName1));
169+
assertFalse("Expected marker field '" + fieldName2
170+
+ "' from marker content generator extension being not visible according to 'visible' attribute in the extension,"
171+
+ " but the following marker fields are visible " + initiallyVisibleFieldNames,
172+
initiallyVisibleFieldNames.contains(fieldName2));
173+
174+
String markerTypeId = "org.eclipse.ui.tests.markers.artificial.problem";
175+
MarkerType markerTypeFromExtension = descriptor.getType(markerTypeId);
176+
List<String> markerTypeIds = descriptor.getMarkerTypes().stream().map(MarkerType::getId)
177+
.collect(Collectors.toList());
178+
179+
assertNotNull("Marker type with id '" + markerTypeId + "' not loaded from marker content generator extension.",
180+
markerTypeFromExtension);
181+
assertTrue("Expected marker type id '" + markerTypeId + "' being in marker types list, but we have only "
182+
+ markerTypeIds, markerTypeIds.contains(markerTypeId));
183+
184+
Collection<MarkerGroup> groups = descriptor.getMarkerGroups();
185+
List<String> groupIds = groups.stream().map(MarkerGroup::getId).collect(Collectors.toList());
186+
String groupId = "org.eclipse.ui.tests.test.extended";
187+
188+
assertTrue("Expected loading group id '" + groupId
189+
+ "' from marker content generator extension, but got only the following group ids: " + groupIds,
190+
groupIds.contains(groupId));
191+
}
192+
193+
private List<String> mapToNames(MarkerField[] markerFields) {
194+
if (markerFields == null || markerFields.length == 0) {
195+
return Collections.emptyList();
196+
}
197+
198+
return Arrays.stream(markerFields).map(mf -> mf.getName()).collect(Collectors.toList());
199+
}
200+
128201
public static MarkerContentGenerator getMarkerContentGenerator(MarkerSupportView view) {
129202
MarkerContentGenerator generator = null;
130203
try {
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.eclipse.ui.tests.markers;
2+
3+
import org.eclipse.ui.views.markers.MarkerField;
4+
import org.eclipse.ui.views.markers.MarkerItem;
5+
6+
public class ProblemKeyMarkerField extends MarkerField {
7+
8+
@Override
9+
public String getValue(MarkerItem item) {
10+
if (item == null) {
11+
return "";
12+
}
13+
return item.getAttributeValue("problemKey", "");
14+
}
15+
16+
}

tests/org.eclipse.ui.tests/plugin.xml

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3461,7 +3461,58 @@
34613461
</markerContentGenerator>
34623462
<markerContentGenerator
34633463
id="org.eclipse.ui.tests.customScopeContentGenerator">
3464-
</markerContentGenerator>
3464+
</markerContentGenerator>
3465+
<markerField
3466+
class="org.eclipse.ui.tests.markers.ProblemKeyMarkerField"
3467+
id="org.eclipse.ui.tests.markerField.problemKey"
3468+
name="Problem Key">
3469+
</markerField>
3470+
<markerField
3471+
class="org.eclipse.ui.tests.markers.ProblemKeyMarkerField"
3472+
id="org.eclipse.ui.tests.markerField.problemKeyV2"
3473+
name="Problem Key V2">
3474+
</markerField>
3475+
<markerContentGenerator
3476+
id="org.eclipse.ui.tests.additionalProblemMarkerContentGenerator"
3477+
name="Additional Problem Marker Content Generator">
3478+
<markerFieldReference
3479+
visible="true"
3480+
id="org.eclipse.ui.tests.markerField.problemKey">
3481+
</markerFieldReference>
3482+
<markerTypeReference
3483+
id="org.eclipse.ui.tests.markers.static.analysis.problem">
3484+
</markerTypeReference>
3485+
<markerTypeReference
3486+
id="org.eclipse.ui.tests.markers.artificial.problem">
3487+
</markerTypeReference>
3488+
</markerContentGenerator>
3489+
<markerContentGeneratorExtension
3490+
generatorId="org.eclipse.ui.ide.problemsGenerator"
3491+
id="org.eclipse.ui.tests.additionalProblemMarkerContentGenerator">
3492+
<markerGrouping
3493+
id="org.eclipse.ui.tests.test.extended"
3494+
label="Extended Problem Category">
3495+
</markerGrouping>
3496+
</markerContentGeneratorExtension>
3497+
<markerContentGeneratorExtension
3498+
generatorId="org.eclipse.ui.ide.allMarkersGenerator"
3499+
id="org.eclipse.ui.tests.additionalProblemMarkerContentGenerator">
3500+
</markerContentGeneratorExtension>
3501+
<markerContentGenerator
3502+
id="org.eclipse.ui.tests.additionalProblemMarkerContentGenerator2"
3503+
name="Additional Problem Marker Content Generator 2">
3504+
<markerFieldReference
3505+
visible="false"
3506+
id="org.eclipse.ui.tests.markerField.problemKeyV2">
3507+
</markerFieldReference>
3508+
<markerTypeReference
3509+
id="org.eclipse.ui.tests.markers.static.analysis.problem">
3510+
</markerTypeReference>
3511+
</markerContentGenerator>
3512+
<markerContentGeneratorExtension
3513+
generatorId="org.eclipse.ui.tests.additionalProblemMarkerContentGenerator"
3514+
id="org.eclipse.ui.tests.additionalProblemMarkerContentGenerator2">
3515+
</markerContentGeneratorExtension>
34653516
</extension>
34663517
<extension
34673518
id="categoryTestMarker"
@@ -4888,5 +4939,24 @@
48884939
categoryId="org.eclipse.ui.tests.issue1832">
48894940
</categoryActivityBinding>
48904941
</extension>
4942+
<extension
4943+
id="markers.static.analysis.problem"
4944+
name="Static Analysis Test Problem"
4945+
point="org.eclipse.core.resources.markers">
4946+
<super
4947+
type="org.eclipse.core.resources.problemmarker">
4948+
</super>
4949+
<persistent
4950+
value="true">
4951+
</persistent>
4952+
<attribute
4953+
name="problemKey">
4954+
</attribute>
4955+
</extension>
4956+
<extension
4957+
id="markers.artificial.problem"
4958+
name="Artificial Test Problem"
4959+
point="org.eclipse.core.resources.markers">
4960+
</extension>
48914961

48924962
</plugin>

0 commit comments

Comments
 (0)