Skip to content

Commit b2ad041

Browse files
committed
Fix rare CCE in the interface selector UI of the new-java-class wizard
The code replaced a typed ListModel with a dummy model containing a single String which can cause a CCE in the interface selector filter. The dummy model isn't really needed since the goto component does handle the "search in progress" state already, so I removed the default value. Fixed more rawtype compiler warnings to avoid similar issues in future.
1 parent f914d7f commit b2ad041

6 files changed

Lines changed: 85 additions & 93 deletions

File tree

ide/jumpto/src/org/netbeans/modules/jumpto/symbol/ContentProviderImpl.java

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.IdentityHashMap;
2929
import java.util.Iterator;
3030
import java.util.List;
31+
import java.util.Map;
3132
import java.util.Optional;
3233
import java.util.Set;
3334
import java.util.concurrent.atomic.AtomicReference;
@@ -38,7 +39,6 @@
3839
import javax.swing.Icon;
3940
import javax.swing.JButton;
4041
import javax.swing.JList;
41-
import javax.swing.ListCellRenderer;
4242
import javax.swing.SwingUtilities;
4343
import javax.swing.event.ChangeEvent;
4444
import javax.swing.event.ChangeListener;
@@ -103,6 +103,7 @@ protected String getItemValue(@NonNull final SymbolDescriptor item) {
103103
}
104104

105105
@Override
106+
@SuppressWarnings("unchecked")
106107
protected void update(@NonNull final SymbolDescriptor item) {
107108
String searchText = getSearchText();
108109
if (searchText == null) {
@@ -111,8 +112,8 @@ protected void update(@NonNull final SymbolDescriptor item) {
111112
SymbolProviderAccessor.DEFAULT.setHighlightText(item, searchText);
112113
final SymbolDescriptorAttrCopier copier = currentSearch.getAttribute(SymbolDescriptorAttrCopier.class);
113114
if (copier != null) {
114-
if (item instanceof AsyncDescriptor && !((AsyncDescriptor<SymbolDescriptor>)item).hasCorrectCase()) {
115-
copier.reportWrongCase((AsyncDescriptor<SymbolDescriptor>)item);
115+
if (item instanceof AsyncDescriptor ad && !ad.hasCorrectCase()) {
116+
copier.reportWrongCase(ad);
116117
}
117118
}
118119
}
@@ -139,8 +140,8 @@ void setDialog(final Dialog dialog) {
139140

140141

141142
@Override
142-
public ListCellRenderer getListCellRenderer(
143-
@NonNull final JList list,
143+
public ItemRenderer<SymbolDescriptor> getListCellRenderer(
144+
@NonNull final JList<SymbolDescriptor> list,
144145
@NonNull final ButtonModel caseSensitive) {
145146
Parameters.notNull("list", list); //NOI18N
146147
Parameters.notNull("caseSensitive", caseSensitive); //NOI18N
@@ -151,7 +152,7 @@ public ListCellRenderer getListCellRenderer(
151152
}
152153

153154
@Override
154-
public boolean setListModel(GoToPanel panel, String text) {
155+
public boolean setListModel(GoToPanel<SymbolDescriptor> panel, String text) {
155156
enableOK(false);
156157
final Worker workToCancel;
157158
final RequestProcessor.Task taskToCancel;
@@ -170,7 +171,7 @@ public boolean setListModel(GoToPanel panel, String text) {
170171

171172
if ( text == null ) {
172173
currentSearch.resetFilter();
173-
panel.setModel(new DefaultListModel(), true);
174+
panel.setModel(new DefaultListModel<>(), true);
174175
return false;
175176
}
176177
final boolean exact = text.endsWith(" "); // NOI18N
@@ -180,7 +181,7 @@ public boolean setListModel(GoToPanel panel, String text) {
180181
currentSearch.filter(
181182
SearchType.EXACT_NAME,
182183
text,
183-
Collections.singletonMap(AbstractModelFilter.OPTION_CLEAR, Boolean.TRUE));
184+
Map.of(AbstractModelFilter.OPTION_CLEAR, Boolean.TRUE));
184185
panel.revalidateModel(true);
185186
return false;
186187
}
@@ -197,7 +198,7 @@ public boolean setListModel(GoToPanel panel, String text) {
197198
if (name.isEmpty()) {
198199
//Empty name, wait for next char
199200
currentSearch.resetFilter();
200-
panel.setModel(new DefaultListModel(), true);
201+
panel.setModel(new DefaultListModel<>(), true);
201202
return false;
202203
}
203204
// Compute in other thread
@@ -245,7 +246,7 @@ public boolean hasValidContent() {
245246
Runnable createWorker(
246247
@NonNull final String text,
247248
@NonNull final SearchType searchType,
248-
@NonNull final GoToPanel panel) {
249+
@NonNull final GoToPanel<SymbolDescriptor> panel) {
249250
return new Worker(text, text, searchType, panel);
250251
}
251252

@@ -268,7 +269,7 @@ private void cleanUp() {
268269
private Collection<? extends SymbolProvider> getTypeProviders() {
269270
Collection<? extends SymbolProvider> res = typeProviders.get();
270271
if (res == null) {
271-
res = Arrays.asList(Lookup.getDefault().lookupAll(SymbolProvider.class).toArray(new SymbolProvider[0]));
272+
res = Arrays.asList(Lookup.getDefault().lookupAll(SymbolProvider.class).toArray(SymbolProvider[]::new));
272273
if (!typeProviders.compareAndSet(null, res)) {
273274
res = typeProviders.get();
274275
}
@@ -324,7 +325,7 @@ private class Worker implements Runnable {
324325
private final String name;
325326
private final SearchType searchType;
326327
private final long createTime;
327-
private final GoToPanel panel;
328+
private final GoToPanel<SymbolDescriptor> panel;
328329

329330
private volatile boolean isCanceled = false;
330331
private volatile SymbolProvider current;
@@ -333,7 +334,7 @@ private class Worker implements Runnable {
333334
@NonNull final String text,
334335
@NonNull final String name,
335336
@NonNull final SearchType searchType,
336-
@NonNull final GoToPanel panel ) {
337+
@NonNull final GoToPanel<SymbolDescriptor> panel ) {
337338
this.text = text;
338339
this.name = name;
339340
this.searchType = searchType;
@@ -465,7 +466,7 @@ private Result getSymbolNames(
465466
items = new HashSet<>(128);
466467
String[] message = new String[1];
467468
int retry = 0;
468-
final Collection<SymbolProvider> nonFinishedProviders = Collections.newSetFromMap(new IdentityHashMap<SymbolProvider, Boolean>());
469+
final Collection<SymbolProvider> nonFinishedProviders = Collections.newSetFromMap(new IdentityHashMap<>());
469470
for (SymbolProvider provider : providers) {
470471
current = provider;
471472
try {
@@ -553,16 +554,17 @@ public boolean removeAll(Collection<?> c) {
553554
return modified;
554555
}
555556
});
556-
resolved = Collections.synchronizedSet(new HashSet<SymbolDescriptor>());
557+
resolved = Collections.synchronizedSet(new HashSet<>());
557558
}
558559

560+
@SuppressWarnings("unchecked")
559561
void checkWrongCase(
560562
@NonNull final Collection<? extends SymbolDescriptor> remove,
561563
@NonNull final Collection<? extends SymbolDescriptor> add) {
562564
hasWrongCase.removeAll(remove);
563565
for (SymbolDescriptor d : add) {
564-
if (d instanceof AsyncDescriptor && !((AsyncDescriptor<SymbolDescriptor>)d).hasCorrectCase()) {
565-
reportWrongCase((AsyncDescriptor<SymbolDescriptor>)d);
566+
if (d instanceof AsyncDescriptor ad && !ad.hasCorrectCase()) {
567+
reportWrongCase(ad);
566568
}
567569
}
568570
}
@@ -593,8 +595,8 @@ public SymbolDescriptor create(@NonNull final Pair<? extends SymbolDescriptor, ?
593595
final SymbolDescriptor source = p.first();
594596
final SymbolDescriptor target = p.second();
595597
resolved.add(source);
596-
if (source instanceof AsyncDescriptor && !((AsyncDescriptor<SymbolDescriptor>)source).hasCorrectCase()) {
597-
hasWrongCase.remove(source);
598+
if (source instanceof AsyncDescriptor ad && !ad.hasCorrectCase()) {
599+
hasWrongCase.remove(ad);
598600
}
599601
SymbolProviderAccessor.DEFAULT.setHighlightText(
600602
target,

ide/jumpto/src/org/netbeans/modules/jumpto/symbol/GoToPanelImpl.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
import javax.swing.JScrollPane;
4848
import javax.swing.JTextField;
4949
import javax.swing.KeyStroke;
50-
import javax.swing.ListCellRenderer;
5150
import javax.swing.ListModel;
5251
import javax.swing.ListSelectionModel;
5352
import javax.swing.SwingConstants;
@@ -61,6 +60,7 @@
6160
import org.netbeans.api.annotations.common.CheckForNull;
6261
import org.netbeans.api.annotations.common.NonNull;
6362
import org.netbeans.modules.jumpto.SearchHistory;
63+
import org.netbeans.modules.jumpto.common.ItemRenderer;
6464
import org.netbeans.modules.jumpto.common.UiUtils;
6565
import org.netbeans.modules.jumpto.settings.GoToSettings;
6666
import org.netbeans.modules.jumpto.type.UiOptions;
@@ -165,7 +165,7 @@ public long getStartTime() {
165165
*/
166166
@Override
167167
public boolean setModel(
168-
@NonNull final ListModel model,
168+
@NonNull ListModel<SymbolDescriptor> model,
169169
final boolean finished) {
170170
assert SwingUtilities.isEventDispatchThread();
171171
matchesList.setModel(model);
@@ -560,7 +560,6 @@ public void itemStateChanged(ItemEvent e) {
560560

561561
@Override
562562
public void valueChanged(@NonNull final ListSelectionEvent ev) {
563-
// got "Not computed yet" text sometimes
564563
SymbolDescriptor selected = dialog.matchesList.getSelectedValue();
565564
if (selected != null) {
566565
dialog.jTextFieldLocation.setText(selected.getFileDisplayPath());
@@ -588,9 +587,9 @@ private void update(boolean restart) {
588587

589588
public static interface ContentProvider {
590589

591-
public ListCellRenderer<SymbolDescriptor> getListCellRenderer(JList<SymbolDescriptor> list, ButtonModel caseSensitive);
590+
public ItemRenderer<SymbolDescriptor> getListCellRenderer(JList<SymbolDescriptor> list, ButtonModel caseSensitive);
592591

593-
public boolean setListModel( GoToPanel panel, String text );
592+
public boolean setListModel(GoToPanel<SymbolDescriptor> panel, String text);
594593

595594
public void closeDialog();
596595

ide/jumpto/src/org/netbeans/modules/jumpto/type/Bundle.properties

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ TXT_GoToType_MatchesList_Label=Types &Found :
4343
LBL_GoToType_LocationJLabel=Location\:
4444
TXT_GoToType_CaseSensitive=Case &Sensitive
4545
TXT_GoToType_PreferOpenProjects=Prefer &Open Projects
46-
LBL_Computing=Computing...
4746

4847
CTL_OK=OK
4948

0 commit comments

Comments
 (0)