Skip to content

Commit 30ba6cf

Browse files
committed
add new jakarta faces libraries
1 parent fb2aab3 commit 30ba6cf

File tree

24 files changed

+516
-58
lines changed

24 files changed

+516
-58
lines changed

enterprise/maven.j2ee/nbproject/project.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
# under the License.
1717

1818
is.eager=true
19-
javac.compilerargs=-Xlint -Xlint:-serial -Xlint -Xlint:-serial
19+
javac.compilerargs=-Xlint -Xlint:-serial
2020

21-
javac.source=1.8
21+
javac.release=17
2222
test.config.stableBTD.includes=**/*Test.class

enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/MavenJsfReferenceImplementationProvider.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import org.netbeans.modules.maven.embedder.MavenEmbedder;
3636
import org.netbeans.modules.web.jsfapi.api.JsfVersion;
3737
import org.netbeans.modules.web.jsfapi.spi.JsfReferenceImplementationProvider;
38-
import org.openide.util.Exceptions;
3938
import org.openide.util.lookup.ServiceProvider;
4039

4140
/**
@@ -56,8 +55,8 @@ public class MavenJsfReferenceImplementationProvider implements JsfReferenceImpl
5655
map.put(JsfVersion.JSF_2_2, "com.sun.faces:jsf-impl:2.2.20");
5756
map.put(JsfVersion.JSF_2_3, "org.glassfish:jakarta.faces:2.3.21");
5857
map.put(JsfVersion.JSF_3_0, "org.glassfish:jakarta.faces:3.0.5");
59-
map.put(JsfVersion.JSF_4_0, "org.glassfish:jakarta.faces:4.0.5");
60-
map.put(JsfVersion.JSF_4_1, "org.glassfish:jakarta.faces:4.1.0-M1");
58+
map.put(JsfVersion.JSF_4_0, "org.glassfish:jakarta.faces:4.0.13");
59+
map.put(JsfVersion.JSF_4_1, "org.glassfish:jakarta.faces:4.1.5");
6160
JSF_VERSION_MAVEN_COORDINATES_MAPPING = Collections.unmodifiableMap(map);
6261
}
6362

enterprise/web.jsf.editor/nbproject/project.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ javac.release=17
2020
javac.compilerargs=-Xlint -Xlint:-serial
2121

2222
test-unit-sys-prop.web.project.jars=\
23-
${web.jsf12.dir}/modules/ext/jsf-2_2/javax.faces.jar:\
23+
${web.jsf12.dir}/modules/ext/jsf-2_3/javax.faces.jar:\
2424
${servletjspapi.dir}/modules/ext/servlet4.0-jsp2.3-api.jar
2525

2626
requires.nb.javac=true

enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/DefaultFaceletLibraries.java

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.util.logging.Level;
3131
import java.util.logging.Logger;
3232
import org.netbeans.modules.web.jsfapi.api.DefaultLibraryInfo;
33+
import org.netbeans.modules.web.jsfapi.api.JsfVersion;
3334
import org.netbeans.modules.web.jsfapi.api.Library;
3435
import org.netbeans.modules.web.jsfapi.api.LibraryComponent;
3536
import org.netbeans.modules.web.jsfapi.api.LibraryInfo;
@@ -49,14 +50,27 @@
4950
public class DefaultFaceletLibraries {
5051

5152
private static DefaultFaceletLibraries INSTANCE;
53+
54+
private static String getJarPath(JsfVersion version) {
55+
if (version == null) {
56+
version = JsfVersion.JSF_2_3;
57+
}
58+
return switch (version) {
59+
case JSF_4_1 -> "modules/ext/jsf-4_1/jakarta.faces.jar";
60+
case JSF_4_0 -> "modules/ext/jsf-4_0/jakarta.faces.jar";
61+
case JSF_3_0 -> "modules/ext/jsf-3_0/jakarta.faces.jar";
62+
default -> "modules/ext/jsf-2_3/javax.faces.jar";
63+
};
64+
}
65+
5266
private File jsfImplJar;
5367
private Collection<FileObject> libraryDescriptorsFiles;
5468
private Map<String, FaceletsLibraryDescriptor> librariesDescriptors;
5569
private static Map<String, Library> jsf22FaceletPseudoLibraries;
5670

5771
public static synchronized DefaultFaceletLibraries getInstance() {
5872
if (INSTANCE == null) {
59-
INSTANCE = new DefaultFaceletLibraries();
73+
INSTANCE = new DefaultFaceletLibraries(JsfVersion.JSF_2_3);
6074
}
6175
return INSTANCE;
6276
}
@@ -67,9 +81,9 @@ public DefaultFaceletLibraries(File jsfImplJar) {
6781
init(jsfImplJar);
6882
}
6983

70-
public DefaultFaceletLibraries() {
84+
public DefaultFaceletLibraries(JsfVersion version) {
7185
this(InstalledFileLocator.getDefault().locate(
72-
"modules/ext/jsf-2_2/javax.faces.jar", //NOI18N
86+
getJarPath(version),
7387
"org.netbeans.modules.web.jsf20", false) //NOI18N
7488
);
7589
}
@@ -105,8 +119,8 @@ private void parseLibraries() {
105119
descritor = FaceletsLibraryDescriptor.create(lfo);
106120
librariesDescriptors.put(descritor.getNamespace(), descritor);
107121
} catch (LibraryDescriptorException ex) {
108-
Logger.global.log(Level.WARNING, "Error parsing facelets library " +
109-
FileUtil.getFileDisplayName(lfo) + " in javax.faces.jar from bundled web.jsf20 library", ex);
122+
Logger.getGlobal().log(Level.WARNING, "Error parsing facelets library " +
123+
FileUtil.getFileDisplayName(lfo) + " from file " + jsfImplJar, ex);
110124
}
111125
}
112126

enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/FaceletsLibrarySupport.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
import org.openide.util.Lookup;
6262
import org.openide.util.NbBundle;
6363
import org.openide.util.RequestProcessor;
64+
import org.openide.util.Utilities;
6465

6566
/**
6667
*
@@ -285,7 +286,7 @@ private Map<String, Library> _findLibraries() {
285286
//exclude the jsf jars from the classpath, if jsf20 library is available,
286287
//we'll use the jars from the netbeans library instead
287288
String fsName = cpRoot.getFileSystem().getDisplayName(); //any better way?
288-
if(!fsName.endsWith("javax.faces.jar")) { //NOI18N
289+
if(!fsName.endsWith("javax.faces.jar") && !fsName.endsWith("jakarta.faces.jar")) { //NOI18N
289290
urlsToLoad.add(URLMapper.findURL(cpRoot, URLMapper.INTERNAL));
290291
LOGGER.log(Level.FINE, "+++{0}", cpRoot); //NOI18N
291292
} else {
@@ -297,7 +298,7 @@ private Map<String, Library> _findLibraries() {
297298
}
298299
}
299300

300-
ClassLoader proxyLoader = new URLClassLoader(urlsToLoad.toArray(new URL[]{}), originalLoader) {
301+
ClassLoader proxyLoader = new URLClassLoader(urlsToLoad.toArray(URL[]::new), originalLoader) {
301302

302303
//prevent services loading from mojarra's sources
303304
@Override
@@ -370,7 +371,7 @@ public Enumeration<URL> findResources(String name) throws IOException {
370371
//happen that there is no javax-faces.jar with the .taglib.xml files
371372
//on the compile classpath and we still want the features like code
372373
//completion work. This happens for example in Maven web projects.
373-
DefaultFaceletLibraries defaultFaceletLibraries = DefaultFaceletLibraries.getInstance();
374+
DefaultFaceletLibraries defaultFaceletLibraries = new DefaultFaceletLibraries(jsfVersion);
374375
Collection<FileObject> libraryDescriptorFiles = defaultFaceletLibraries.getLibrariesDescriptorsFiles();
375376
final Collection<URI> libraryURIs = new ArrayList<>();
376377
for (FileObject fo : libraryDescriptorFiles) {
@@ -382,13 +383,13 @@ public Enumeration<URL> findResources(String name) throws IOException {
382383
}
383384
faceletTaglibProviders.add(sc -> libraryURIs);
384385

385-
jsfRIJars.add(defaultFaceletLibraries.getJsfImplJar().toURI().toURL());
386+
jsfRIJars.add(Utilities.toURI(defaultFaceletLibraries.getJsfImplJar()).toURL());
386387
}
387388
} catch (MalformedURLException ex) {
388389
Exceptions.printStackTrace(ex);
389390
}
390391

391-
URLClassLoader jsfRIClassLoader = new URLClassLoader(jsfRIJars.toArray(new URL[]{}));
392+
URLClassLoader jsfRIClassLoader = new URLClassLoader(jsfRIJars.toArray(URL[]::new));
392393

393394
//parse the libraries
394395
ServletContext sc = new EmptyServletContext();

enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/WebFaceletTaglibResourceProvider.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,17 @@
4141
import org.openide.util.Exceptions;
4242

4343
/**
44-
* provider URLs of libraries defined in javax.faces.FACELETS_LIBRARIES context param of deployment descriptor
44+
* provider URLs of libraries defined in [javax|jakarta].faces.FACELETS_LIBRARIES context param of deployment descriptor
4545
*
4646
* @author marekfukala
4747
*/
4848
public class WebFaceletTaglibResourceProvider implements ConfigurationResourceProvider {
4949

50-
private WebModule wm;
51-
5250
private static final String FACELETS_LIBRARIES_OLD_PROPERTY_NAME = "facelets.LIBRARIES"; //NOI18N
5351
private static final String FACELETS_LIBRARIES_PROPERTY_NAME = "javax.faces.FACELETS_LIBRARIES"; //NOI18N
52+
private static final String FACELETS_LIBRARIES_JAKARTA_PROPERTY_NAME = "jakarta.faces.FACELETS_LIBRARIES"; //NOI18N
53+
54+
private final WebModule wm;
5455

5556
public WebFaceletTaglibResourceProvider(WebModule wm) {
5657
this.wm = wm;
@@ -65,16 +66,17 @@ public Collection<URI> getResources(ServletContext ignored) {
6566
// This is executed just in case that the model is ready. Otherwise it leads to uncancelable work.
6667
// Another reports against non-consistents result from the first and second invocation should be
6768
// consulted with tzetula for better options how to fix this. Related issue is bug #232878.
68-
faceletsLibrariesList = model.runReadAction(new MetadataModelAction<WebAppMetadata, String>() {
69+
faceletsLibrariesList = model.runReadAction(new MetadataModelAction<>() {
6970
@Override
7071
public String run(WebAppMetadata metadata) throws Exception {
7172
//TODO can be init param specified by some annotation or the dd must be present?
7273
WebApp ddRoot = metadata.getRoot();
7374
if (ddRoot != null) {
7475
InitParam[] contextParams = ddRoot.getContextParam();
7576
for (InitParam param : contextParams) {
76-
if (FACELETS_LIBRARIES_PROPERTY_NAME.equals(param.getParamName()) ||
77-
FACELETS_LIBRARIES_OLD_PROPERTY_NAME.equals(param.getParamName())) {
77+
if (FACELETS_LIBRARIES_PROPERTY_NAME.equals(param.getParamName())
78+
|| FACELETS_LIBRARIES_OLD_PROPERTY_NAME.equals(param.getParamName())
79+
|| FACELETS_LIBRARIES_JAKARTA_PROPERTY_NAME.equals(param.getParamName())) {
7880
return param.getParamValue();
7981
}
8082
}

enterprise/web.jsf/nbproject/project.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
# under the License.
1717

1818
javac.compilerargs=-Xlint -Xlint:-serial
19-
javac.source=1.8
19+
javac.release=17
2020
spec.version.base=2.11.0
2121

2222
test.config.default.excludes=\

enterprise/web.jsf/src/org/netbeans/modules/web/jsf/JSFFrameworkProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ public Set extendImpl(WebModule webModule, TreeMap<String, JsfComponentCustomize
148148
jsfLibrary = panel.getLibrary();
149149
// if the selected library is a default one, add also JSTL library
150150
if (jsfLibrary.getName().equals(JSFUtils.DEFAULT_JSF_1_2_NAME)
151-
|| jsfLibrary.getName().equals(JSFUtils.DEFAULT_JSF_2_0_NAME)
151+
|| jsfLibrary.getName().equals(JSFUtils.DEFAULT_JSF_2_3_NAME)
152152
|| jsfLibrary.getName().equals(JSFUtils.DEFAULT_JSF_1_1_NAME)) {
153153
jstlLibrary = LibraryManager.getDefault().getLibrary(JSFUtils.DEFAULT_JSTL_1_1_NAME);
154154
}

enterprise/web.jsf/src/org/netbeans/modules/web/jsf/JSFUtils.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public class JSFUtils {
6767
// the names of bundled jsf libraries
6868
public static final String DEFAULT_JSF_1_1_NAME = "jsf1102"; //NOI18N
6969
public static final String DEFAULT_JSF_1_2_NAME = "jsf12"; //NOI18N
70-
public static final String DEFAULT_JSF_2_0_NAME = "jsf20"; //NOI18N
70+
public static final String DEFAULT_JSF_2_3_NAME = "jsf20"; //NOI18N
7171
public static final String DEFAULT_JSF_3_0_NAME = "jsf30"; //NOI18N
7272
public static final String DEFAULT_JSF_4_0_NAME = "jsf40"; //NOI18N
7373
public static final String DEFAULT_JSF_4_1_NAME = "jsf41"; //NOI18N
@@ -120,7 +120,7 @@ public static String isJSFLibraryResource(File resource) {
120120
}
121121

122122
if (resource.isDirectory()) {
123-
// Case of JSF version 2.1.2 and older - JSF library is created from packed directory
123+
// Case of MyFaces and Mojarra version 2.1.2 and older - JSF library is created from packed directory
124124
File libFolder = new File(resource, LIB_FOLDER);
125125
if (libFolder.exists()) {
126126
File[] files = libFolder.listFiles(new FileFilter() {
@@ -136,16 +136,23 @@ public boolean accept(File pathname) {
136136
try {
137137
List<File> list = Arrays.asList(files);
138138
isJSF = ClasspathUtil.containsClass(list, FACES_EXCEPTION);
139+
if (!isJSF) {
140+
isJSF = ClasspathUtil.containsClass(list, JAKARTAEE_FACES_EXCEPTION);
141+
}
139142
} catch (IOException exception) {
140143
Exceptions.printStackTrace(exception);
141144
}
142145
} else {
143146
result = NbBundle.getMessage(JSFUtils.class, "ERROR_THERE_IS_NOT_LIB_FOLDER", resource.getPath()); //NOI18N
144147
}
145148
} else {
146-
// Case of JSF version 2.1.3+ - JSF library is delivered as a single JAR file
149+
// Case of Mojarra version 2.1.3+ - JSF library is delivered as a single JAR file
147150
try {
148-
isJSF = ClasspathUtil.containsClass(Collections.singletonList(resource), FACES_EXCEPTION);
151+
List<File> list = Collections.singletonList(resource);
152+
isJSF = ClasspathUtil.containsClass(list, FACES_EXCEPTION);
153+
if (!isJSF) {
154+
isJSF = ClasspathUtil.containsClass(list, JAKARTAEE_FACES_EXCEPTION);
155+
}
149156
} catch (IOException ex) {
150157
Exceptions.printStackTrace(ex);
151158
}

enterprise/web.jsf/src/org/netbeans/modules/web/jsf/api/facesmodel/JsfVersionUtils.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.util.LinkedHashMap;
3030
import java.util.List;
3131
import java.util.Map;
32+
import java.util.Set;
3233
import java.util.WeakHashMap;
3334
import java.util.logging.Level;
3435
import java.util.logging.Logger;
@@ -52,7 +53,6 @@
5253
import org.openide.filesystems.FileUtil;
5354
import org.openide.util.Exceptions;
5455
import org.openide.util.Parameters;
55-
import org.openide.util.RequestProcessor;
5656
import org.openide.util.WeakListeners;
5757

5858
/**
@@ -61,6 +61,12 @@
6161
*/
6262
public final class JsfVersionUtils {
6363

64+
private static final Set<String> SPECIFICATION_TITLES = Set.of(
65+
"JavaServer Faces", // 1-2
66+
"Jakarta Server Faces", // 3
67+
"Jakarta Faces" // 4+
68+
);
69+
6470
private static final LinkedHashMap<JsfVersion, String> SPECIFIC_CLASS_NAMES = new LinkedHashMap<>();
6571

6672
static {
@@ -197,7 +203,7 @@ public static JsfVersion forClasspath(@NonNull List<URL> classpath) {
197203
@CheckForNull
198204
public static JsfVersion forServerLibrary(@NonNull ServerLibrary lib) {
199205
Parameters.notNull("serverLibrary", lib); //NOI18N
200-
if ("JavaServer Faces".equals(lib.getSpecificationTitle())) { // NOI18N
206+
if (SPECIFICATION_TITLES.contains(lib.getSpecificationTitle())) { // NOI18N
201207
if (Version.fromJsr277NotationWithFallback("4.1").equals(lib.getSpecificationVersion())) { //NOI18N
202208
return JsfVersion.JSF_4_1;
203209
} else if (Version.fromJsr277NotationWithFallback("4.0").equals(lib.getSpecificationVersion())) { //NOI18N

0 commit comments

Comments
 (0)