Skip to content

Commit b0a02ab

Browse files
travkin79trancexpress
authored andcommitted
Load marker content generator details from extensions #2193
It was not possible to add new columns to MarkerSupportViews via marker content generator extensions. By loading marker fields, marker types, and groups from marker content generator extensions that will be possible. This way, 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 9b21618 commit b0a02ab

File tree

4 files changed

+195
-3
lines changed

4 files changed

+195
-3
lines changed

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

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.HashMap;
2121
import java.util.HashSet;
2222
import java.util.Iterator;
23+
import java.util.List;
2324
import java.util.Map;
2425
import java.util.TreeSet;
2526
import java.util.stream.Stream;
@@ -44,8 +45,10 @@ public class ContentGeneratorDescriptor {
4445

4546
private IConfigurationElement configurationElement;
4647
private MarkerField[] allFields;
48+
private MarkerField[] allFieldsWithExtensions;
4749
private Collection<MarkerType> markerTypes;
4850
private MarkerField[] initialVisible;
51+
private MarkerField[] initialVisibleWithExtensions;
4952
private Collection<MarkerGroup> groups;
5053
private Collection<IConfigurationElement> generatorExtensions = new ArrayList<>();
5154
private Map<String, MarkerType> allTypesTable;
@@ -105,7 +108,14 @@ public boolean allTypesSelected(Collection<MarkerType> selectedTypes) {
105108
* @return {@link MarkerField}[]
106109
*/
107110
public MarkerField[] getAllFields() {
108-
return allFields;
111+
if (allFieldsWithExtensions == null) {
112+
List<MarkerField> fields = new ArrayList<>();
113+
fields.addAll(Arrays.asList(allFields));
114+
getExtensionsDescriptorsStream().map(d -> Arrays.asList(d.getAllFields())).flatMap(Collection::stream)
115+
.forEach(fields::add);
116+
allFieldsWithExtensions = fields.toArray(MarkerField[]::new);
117+
}
118+
return allFieldsWithExtensions;
109119
}
110120

111121
/**
@@ -156,7 +166,14 @@ public String getId() {
156166
* @return {@link MarkerField}[]
157167
*/
158168
public MarkerField[] getInitialVisible() {
159-
return initialVisible;
169+
if (initialVisibleWithExtensions == null) {
170+
List<MarkerField> fields = new ArrayList<>();
171+
fields.addAll(Arrays.asList(initialVisible));
172+
getExtensionsDescriptorsStream().map(d -> Arrays.asList(d.getInitialVisible())).flatMap(Collection::stream)
173+
.forEach(fields::add);
174+
initialVisibleWithExtensions = fields.toArray(MarkerField[]::new);
175+
}
176+
return initialVisibleWithExtensions;
160177
}
161178

162179
/**
@@ -198,6 +215,8 @@ public Collection<MarkerType> getMarkerTypes() {
198215
MarkerType[] types = MarkerTypesModel.getInstance().getType(IMarker.PROBLEM).getAllSubTypes();
199216
markerTypes.addAll(Arrays.asList(types));
200217
}
218+
getExtensionsDescriptorsStream().map(ContentGeneratorDescriptor::getMarkerTypes).flatMap(Collection::stream)
219+
.forEach(markerTypes::add);
201220
}
202221
return markerTypes;
203222
}
@@ -278,4 +297,18 @@ public void initializeFromConfigurationElement(
278297
public void removeExtension(IConfigurationElement element) {
279298
generatorExtensions.remove(element);
280299
}
300+
301+
private Stream<ContentGeneratorDescriptor> getExtensionsDescriptorsStream() {
302+
if (generatorExtensions != null) {
303+
MarkerSupportRegistry registry = MarkerSupportRegistry.getInstance();
304+
return generatorExtensions.stream()
305+
.map(extensionConfigElem -> extensionConfigElem
306+
.getAttribute(MarkerSupportInternalUtilities.ATTRIBUTE_ID))
307+
.filter(id -> id != null && !id.isBlank())
308+
.map(contentGeneratorId -> registry.getContentGenDescriptor(contentGeneratorId))
309+
.filter(generator -> generator != null);
310+
}
311+
return Stream.empty();
312+
}
313+
281314
}

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
@@ -3411,7 +3411,58 @@
34113411
</markerContentGenerator>
34123412
<markerContentGenerator
34133413
id="org.eclipse.ui.tests.customScopeContentGenerator">
3414-
</markerContentGenerator>
3414+
</markerContentGenerator>
3415+
<markerField
3416+
class="org.eclipse.ui.tests.markers.ProblemKeyMarkerField"
3417+
id="org.eclipse.ui.tests.markerField.problemKey"
3418+
name="Problem Key">
3419+
</markerField>
3420+
<markerField
3421+
class="org.eclipse.ui.tests.markers.ProblemKeyMarkerField"
3422+
id="org.eclipse.ui.tests.markerField.problemKeyV2"
3423+
name="Problem Key V2">
3424+
</markerField>
3425+
<markerContentGenerator
3426+
id="org.eclipse.ui.tests.additionalProblemMarkerContentGenerator"
3427+
name="Additional Problem Marker Content Generator">
3428+
<markerFieldReference
3429+
visible="true"
3430+
id="org.eclipse.ui.tests.markerField.problemKey">
3431+
</markerFieldReference>
3432+
<markerTypeReference
3433+
id="org.eclipse.ui.tests.markers.static.analysis.problem">
3434+
</markerTypeReference>
3435+
<markerTypeReference
3436+
id="org.eclipse.ui.tests.markers.artificial.problem">
3437+
</markerTypeReference>
3438+
</markerContentGenerator>
3439+
<markerContentGeneratorExtension
3440+
generatorId="org.eclipse.ui.ide.problemsGenerator"
3441+
id="org.eclipse.ui.tests.additionalProblemMarkerContentGenerator">
3442+
<markerGrouping
3443+
id="org.eclipse.ui.tests.test.extended"
3444+
label="Extended Problem Category">
3445+
</markerGrouping>
3446+
</markerContentGeneratorExtension>
3447+
<markerContentGeneratorExtension
3448+
generatorId="org.eclipse.ui.ide.allMarkersGenerator"
3449+
id="org.eclipse.ui.tests.additionalProblemMarkerContentGenerator">
3450+
</markerContentGeneratorExtension>
3451+
<markerContentGenerator
3452+
id="org.eclipse.ui.tests.additionalProblemMarkerContentGenerator2"
3453+
name="Additional Problem Marker Content Generator 2">
3454+
<markerFieldReference
3455+
visible="false"
3456+
id="org.eclipse.ui.tests.markerField.problemKeyV2">
3457+
</markerFieldReference>
3458+
<markerTypeReference
3459+
id="org.eclipse.ui.tests.markers.static.analysis.problem">
3460+
</markerTypeReference>
3461+
</markerContentGenerator>
3462+
<markerContentGeneratorExtension
3463+
generatorId="org.eclipse.ui.tests.additionalProblemMarkerContentGenerator"
3464+
id="org.eclipse.ui.tests.additionalProblemMarkerContentGenerator2">
3465+
</markerContentGeneratorExtension>
34153466
</extension>
34163467
<extension
34173468
id="categoryTestMarker"
@@ -4838,5 +4889,24 @@
48384889
categoryId="org.eclipse.ui.tests.issue1832">
48394890
</categoryActivityBinding>
48404891
</extension>
4892+
<extension
4893+
id="markers.static.analysis.problem"
4894+
name="Static Analysis Test Problem"
4895+
point="org.eclipse.core.resources.markers">
4896+
<super
4897+
type="org.eclipse.core.resources.problemmarker">
4898+
</super>
4899+
<persistent
4900+
value="true">
4901+
</persistent>
4902+
<attribute
4903+
name="problemKey">
4904+
</attribute>
4905+
</extension>
4906+
<extension
4907+
id="markers.artificial.problem"
4908+
name="Artificial Test Problem"
4909+
point="org.eclipse.core.resources.markers">
4910+
</extension>
48414911

48424912
</plugin>

0 commit comments

Comments
 (0)