Skip to content

Commit 9d727cb

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 9b21618 commit 9d727cb

File tree

4 files changed

+203
-3
lines changed

4 files changed

+203
-3
lines changed

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

Lines changed: 43 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;
@@ -78,6 +81,7 @@ private void addDefinedGroups(Collection<MarkerGroup> groupss) {
7881
*/
7982
public void addExtensions(Collection<IConfigurationElement> extensions) {
8083
generatorExtensions = extensions;
84+
clearMarkerFieldCaches();
8185
}
8286

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

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

162180
/**
@@ -198,6 +216,8 @@ public Collection<MarkerType> getMarkerTypes() {
198216
MarkerType[] types = MarkerTypesModel.getInstance().getType(IMarker.PROBLEM).getAllSubTypes();
199217
markerTypes.addAll(Arrays.asList(types));
200218
}
219+
getExtensionsDescriptorsStream().map(ContentGeneratorDescriptor::getMarkerTypes).flatMap(Collection::stream)
220+
.forEach(markerTypes::add);
201221
}
202222
return markerTypes;
203223
}
@@ -277,5 +297,26 @@ public void initializeFromConfigurationElement(
277297
*/
278298
public void removeExtension(IConfigurationElement element) {
279299
generatorExtensions.remove(element);
300+
clearMarkerFieldCaches();
301+
}
302+
303+
private void clearMarkerFieldCaches() {
304+
allFieldsWithExtensions = null;
305+
initialVisibleWithExtensions = null;
306+
markerTypes = null;
280307
}
308+
309+
private Stream<ContentGeneratorDescriptor> getExtensionsDescriptorsStream() {
310+
if (generatorExtensions != null) {
311+
MarkerSupportRegistry registry = MarkerSupportRegistry.getInstance();
312+
return generatorExtensions.stream()
313+
.map(extensionConfigElem -> extensionConfigElem
314+
.getAttribute(MarkerSupportInternalUtilities.ATTRIBUTE_ID))
315+
.filter(id -> id != null && !id.isBlank())
316+
.map(contentGeneratorId -> registry.getContentGenDescriptor(contentGeneratorId))
317+
.filter(generator -> generator != null);
318+
}
319+
return Stream.empty();
320+
}
321+
281322
}

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)