From 15bc0360fd7779e8ce6d5b517e3f0e394be57638 Mon Sep 17 00:00:00 2001 From: Nicola Isotta Date: Wed, 18 Jun 2025 12:20:09 +0200 Subject: [PATCH] Fix EL ResourceBundle preview panel Fix "Open source in editor button" Fix loading of bundle files from default package @ --- .../modules/web/el/ResourceBundles.java | 6 +- .../completion/ELCodeCompletionHandler.java | 16 +++++- .../ELResourceBundleCompletionItem.java | 8 ++- .../ELResourceBundleKeyCompletionItem.java | 7 ++- .../editor/JSFResourceBundlesProvider.java | 57 ++++++++----------- 5 files changed, 52 insertions(+), 42 deletions(-) diff --git a/enterprise/web.el/src/org/netbeans/modules/web/el/ResourceBundles.java b/enterprise/web.el/src/org/netbeans/modules/web/el/ResourceBundles.java index 5c9cfda2be84..5bf24f336df5 100644 --- a/enterprise/web.el/src/org/netbeans/modules/web/el/ResourceBundles.java +++ b/enterprise/web.el/src/org/netbeans/modules/web/el/ResourceBundles.java @@ -163,9 +163,9 @@ public boolean isValidKey(String bundle, String key) { */ private ResourceBundleInfo getBundleForIdentifier(String ident) { // XXX - do it more efficiently - for (Map.Entry entry : getBundlesMap().entrySet()) { - if (ident.equals(entry.getValue().getVarName())) { - return entry.getValue(); + for (ResourceBundleInfo rbi : getBundlesMap().values()) { + if (ident.equals(rbi.getVarName())) { + return rbi; } } return null; diff --git a/enterprise/web.el/src/org/netbeans/modules/web/el/completion/ELCodeCompletionHandler.java b/enterprise/web.el/src/org/netbeans/modules/web/el/completion/ELCodeCompletionHandler.java index 983f2ba7186b..1fbbdf5dedae 100644 --- a/enterprise/web.el/src/org/netbeans/modules/web/el/completion/ELCodeCompletionHandler.java +++ b/enterprise/web.el/src/org/netbeans/modules/web/el/completion/ELCodeCompletionHandler.java @@ -54,7 +54,6 @@ import org.netbeans.api.java.source.JavaSource; import org.netbeans.api.java.source.Task; import org.netbeans.modules.csl.api.CodeCompletionContext; -import org.netbeans.modules.csl.api.CodeCompletionHandler; import org.netbeans.modules.csl.api.CodeCompletionHandler2; import org.netbeans.modules.csl.api.CodeCompletionResult; import org.netbeans.modules.csl.api.CompletionProposal; @@ -72,6 +71,7 @@ import org.netbeans.modules.web.el.ELVariableResolvers; import org.netbeans.modules.web.el.NodeUtil; import org.netbeans.modules.web.el.ResourceBundles; +import org.netbeans.modules.web.el.ResourceBundles.Location; import org.netbeans.modules.web.el.refactoring.RefactoringUtil; import org.netbeans.modules.web.el.spi.ELPlugin; import org.netbeans.modules.web.el.spi.ELVariableResolver.VariableInfo; @@ -603,11 +603,16 @@ private void proposeBundleKeysInArrayNotation(CodeCompletionContext context, if (!resourceBundles.canHaveBundles()) { return; } + FileObject bundleFile = null; + List bundleLocations = resourceBundles.getLocationsForBundleIdent(bundleKey); + if (!bundleLocations.isEmpty()) { + bundleFile = bundleLocations.get(0).getFile(); + } for (Map.Entry entry : resourceBundles.getEntries(bundleKey).entrySet()) { if (!prefix.matches(entry.getKey())) { continue; } - ELResourceBundleKeyCompletionItem item = new ELResourceBundleKeyCompletionItem(entry.getKey(), entry.getValue(), elElement); + ELResourceBundleKeyCompletionItem item = new ELResourceBundleKeyCompletionItem(entry.getKey(), entry.getValue(), elElement, bundleFile); item.setSmart(true); item.setAnchorOffset(context.getCaretOffset() - prefix.length()); proposals.add(item); @@ -626,11 +631,16 @@ private void proposeBundleKeysInDotNotation(CodeCompletionContext context, if (!resourceBundles.canHaveBundles()) { return; } + FileObject bundleFile = null; + List bundleLocations = resourceBundles.getLocationsForBundleIdent(bundleKey); + if (!bundleLocations.isEmpty()) { + bundleFile = bundleLocations.get(0).getFile(); + } for (Map.Entry entry : resourceBundles.getEntries(bundleKey).entrySet()) { if (!prefix.matches(entry.getKey())) { continue; } - ELResourceBundleKeyCompletionItem item = new ELResourceBundleKeyCompletionItem(entry.getKey(), entry.getValue(), elElement); + ELResourceBundleKeyCompletionItem item = new ELResourceBundleKeyCompletionItem(entry.getKey(), entry.getValue(), elElement, bundleFile); item.setSmart(true); item.setAnchorOffset(context.getCaretOffset() - prefix.length()); proposals.add(item); diff --git a/enterprise/web.el/src/org/netbeans/modules/web/el/completion/ELResourceBundleCompletionItem.java b/enterprise/web.el/src/org/netbeans/modules/web/el/completion/ELResourceBundleCompletionItem.java index 0c0e8f5c42aa..7924d90adfcd 100644 --- a/enterprise/web.el/src/org/netbeans/modules/web/el/completion/ELResourceBundleCompletionItem.java +++ b/enterprise/web.el/src/org/netbeans/modules/web/el/completion/ELResourceBundleCompletionItem.java @@ -19,6 +19,7 @@ package org.netbeans.modules.web.el.completion; import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.Callable; @@ -120,11 +121,10 @@ Documentation document(ParserResult info, Callable cancel) { Map entries = bundles.getEntries(bundle.getVar()); for (Map.Entry entry : entries.entrySet()) { - String value = entries.get(entry.getValue()); buf.append(entry.getKey()); buf.append('='); //NOI18N buf.append(""); //NOI18N - buf.append(value); + buf.append(entry.getValue()); buf.append(""); //NOI18N buf.append("
"); //NOI18N } @@ -133,6 +133,10 @@ Documentation document(ParserResult info, Callable cancel) { @Override public FileObject getFileObject() { + List files = bundle.getFiles(); + if (!files.isEmpty()) { + return files.get(0); + } return file; } diff --git a/enterprise/web.el/src/org/netbeans/modules/web/el/completion/ELResourceBundleKeyCompletionItem.java b/enterprise/web.el/src/org/netbeans/modules/web/el/completion/ELResourceBundleKeyCompletionItem.java index cde4e24ba2f1..8bd80445bb2d 100644 --- a/enterprise/web.el/src/org/netbeans/modules/web/el/completion/ELResourceBundleKeyCompletionItem.java +++ b/enterprise/web.el/src/org/netbeans/modules/web/el/completion/ELResourceBundleKeyCompletionItem.java @@ -45,11 +45,13 @@ final class ELResourceBundleKeyCompletionItem extends DefaultCompletionProposal private final String key; private final String value; private final ELElement element; + private final FileObject bundleFile; - public ELResourceBundleKeyCompletionItem(String key, String value, ELElement element) { + public ELResourceBundleKeyCompletionItem(String key, String value, ELElement element, FileObject bundleFile) { this.key = key; this.value = value; this.element = element; + this.bundleFile = bundleFile; } @Override @@ -92,6 +94,9 @@ Documentation document(ParserResult info, Callable cancel) { @Override public FileObject getFileObject() { + if (bundleFile != null) { + return bundleFile; + } return element.getSnapshot().getSource().getFileObject(); } diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/api/editor/JSFResourceBundlesProvider.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/api/editor/JSFResourceBundlesProvider.java index 1e00acf876b7..bccd8a430f8b 100644 --- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/api/editor/JSFResourceBundlesProvider.java +++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/api/editor/JSFResourceBundlesProvider.java @@ -31,8 +31,6 @@ import org.netbeans.api.project.SourceGroup; import org.netbeans.modules.j2ee.core.api.support.SourceGroups; import org.netbeans.modules.j2ee.metadata.model.api.MetadataModel; -import org.netbeans.modules.j2ee.metadata.model.api.MetadataModelAction; -import org.netbeans.modules.j2ee.metadata.model.api.MetadataModelException; import org.netbeans.modules.web.el.spi.ResourceBundle; import org.netbeans.modules.web.jsf.JSFUtils; import org.netbeans.modules.web.jsf.api.facesmodel.Application; @@ -53,41 +51,35 @@ public static List getResourceBundles(final Project project) { return Collections.emptyList(); } try { - return model.runReadAction(new MetadataModelAction>() { - - @Override - public List run(JsfModel metadata) throws Exception { - List applications = metadata.getElements(Application.class); - List result = new ArrayList<>(); - for (Application application : applications) { - for (org.netbeans.modules.web.jsf.api.facesmodel.ResourceBundle bundle : application.getResourceBundles()) { - if (bundle.getBaseName() == null) { - continue; - } - List files = new ArrayList<>(); - // java source source groups - for (SourceGroup sourceGroup : SourceGroups.getJavaSourceGroups(project)) { - FileObject bundleFile = getBundleFileInSourceGroup(sourceGroup, bundle); - if (bundleFile != null) { - files.add(bundleFile); - } + return model.runReadAction(metadata -> { + List applications = metadata.getElements(Application.class); + List result = new ArrayList<>(); + for (Application application : applications) { + for (org.netbeans.modules.web.jsf.api.facesmodel.ResourceBundle bundle : application.getResourceBundles()) { + if (bundle.getBaseName() == null) { + continue; + } + List files = new ArrayList<>(); + // java source source groups + for (SourceGroup sourceGroup : SourceGroups.getJavaSourceGroups(project)) { + FileObject bundleFile = getBundleFileInSourceGroup(sourceGroup, bundle); + if (bundleFile != null) { + files.add(bundleFile); } - // resource source groups - for (SourceGroup sourceGroup : ProjectUtils.getSources(project).getSourceGroups(JavaProjectConstants.SOURCES_TYPE_RESOURCES)) { - FileObject bundleFile = getBundleFileInSourceGroup(sourceGroup, bundle); - if (bundleFile != null) { - files.add(bundleFile); - } + } + // resource source groups + for (SourceGroup sourceGroup : ProjectUtils.getSources(project).getSourceGroups(JavaProjectConstants.SOURCES_TYPE_RESOURCES)) { + FileObject bundleFile = getBundleFileInSourceGroup(sourceGroup, bundle); + if (bundleFile != null) { + files.add(bundleFile); } - - result.add(new ResourceBundle(bundle.getBaseName(), bundle.getVar(), files)); } + + result.add(new ResourceBundle(bundle.getBaseName(), bundle.getVar(), files)); } - return result; } + return result; }); - } catch (MetadataModelException ex) { - LOGGER.log(Level.INFO, "Failed to read resource bundles for " + project, ex); } catch (IOException | IllegalStateException ex) { LOGGER.log(Level.INFO, "Failed to read resource bundles for " + project, ex); } @@ -96,13 +88,12 @@ public List run(JsfModel metadata) throws Exception { private static FileObject getBundleFileInSourceGroup(SourceGroup sourceGroup, org.netbeans.modules.web.jsf.api.facesmodel.ResourceBundle bundle) { int lastDelim = bundle.getBaseName().lastIndexOf("/"); //NOI18N + String bundleName = bundle.getBaseName().substring(lastDelim + 1); if (lastDelim <= 0) { // in root folder or default package - String bundleName = bundle.getBaseName().substring(1); return getBundleInFolder(sourceGroup.getRootFolder(), bundleName); } else { // in the subfolder or non-default package - String bundleName = bundle.getBaseName().substring(lastDelim + 1); String parentFolder = bundle.getBaseName().replace(".", "/").substring(0, lastDelim); //NOI18N return getBundleInFolder(sourceGroup.getRootFolder().getFileObject(parentFolder), bundleName); }