TCK Migration: Move standalone jaxrs tck signature tests from jakartaee-tck (#1044)
* Initial commit to lift sigtest framework from jakartaee-tck
-added signature file, .map file and packagelist txt to resources
* signature test fixes
* Update README
* signature file update, address review comments
* move signature record to profile
- also add missing junit jar to jersey-tck
* generate temp files for mapfile, packagelistfile and signaturefiles
* corrected builderror in previous commit
diff --git a/jaxrs-tck/pom.xml b/jaxrs-tck/pom.xml
index ca46aa6..33d845d 100644
--- a/jaxrs-tck/pom.xml
+++ b/jaxrs-tck/pom.xml
@@ -84,6 +84,39 @@
<tag>HEAD</tag>
</scm>
+<profiles>
+<profile>
+ <id>record-signature</id>
+ <activation>
+ <activeByDefault>false</activeByDefault>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.netbeans.tools</groupId>
+ <artifactId>sigtest-maven-plugin</artifactId>
+ <version>1.4</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>generate</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <FileName>${project.build.directory}/jakarta.ws.rs.sig_${version}</FileName>
+ <packages>jakarta.ws.rs,jakarta.ws.rs.client,jakarta.ws.rs.core,jakarta.ws.rs.container,jakarta.ws.rs.ext,jakarta.ws.rs.sse</packages>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</profile>
+
+<profile>
+ <id>tck-build</id>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
<build>
<plugins>
<plugin>
@@ -93,14 +126,19 @@
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M5</version>
- <configuration>
- <excludedGroups>optional</excludedGroups>
- </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>3.2.0</version>
</plugin>
</plugins>
</build>
+</profile>
+
+ </profiles>
<dependencies>
<dependency>
<groupId>jakarta.ws.rs</groupId>
@@ -164,5 +202,11 @@
<scope>provided</scope>
</dependency>
+ <dependency>
+ <groupId>org.netbeans.tools</groupId>
+ <artifactId>sigtest-maven-plugin</artifactId>
+ <version>1.4</version>
+ </dependency>
+
</dependencies>
</project>
\ No newline at end of file
diff --git a/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/lib/util/TestUtil.java b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/lib/util/TestUtil.java
index fe19465..8233757 100644
--- a/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/lib/util/TestUtil.java
+++ b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/lib/util/TestUtil.java
@@ -34,7 +34,7 @@
*
*/
public final class TestUtil {
- public static boolean traceflag = Boolean.getBoolean("junit.log.traceflag");
+ public static boolean traceflag = true;
// this can be set in TestUtil's start logging method!!
public static String sTestName;
@@ -405,9 +405,7 @@
}
if (true) {
// System.out.println("INIT_CALLED AND SOCKET = NULL");
- traceflag = Boolean
- .valueOf(p.getProperty("harness.log.traceflag", "true"))
- .booleanValue();
+ traceflag = Boolean.getBoolean("junit.log.traceflag");
hostOfHarness = p.getProperty("harness.host");
portOfHarness = Integer
.parseInt(p.getProperty("harness.log.port", "2000"));
@@ -443,9 +441,7 @@
try {
// System.out.println("INIT_CALLED AND TRYING TO ESABLISH CONN. AFTER
// IOEXCEPTION");
- traceflag = Boolean
- .valueOf(p.getProperty("harness.log.traceflag", "true"))
- .booleanValue();
+ traceflag = Boolean.getBoolean("junit.log.traceflag");
hostOfHarness = p.getProperty("harness.host");
portOfHarness = Integer
.parseInt(p.getProperty("harness.log.port", "2000"));
@@ -506,8 +502,7 @@
testProps = p;
NEW_LINE = p.getProperty("line.separator");
- traceflag = Boolean.valueOf(p.getProperty("harness.log.traceflag", "true"))
- .booleanValue();
+ traceflag = Boolean.getBoolean("junit.log.traceflag");
iWhereAreWe = VM_HARNESS;
bAlreadyInitialized = true;
}
@@ -527,9 +522,7 @@
try {
testProps = p;
NEW_LINE = p.getProperty("line.separator");
- traceflag = Boolean
- .valueOf(p.getProperty("harness.log.traceflag", "true"))
- .booleanValue();
+ traceflag = Boolean.getBoolean("junit.log.traceflag");
iWhereAreWe = VM_HARNESS;
ServerSocket ss = getServerSocket(p);
new Acceptor(ss);
diff --git a/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/ApiCheckDriver.java b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/ApiCheckDriver.java
new file mode 100644
index 0000000..7d7b06c
--- /dev/null
+++ b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/ApiCheckDriver.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (c) 2007, 2020 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+/*
+ * $Id$
+ */
+package jakarta.ws.rs.tck.signaturetest;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.PrintWriter;
+import java.io.Serializable;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.LinkedList;
+import java.util.List;
+
+import jakarta.ws.rs.tck.lib.util.TestUtil;
+
+public final class ApiCheckDriver extends SignatureTestDriver
+ implements Serializable {
+
+ /* flags for the Diff utility argument list */
+ private static final String BASE_FLAG = "-base";
+
+ private static final String TEST_FLAG = "-test";
+
+ private static final String PACKAGE_NO_SUBS_FLAG = "-PackageWithoutSubpackages";
+
+ private static final String PACKAGE_FLAG = "-package";
+
+ private static final String EXPACKAGE_FLAG = "-expackage";
+
+ private static final String REFLECT_FLAG = "-reflect";
+
+ private static final String CONST_FLAG = "-constvalues";
+
+ // ---------------------------------------- Methods from SignatureTestDriver
+
+ @Override
+ protected String normalizeFileName(File f) {
+ return f.getPath();
+ }
+
+ @Override
+ protected String[] createTestArguments(String packageListFile, String mapFile,
+ String signatureRepositoryDir, String packageOrClassUnderTest,
+ String classpath, boolean bStaticMode) throws Exception {
+
+ Class pkgListClass = Class.forName("javasoft.sqe.apiCheck.PackageList");
+ Constructor pkgCtor = pkgListClass
+ .getDeclaredConstructor(new Class[] { String.class });
+ Object pkgInstance = pkgCtor.newInstance(new Object[] { packageListFile });
+
+ Method pkgMethod = pkgListClass.getDeclaredMethod("getSubPackagesFormatted",
+ new Class[] { String.class });
+
+ String excludePkgs = (String) pkgMethod.invoke(pkgInstance,
+ new Object[] { packageOrClassUnderTest });
+
+ List sigArgsList = new LinkedList();
+
+ sigArgsList.add(BASE_FLAG);
+ sigArgsList.add(
+ getSigFileInfo(packageOrClassUnderTest, mapFile, signatureRepositoryDir)
+ .getFile());
+
+ if (classpath != null && classpath.length() > 0) {
+ sigArgsList.add(TEST_FLAG);
+ sigArgsList.add(classpath);
+ }
+
+ sigArgsList.add(REFLECT_FLAG);
+ sigArgsList.add(CONST_FLAG);
+ sigArgsList.add(PACKAGE_FLAG);
+ sigArgsList.add(packageOrClassUnderTest);
+
+ if (excludePkgs != null && excludePkgs.length() > 0) {
+ sigArgsList.add(EXPACKAGE_FLAG);
+ sigArgsList.add(excludePkgs);
+ }
+
+ return (String[]) (sigArgsList.toArray(new String[sigArgsList.size()]));
+
+ } // END createTestArguments
+
+ @Override
+ protected boolean runSignatureTest(String packageOrClassName,
+ String[] testArguments) throws Exception {
+
+ Class diffClass = Class.forName("javasoft.sqe.apiCheck.Diff");
+ Method mainMethod = diffClass.getDeclaredMethod("main",
+ new Class[] { String[].class });
+ mainMethod.invoke(null, new Object[] { testArguments });
+
+ Method diffMethod = diffClass.getDeclaredMethod("diffsFound",
+ new Class[] {});
+ return (!((Boolean) diffMethod.invoke(null, new Object[] {}))
+ .booleanValue());
+
+ } // END runSignatureTest
+
+ @Override
+ protected boolean runPackageSearch(String packageOrClassName,
+ String[] testArguments) throws Exception {
+ Class sigTestClass = Class
+ .forName("com.sun.tdk.signaturetest.SignatureTest");
+ Object sigTestInstance = sigTestClass.newInstance();
+
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+
+ // we want to replace the PACKAGE_FLAG with PACKAGE_NO_SUBS_FLAG
+ for (int ii = 0; ii < testArguments.length; ii++) {
+ if (testArguments[ii].equals(PACKAGE_FLAG)) {
+ testArguments[ii] = PACKAGE_NO_SUBS_FLAG;
+ }
+ }
+
+ // dump args for debugging aid
+ TestUtil.logTrace(
+ "\nCalling: com.sun.tdk.signaturetest.SignatureTest() with following args:");
+ for (int ii = 0; ii < testArguments.length; ii++) {
+ TestUtil.logTrace(" testArguments[" + ii + "] = " + testArguments[ii]);
+ }
+
+ @SuppressWarnings("unchecked")
+ Method runMethod = sigTestClass.getDeclaredMethod("run",
+ new Class[] { String[].class, PrintWriter.class, PrintWriter.class });
+ runMethod.invoke(sigTestInstance,
+ new Object[] { testArguments, new PrintWriter(output, true), null });
+
+ String rawMessages = output.toString();
+
+ // currently, there is no way to determine if there are error msgs in
+ // the rawmessages, so we will always dump this and call it a status.
+ TestUtil.logMsg(
+ "********** Status Report '" + packageOrClassName + "' **********\n");
+ TestUtil.logMsg(rawMessages);
+ return sigTestInstance.toString().substring(7).startsWith("Passed.");
+ }
+
+ @Override
+ protected boolean verifyJTAJarForNoXA(String classpath, String repositoryDir)
+ throws Exception {
+ // Need to find out whether implementing this method is really required now.
+ // By default, signature test framework will use sigtest
+ return true;
+ }
+
+} // END ApiCheckDriver
diff --git a/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/ApiCheckRecorder.java b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/ApiCheckRecorder.java
new file mode 100644
index 0000000..69d4503
--- /dev/null
+++ b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/ApiCheckRecorder.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2007, 2018 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+/*
+ * @(#)SigTestRecorder.java 1.1 03/03/05
+ */
+package jakarta.ws.rs.tck.signaturetest;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ * This implementation of {@link Recorder} will record signatures using the
+ * <code>ApiCheck</code> framework.
+ * </p>
+ */
+public class ApiCheckRecorder extends Recorder {
+
+ // ------------------------------------------------------------ Constructors
+
+ public ApiCheckRecorder(String[] args) {
+
+ super(args);
+ System.setProperty("pkg.list.file.path", packageListFile);
+ System.setProperty("map.file.path", signatureMapFile);
+ System.setProperty("signature.repository.dir", signatureRepositoryDir);
+
+ } // END ApiCheckRecorder
+
+ // ------------------------------------------------------- Protected Methods
+
+ protected String[] createCommandLine(String version, String classpath,
+ String outputFileName, String packageName) {
+
+ List command = new ArrayList();
+
+ command.add("-constvalues");
+ command.add("-xpriv");
+
+ command.add("-in");
+ command.add(classpath);
+
+ return ((String[]) command.toArray(new String[command.size()]));
+
+ } // END getCommandLine
+
+ protected void writePackageListFile(String basePackageName,
+ String signatureFile, String packageListFile) throws Exception {
+
+ // no-op as this is done internally by our version of ApiCheck
+
+ } // END writePackageListFile
+
+ protected void doRecord(String[] commandLine) throws Exception {
+
+ Class batchSetup = Class.forName("javasoft.sqe.apiCheck.BatchSetup");
+ Method mainMethod = batchSetup.getDeclaredMethod("main",
+ new Class[] { String[].class });
+ mainMethod.invoke(null, new Object[] { commandLine });
+
+ } // END doRecord
+
+} // END SigTestRecorder
diff --git a/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/PackageList.java b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/PackageList.java
new file mode 100644
index 0000000..a5368ea
--- /dev/null
+++ b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/PackageList.java
@@ -0,0 +1,430 @@
+/*
+ * Copyright (c) 2007, 2020 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+/*
+ * $Id$
+ */
+
+package jakarta.ws.rs.tck.signaturetest;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+
+/**
+ * This class represents a package list file. A package list file is used in
+ * conjunction with a set of signature files to execute API signature tests.
+ * Users specify which set of package APIs are verified. Each package's
+ * signature is verified independently. As such all valid sub-packages must be
+ * excluded while a package's signature is being verified. This allows API check
+ * to determine incompatible additional packages included in a distribution.
+ * <p/>
+ * This class builds a package list file when signatures are recorded and
+ * provides an API to provide valid sub-package lists when signatures are played
+ * back (verified).
+ * <p/>
+ * In record mode, this class reads the existing package list file, if one
+ * exists, and removes the package (as well as sub-packages) that are currently
+ * being recorded. All package names read from the existing package list file
+ * are held in a tree set which sorts the package names and keeps duplicate
+ * package names from ocurring. The user can then instruct this class to write
+ * out the package list file. At this point this class reads the currently
+ * recorded signature file and extracts each package names and adds it to the
+ * tree set. After this step the previous package list file is saved as a backup
+ * and the new package list file is written to disk.
+ * <p/>
+ * In playback mode, this class reads the contents of the package list file and
+ * stores each package name in a tree set. Users can then invoke the
+ * getSubPackages method to retrieve the valid sub-packages for any given
+ * package. This is done by simply examining the package names in the tree set
+ * and returning any package name that starts with the parent package name and a
+ * trailing period character.
+ */
+class PackageList {
+
+ // Any line in the packageFile starting with this character is a comment
+ private static final char COMMENT_CHAR = '#';
+
+ private static final String BACKUP_EXT = ".bak";
+
+ // File containing the list of packages and sub-packages
+ private File packageFile;
+
+ // Signature file where the package signatures were recorded
+ private File sigFile;
+
+ // Name of the package being recorded
+ private String additionalPackageName;
+
+ // Name of packages and sub-packages in the
+ private Set packageNames = new TreeSet();
+
+ /**
+ * Creates an instance of the PackageList class. The PackageList instance
+ * reads the specified package file and populates it's internal state with the
+ * package names found in this file. Users should use this c'tor when playing
+ * back signature files. Users can init the PackageList instance then use the
+ * "String[] getSubPackages(String packageName)" method to get the list of
+ * valid sub-packages for every package who's signature is being verified.
+ *
+ * @param packageFileName
+ * The name of the file that contains the package list. This file
+ * contains the names of all the packages that exist across all the
+ * signature files that makeup this deliverable. This file is used to
+ * generate a list of valid sub-packages that must be exclued when
+ * testing theor parent package's signature.
+ *
+ * @throws Exception
+ * when the packageFileName does not exist.
+ */
+ public PackageList(String packageFileName) throws Exception {
+ packageFile = new File(packageFileName);
+ if (packageFile.exists() && packageFile.isFile()) {
+ extractExistingPackageNames();
+ } else {
+ throw new FileNotFoundException(packageFileName);
+ }
+ }
+
+ /**
+ * Creates an instance of the PackageList class. The PackageList instance
+ * reads the contents of the packageFileName and stores it in it's internal
+ * state. Next, any packages whos name starts with the specified packageName
+ * are removed from the internal package list. This is done because this is
+ * the package being recorded and we need to remove any previously recorded
+ * package names in case any sub-packages have been removed since the last
+ * time the signatures were recorded. Users should use this c'tor when they
+ * are recording signature files never during playback.
+ *
+ * @param packageName
+ * The name of the package whos signatures are being recorded (along
+ * with sub-packages).
+ * @param sigFileName
+ * The name of the file that contains the recored signatures.
+ * @param packageFileName
+ * The name of the file that contains the package list. This file
+ * contains the names of all the packages that exist across all the
+ * signature files that makeup this deliverable. This file is used to
+ * generate a list of valid sub-packages that must be exclued when
+ * testing their parent package's signature.
+ *
+ * @throws Exception
+ * when an error occurs reading the packageFileName or the
+ * sigFileName does not exist.
+ */
+ public PackageList(String packageName, String sigFileName,
+ String packageFileName) throws Exception {
+ this.additionalPackageName = packageName;
+ sigFile = new File(sigFileName);
+ if (!sigFile.exists() || !sigFile.isFile()) {
+ throw new FileNotFoundException(sigFileName);
+ }
+ packageFile = new File(packageFileName);
+ if (packageFile.exists() && packageFile.isFile()) {
+ extractExistingPackageNames();
+ removeExistingPackage();
+ }
+ }
+
+ /**
+ * Read the package names stored in the package list file. Each package name
+ * found in the package list file is added to the internal tree set.
+ *
+ * @throws Exception
+ * if there is an error opening or reading the package list file.
+ */
+ private void extractExistingPackageNames() throws Exception {
+ BufferedReader in = new BufferedReader(new FileReader(packageFile));
+ String line;
+ String trimLine;
+ try {
+ while ((line = in.readLine()) != null) {
+ trimLine = line.trim();
+ if (isComment(trimLine) || "".equals(trimLine)) {
+ continue;
+ }
+ packageNames.add(trimLine);
+ }
+ } finally {
+ try {
+ in.close();
+ } catch (Exception e) {
+ }
+ }
+ }
+
+ /**
+ * Returns true if the specified string starts with a comment character as
+ * denoted by the COMMENT_CHAR constant.
+ *
+ * @param line
+ * Determins of this line is a comment line
+ *
+ * @return boolean True if the specified line is a comment line else false.
+ */
+ private boolean isComment(String line) {
+ if (line == null) {
+ return false;
+ }
+ String theLine = line.trim();
+ if (theLine.length() > 0) {
+ return (theLine.charAt(0) == COMMENT_CHAR);
+ }
+
+ return false;
+ }
+
+ /**
+ * Removes package names from the package list file. The packages that are
+ * removed are the ones currently being recorded. The packages being recorded
+ * is denoted by this.additionalPackageName. This includes any sub-packages of
+ * the additionalPackageName. This step is necessary in the cases where a
+ * sub-package has been removed from a parent package in between signature
+ * recordings.
+ */
+ private void removeExistingPackage() {
+ String delPackage = this.additionalPackageName;
+ String packageName;
+ List delPkgs = new ArrayList();
+ // iterate over package set and find package names to remove
+ for (Iterator i = packageNames.iterator(); i.hasNext();) {
+ packageName = (String) i.next();
+ if (packageName.startsWith(delPackage)) {
+ delPkgs.add(packageName);
+ }
+ }
+ // actually remove the package names from the set
+ for (int i = 0; i < delPkgs.size(); i++) {
+ packageName = (String) (delPkgs.get(i));
+ packageNames.remove(packageName);
+ System.out.println(
+ "PackageList.removeExistingPackage() \"" + packageName + "\"");
+ }
+ }
+
+ /**
+ * Write the package list out to the package list file. This is done by
+ * reading all the package names in the specified signature file and adding
+ * them to the internal tree set. Then the old package list file is removed
+ * and the new package list file is written out.
+ *
+ * @throws Exception
+ * if there is a problem removing the existing package file or
+ * writting the new package list file.
+ */
+ public void writePkgListFile() throws Exception {
+ readPkgsFromSigFile();
+ removePkgFile();
+ writePkgFile();
+ }
+
+ /**
+ * Extract the package name from the specified string. The specified string
+ * should have the form: "package jakarta.ejb;"
+ *
+ * @param packageLine
+ * The string containing the package name.
+ *
+ * @return String The extracted package name.
+ *
+ * @throws Exception
+ * if the specified string does not conform to the expected format.
+ */
+ private String parsePackageName(String packageLine) throws Exception {
+
+ // sig test framework doesn't have the concept of package entries
+ // as the ApiCheck signature format does.
+ // Instead, we need to parse an entry similar to this:
+ // CLSS public jakarta.some.package.SomeClass
+
+ return packageLine.substring(packageLine.lastIndexOf(' ') + 1,
+ packageLine.lastIndexOf('.'));
+ }
+
+ /**
+ * Reads the package names from the signature file. Each package name that is
+ * read is added to this classes internal tree set.
+ *
+ * @throws Exception
+ * if there is an error opening or reading the signature file.
+ */
+ private void readPkgsFromSigFile() throws Exception {
+ BufferedReader in = new BufferedReader(new FileReader(sigFile));
+ String line;
+ String trimLine;
+ try {
+ while ((line = in.readLine()) != null) {
+ trimLine = line.trim();
+ if (trimLine.startsWith("CLSS")) {
+ packageNames.add(parsePackageName(trimLine));
+ }
+ }
+ } finally {
+ try {
+ in.close();
+ } catch (Exception e) {
+ }
+ }
+ }
+
+ /**
+ * Removes the existing package list file. The package list file is actually
+ * moved to a backup file if it exists. The old backup is lost.
+ *
+ * @throws Exception
+ * if there is an error moving the current package list file to a
+ * backup file.
+ */
+ private void removePkgFile() throws Exception {
+ File backupPkgFile = new File(packageFile.getPath() + BACKUP_EXT);
+ if (backupPkgFile.exists() && backupPkgFile.isFile()) {
+ backupPkgFile.delete();
+ }
+ if (packageFile.isFile() && packageFile.exists()) {
+ File copyPackageFile = new File(packageFile.getPath());
+ copyPackageFile.renameTo(backupPkgFile);
+ }
+ }
+
+ /**
+ * Write a simple header to the package list file to explain what the file is.
+ *
+ * @param out
+ * The BufferedWriter to dump the header to.
+ *
+ * @throws Exception
+ * if there is any errors writing the header to the specified
+ * BufferedWriter.
+ */
+ private void writeHeader(BufferedWriter out) throws Exception {
+ out.write(COMMENT_CHAR);
+ out.write(COMMENT_CHAR);
+ out.newLine();
+ out.write(COMMENT_CHAR + " This file contains a list of all the packages");
+ out.newLine();
+ out.write(COMMENT_CHAR + " contained in the signature files for this");
+ out.newLine();
+ out.write(
+ COMMENT_CHAR + " deliverable. This file is used to exclude valid");
+ out.newLine();
+ out.write(COMMENT_CHAR + " sub-packages from being verified when their");
+ out.newLine();
+ out.write(COMMENT_CHAR + " parent package's signature is checked.");
+ out.newLine();
+ out.write(COMMENT_CHAR);
+ out.write(COMMENT_CHAR);
+ out.newLine();
+ out.newLine();
+ }
+
+ /**
+ * Write the list of package names out to a package list file.
+ *
+ * @throws Exception
+ * if there is an error creating and writting the package list file.
+ */
+ private void writePkgFile() throws Exception {
+ BufferedWriter out = null;
+ try {
+ out = new BufferedWriter(new FileWriter(packageFile));
+ writeHeader(out);
+ for (Iterator i = packageNames.iterator(); i.hasNext();) {
+ String packageName = (String) i.next();
+ out.write(packageName);
+ out.newLine();
+ System.out
+ .println("PackageList.writePkgFile() \"" + packageName + "\"");
+ }
+ } finally {
+ if (out != null) {
+ out.close();
+ }
+ }
+ }
+
+ /**
+ * Returns the list of sub-packages that exist in the specified package name.
+ *
+ * @param pkgName
+ * The name of the package we want the sub-package list for.
+ *
+ * @return String[] The sub-packages that live under the specified parent
+ * package.
+ */
+ public String[] getSubPackages(String pkgName) {
+ List result = new ArrayList();
+ String subPackageName = pkgName + ".";
+ for (Iterator i = packageNames.iterator(); i.hasNext();) {
+ String packageName = (String) i.next();
+ if (packageName.startsWith(subPackageName)) {
+ result.add(packageName);
+ }
+ }
+ return (String[]) (result.toArray(new String[result.size()]));
+ }
+
+ /**
+ * Returns the list of sub-packages that exist in the specified package name.
+ * The returned string matches the API check format of specifying multiple
+ * packages with a single string. Each package name is separated with the "+"
+ * character.
+ *
+ * @param pkgName
+ * The name of the package we want the sub-package list for.
+ *
+ * @return String The sub-packages that live under the specified parent
+ * package.
+ */
+ public String getSubPackagesFormatted(String pkgName) {
+ StringBuffer formattedResult = new StringBuffer();
+ String[] result = getSubPackages(pkgName);
+ for (int i = 0; i < result.length; i++) {
+ formattedResult.append(result[i]);
+ if (i < (result.length - 1)) {
+ formattedResult.append("+");
+ }
+ }
+ return formattedResult.toString();
+ }
+
+ /*
+ * Test Driver
+ */
+ public static void main(String[] args) throws Exception {
+ System.out.println("\n\n*** Creating package list file ***\n\n");
+ PackageList list = new PackageList("jakarta.ejb",
+ "/home/ryano/cts-tools-master/tools/api-check/test/jakarta.ejb.sig_2.1",
+ "/home/ryano/cts-tools-master/tools/api-check/test/pkg-list.txt");
+ list.writePkgListFile();
+
+ System.out
+ .println("\n\n*** Reading sub-packages from package list file ***\n\n");
+ PackageList readList = new PackageList(
+ "/home/ryano/cts-tools-master/tools/api-check/test/pkg-list.txt");
+ System.out.println(Arrays.asList(readList.getSubPackages("jakarta.ejb")));
+ System.out.println(readList.getSubPackagesFormatted("jakarta.ejb"));
+ }
+
+} // end class PackageList
diff --git a/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/README b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/README
new file mode 100644
index 0000000..0738143
--- /dev/null
+++ b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/README
@@ -0,0 +1,43 @@
+The latest signature files are updated in the jaxrsp-api repoitory
+(jaxrs-api/jaxrs-tck/src/main/resources/jakarta/ws/rs/tck/signaturetest)
+generated using sigtest-maven-plugin.jar(version 1.4).
+
+The signature tests are run using the sigtest-maven-plugin.jar and the framework avaliable in this folder.
+
+
+
+For TCK developers :-
+
+ 1. Generate Signature Files : The signature file will be generated by the TCK team using jaxrs-tck/pom.xml
+ by running 'mvn install -Precord-signature'. The classpath should contain the api jar for which we are generating the signature file.
+
+ The signature file name expected is jakarta.ws.rs.sig_${version} , where version is the api version for which the signature is generated.
+
+ 2. Place the required files in the TCK folder :
+
+ All the below files has to be placed in the folder jaxrs-tck/src/main/resources/jakarta/ws/rs/tck/signaturetest, so they are included as part of the TCK jar during the build.
+
+ -The signature file generated from above of the name jakarta.ws.rs.sig_${version}
+ -The mapping file will be named sig-test.map, it contains the api to version mapping. This file will be used to pick the right signature file when running the signature test.
+ -The package list file will be named sig-test-pkg-list.txt, contains the list of packages tested.
+
+
+
+For TCK users (to run the signature test as a Junit test) :-
+
+
+ 1. Set the below system properties correctly :
+
+ jimage.dir //The jdk9+(jdk11 for this release) will be extracted to this location as to use the Java modules in the path.
+ optional.tech.packages.to.ignore // The optional package that should be ignored while running the signature test
+ signature.sigTestClasspath // the sigTestClasspath that will contain the implementation jar that needs to be tested along with dependent jars.
+
+ For eg:
+
+ <jimage.dir>${project.build.directory}/jdk11-bundle</jimage.dir>
+ <optional.tech.packages.to.ignore>jakarta.xml.bind</optional.tech.packages.to.ignore>
+ <signature.sigTestClasspath>${project.build.directory}/glassfish6/glassfish/modules/jakarta.ws.rs-api.jar:${project.build.directory}/glassfish6/glassfish/modules/jakarta.xml.bind-api.jar:${project.build.directory}/jdk11-bundle/java.base:${project.build.directory}/jdk11-bundle/java.rmi:${project.build.directory}/jdk11-bundle/java.sql:${project.build.directory}/jdk11-bundle/java.naming</signature.sigTestClasspath>
+
+ 2. The signature test alone can be run using below command within jersey-tck/ directory.
+
+ mvn clean verify -Parq-glassfish-managed -Dit.test=jakarta.ws.rs.tck.signaturetest.**
diff --git a/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/Recorder.java b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/Recorder.java
new file mode 100644
index 0000000..7838aad
--- /dev/null
+++ b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/Recorder.java
@@ -0,0 +1,284 @@
+/*
+ * Copyright (c) 2007, 2018 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+/*
+ * $Id$
+ */
+
+package jakarta.ws.rs.tck.signaturetest;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.Properties;
+
+import jakarta.ws.rs.tck.lib.util.TestUtil;
+
+public abstract class Recorder {
+
+ protected Properties signatureMap;
+
+ protected String packageListFile;
+
+ protected String classpath;
+
+ protected String signatureRepositoryDir;
+
+ protected String signatureMapFile;
+
+ // ------------------------------------------------------------ Constructors
+
+ public Recorder(String[] args) {
+
+ TestUtil.logTrace("\nCalling: Recorder with following args:");
+ for (int ii = 0; ii < args.length; ii++) {
+ TestUtil.logTrace(" args[" + ii + "] = " + args[ii]);
+ }
+
+ Arguments arguments = new Arguments(args);
+ packageListFile = arguments.getPackageList();
+ classpath = arguments.getClasspath();
+ signatureRepositoryDir = arguments.getRepository();
+ signatureMapFile = arguments.getSignatureMap();
+ loadSignatureMap(signatureMapFile);
+ }
+
+ // ---------------------------------------------------------- Public Methods
+
+ /**
+ * <p>
+ * Record the signatures for each package listed in the
+ * <code>TS_HOME/bin/sig-test.map</code> file.
+ * </p>
+ */
+ public void batchRecord() {
+
+ for (Iterator i = signatureMap.keySet().iterator(); i.hasNext();) {
+ String basePackageName = (String) i.next();
+ String version = (String) signatureMap.get(basePackageName);
+ String outputFileName = getOutputFileName(basePackageName, version);
+ String[] commandLine = createCommandLine(version, classpath,
+ outputFileName, basePackageName);
+
+ try {
+
+ // dump command line args passed to Setup()...
+ TestUtil.logTrace("\n\nDUMPING SIGTEST COMMAND LINE: \n");
+ for (int ii = 0; ii < commandLine.length; ii++) {
+ TestUtil.logTrace("commandLine[" + ii + "] = " + commandLine[ii]);
+ }
+ TestUtil.logTrace("\nDONE DUMPING SIGTEST COMMAND LINE. \n\n");
+
+ doRecord(commandLine);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+ try {
+ writePackageListFile(basePackageName, outputFileName, packageListFile);
+ } catch (Exception e) {
+ System.out.println("Unexpected exception: " + e);
+ e.printStackTrace();
+ System.exit(1);
+ }
+ }
+
+ } // END batchRecord
+
+ // ------------------------------------------------------- Protected Methods
+
+ /**
+ * Write, to a separate file, all of the packages that were recorded. How this
+ * is accomplised will be dependent on the framework.
+ *
+ * @param basePackageName
+ * the base package
+ * @param signatureFile
+ * the file in which the signatures were recorded to
+ * @param packageListFile
+ * the name of the package list file (which may or may not exist)
+ * @throws Exception
+ * if an error occurs writing the file
+ */
+ protected abstract void writePackageListFile(String basePackageName,
+ String signatureFile, String packageListFile) throws Exception;
+
+ /**
+ * Create a array of arguments appropriate for use with different signature
+ * recording frameworks.
+ *
+ * @param version
+ * The version of the API
+ * @param classpath
+ * the classpath containing classes that will be recorded
+ * @param outputFileName
+ * the file in which to write the recorded signatures to
+ * @param packageName
+ * the base package name of the signatures that will be recorded
+ */
+ protected abstract String[] createCommandLine(String version,
+ String classpath, String outputFileName, String packageName);
+
+ /**
+ * Perform whatever action in necessary to do the actual recording of the
+ * signatures.
+ *
+ * @param commandLine
+ * the options to invoke the recording facility
+ * @throws Exception
+ * if an error occurs during the record process
+ */
+ protected abstract void doRecord(String[] commandLine) throws Exception;
+
+ // --------------------------------------------------------- Private Methods
+
+ private void loadSignatureMap(String signatureTestMapFile) {
+
+ signatureMap = new Properties();
+ try {
+ signatureMap.load(
+ new BufferedInputStream(new FileInputStream(signatureTestMapFile)));
+ } catch (FileNotFoundException fnfe) {
+ throw new RuntimeException(
+ "Unable to find or read file '" + signatureTestMapFile + '\'');
+ } catch (IOException ioe) {
+ throw new RuntimeException(
+ "Error processing file '" + signatureTestMapFile + '\'', ioe);
+ }
+
+ } // END loadSignatureMap
+
+ private String getOutputFileName(String name, String version) {
+
+ StringBuffer fileName = new StringBuffer();
+ fileName.append(signatureRepositoryDir).append(File.separatorChar);
+ fileName.append(name).append(".sig_").append(version);
+ return fileName.toString();
+
+ } // END getOutputFileName
+
+ // --------------------------------------------------- Static Nested Classes
+
+ private static class Arguments {
+
+ private static final String CLASSPATH_ARG = "-classpath";
+
+ private static final String PKG_LIST_ARG = "-packagelist";
+
+ private static final String SIG_MAP_ARG = "-sigmap";
+
+ private static final String REPOSITORY_ARG = "-repository";
+
+ private String classpath;
+
+ private String packageList;
+
+ private String signatureMap;
+
+ private String repository;
+
+ // -------------------------------------------------------- Constructors
+
+ Arguments(String[] args) {
+
+ // all 4 arguments must be defined, thus there should be 8 elements
+ if (args.length != 8) {
+ System.out
+ .println("Error - incorrect number of args should be 8 but was: "
+ + args.length);
+ System.out.println("Args passed in were: ");
+ for (int ii = 0; ii < args.length; ii++) {
+ System.out.println("args[" + ii + "] = " + args[ii]);
+ }
+
+ throw new IllegalArgumentException();
+ }
+
+ String[] clonedArgs = (String[]) args.clone();
+ Arrays.sort(clonedArgs);
+ // ensure the proper arguments are specified
+ if (Arrays.binarySearch(clonedArgs, CLASSPATH_ARG) < 0
+ || Arrays.binarySearch(clonedArgs, PKG_LIST_ARG) < 0
+ || Arrays.binarySearch(clonedArgs, SIG_MAP_ARG) < 0
+ || Arrays.binarySearch(clonedArgs, REPOSITORY_ARG) < 0) {
+ usage();
+ System.exit(1);
+ }
+
+ for (int i = 0; i < args.length; i += 2) {
+ if (CLASSPATH_ARG.equals(args[i])) {
+ classpath = args[i + 1];
+ } else if (PKG_LIST_ARG.equals(args[i])) {
+ packageList = args[i + 1];
+ } else if (SIG_MAP_ARG.equals(args[i])) {
+ signatureMap = args[i + 1];
+ } else if (REPOSITORY_ARG.equals(args[i])) {
+ repository = args[i + 1];
+ } else {
+ // shouldn't get here
+ usage();
+ System.exit(1);
+ }
+ }
+
+ } // END Arguments
+
+ // ---------------------------------------------------------- Properties
+
+ public String getClasspath() {
+
+ return classpath;
+
+ } // END getClasspath
+
+ public String getPackageList() {
+
+ return packageList;
+
+ } // END getPackageList
+
+ public String getSignatureMap() {
+
+ return signatureMap;
+
+ } // END getSignatureMap
+
+ public String getRepository() {
+
+ return repository;
+
+ } // END getRepository
+
+ private static void usage() {
+
+ String usage = "Usage:"
+ + "\t-classpath (classpath to JARs and/or classes under test)\n"
+ + "\t-packageList (Reference to the sig-test-pkg-list.txt file)\n"
+ + "\t-sigmap (Reference to the sig-test.map file)\n"
+ + "\t-repository (Directory in which to write the recorded"
+ + "\tsignatures to)\n\n";
+
+ System.err.println(usage);
+
+ } // END usage
+
+ } // END Arguments
+
+}
diff --git a/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/RecorderFactory.java b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/RecorderFactory.java
new file mode 100644
index 0000000..4336f3a
--- /dev/null
+++ b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/RecorderFactory.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2007, 2018 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+/*
+ * $Id$
+ */
+
+package jakarta.ws.rs.tck.signaturetest;
+
+/**
+ * <p>
+ * This class is a bit overloaded in that it serves as both a factory and entry
+ * point from Ant to handle signature recording.
+ * </p>
+ *
+ * <p>
+ * The desired <code>type</code> is provided using a system property with a key
+ * of <code>recorder.type</code>. Valid values for the
+ * <code>recorder.type</code> property are:
+ * <ul>
+ * <li>apicheck</li>
+ * <li>sigtest</li>
+ * </ul>
+ * </p>
+ *
+ * <p>
+ * If the <code>recorder.type</code> property is not set, this factory will
+ * return a <code>SignatureTestRecorder</code> using the SigTest framework.
+ * </p>
+ */
+public class RecorderFactory {
+
+ public static final String API_CHECK_RECORDER = "apicheck";
+
+ public static final String SIG_TEST_RECORDER = "sigtest";
+
+ // ---------------------------------------------------------- Public Methods
+
+ /**
+ * Returns a {@link Recorder} instance to handle recording signatures based on
+ * the value specified via the <code>type</code> argument.
+ *
+ * @param type
+ * the type of {@link Recorder} to use
+ * @param args
+ * the args to pass to the {@link Recorder}
+ * @return a {@link Recorder} instanced based on the <code>type</code>
+ * provided
+ */
+ public static Recorder getRecorder(String type, String[] args) {
+
+ if (type == null) {
+ throw new IllegalArgumentException("'type' cannot be null");
+ }
+
+ if (type.equals(API_CHECK_RECORDER)) {
+ return new ApiCheckRecorder(args);
+ } else if (type.equals(SIG_TEST_RECORDER)) {
+ return new SigTestRecorder(args);
+ } else {
+ throw new IllegalArgumentException("Unknown type: " + type);
+ }
+
+ } // END getRecorder
+
+ public static void main(String[] args) {
+
+ String type = System.getProperty("recorder.type", SIG_TEST_RECORDER);
+ Recorder recorder = getRecorder(type, args);
+ recorder.batchRecord();
+
+ } // END main
+
+}
diff --git a/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SigTest.java b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SigTest.java
new file mode 100644
index 0000000..f5dc71f
--- /dev/null
+++ b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SigTest.java
@@ -0,0 +1,393 @@
+/*
+ * Copyright (c) 2007, 2021 Oracle and/or its affiliates and others.
+ * All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+/*
+ * $Id$
+ */
+
+package jakarta.ws.rs.tck.signaturetest;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.io.PrintStream;
+
+import java.util.ArrayList;
+import java.util.Properties;
+
+import jakarta.ws.rs.tck.lib.util.TestUtil;
+
+/**
+ * This class should be extended by TCK developers that wish to create a set of
+ * signature tests that run outside of any Java EE container. Developers must
+ * implement the getPackages method to specify which packages are to be tested
+ * by the signature test framework.
+ */
+public abstract class SigTest {
+
+ protected SignatureTestDriver driver;
+
+ /**
+ * <p>
+ * Returns a {@link SignatureTestDriver} appropriate for the particular TCK
+ * (using API check or the Signature Test Framework).
+ * </p>
+ *
+ * <p>
+ * The default implementation of this method will return a
+ * {@link SignatureTestDriver} that will use API Check. TCK developers can
+ * override this to return the desired {@link SignatureTestDriver} for their
+ * TCK.
+ */
+ protected SignatureTestDriver getSigTestDriver() {
+
+ if (driver == null) {
+ driver = SignatureTestDriverFactory.getInstance(SignatureTestDriverFactory.SIG_TEST);
+ }
+
+ return driver;
+
+ } // END getSigTestDriver
+
+ /**
+ * Returns the location of the package list file. This file denotes the valid
+ * sub-packages of any package being verified in the signature tests.
+ *
+ * Sub-classes are free to override this method if they use a different path
+ * or filename for their package list file. Most users should be able to use
+ * this default implementation.
+ *
+ * @return String The path and name of the package list file.
+ */
+ protected String getPackageFile() {
+ return getSigTestDriver().getPackageFileImpl(testInfo.getBinDir());
+ }
+
+ /**
+ * Returns the path and name of the signature map file that this TCK uses when
+ * conducting signature tests. The signature map file tells the signature test
+ * framework which API versions of tested packages to use. To keep this code
+ * platform independent, be sure to use the File.separator string (or the
+ * File.separatorChar) to denote path separators.
+ *
+ * Sub-classes are free to override this method if they use a different path
+ * or filename for their signature map file. Most users should be able to use
+ * this default implementation.
+ *
+ * @return String The path and name of the signature map file.
+ */
+ protected String getMapFile() {
+ return getSigTestDriver().getMapFileImpl(testInfo.getBinDir());
+ }
+
+ /**
+ * Returns the directory that contains the signature files.
+ *
+ * Sub-classes are free to override this method if they use a different
+ * signature repository directory. Most users should be able to use this
+ * default implementation.
+ *
+ * @return String The signature repository directory.
+ */
+ protected String getRepositoryDir() {
+ return getSigTestDriver().getRepositoryDirImpl(testInfo.getTSHome());
+ }
+
+ /**
+ * Returns the list of Optional Packages which are not accounted for. By
+ * 'unlisted optional' we mean the packages which are Optional to the
+ * technology under test that the user did NOT specifically list for testing.
+ * For example, with Java EE 7 implementation, a user could additionally opt
+ * to test a JSR-88 technology along with the Java EE technology. But if the
+ * user chooses NOT to list this optional technology for testing (via ts.jte
+ * javaee.level prop) then this method will return the packages for JSR-88
+ * technology with this method call.
+ * <p/>
+ * This is useful for checking for a scenarios when a user may have forgotten
+ * to identify a whole or partial technology implementation and in such cases,
+ * Java EE platform still requires testing it.
+ * <p/>
+ * Any partial or complete impl of an unlistedOptionalPackage sends up a red
+ * flag indicating that the user must also pass tests for this optional
+ * technology area.
+ * <p/>
+ * Sub-classes are free to override this method if they use a different
+ * signature repository directory. Most users should be able to use this
+ * default implementation - which means that there was NO optional technology
+ * packages that need to be tested.
+ *
+ * @return ArrayList<String>
+ */
+ protected ArrayList<String> getUnlistedOptionalPackages() {
+ return null;
+ }
+
+ /**
+ * Returns the list of packages that must be tested by the siganture test
+ * framework. TCK developers must implement this method in their signature
+ * test sub-class.
+ *
+ * @return String A list of packages that the developer wishes to test using
+ * the signature test framework.
+ */
+ protected abstract String[] getPackages();
+
+ /**
+ * Returns an array of individual classes that must be tested by the signature
+ * test framwork. TCK developers may override this method when this
+ * functionality is needed. Most will only need package level granularity.
+ *
+ * @return an Array of Strings containing the individual classes the framework
+ * should test. The default implementation of this method returns a
+ * zero-length array.
+ */
+ protected String[] getClasses() {
+
+ return new String[] {};
+
+ } // END getClasses
+
+ protected SigTestData testInfo; // holds the bin.dir property
+
+ /**
+ * Called by the test framework to initialize this test. The method simply
+ * retrieves some state information that is necessary to run the test when
+ * when the test framework invokes the run method (actually the test1 method).
+ *
+ * @param args
+ * List of arguments passed to this test.
+ * @param p
+ * Properties specified by the test user and passed to this test via
+ * the test framework.
+ * @throws Fault
+ * When an error occurs reading or saving the state information
+ * processed by this method.
+ */
+ public void setup() {
+ try {
+ TestUtil.logTrace("$$$ SigTest.setup() called");
+ this.testInfo = new SigTestData();
+ TestUtil.logTrace("$$$ SigTest.setup() complete");
+ } catch (Exception e) {
+ TestUtil.logErr("Unexpected exception " + e.getMessage());
+ //throw new Fault("setup failed!", e);
+ }
+ }
+
+
+ /**
+ * Called by the test framework to cleanup any outstanding state. This method
+ * simply passes the message through to the utility class so the
+ * implementation can be used by both framework base classes.
+ *
+ * @throws Fault
+ * When an error occurs cleaning up the state of this test.
+ */
+ public void cleanup() throws Fault {
+ TestUtil.logTrace("$$$ SigTest.cleanup() called");
+ try {
+ getSigTestDriver().cleanupImpl();
+ TestUtil.logTrace("$$$ SigTest.cleanup() returning");
+ } catch (Exception e) {
+ throw new Fault("Cleanup failed!", e);
+ }
+ }
+
+ public static class Fault extends Exception {
+ private static final long serialVersionUID = -1574745208867827913L;
+
+ public Throwable t;
+
+ /**
+ * creates a Fault with a message
+ */
+ public Fault(String msg) {
+ super(msg);
+ TestUtil.logErr(msg);
+ }
+
+ /**
+ * creates a Fault with a message.
+ *
+ * @param msg
+ * the message
+ * @param t
+ * prints this exception's stacktrace
+ */
+ public Fault(String msg, Throwable t) {
+ super(msg);
+ this.t = t;
+ // TestUtil.logErr(msg, t);
+ }
+
+ /**
+ * creates a Fault with a Throwable.
+ *
+ * @param t
+ * the Throwable
+ */
+ public Fault(Throwable t) {
+ super(t);
+ this.t = t;
+ }
+
+ /**
+ * Prints this Throwable and its backtrace to the standard error stream.
+ *
+ */
+ public void printStackTrace() {
+ if (this.t != null) {
+ this.t.printStackTrace();
+ } else {
+ super.printStackTrace();
+ }
+ }
+
+ /**
+ * Prints this throwable and its backtrace to the specified print stream.
+ *
+ * @param s
+ * <code>PrintStream</code> to use for output
+ */
+ public void printStackTrace(PrintStream s) {
+ if (this.t != null) {
+ this.t.printStackTrace(s);
+ } else {
+ super.printStackTrace(s);
+ }
+ }
+
+ /**
+ * Prints this throwable and its backtrace to the specified print writer.
+ *
+ * @param s
+ * <code>PrintWriter</code> to use for output
+ */
+ public void printStackTrace(PrintWriter s) {
+ if (this.t != null) {
+ this.t.printStackTrace(s);
+ } else {
+ super.printStackTrace(s);
+ }
+ }
+
+ @Override
+ public Throwable getCause() {
+ return t;
+ }
+
+ @Override
+ public synchronized Throwable initCause(Throwable cause) {
+ if (t != null)
+ throw new IllegalStateException("Can't overwrite cause");
+ if (!Exception.class.isInstance(cause))
+ throw new IllegalArgumentException("Cause not permitted");
+ this.t = (Exception) cause;
+ return this;
+ }
+ }
+
+ /**
+ * This exception is used only by EETest. Overrides 3 printStackTrace methods
+ * to preserver the original stack trace. Using setStackTraceElement() would
+ * be more elegant but it is not available prior to j2se 1.4.
+ *
+ * @author Kyle Grucci
+ */
+ public static class SetupException extends Exception {
+ private static final long serialVersionUID = -7616313680616499158L;
+
+ public Exception e;
+
+ /**
+ * creates a Fault with a message
+ */
+ public SetupException(String msg) {
+ super(msg);
+ }
+
+ /**
+ * creates a SetupException with a message
+ *
+ * @param msg
+ * the message
+ * @param e
+ * prints this exception's stacktrace
+ */
+ public SetupException(String msg, Exception e) {
+ super(msg);
+ this.e = e;
+ }
+
+ /**
+ * Prints this Throwable and its backtrace to the standard error stream.
+ *
+ */
+ public void printStackTrace() {
+ if (this.e != null) {
+ this.e.printStackTrace();
+ } else {
+ super.printStackTrace();
+ }
+ }
+
+ /**
+ * Prints this throwable and its backtrace to the specified print stream.
+ *
+ * @param s
+ * <code>PrintStream</code> to use for output
+ */
+ public void printStackTrace(PrintStream s) {
+ if (this.e != null) {
+ this.e.printStackTrace(s);
+ } else {
+ super.printStackTrace(s);
+ }
+ }
+
+ /**
+ * Prints this throwable and its backtrace to the specified print writer.
+ *
+ * @param s
+ * <code>PrintWriter</code> to use for output
+ */
+ public void printStackTrace(PrintWriter s) {
+ if (this.e != null) {
+ this.e.printStackTrace(s);
+ } else {
+ super.printStackTrace(s);
+ }
+ }
+
+ @Override
+ public Throwable getCause() {
+ return e;
+ }
+
+ @Override
+ public synchronized Throwable initCause(Throwable cause) {
+ if (e != null)
+ throw new IllegalStateException("Can't overwrite cause");
+ if (!Exception.class.isInstance(cause))
+ throw new IllegalArgumentException("Cause not permitted");
+ this.e = (Exception) cause;
+ return this;
+ }
+ }
+
+} // end class SigTest
diff --git a/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SigTestData.java b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SigTestData.java
new file mode 100644
index 0000000..fb3171d
--- /dev/null
+++ b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SigTestData.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2007, 2021 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+/*
+ * $Id$
+ */
+
+package jakarta.ws.rs.tck.signaturetest;
+
+import java.util.Properties;
+
+/**
+ * This class holds the data passed to a signature test invocation during the
+ * setup phase. This allows us to keep the passed data separate and reuse the
+ * data between the signature test framework base classes.
+ */
+public class SigTestData {
+
+ private Properties props;
+
+ public SigTestData() {
+ this.props = System.getProperties();;
+ }
+
+ public String getVehicle() {
+ return props.getProperty("vehicle", "");
+ }
+
+ public String getBinDir() {
+ return props.getProperty("bin.dir", "");
+ }
+
+ public String getTSHome() {
+ return props.getProperty("ts_home", "");
+ }
+
+ public String getTestClasspath() {
+ return props.getProperty("sigTestClasspath", "");
+ }
+
+ public String getJavaeeLevel() {
+ return props.getProperty("javaee.level", "");
+ }
+
+ public String getCurrentKeywords() {
+ return props.getProperty("current.keywords", "");
+ }
+
+ public String getProperty(String prop) {
+ return props.getProperty(prop);
+ }
+
+ public String getOptionalTechPackagesToIgnore() {
+ return props.getProperty("optional.tech.packages.to.ignore", "jakarta.xml.bind");
+ }
+
+ public String getJtaJarClasspath() {
+ return props.getProperty("jtaJarClasspath", "");
+ }
+
+ public String getJImageDir() {
+ return props.getProperty("jimage.dir", "");
+ }
+} // end class SigTestData
diff --git a/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SigTestDriver.java b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SigTestDriver.java
new file mode 100644
index 0000000..48e0543
--- /dev/null
+++ b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SigTestDriver.java
@@ -0,0 +1,286 @@
+/*
+ * Copyright (c) 2007, 2021 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package jakarta.ws.rs.tck.signaturetest;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.PrintWriter;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+import jakarta.ws.rs.tck.lib.util.TestUtil;
+
+/**
+ * <p>
+ * Wrapper for the <code>Sig Test</code> framework.
+ * </p>
+ */
+public class SigTestDriver extends SignatureTestDriver {
+
+ private static final String CLASSPATH_FLAG = "-Classpath";
+
+ private static final String FILENAME_FLAG = "-FileName";
+
+ private static final String PACKAGE_FLAG = "-Package";
+
+ private static final String PACKAGE_NO_SUBS_FLAG = "-PackageWithoutSubpackages";
+
+ private static final String API_VERSION_FLAG = "-ApiVersion";
+
+ private static final String EXCLUDE_FLAG = "-Exclude";
+
+ private static final String STATIC_FLAG = "-Static";
+
+ private static final String CHECKVALUE_FLAG = "-CheckValue"; // only valid w/
+ // -static
+
+ private static final String NO_CHECKVALUE_FLAG = "-NoCheckValue";
+
+ private static final String SMODE_FLAG = "-mode"; // requires arg of bin or
+ // src
+
+ private static final String DEBUG_FLAG = "-Debug";
+
+ private static final String FORMATPLAIN_FLAG = "-FormatPlain";
+
+ private static final String EXCLUDE_JDK_CLASS_FLAG = "-IgnoreJDKClass";
+
+ private static String[] excludeJdkClasses = {
+ "java.util.Map",
+ "java.lang.Object",
+ "java.io.ByteArrayInputStream",
+ "java.io.InputStream",
+ "java.lang.Deprecated",
+ "java.io.Writer",
+ "java.io.OutputStream",
+ "java.util.List",
+ "java.util.Collection",
+ "java.lang.instrument.IllegalClassFormatException",
+ "javax.transaction.xa.XAException",
+ "java.lang.annotation.Repeatable",
+ "java.lang.InterruptedException",
+ "java.lang.CloneNotSupportedException",
+ "java.lang.Throwable",
+ "java.lang.Thread",
+ "java.lang.Enum"
+ };
+
+ // ---------------------------------------- Methods from SignatureTestDriver
+
+ @Override
+ protected String normalizeFileName(File f) {
+ String sURL = null;
+ try {
+ sURL = f.toURI().toURL().toExternalForm();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ return sURL;
+ }
+
+ @Override
+ protected String[] createTestArguments(String packageListFile, String mapFile,
+ String signatureRepositoryDir, String packageOrClassUnderTest,
+ String classpath, boolean bStaticMode) throws Exception {
+
+ SignatureFileInfo info = getSigFileInfo(packageOrClassUnderTest, mapFile,
+ signatureRepositoryDir);
+
+ PackageList packageList = new PackageList(packageListFile);
+ String[] subPackages = packageList.getSubPackages(packageOrClassUnderTest);
+
+ List command = new ArrayList();
+
+ if (bStaticMode) {
+ // static mode allows finer level of constants checking
+ // -CheckValue says to check the actual const values
+ TestUtil.logTrace("Setting static mode flag to allow constant checking.");
+ command.add(STATIC_FLAG);
+ command.add(CHECKVALUE_FLAG);
+
+ // specifying "-mode src" allows stricter 2 way verification of constant
+ // vals
+ // (note that using "-mode bin" mode is less strict)
+ command.add(SMODE_FLAG);
+ // command.add("bin");
+ command.add("src");
+ } else {
+ TestUtil
+ .logTrace("Not Setting static mode flag to allow constant checking.");
+ }
+
+ if (TestUtil.harnessDebug) {
+ command.add(DEBUG_FLAG);
+ }
+ command.add("-Verbose");
+
+ command.add(FILENAME_FLAG);
+ command.add(info.getFile());
+
+ command.add(CLASSPATH_FLAG);
+ command.add(classpath);
+
+ command.add(PACKAGE_FLAG);
+ command.add(packageOrClassUnderTest);
+
+ for (int i = 0; i < subPackages.length; i++) {
+ command.add(EXCLUDE_FLAG);
+ command.add(subPackages[i]);
+ }
+
+ for(String jdkClassName:excludeJdkClasses) {
+ command.add(EXCLUDE_JDK_CLASS_FLAG);
+ command.add(jdkClassName);
+ }
+
+
+ command.add(API_VERSION_FLAG);
+ command.add(info.getVersion());
+
+ return ((String[]) command.toArray(new String[command.size()]));
+
+ } // END createTestArguments
+
+ @Override
+ protected boolean runSignatureTest(String packageOrClassName,
+ String[] testArguments) throws Exception {
+
+ Class sigTestClass = Class
+ .forName("com.sun.tdk.signaturetest.SignatureTest");
+ Object sigTestInstance = sigTestClass.newInstance();
+
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+
+ // do some logging to help with troubleshooting
+ TestUtil.logTrace(
+ "\nCalling: com.sun.tdk.signaturetest.SignatureTest() with following args:");
+ for (int ii = 0; ii < testArguments.length; ii++) {
+ TestUtil.logTrace(" testArguments[" + ii + "] = " + testArguments[ii]);
+ }
+
+ @SuppressWarnings("unchecked")
+ Method runMethod = sigTestClass.getDeclaredMethod("run",
+ new Class[] { String[].class, PrintWriter.class, PrintWriter.class });
+ runMethod.invoke(sigTestInstance,
+ new Object[] { testArguments, new PrintWriter(output, true), null });
+
+ String rawMessages = output.toString();
+
+ // currently, there is no way to determine if there are error msgs in
+ // the rawmessages, so we will always dump this and call it a status.
+ TestUtil.logMsg(
+ "********** Status Report '" + packageOrClassName + "' **********\n");
+ TestUtil.logMsg(rawMessages);
+
+ return sigTestInstance.toString().substring(7).startsWith("Passed.");
+ } // END runSignatureTest
+
+ /*
+ *
+ * @return This returns true if the packageOrClassName is found in the impl.
+ */
+ @Override
+ protected boolean runPackageSearch(String packageOrClassName,
+ String[] testArguments) throws Exception {
+
+ Class sigTestClass = Class
+ .forName("com.sun.tdk.signaturetest.SignatureTest");
+ Object sigTestInstance = sigTestClass.newInstance();
+
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+
+ // we want to replace the PACKAGE_FLAG with PACKAGE_NO_SUBS_FLAG
+ for (int ii = 0; ii < testArguments.length; ii++) {
+ if (testArguments[ii].equals(PACKAGE_FLAG)) {
+ testArguments[ii] = PACKAGE_NO_SUBS_FLAG;
+ }
+ }
+
+ // dump args for debugging aid
+ TestUtil.logTrace(
+ "\nCalling: com.sun.tdk.signaturetest.SignatureTest() with following args:");
+ for (int ii = 0; ii < testArguments.length; ii++) {
+ TestUtil.logTrace(" testArguments[" + ii + "] = " + testArguments[ii]);
+ }
+
+ @SuppressWarnings("unchecked")
+ Method runMethod = sigTestClass.getDeclaredMethod("run",
+ new Class[] { String[].class, PrintWriter.class, PrintWriter.class });
+ runMethod.invoke(sigTestInstance,
+ new Object[] { testArguments, new PrintWriter(output, true), null });
+
+ String rawMessages = output.toString();
+
+ // currently, there is no way to determine if there are error msgs in
+ // the rawmessages, so we will always dump this and call it a status.
+ TestUtil.logMsg(
+ "********** Status Report '" + packageOrClassName + "' **********\n");
+ TestUtil.logMsg(rawMessages);
+
+ return sigTestInstance.toString().substring(7).startsWith("Passed.");
+ }
+
+ /*
+ * @return This returns true if javax.transaction.xa is not found in the
+ * JTA API jar
+ */
+ protected boolean verifyJTAJarForNoXA(String classpath, String repositoryDir) throws Exception {
+
+ TestUtil.logMsg("SigTestDriver#verifyJTAJarForNoXA - Starting:");
+ boolean result = false;
+ List command = new ArrayList();
+
+ // Build Commandline for com.sun.tdk.signaturetest.SignatureTest
+ command.add(STATIC_FLAG);
+ command.add(FILENAME_FLAG);
+ command.add(repositoryDir + "empty.sig");
+ command.add(PACKAGE_FLAG);
+ command.add("javax.transaction.xa");
+ command.add(CLASSPATH_FLAG);
+ command.add(classpath);
+
+ String testArguments [] = (String[]) command.toArray(new String[command.size()]);
+
+ // do some logging to help with troubleshooting
+ TestUtil.logTrace("\nCalling: com.sun.tdk.signaturetest.SignatureTest() with following args:");
+ for (int ii=0; ii < testArguments.length; ii++) {
+ TestUtil.logTrace(" testArguments[" +ii+ "] = " + testArguments[ii]);
+ }
+
+ Class sigTestClass = Class.forName("com.sun.tdk.signaturetest.SignatureTest");
+ Object sigTestInstance = sigTestClass.newInstance();
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+
+ @SuppressWarnings("unchecked")
+ Method runMethod = sigTestClass.getDeclaredMethod("run",
+ new Class[] { String[].class,
+ PrintWriter.class,
+ PrintWriter.class });
+ runMethod.invoke(sigTestInstance,
+ new Object[] { testArguments,
+ new PrintWriter(output, true),
+ null });
+ String rawMessages = output.toString();
+
+ // currently, there is no way to determine if there are error msgs in
+ // the rawmessages, so we will always dump this and call it a status.
+ TestUtil.logMsg("********** Status Report JTA JAR validation **********\n");
+ TestUtil.logMsg(rawMessages);
+ return sigTestInstance.toString().substring(7).startsWith("Passed.");
+ }
+}
diff --git a/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SigTestEE.java b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SigTestEE.java
new file mode 100644
index 0000000..75435f1
--- /dev/null
+++ b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SigTestEE.java
@@ -0,0 +1,486 @@
+/*
+ * Copyright (c) 2007, 2021 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package jakarta.ws.rs.tck.signaturetest;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.PrintStream;
+
+import java.util.ArrayList;
+import java.util.Properties;
+
+import jakarta.ws.rs.tck.lib.util.TestUtil;
+
+/**
+ * This class should be extended by TCK developers that wish to create a set of
+ * signature tests that run inside all the Java EE containers. Developers must
+ * implement the getPackages method to specify which packages are to be tested
+ * by the signature test framework within which container.
+ */
+public abstract class SigTestEE {
+
+ String[] sVehicles;
+
+ private Object theSharedObject;
+
+ private Object theSharedObjectArray[];
+
+
+ protected SignatureTestDriver driver;
+
+ /**
+ * <p>
+ * Returns a {@link SignatureTestDriver} appropriate for the particular TCK
+ * (using API check or the Signature Test Framework).
+ * </p>
+ *
+ * <p>
+ * The default implementation of this method will return a
+ * {@link SignatureTestDriver} that will use API Check. TCK developers can
+ * override this to return the desired {@link SignatureTestDriver} for their
+ * TCK.
+ */
+ protected SignatureTestDriver getSigTestDriver() {
+
+ if (driver == null) {
+ driver = SignatureTestDriverFactory.getInstance(SignatureTestDriverFactory.SIG_TEST);
+ }
+
+ return driver;
+
+ } // END getSigTestDriver
+
+ /**
+ * Returns the location of the package list file. This file denotes the valid
+ * sub-packages of any package being verified in the signature tests.
+ * <p/>
+ * Sub-classes are free to override this method if they use a different path
+ * or filename for their package list file. Most users should be able to use
+ * this default implementation.
+ *
+ * @return String The path and name of the package list file.
+ */
+ protected String getPackageFile() {
+ return getSigTestDriver().getPackageFileImpl(testInfo.getBinDir());
+ }
+
+ /**
+ * Returns the path and name of the signature map file that this TCK uses when
+ * conducting signature tests. The signature map file tells the signature test
+ * framework which API versions of tested packages to use. To keep this code
+ * platform independent, be sure to use the File.separator string (or the
+ * File.separatorChar) to denote path separators.
+ * <p/>
+ * Sub-classes are free to override this method if they use a different path
+ * or filename for their signature map file. Most users should be able to use
+ * this default implementation.
+ *
+ * @return String The path and name of the signature map file.
+ */
+ protected String getMapFile() {
+ return getSigTestDriver().getMapFileImpl(testInfo.getBinDir());
+ }
+
+ /**
+ * Returns the directory that contains the signature files.
+ * <p/>
+ * Sub-classes are free to override this method if they use a different
+ * signature repository directory. Most users should be able to use this
+ * default implementation.
+ *
+ * @return String The signature repository directory.
+ */
+ protected String getRepositoryDir() {
+ return getSigTestDriver().getRepositoryDirImpl(testInfo.getTSHome());
+ }
+
+ /**
+ * Returns the list of Optional Packages which are not accounted for. By
+ * 'unlisted optional' we mean the packages which are Optional to the
+ * technology under test that the user did NOT specifically list for testing.
+ * For example, with Java EE 7 implementation, a user could additionally opt
+ * to test a JSR-88 technology along with the Java EE technology. But if the
+ * user chooses NOT to list this optional technology for testing (via ts.jte
+ * javaee.level prop) then this method will return the packages for JSR-88
+ * technology with this method call.
+ * <p/>
+ * This is useful for checking for a scenarios when a user may have forgotten
+ * to identify a whole or partial technology implementation and in such cases,
+ * Java EE platform still requires testing it.
+ * <p/>
+ * Any partial or complete impl of an unlistedOptionalPackage sends up a red
+ * flag indicating that the user must also pass tests for this optional
+ * technology area.
+ * <p/>
+ * Sub-classes are free to override this method if they use a different
+ * signature repository directory. Most users should be able to use this
+ * default implementation - which means that there was NO optional technology
+ * packages that need to be tested.
+ *
+ * @return ArrayList<String>
+ */
+ protected ArrayList<String> getUnlistedOptionalPackages() {
+ return null;
+ }
+
+ /**
+ * Returns the list of packages that must be tested by the signature test
+ * framework. TCK developers must implement this method in their signature
+ * test sub-class.
+ *
+ * @param vehicleName
+ * The name of the vehicle the signature tests should be conducted
+ * in. Valid values for this property are ejb, servlet, ejb and
+ * appclient.
+ *
+ * @return String[] A list of packages that the developer wishes to test using
+ * the signature test framework. If the developer does not wish to
+ * test any package signatures in the specified vehicle this method
+ * should return null.
+ * <p>
+ * Note, The proper way to insure that this method is not called with
+ * a vehicle name that has no package signatures to verify is to
+ * modify the vehicle.properties in the $TS_HOME/src directory. This
+ * file provides a mapping that maps test directories to a list of
+ * vehicles where the tests in those directory should be run. As an
+ * extra precaution users are encouraged to return null from this
+ * method if the specified vehicle has no package signatures to be
+ * verified within it.
+ */
+ protected abstract String[] getPackages(String vehicleName);
+
+ /**
+ * <p>
+ * Returns an array of individual classes that must be tested by the signature
+ * test framwork within the specified vehicle. TCK developers may override
+ * this method when this functionality is needed. Most will only need package
+ * level granularity.
+ * </p>
+ *
+ * <p>
+ * If the developer doesn't wish to test certain classes within a particular
+ * vehicle, the implementation of this method must return a zero-length array.
+ * </p>
+ *
+ * @param vehicleName
+ * The name of the vehicle the signature tests should be conducted
+ * in. Valid values for this property are ejb, servlet, ejb and
+ * appclient.
+ *
+ * @return an Array of Strings containing the individual classes the framework
+ * should test based on the specifed vehicle. The default
+ * implementation of this method returns a zero-length array no matter
+ * the vehicle specified.
+ */
+ protected String[] getClasses(String vehicleName) {
+
+ return new String[] {};
+
+ } // END getClasses
+
+ protected SigTestData testInfo; // holds the bin.dir and vehicle properties
+
+ /**
+ * Called by the test framework to initialize this test. The method simply
+ * retrieves some state information that is necessary to run the test when
+ * when the test framework invokes the run method (actually the test1 method).
+ *
+ * @param args
+ * List of arguments passed to this test.
+ * @param p
+ * Properties specified by the test user and passed to this test via
+ * the test framework.
+ *
+ * @throws Fault
+ * When an error occurs reading or saving the state information
+ * processed by this method.
+ */
+ public void setup() {
+ try {
+ TestUtil.logMsg("$$$ SigTestEE.setup() called");
+ this.testInfo = new SigTestData();
+ TestUtil.logMsg("$$$ SigTestEE.setup() complete");
+ } catch (Exception e) {
+ TestUtil.logErr("Unexpected exception " + e.getMessage());
+ }
+ }
+
+ /**
+ * Called by the test framework to run this test. This method utilizes the
+ * state information set in the setup method to run the signature tests. All
+ * signature test code resides in the utility class so it can be reused by the
+ * signature test framework base classes.
+ *
+ * @throws Fault
+ * When an error occurs executing the signature tests.
+ */
+ public void signatureTest() throws Fault {
+ TestUtil.logMsg("$$$ SigTestEE.signatureTest() called");
+ SigTestResult results = null;
+ String mapFile = getMapFile();
+ String repositoryDir = getRepositoryDir();
+ String[] packages = getPackages(testInfo.getVehicle());
+ String[] classes = getClasses(testInfo.getVehicle());
+ String packageFile = getPackageFile();
+ String testClasspath = testInfo.getTestClasspath();
+ String optionalPkgToIgnore = testInfo.getOptionalTechPackagesToIgnore();
+
+ // unlisted optional packages are technology packages for those optional
+ // technologies (e.g. jsr-88) that might not have been specified by the
+ // user.
+ // We want to ensure there are no full or partial implementations of an
+ // optional technology which were not declared
+ ArrayList<String> unlistedTechnologyPkgs = getUnlistedOptionalPackages();
+
+ // If testing with Java 9+, extract the JDK's modules so they can be used
+ // on the testcase's classpath.
+ Properties sysProps = System.getProperties();
+ String version = (String) sysProps.get("java.version");
+ if (!version.startsWith("1.")) {
+ String jimageDir = testInfo.getJImageDir();
+ File f = new File(jimageDir);
+ f.mkdirs();
+
+ String javaHome = (String) sysProps.get("java.home");
+ TestUtil.logMsg("Executing JImage");
+
+ try {
+ ProcessBuilder pb = new ProcessBuilder(javaHome + "/bin/jimage", "extract", "--dir=" + jimageDir, javaHome + "/lib/modules");
+ TestUtil.logMsg(javaHome + "/bin/jimage extract --dir=" + jimageDir + " " + javaHome + "/lib/modules");
+ pb.redirectErrorStream(true);
+ Process proc = pb.start();
+ BufferedReader out = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+ String line = null;
+ while ((line = out.readLine()) != null) {
+ TestUtil.logMsg(line);
+ }
+
+ int rc = proc.waitFor();
+ TestUtil.logMsg("JImage RC = " + rc);
+ out.close();
+ } catch (Exception e) {
+ TestUtil.logMsg("Exception while executing JImage! Some tests may fail.");
+ e.printStackTrace();
+ }
+ }
+
+ try {
+ results = getSigTestDriver().executeSigTest(packageFile, mapFile,
+ repositoryDir, packages, classes, testClasspath,
+ unlistedTechnologyPkgs, optionalPkgToIgnore);
+ TestUtil.logMsg(results.toString());
+ if (!results.passed()) {
+ TestUtil.logErr("results.passed() returned false");
+ throw new Exception();
+ }
+
+ // Call verifyJtaJarTest based on some conditions, please check the
+ // comment for verifyJtaJarTest.
+ if ("standalone".equalsIgnoreCase(testInfo.getVehicle())) {
+ Properties mapFileAsProps = getSigTestDriver().loadMapFile(mapFile);
+ if (mapFileAsProps == null || mapFileAsProps.size() == 0) {
+ // empty signature file, something unusual
+ TestUtil.logMsg("SigTestEE.signatureTest() returning, " +
+ "as signature map file is empty.");
+ return;
+ }
+
+ boolean isJTASigTest = false;
+
+ // Determine whether the signature map file contains package
+ // jakarta.transaction
+ String jtaVersion = mapFileAsProps.getProperty("jakarta.transaction");
+ if (jtaVersion == null || "".equals(jtaVersion.trim())) {
+ TestUtil.logMsg("SigTestEE.signatureTest() returning, " +
+ "as this is neither JTA TCK run, not Java EE CTS run.");
+ return;
+ }
+
+ TestUtil.logMsg("jtaVersion " + jtaVersion);
+ // Signature map packaged in JTA TCK will contain a single package
+ // jakarta.transaction
+ if (mapFileAsProps.size() == 1) {
+ isJTASigTest = true;
+ }
+
+ if (isJTASigTest || !jtaVersion.startsWith("1.2")) {
+ verifyJtaJarTest();
+ }
+ }
+ TestUtil.logMsg("$$$ SigTestEE.signatureTest() returning");
+ } catch (Exception e) {
+ if (results != null && !results.passed()) {
+ throw new Fault("SigTestEE.signatureTest() failed!, diffs found");
+ } else {
+ TestUtil.logErr("Unexpected exception " + e.getMessage());
+ throw new Fault("signatureTest failed with an unexpected exception", e);
+ }
+ }
+ }
+
+ /**
+ * Called by the test framework to run this test. This method utilizes the
+ * state information set in the setup method to run. This test validates
+ * that the javax.transaction.xa type is not in the JTA API jar
+ *
+ * This method is called only for standaone vehicle, as calling the same
+ * for all the vehicles in the CTS run is not necessary.
+ *
+ * This method is called always from JTA 1.3 TCK. The test will be run as
+ * part of Java EE Signature Test only when the signature map in the CTS
+ * bundle is using JTA 1.3 (or higher) signature file.
+ *
+ * If property ts.jte jtaJarClasspath is removed in ts.jte of the JTA 1.3 TCK,
+ * this test will display the available options to call SignatureTest and
+ * fail. Similar failure will be seen in CTS run, if the signature map points
+ * to JTA 1.3 signature file and the property jtaJarClasspath is removed from
+ * ts.jte of CTS bundle.
+ *
+ * @throws Fault When an error occurs executing the signature tests.
+ */
+ public void verifyJtaJarTest() throws Exception {
+ TestUtil.logMsg("SigTestEE#verifyJtaJarTest - Starting:");
+ String repositoryDir = getRepositoryDir();
+ String jtaJarClasspath = testInfo.getJtaJarClasspath();
+ boolean result = getSigTestDriver().verifyJTAJarForNoXA(
+ testInfo.getJtaJarClasspath(), repositoryDir);
+ if(result) {
+ TestUtil.logMsg("PASS: javax.transaction.xa not found in API jar");
+ } else {
+ TestUtil.logErr("FAIL: javax.transaction.xa found in API jar");
+ throw new Fault("javax.transaction.xa validation failed");
+ }
+ TestUtil.logMsg("SigTestEE#verifyJtaJarTest returning");
+ }
+
+ /**
+ * Called by the test framework to cleanup any outstanding state. This method
+ * simply passes the message through to the utility class so the
+ * implementation can be used by both framework base classes.
+ *
+ * @throws Fault
+ * When an error occurs cleaning up the state of this test.
+ */
+ public void cleanup() throws Fault {
+ TestUtil.logMsg("$$$ SigTestEE.cleanup() called");
+ try {
+ getSigTestDriver().cleanupImpl();
+ TestUtil.logMsg("$$$ SigTestEE.cleanup() returning");
+ } catch (Exception e) {
+ throw new Fault("Cleanup failed!", e);
+ }
+ }
+
+
+ public static class Fault extends Exception {
+ private static final long serialVersionUID = -1574745208867827913L;
+
+ public Throwable t;
+
+ /**
+ * creates a Fault with a message
+ */
+ public Fault(String msg) {
+ super(msg);
+ TestUtil.logErr(msg);
+ }
+
+ /**
+ * creates a Fault with a message.
+ *
+ * @param msg
+ * the message
+ * @param t
+ * prints this exception's stacktrace
+ */
+ public Fault(String msg, Throwable t) {
+ super(msg);
+ this.t = t;
+ TestUtil.logErr(msg, t);
+ }
+
+ /**
+ * creates a Fault with a Throwable.
+ *
+ * @param t
+ * the Throwable
+ */
+ public Fault(Throwable t) {
+ super(t);
+ this.t = t;
+ }
+
+ /**
+ * Prints this Throwable and its backtrace to the standard error stream.
+ *
+ */
+ public void printStackTrace() {
+ if (this.t != null) {
+ this.t.printStackTrace();
+ } else {
+ super.printStackTrace();
+ }
+ }
+
+ /**
+ * Prints this throwable and its backtrace to the specified print stream.
+ *
+ * @param s
+ * <code>PrintStream</code> to use for output
+ */
+ public void printStackTrace(PrintStream s) {
+ if (this.t != null) {
+ this.t.printStackTrace(s);
+ } else {
+ super.printStackTrace(s);
+ }
+ }
+
+ /**
+ * Prints this throwable and its backtrace to the specified print writer.
+ *
+ * @param s
+ * <code>PrintWriter</code> to use for output
+ */
+ public void printStackTrace(PrintWriter s) {
+ if (this.t != null) {
+ this.t.printStackTrace(s);
+ } else {
+ super.printStackTrace(s);
+ }
+ }
+
+ @Override
+ public Throwable getCause() {
+ return t;
+ }
+
+ @Override
+ public synchronized Throwable initCause(Throwable cause) {
+ if (t != null)
+ throw new IllegalStateException("Can't overwrite cause");
+ if (!Exception.class.isInstance(cause))
+ throw new IllegalArgumentException("Cause not permitted");
+ this.t = (Exception) cause;
+ return this;
+ }
+ }
+
+} // end class SigTestEE
diff --git a/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SigTestRecorder.java b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SigTestRecorder.java
new file mode 100644
index 0000000..d07918c
--- /dev/null
+++ b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SigTestRecorder.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2007, 2021 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+/*
+ * @(#)SigTestRecorder.java 1.1 03/03/05
+ */
+package jakarta.ws.rs.tck.signaturetest;
+
+import java.io.File;
+import java.io.PrintWriter;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ * This implementation of {@link Recorder} will record signatures using the
+ * <code>Signature Test</code> framework.
+ * </p>
+ */
+public class SigTestRecorder extends Recorder {
+
+ // ------------------------------------------------------------ Constructors
+
+ public SigTestRecorder(String[] args) {
+
+ super(args);
+
+ } // END SigTestRecorder
+
+ // ------------------------------------------------------- Protected Methods
+
+ protected String[] createCommandLine(String version, String classpath,
+ String outputFileName, String packageName) {
+
+ List command = new ArrayList();
+
+ // command.add("-xReflection");
+ command.add("-static");
+ command.add("-debug");
+ command.add("-verbose");
+ command.add("-classpath");
+ command.add(classpath);
+
+ command.add("-FileName");
+ try {
+ command.add(new File(outputFileName).toURI().toURL().toExternalForm());
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+ command.add("-package");
+ command.add(packageName);
+
+ command.add("-apiVersion");
+ command.add(version);
+
+ return ((String[]) command.toArray(new String[command.size()]));
+
+ } // END getCommandLine
+
+ protected void writePackageListFile(String basePackageName,
+ String signatureFile, String packageListFile) throws Exception {
+
+ PackageList packageList = new PackageList(basePackageName, signatureFile,
+ packageListFile);
+ packageList.writePkgListFile();
+
+ } // END writePackageListFile
+
+ protected void doRecord(String[] commandLine) throws Exception {
+
+ Class batchSetup = Class.forName("com.sun.tdk.signaturetest.Setup");
+ Object batchSetupInstance = batchSetup.newInstance();
+ Method runMethod = batchSetup.getDeclaredMethod("run",
+ new Class[] { String[].class, PrintWriter.class, PrintWriter.class });
+
+ runMethod.invoke(batchSetupInstance, new Object[] { commandLine,
+ new PrintWriter(System.out, true), new PrintWriter(System.err, true) });
+
+ } // END doRecord
+
+} // END SigTestRecorder
diff --git a/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SigTestResult.java b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SigTestResult.java
new file mode 100644
index 0000000..e977f75
--- /dev/null
+++ b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SigTestResult.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 2007, 2020 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+/*
+ * $Id$
+ */
+package jakarta.ws.rs.tck.signaturetest;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+public class SigTestResult implements Serializable {
+
+ private static final String NL = System.getProperty("line.separator", "\n");
+
+ private List failedPkgs = new ArrayList();
+
+ private List passedPkgs = new ArrayList();
+
+ private List failedClasses = new ArrayList();
+
+ private List passedClasses = new ArrayList();
+
+ // ---------------------------------------------------------- Public Methods
+
+ public synchronized boolean passed() {
+
+ return (failedPkgs.size() == 0 && failedClasses.size() == 0);
+
+ } // end passed
+
+ public synchronized void addFailedPkg(String pkg) {
+
+ failedPkgs.add(pkg);
+
+ } // END addFailedPkg
+
+ public synchronized void addPassedPkg(String pkg) {
+
+ passedPkgs.add(pkg);
+
+ } // END addPassedPkg
+
+ public synchronized void addFailedClass(String className) {
+
+ failedClasses.add(className);
+
+ } // END addFailedClass
+
+ public synchronized void addPassedClass(String className) {
+
+ passedClasses.add(className);
+
+ } // END addPassedClass
+
+ public String toString() {
+
+ String delim = "******************************************************"
+ + NL;
+ if (!pkgsTested() && !classesTested()) {
+ return (delim + "******** No packages or classes were tested **********"
+ + NL + delim);
+ }
+ StringBuffer buf = new StringBuffer();
+ buf.append(delim);
+ buf.append(delim);
+ if (passed()) {
+ buf.append("All package signatures passed.").append(NL);
+ } else {
+ buf.append("Some signatures failed.").append(NL);
+ if (failedPkgs.size() > 0) {
+ buf.append("\tFailed packages listed below: ").append(NL);
+ formatList(failedPkgs, buf);
+ }
+ if (failedClasses.size() > 0) {
+ buf.append("\tFailed classes listed below: ").append(NL);
+ formatList(failedClasses, buf);
+ }
+ }
+ if (passedPkgs.size() > 0) {
+ buf.append("\tPassed packages listed below: ").append(NL);
+ formatList(passedPkgs, buf);
+ }
+ if (passedClasses.size() > 0) {
+ buf.append("\tPassed classes listed below: ").append(NL);
+ formatList(passedClasses, buf);
+ }
+ buf.append("\t");
+ buf.append(delim);
+ buf.append(delim);
+ return buf.toString();
+
+ } // END toString
+
+ // --------------------------------------------------------- Private Methods
+
+ private synchronized void formatList(List list, StringBuffer buf) {
+
+ synchronized (this) {
+ for (int i = 0; i < list.size(); i++) {
+ String pkg = (String) (list.get(i));
+ buf.append("\t\t").append(pkg).append(NL);
+ }
+ }
+
+ } // END formatList
+
+ private synchronized boolean pkgsTested() {
+
+ return (failedPkgs.size() != 0 || passedPkgs.size() != 0);
+
+ } // END pkgsTested
+
+ private synchronized boolean classesTested() {
+
+ return (failedClasses.size() != 0 || passedClasses.size() != 0);
+
+ } // END classesTested
+
+} // end class SigTestResult
diff --git a/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SignatureTestDriver.java b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SignatureTestDriver.java
new file mode 100644
index 0000000..2370571
--- /dev/null
+++ b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SignatureTestDriver.java
@@ -0,0 +1,699 @@
+/*
+ * Copyright (c) 2007, 2021 Oracle and/or its affiliates and others.
+ * All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package jakarta.ws.rs.tck.signaturetest;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Properties;
+
+import jakarta.ws.rs.tck.lib.util.TestUtil;
+
+/**
+ * Allows the sigtest framework to be extended using different signature test
+ * implementations (e.g. ApiCheck, or SigTest)
+ */
+public abstract class SignatureTestDriver {
+
+ private static final String SIG_FILE_EXT = ".sig";
+
+ private static final String SIG_FILE_VER_SEP = "_";
+
+ // ---------------------------------------------------------- Public Methods
+
+ /**
+ * Implementation of the getPackageFile method defined in both the SigTest and
+ * SigTestEE class.
+ */
+ public String getPackageFileImpl(String binDir) {
+
+ String thePkgListFile = "sig-test-pkg-list.txt";
+
+ TestUtil.logMsg(
+ "Using the following as the SigTest Package file: " + thePkgListFile);
+
+ String theFile = binDir + File.separator + thePkgListFile;
+ File ff = new File(theFile);
+ if (!ff.exists()) {
+ // we could not find the map file that coresponded to our SE version so
+ // lets
+ // try to default to use the sig-test-pkg-list.txt
+ TestUtil
+ .logErr("The SigTest Package file does not exist: " + thePkgListFile);
+ theFile = binDir + File.separator + "sig-test-pkg-list.txt";
+ File ff2 = new File(theFile);
+ if (!ff2.exists()) {
+ TestUtil
+ .logErr("The Default SigTest Package file does not exist either: "
+ + theFile);
+ } else {
+ TestUtil.logMsg("Defaulting to using SigTest Package file: " + theFile);
+ }
+ }
+
+ return (theFile);
+
+ } // END getPackageFileImpl
+
+ /**
+ * Implementation of the getMapFile method defined in both the SigTest and
+ * SigTestEE class.
+ */
+ public String getMapFileImpl(String binDir) {
+
+ String theMapFile = "sig-test.map";
+
+ TestUtil
+ .logMsg("Using the following as the sig-Test map file: " + theMapFile);
+
+ String theFile = binDir + File.separator + theMapFile;
+ File ff = new File(theFile);
+ if (!ff.exists()) {
+ // we could not find the map file that coresponded to our SE version so
+ // lets
+ // try to default to use the sig-test.map
+ TestUtil.logErr("The SigTest Map file does not exist: " + theMapFile);
+ theFile = binDir + File.separator + "sig-test.map";
+ File ff2 = new File(theFile);
+ if (!ff2.exists()) {
+ TestUtil
+ .logErr("The SigTest Map file does not exist either: " + theFile);
+ } else {
+ TestUtil.logMsg("Defaulting to using SigTest Map file: " + theFile);
+ }
+ }
+
+ return (theFile);
+
+ } // END getMapFileImpl
+
+ /**
+ * Returns true if the passed in version matches the current Java version
+ * being used.
+ *
+ */
+ public Boolean isJavaSEVersion(String ver) {
+
+ String strOSVersion = System.getProperty("java.version");
+ if (strOSVersion.startsWith(ver)) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Implementation of the getRepositoryDir method defined in both the SigTest
+ * and SigTestEE class.
+ */
+ public String getRepositoryDirImpl(String tsHome) {
+
+ return (tsHome + File.separator + "src" + File.separator + "com"
+ + File.separator + "sun" + File.separator + "ts" + File.separator
+ + "tests" + File.separator + "signaturetest" + File.separator
+ + "signature-repository" + File.separator);
+
+ } // END getRepositoryDirImpl
+
+ /**
+ * Implementation of the cleanup method defined in both the SigTest and
+ * SigTestEE class.
+ */
+ public void cleanupImpl() throws Exception {
+
+ try {
+ TestUtil.logMsg("cleanup");
+ } catch (Exception e) {
+ TestUtil.logErr("Exception in cleanup method" + e);
+ throw e;
+ }
+
+ } // END cleanupImpl
+
+ /**
+ * <p>
+ * Execute the signature test. By default, this method passes the result of
+ * {@link #createTestArguments(String, String, String, String, String)} and
+ * passes the result to {@link #runSignatureTest(String, String[])}.
+ *
+ * @param packageListFile
+ * - file containing the packages/classes that are to be verified
+ * @param mapFile
+ * sig-test.map file
+ * @param signatureRepositoryDir
+ * directory containing the recorded signatures
+ * @param packagesUnderTest
+ * packages, defined by the test client, that should be tested
+ * @param classesUnderTest
+ * classes, defined by the test client, that should be tested
+ * @param classpath
+ * The location of the API being verified. Normally the checked API
+ * will be available in the test environment and testClasspath will
+ * be null. In some rare cases the tested API may not be part of the
+ * test environment and will have to specified using this parameter.
+ * @param unaccountedTechPkgs
+ * packages that should not exist within the technology under test.
+ * These will be searched for and if found, will be flagged as error
+ * since they were not explicitly declared as being under test. Their
+ * existence requires explicit testing.
+ *
+ * @return a {@link SigTestResult} containing the result of the test execution
+ */
+ public SigTestResult executeSigTest(String packageListFile, String mapFile,
+ String signatureRepositoryDir, String[] packagesUnderTest,
+ String[] classesUnderTest, String classpath,
+ ArrayList<String> unaccountedTechPkgs, String optionalPkgToIgnore)
+ throws Exception {
+
+ SigTestResult result = new SigTestResult();
+
+ TestUtil.logMsg("optionalPkgToIgnore = " + optionalPkgToIgnore);
+ String[] arrayOptionalPkgsToIgnore = null;
+ if (optionalPkgToIgnore != null) {
+ arrayOptionalPkgsToIgnore = optionalPkgToIgnore.split(",");
+ }
+
+ if (packagesUnderTest != null && packagesUnderTest.length > 0) {
+ TestUtil.logMsg("********** BEGIN PACKAGE LEVEL SIGNATURE "
+ + "VALIDATION **********\n\n");
+ for (int i = 0; i < packagesUnderTest.length; i++) {
+
+ String packageName = packagesUnderTest[i];
+
+ TestUtil.logMsg("********** BEGIN VALIDATE PACKAGE '"
+ + packagesUnderTest[i] + "' **********\n");
+
+ TestUtil.logMsg(
+ "********** VALIDATE IN STATIC MODE - TO CHECK CONSANT VALUES ****");
+ TestUtil
+ .logMsg("Static mode supports checks of static constants values ");
+
+ String[] args = createTestArguments(packageListFile, mapFile,
+ signatureRepositoryDir, packageName, classpath, true);
+ dumpTestArguments(args);
+
+ if (runSignatureTest(packageName, args)) {
+ TestUtil.logMsg("********** Package '" + packageName
+ + "' - PASSED (STATIC MODE) **********");
+ result.addPassedPkg(packageName + "(static mode)");
+ } else {
+ result.addFailedPkg(packageName + "(static mode)");
+ TestUtil.logMsg("********** Package '" + packageName
+ + "' - FAILED (STATIC MODE) **********");
+ }
+
+ TestUtil.logMsg("\n\n");
+ TestUtil.logMsg("********** VALIDATE IN REFLECTIVE MODE ****");
+ TestUtil.logMsg(
+ "Reflective mode supports verification within containers (ie ejb, servlet, etc)");
+
+ String[] args2 = createTestArguments(packageListFile, mapFile,
+ signatureRepositoryDir, packageName, classpath, false);
+ dumpTestArguments(args2);
+
+ if (runSignatureTest(packageName, args2)) {
+ TestUtil.logMsg("********** Package '" + packageName
+ + "' - PASSED (REFLECTION MODE) **********");
+ result.addPassedPkg(packageName + "(reflection mode)");
+ } else {
+ result.addFailedPkg(packageName + "(reflection mode)");
+ TestUtil.logMsg("********** Package '" + packageName
+ + "' - FAILED (REFLECTION MODE) **********");
+ }
+
+ TestUtil.logMsg("********** END VALIDATE PACKAGE '"
+ + packagesUnderTest[i] + "' **********\n");
+
+ TestUtil.logMsg("\n");
+ TestUtil.logMsg("\n");
+
+ }
+ }
+
+ if (classesUnderTest != null && classesUnderTest.length > 0) {
+ TestUtil.logMsg("********** BEGIN CLASS LEVEL SIGNATURE "
+ + "VALIDATION **********\n\n");
+
+ for (int i = 0; i < classesUnderTest.length; i++) {
+
+ String className = classesUnderTest[i];
+
+ TestUtil.logMsg("********** BEGIN VALIDATE CLASS '"
+ + classesUnderTest[i] + "' **********\n");
+
+ TestUtil.logMsg(
+ "********** VALIDATE IN STATIC MODE - TO CHECK CONSANT VALUES ****");
+ TestUtil
+ .logMsg("Static mode supports checks of static constants values ");
+
+ String[] args = createTestArguments(packageListFile, mapFile,
+ signatureRepositoryDir, className, classpath, true);
+ dumpTestArguments(args);
+
+ if (runSignatureTest(className, args)) {
+ TestUtil.logMsg("********** Class '" + className
+ + "' - PASSED (STATIC MODE) **********");
+ result.addPassedClass(className + "(static mode)");
+ } else {
+ TestUtil.logMsg("********** Class '" + className
+ + "' - FAILED (STATIC MODE) **********");
+ result.addFailedClass(className + "(static mode)");
+ }
+
+ TestUtil.logMsg("\n\n");
+ TestUtil.logMsg("********** VALIDATE IN REFLECTIVE MODE ****");
+ TestUtil.logMsg(
+ "Reflective mode supports verification within containers (ie ejb, servlet, etc)");
+
+ String[] args2 = createTestArguments(packageListFile, mapFile,
+ signatureRepositoryDir, className, classpath, false);
+ dumpTestArguments(args2);
+
+ if (runSignatureTest(className, args2)) {
+ TestUtil.logMsg("********** Class '" + className
+ + "' - PASSED (REFLECTION MODE) **********");
+ result.addPassedClass(className + "(reflection mode)");
+ } else {
+ TestUtil.logMsg("********** Class '" + className
+ + "' - FAILED (REFLECTION MODE) **********");
+ result.addFailedClass(className + "(reflection mode)");
+ }
+
+ TestUtil.logMsg("********** END VALIDATE CLASS '" + classesUnderTest[i]
+ + "' **********\n");
+
+ TestUtil.logMsg("\n");
+ TestUtil.logMsg("\n");
+
+ }
+ }
+
+ /*
+ * The following will check if there are Optional Technologies being
+ * implemented but not explicitly defined thru (ts.jte) javaee.level
+ * property. This is a problem because if an optional technolgy is defined
+ * (either whole or partially) than the TCK tests (and sig tests) for those
+ * Optional Technology(s) MUST be run according to related specs.
+ */
+ if (unaccountedTechPkgs != null) {
+ for (int ii = 0; ii < unaccountedTechPkgs.size(); ii++) {
+ // 'unaccountedTechPkgs' are t hose packages which do not beling to
+ // base technology nor one of the *declared* optionalal technologies.
+ // 'unaccountedTechPkgs' refers to packages for Optional Technologies
+ // which were not defined thru (ts.jte) javaee.level property.
+ // So, make sure there are no whole or partial implementations of
+ // undeclared optional technologies in the implementation
+
+ String packageName = unaccountedTechPkgs.get(ii);
+
+ // this is a special case exception to our validation of Optional
+ // Technologies. Normally any partial technology implementations
+ // would be a compatibility failure. HOWEVER, EE 7 Spec (see section
+ // EE 6.1.2 of the Platform spec in the footnote on p. 156.)
+ // requires us to add special handling to avoid testing 'certain' pkgs
+ // within an optional technology.
+ if (isIgnorePackageUnderTest(packageName, arrayOptionalPkgsToIgnore)) {
+ TestUtil.logMsg(
+ "Ignoring special optional technology package: " + packageName);
+ continue;
+ }
+
+ TestUtil.logMsg("\n\n");
+ TestUtil.logMsg(
+ "********** CHECK IF OPTIONAL TECHNOLOGIES EXIST IN REFLECTIVE MODE ****");
+ TestUtil.logMsg(
+ "Reflective mode supports verification within containers (ie ejb, servlet, etc)");
+
+ String[] args3 = createTestArguments(packageListFile, mapFile,
+ signatureRepositoryDir, packageName, classpath, false);
+ dumpTestArguments(args3);
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ // - - - -
+ // NOTE: this is the opposite of above in that *if* we find that an
+ // undeclared
+ // optional technology package exists - then we want to raise a red
+ // flag.
+ // The user would have to either remove the technology from the impl if
+ // they do not want to include it in their impl -OR- they must
+ // explicitly
+ // set javaee.level (in ts.jte) to include that Optional Technology AND
+ // after setting this property, they have to pass all related TCK tests.
+ if (runPackageSearch(packageName, args3)) {
+ // if this passed we have an issue because it should not exist - thus
+ // should NOT pass.
+ TestUtil.logMsg("********** Package '" + packageName
+ + "' - WAS FOUND BUT SHOULD NOT BE (REFLECTION MODE) **********");
+ String err = "ERROR: An area of concern has been identified. ";
+ err += "You must run sigtests with (ts.jte) javaee.level set to ";
+ err += "include all optional technology keywords. Whole and/or ";
+ err += "partial implementations of Optional Technologies ";
+ err += "must be implemented according to the specs AND must pass ";
+ err += "all related TCK tests. To properly pass the ";
+ err += "signature tests - you must identify all Optional Technology ";
+ err += "areas (via javaee.level) that you wish to pass signature tests for.";
+ TestUtil.logMsg(err);
+ result.addFailedPkg(packageName
+ + " (Undeclared Optional Technology package found in reflection mode)");
+ } else {
+ TestUtil.logMsg("********** Undeclared Optional Technology package '"
+ + packageName + "' - PASSED (REFLECTION MODE) **********");
+ }
+ }
+ }
+
+ return result;
+
+ } // END executeSigTest
+
+ // ------------------------------------------------------- Protected Methods
+
+ /**
+ * Using a common set of information, create arguments that are appropriate to
+ * be used with the underlying signature test framework.
+ *
+ * @param packageListFile
+ * - file containing the packages/classes that are to be verified
+ * @param mapFile
+ * sig-test.map file
+ * @param signatureRepositoryDir
+ * directory containing the recorded signatures
+ * @param packageOrClassUnderTest
+ * the class or package
+ * @param classpath
+ * The location of the API being verified. Normally the checked API
+ * will be available in the test environment and testClasspath will
+ * be null. In some rare cases the tested API may not be part of the
+ * test environment and will have to specified using this parameter.
+ */
+ protected abstract String[] createTestArguments(String packageListFile,
+ String mapFile, String signatureRepositoryDir,
+ String packageOrClassUnderTest, String classpath, boolean bStaticMode)
+ throws Exception;
+
+ /**
+ * Invoke the underlying signature test framework for the specified package or
+ * class.
+ *
+ * @param packageOrClassName
+ * the package or class to be validated
+ * @param testArguments
+ * the arguments necessary to invoke the signature test framework
+ *
+ * @return <code>true</code> if the test passed, otherwise <code>false</code>
+ */
+ protected abstract boolean runSignatureTest(String packageOrClassName,
+ String[] testArguments) throws Exception;
+
+ /**
+ * This checks if a class exists or not within the impl.
+ *
+ * @param packageOrClassName
+ * the package or class to be validated
+ *
+ * @return <code>true</code> if the package was found to exist, otherwise
+ * <code>false</code>
+ */
+ protected abstract boolean runPackageSearch(String packageOrClassName,
+ String[] testArguments) throws Exception;
+
+
+ /**
+ * This method checks whether JTA API jar contains classes from
+ * javax.transaction.xa package
+ *
+ * @param classpath
+ * the classpath, pointing JTA API jar
+ * @param repositoryDir
+ * the directory containing an empty signature file
+ *
+ * @return <code>true</code> if the package javax.transaction.xa is not
+ * found in the JTA API jar, otherwise <code>false</code>
+ */
+ protected abstract boolean verifyJTAJarForNoXA(String classpath,
+ String repositoryDir) throws Exception;
+
+ /**
+ * Loads the specified file into a Properties object provided the specified
+ * file exists and is a regular file. The call to new FileInputStream verifies
+ * that the specfied file is a regular file and exists.
+ *
+ * @param mapFile
+ * the path and name of the map file to be loaded
+ *
+ * @return Properties The Properties object initialized with the contents of
+ * the specified file
+ *
+ * @throws java.io.IOException
+ * If the specified map file does not exist or is not a regular
+ * file, can also be thrown if there is an error creating an input
+ * stream from the specified file.
+ */
+ public Properties loadMapFile(String mapFile)
+ throws IOException, FileNotFoundException {
+
+ FileInputStream in = null;
+ try {
+ File map = new File(mapFile);
+ Properties props = new Properties();
+ in = new FileInputStream(map);
+ props.load(in);
+ return props;
+ } finally {
+ try {
+ if (in != null) {
+ in.close();
+ }
+ } catch (Throwable t) {
+ // do nothing
+ }
+ }
+
+ } // END loadMapFile
+
+ /**
+ * This method will attempt to build a fully-qualified filename in the format
+ * of <code>respositoryDir</code> + </code>baseName</code> +
+ * <code>.sig_</code> + </code>version</code>.
+ *
+ * @param baseName
+ * the base portion of the signature filename
+ * @param repositoryDir
+ * the directory in which the signatures are stored
+ * @param version
+ * the version of the signature file
+ * @throws FileNotFoundException
+ * if the file cannot be validated as existing and is in fact a file
+ * @return a valid, fully qualified filename, appropriate for the system the
+ * test is being run on
+ */
+ protected String getSigFileName(String baseName, String repositoryDir,
+ String version) throws FileNotFoundException {
+
+ String sigFile;
+ if (repositoryDir.endsWith(File.separator)) {
+ sigFile = repositoryDir + baseName + SIG_FILE_EXT + SIG_FILE_VER_SEP
+ + version;
+ } else {
+ sigFile = repositoryDir + File.separator + baseName + SIG_FILE_EXT
+ + SIG_FILE_VER_SEP + version;
+ }
+
+ File testFile = new File(sigFile);
+
+ if (!testFile.exists() && !testFile.isFile()) {
+ throw new FileNotFoundException(
+ "Signature file \"" + sigFile + "\" does not exist.");
+ }
+
+ // we are actually requiring this normalizeFileName call to get
+ // things working on Windows. Without this, if we just return the
+ // testFile; we will fail on windows. (Solaris works either way)
+ // IMPORTANT UPDATE!! (4/5/2011)
+ // in sigtest 2.2: they stopped supporting the normalized version which
+ // created a string filename =
+ // "file://com/sun/ts/tests/signaturetest/foo.sig"
+ // so now use file path and name only.
+ // return normalizeFileName(testFile);
+ return testFile.toString();
+
+ } // END getSigFileName
+
+ protected abstract String normalizeFileName(File f);
+
+ /**
+ * Returns the name and path to the signature file that contains the specified
+ * package's signatures.
+ *
+ * @param packageName
+ * The package under test
+ * @param mapFile
+ * The name of the file that maps package names to versions
+ * @param repositoryDir
+ * The directory that conatisn all signature files
+ *
+ * @return String The path and name of the siganture file that contains the
+ * specified package's signatures
+ *
+ * @throws Exception
+ * if the determined signature file is not a regular file or does
+ * not exist
+ */
+ protected SignatureFileInfo getSigFileInfo(String packageName, String mapFile,
+ String repositoryDir) throws Exception {
+
+ String originalPackage = packageName;
+ String name = null;
+ String version = null;
+ Properties props = loadMapFile(mapFile);
+
+ while (true) {
+ boolean packageFound = false;
+ for (Enumeration<?> e = props.propertyNames(); e.hasMoreElements();) {
+ name = (String) (e.nextElement());
+ if (name.equals(packageName)) {
+ version = props.getProperty(name);
+ packageFound = true;
+ break;
+ } // end if
+ } // end for
+
+ if (packageFound) {
+ break;
+ }
+
+ /*
+ * If we get here we did not find a package name in the properties file
+ * that matches the package name under test. So we look for a package name
+ * in the properties file that could be the parent package for the package
+ * under test. We do this by removing the specified packages last package
+ * name section. So jakarta.ejb.spi would become jakarta.ejb
+ */
+ int index = packageName.lastIndexOf(".");
+ if (index <= 0) {
+ throw new Exception("Package \"" + originalPackage
+ + "\" not specified in mapping file \"" + mapFile + "\".");
+ }
+ packageName = packageName.substring(0, index);
+ } // end while
+
+ /* Return the expected name of the signature file */
+
+ return new SignatureFileInfo(getSigFileName(name, repositoryDir, version),
+ version);
+
+ } // END getSigFileInfo
+
+ // --------------------------------------------------------- Private Methods
+
+ /*
+ * This returns true is the passed in packageName matches one of the packages
+ * that are listed in the arrayOptionalPkgsToIgnore. arrayOptionalPkgsToIgnore
+ * is ultimately defined in the ts.jte property
+ * 'optional.tech.packages.to.ignore' If one of the entries in
+ * arrayOptionalPkgsToIgnore matches the packageName then that means we return
+ * TRUE to indicate we should ignore and NOT TEST that particular package.
+ */
+ private static boolean isIgnorePackageUnderTest(String packageName,
+ String[] arrayOptionalPkgsToIgnore) {
+
+ // if anything is null - consider no match
+ if ((packageName == null) || (arrayOptionalPkgsToIgnore == null)) {
+ return false;
+ }
+
+ for (int ii = 0; ii < arrayOptionalPkgsToIgnore.length; ii++) {
+ if (packageName.equals(arrayOptionalPkgsToIgnore[ii])) {
+ // we found a match -
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Prints the specified list of parameters to the message log. Used for
+ * debugging purposes only.
+ *
+ * @param params
+ * The list of parameters to dump.
+ */
+ private static void dumpTestArguments(String[] params) {
+
+ if (params != null && params.length > 0) {
+ TestUtil
+ .logTrace("----------------- BEGIN SIG PARAM DUMP -----------------");
+ for (int i = 0; i < params.length; i++) {
+ TestUtil.logTrace(" Param[" + i + "]: " + params[i]);
+ }
+ TestUtil
+ .logTrace("------------------ END SIG PARAM DUMP ------------------");
+ }
+
+ } // END dumpTestArguments
+
+ // ----------------------------------------------------------- Inner Classes
+
+ /**
+ * A simple data structure containing the fully qualified path to the
+ * signature file as well as the version being tested.
+ */
+ protected static class SignatureFileInfo {
+
+ private String file;
+
+ private String version;
+
+ // -------------------------------------------------------- Constructors
+
+ public SignatureFileInfo(String file, String version) {
+
+ if (file == null) {
+ throw new IllegalArgumentException("'file' argument cannot be null");
+ }
+
+ if (version == null) {
+ throw new IllegalArgumentException("'version' argument cannot be null");
+ }
+
+ this.file = file;
+ this.version = version;
+
+ } // END SignatureFileInfo
+
+ // ------------------------------------------------------ Public Methods
+
+ public String getFile() {
+
+ return file;
+
+ } // END getFileIncludingPath
+
+ public String getVersion() {
+
+ return version;
+
+ } // END getVersion
+
+ }
+
+} // END SigTestDriver
diff --git a/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SignatureTestDriverFactory.java b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SignatureTestDriverFactory.java
new file mode 100644
index 0000000..ff7434e
--- /dev/null
+++ b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/SignatureTestDriverFactory.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2007, 2018 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+/*
+ * $Id$
+ */
+
+package jakarta.ws.rs.tck.signaturetest;
+
+/**
+ * <p>
+ * Factory to obtain SignatureTestDriver implementations.
+ * </p>
+ */
+public class SignatureTestDriverFactory {
+
+ /**
+ * <p>
+ * Identifier for the driver that uses API Check to perform signature
+ * validation.
+ * </p>
+ */
+ public static final String API_CHECK = "apicheck";
+
+ /**
+ * <p>
+ * Identifier for the driver that uses the Signature Test framwork for
+ * signature validation.
+ * </p>
+ */
+ public static final String SIG_TEST = "sigtest";
+
+ // ------------------------------------------------------------ Constructors
+
+ // Access via factory method
+ private SignatureTestDriverFactory() {
+ } // END SignatureTestDriverFactory
+
+ // ---------------------------------------------------------- Public Methods
+
+ /**
+ * <p>
+ * Obtain a {@link SignatureTestDriver} instance based on the
+ * <code>type</code> argument.
+ *
+ * @param type
+ * the driver type to create
+ * @return a {@link SignatureTestDriver} implementation
+ */
+ public static SignatureTestDriver getInstance(String type) {
+
+ if (type == null || type.length() == 0) {
+ throw new IllegalArgumentException("Type was null or empty");
+ }
+
+ if (API_CHECK.equals(type)) {
+ return new ApiCheckDriver();
+ } else if (SIG_TEST.equals(type)) {
+ return new SigTestDriver();
+ } else {
+ throw new IllegalArgumentException("Unknown Type: '" + type + '\'');
+ }
+
+ } // END getInstance
+
+} // END SignatureTestDriverFactory
diff --git a/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/jaxrs/JAXRSSigTestIT.java b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/jaxrs/JAXRSSigTestIT.java
new file mode 100644
index 0000000..d513392
--- /dev/null
+++ b/jaxrs-tck/src/main/java/jakarta/ws/rs/tck/signaturetest/jaxrs/JAXRSSigTestIT.java
@@ -0,0 +1,429 @@
+/*
+ * Copyright (c) 2008, 2021 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+/*
+ * $Id:
+ */
+package jakarta.ws.rs.tck.signaturetest.jaxrs;
+
+import java.io.PrintWriter;
+import java.util.LinkedList;
+import java.util.List;
+
+import jakarta.ws.rs.tck.signaturetest.SigTestEE;
+import jakarta.ws.rs.tck.signaturetest.SigTestResult;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import org.junit.jupiter.api.Test;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.PrintStream;
+
+import java.io.FileOutputStream;
+import java.io.FileInputStream;
+import java.util.ArrayList;
+import java.util.Properties;
+import java.io.InputStream;
+import java.io.FileNotFoundException;
+import java.util.Properties;
+
+import jakarta.ws.rs.tck.lib.util.TestUtil;
+
+/*
+ * This class is a simple example of a signature test that extends the
+ * SigTest framework class. This signature test is run outside of the
+ * Java EE containers. This class also contains the boilerplate
+ * code necessary to create a signature test using the test framework.
+ * To see a complete TCK example see the javaee directory for the Java EE
+ * TCK signature test class.
+ */
+public class JAXRSSigTestIT extends SigTestEE {
+
+ private static final long serialVersionUID = 1675845761668114828L;
+
+ public static final String EJB_VEHICLE = "ejb";
+
+ public static final String SERVLET_VEHICLE = "servlet";
+
+ public static final String JSP_VEHICLE = "jsp";
+
+ public static final String APP_CLIENT_VEHICLE = "appclient";
+
+ public static final String NO_VEHICLE = "standalone";
+
+ public JAXRSSigTestIT(){
+ setup();
+ }
+
+ /*
+ * Defines the packages that are included when running signature tests for any
+ * container (the default packages). This includes the appclient, ejb, jsp,
+ * and servlet containers.
+ */
+ private static final String[] DEFAULT_PKGS = { "jakarta.ws.rs",
+ "jakarta.ws.rs.client", "jakarta.ws.rs.core", "jakarta.ws.rs.container",
+ "jakarta.ws.rs.ext", "jakarta.ws.rs.sse", };
+
+ /*
+ * Defines additional packages that are included when running signature tests
+ * for the ejb, jsp and servlet containers.
+ */
+ private static final String[] EJB_SERVLET_JSP_PKGS = {};
+
+ /*
+ * Defines additional packages that are included when running signature tests
+ * for the jsp and servlet containers.
+ */
+ private static final String[] SERVLET_JSP_PKGS = {};
+
+ private static final String[] NO_CONTAINER_PKGS = { "jakarta.ws.rs",
+ "jakarta.ws.rs.client", "jakarta.ws.rs.core", "jakarta.ws.rs.container",
+ "jakarta.ws.rs.ext", "jakarta.ws.rs.sse", };
+
+ /***** Abstract Method Implementation *****/
+ /**
+ * Returns a list of strings where each string represents a package name. Each
+ * package name will have it's signature tested by the signature test
+ * framework.
+ *
+ * @return String[] The names of the packages whose signatures should be
+ * verified.
+ */
+ protected String[] getPackages() {
+ return DEFAULT_PKGS;
+ }
+
+ /**
+ * Adds the default packages and the command line flags to the specified list
+ * for each package defined in the list of default packages to check during
+ * signature tests. Note: The specified list is modified as a result of this
+ * method call.
+ *
+ * @param sigArgsList
+ * The arg list being constructed to pass to the utility that records
+ * and runs signature file tests.
+ */
+ private static void addDefaultPkgs(List<String> sigArgsList) {
+ for (int i = 0; i < DEFAULT_PKGS.length; i++) {
+ sigArgsList.add(DEFAULT_PKGS[i]);
+ }
+ }
+
+ /**
+ * Adds the ejb, servlet, and jsp packages and the command line flags to the
+ * specified list for each package defined in the list of ejb, servlet, and
+ * jsp packages to check during signature tests. Note: The specified list is
+ * modified as a result of this method call.
+ *
+ * @param sigArgsList
+ * The arg list being constructed to pass to the utility that records
+ * and runs signature file tests.
+ */
+ private static void addEjbServletJspPkgs(List<String> sigArgsList) {
+ for (int i = 0; i < EJB_SERVLET_JSP_PKGS.length; i++) {
+ sigArgsList.add(EJB_SERVLET_JSP_PKGS[i]);
+ }
+ }
+
+ /**
+ * Adds the servlet, and jsp packages and the command line flags to the
+ * specified list for each package defined in the list of servlet, and jsp
+ * packages to check during signature tests. Note: The specified list is
+ * modified as a result of this method call.
+ *
+ * @param sigArgsList
+ * The arg list being constructed to pass to the utility that records
+ * and runs signature file tests.
+ */
+ private static void addServletJspPkgs(List<String> sigArgsList) {
+ for (int i = 0; i < SERVLET_JSP_PKGS.length; i++) {
+ sigArgsList.add(SERVLET_JSP_PKGS[i]);
+ }
+ }
+
+ /**
+ * Adds the pkgs for tests to be run in NO Container (ie standalone) packages
+ * to check during signature tests. Note: The specified list is modified as a
+ * result of this method call.
+ *
+ * @param sigArgsList
+ * The arg list being constructed to pass to the utility that records
+ * and runs signature file tests.
+ */
+ private static void addNoContainerPkgs(List<String> sigArgsList) {
+ for (int i = 0; i < NO_CONTAINER_PKGS.length; i++) {
+ sigArgsList.add(NO_CONTAINER_PKGS[i]);
+ }
+ }
+
+ /**
+ * Returns a list of strings where each string represents a package name. Each
+ * package name will have it's signature tested by the signature test
+ * framework.
+ *
+ * @param vehicleName
+ * The name of the Jaspic container where the signature tests should
+ * be conducted.
+ * @return String[] The names of the packages whose signatures should be
+ * verified.
+ */
+ protected String[] getPackages(String vehicleName) {
+ List<String> packages = new LinkedList<String>();
+
+ if (vehicleName.equals(NO_VEHICLE)) {
+ addNoContainerPkgs(packages);
+ } else {
+ addDefaultPkgs(packages); // add default vehicle packages
+ if (vehicleName.equals(EJB_VEHICLE) || vehicleName.equals(SERVLET_VEHICLE)
+ || vehicleName.equals(JSP_VEHICLE)) {
+ addEjbServletJspPkgs(packages);
+ }
+ if (vehicleName.equals(SERVLET_VEHICLE)
+ || vehicleName.equals(JSP_VEHICLE)) {
+ addServletJspPkgs(packages);
+ }
+ }
+ return packages.toArray(new String[packages.size()]);
+ }
+
+ public File writeStreamToTempFile(InputStream inputStream, String tempFilePrefix, String tempFileSuffix) throws IOException {
+ FileOutputStream outputStream = null;
+
+ try {
+ File file = File.createTempFile(tempFilePrefix, tempFileSuffix);
+ outputStream = new FileOutputStream(file);
+ byte[] buffer = new byte[1024];
+ while (true) {
+ int bytesRead = inputStream.read(buffer);
+ if (bytesRead == -1) {
+ break;
+ }
+ outputStream.write(buffer, 0, bytesRead);
+ }
+ return file;
+ }
+
+ finally {
+ if (outputStream != null) {
+ outputStream.close();
+ }
+ }
+ }
+
+ public File writeStreamToSigFile(InputStream inputStream, String packageVersion) throws IOException {
+ FileOutputStream outputStream = null;
+ String tmpdir = System.getProperty("java.io.tmpdir");
+ try {
+ File sigfile = new File(tmpdir+File.separator+"jakarta.ws.rs.sig_"+packageVersion);
+ if(sigfile.exists()){
+ sigfile.delete();
+ TestUtil.logMsg("Existing signature file deleted to create new one");
+ }
+ if(!sigfile.createNewFile()){
+ TestUtil.logErr("signature file is not created");
+ }
+ outputStream = new FileOutputStream(sigfile);
+ byte[] buffer = new byte[1024];
+ while (true) {
+ int bytesRead = inputStream.read(buffer);
+ if (bytesRead == -1) {
+ break;
+ }
+ outputStream.write(buffer, 0, bytesRead);
+ }
+ return sigfile;
+ }
+
+ finally {
+ if (outputStream != null) {
+ outputStream.close();
+ }
+ }
+ }
+
+
+ /***** Boilerplate Code *****/
+
+
+ /*
+ * The following comments are specified in the base class that defines the
+ * signature tests. This is done so the test finders will find the right class
+ * to run. The implementation of these methods is inherited from the super
+ * class which is part of the signature test framework.
+ */
+
+ // NOTE: If the API under test is not part of your testing runtime
+ // environment, you may use the property sigTestClasspath to specify
+ // where the API under test lives. This should almost never be used.
+ // Normally the API under test should be specified in the classpath
+ // of the VM running the signature tests. Use either the first
+ // comment or the one below it depending on which properties your
+ // signature tests need. Please do not use both comments.
+
+
+ /*
+ * @class.setup_props: ts_home, The base path of this TCK; sigTestClasspath;
+ */
+ /*
+ * @testName: signatureTest
+ *
+ * @assertion: A JAXRS container must implement the required classes and APIs
+ * specified in the JAXRS Specification.
+ *
+ * @test_Strategy: Using reflection, gather the implementation specific
+ * classes and APIs. Compare these results with the expected (required)
+ * classes and APIs.
+ *
+ */
+ @Test
+ public void signatureTest() throws Fault {
+ TestUtil.logMsg("$$$ JAXRSSigTestIT.signatureTest() called");
+ SigTestResult results = null;
+ String mapFile = null;
+ String packageFile = null;
+ String repositoryDir = null;
+ Properties mapFileAsProps = null;
+ try {
+
+ InputStream inStreamMapfile = JAXRSSigTestIT.class.getClassLoader().getResourceAsStream("jakarta/ws/rs/tck/signaturetest/sig-test.map");
+ File mFile = writeStreamToTempFile(inStreamMapfile, "sig-test", ".map");
+ mapFile = mFile.getCanonicalPath();
+ TestUtil.logMsg("mapFile location is :"+mapFile);
+
+ InputStream inStreamPackageFile = JAXRSSigTestIT.class.getClassLoader().getResourceAsStream("jakarta/ws/rs/tck/signaturetest/sig-test-pkg-list.txt");
+ File pFile = writeStreamToTempFile(inStreamPackageFile, "sig-test-pkg-list", ".txt");
+ packageFile = pFile.getCanonicalPath();
+ TestUtil.logMsg("packageFile location is :"+packageFile);
+
+ mapFileAsProps = getSigTestDriver().loadMapFile(mapFile);
+ String packageVersion = mapFileAsProps.getProperty("jakarta.ws.rs");
+ TestUtil.logMsg("Package version from mapfile :"+packageVersion);
+
+ InputStream inStreamSigFile = JAXRSSigTestIT.class.getClassLoader().getResourceAsStream("jakarta/ws/rs/tck/signaturetest/jakarta.ws.rs.sig_"+packageVersion);
+ File sigFile = writeStreamToSigFile(inStreamSigFile, packageVersion);
+ TestUtil.logMsg("signature File location is :"+sigFile.getCanonicalPath());
+ repositoryDir = System.getProperty("java.io.tmpdir");
+
+
+ } catch(IOException ex){
+ TestUtil.logMsg("Exception while creating temp files :"+ex);
+ }
+
+ String[] packages = getPackages(testInfo.getVehicle());
+ String[] classes = getClasses(testInfo.getVehicle());
+ String testClasspath = System.getProperty("signature.sigTestClasspath");
+ String optionalPkgToIgnore = testInfo.getOptionalTechPackagesToIgnore();
+
+ // unlisted optional packages are technology packages for those optional
+ // technologies (e.g. jsr-88) that might not have been specified by the
+ // user.
+ // We want to ensure there are no full or partial implementations of an
+ // optional technology which were not declared
+ ArrayList<String> unlistedTechnologyPkgs = getUnlistedOptionalPackages();
+
+ // If testing with Java 9+, extract the JDK's modules so they can be used
+ // on the testcase's classpath.
+ Properties sysProps = System.getProperties();
+ String version = (String) sysProps.get("java.version");
+ if (!version.startsWith("1.")) {
+ String jimageDir = testInfo.getJImageDir();
+ File f = new File(jimageDir);
+ f.mkdirs();
+
+ String javaHome = (String) sysProps.get("java.home");
+ TestUtil.logMsg("Executing JImage");
+
+ try {
+ ProcessBuilder pb = new ProcessBuilder(javaHome + "/bin/jimage", "extract", "--dir=" + jimageDir, javaHome + "/lib/modules");
+ TestUtil.logMsg(javaHome + "/bin/jimage extract --dir=" + jimageDir + " " + javaHome + "/lib/modules");
+ pb.redirectErrorStream(true);
+ Process proc = pb.start();
+ BufferedReader out = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+ String line = null;
+ while ((line = out.readLine()) != null) {
+ TestUtil.logMsg(line);
+ }
+
+ int rc = proc.waitFor();
+ TestUtil.logMsg("JImage RC = " + rc);
+ out.close();
+ } catch (Exception e) {
+ TestUtil.logMsg("Exception while executing JImage! Some tests may fail.");
+ e.printStackTrace();
+ }
+ }
+
+ try {
+ results = getSigTestDriver().executeSigTest(packageFile, mapFile,
+ repositoryDir, packages, classes, testClasspath,
+ unlistedTechnologyPkgs, optionalPkgToIgnore);
+ TestUtil.logMsg(results.toString());
+ if (!results.passed()) {
+ TestUtil.logErr("results.passed() returned false");
+ throw new Exception();
+ }
+
+ // Call verifyJtaJarTest based on some conditions, please check the
+ // comment for verifyJtaJarTest.
+ if ("standalone".equalsIgnoreCase(testInfo.getVehicle())) {
+ if (mapFileAsProps == null || mapFileAsProps.size() == 0) {
+ // empty signature file, something unusual
+ TestUtil.logMsg("JAXRSSigTestIT.signatureTest() returning, " +
+ "as signature map file is empty.");
+ return;
+ }
+
+ boolean isJTASigTest = false;
+
+ // Determine whether the signature map file contains package
+ // jakarta.transaction
+ String jtaVersion = mapFileAsProps.getProperty("jakarta.transaction");
+ if (jtaVersion == null || "".equals(jtaVersion.trim())) {
+ TestUtil.logMsg("JAXRSSigTestIT.signatureTest() returning, " +
+ "as this is neither JTA TCK run, not Java EE CTS run.");
+ return;
+ }
+
+ TestUtil.logMsg("jtaVersion " + jtaVersion);
+ // Signature map packaged in JTA TCK will contain a single package
+ // jakarta.transaction
+ if (mapFileAsProps.size() == 1) {
+ isJTASigTest = true;
+ }
+
+ if (isJTASigTest || !jtaVersion.startsWith("1.2")) {
+ verifyJtaJarTest();
+ }
+ }
+ TestUtil.logMsg("$$$ JAXRSSigTestIT.signatureTest() returning");
+ } catch (Exception e) {
+ if (results != null && !results.passed()) {
+ throw new Fault("JAXRSSigTestIT.signatureTest() failed!, diffs found");
+ } else {
+ TestUtil.logErr("Unexpected exception " + e.getMessage());
+ throw new Fault("signatureTest failed with an unexpected exception", e);
+ }
+ }
+ }
+
+ /*
+ * Call the parent class's cleanup method.
+ */
+}
diff --git a/jaxrs-tck/src/main/resources/jakarta/ws/rs/tck/signaturetest/jakarta.ws.rs.sig_3.1.0 b/jaxrs-tck/src/main/resources/jakarta/ws/rs/tck/signaturetest/jakarta.ws.rs.sig_3.1.0
new file mode 100644
index 0000000..9838fc9
--- /dev/null
+++ b/jaxrs-tck/src/main/resources/jakarta/ws/rs/tck/signaturetest/jakarta.ws.rs.sig_3.1.0
@@ -0,0 +1,1998 @@
+#Signature file v4.1
+#Version 3.1.0
+
+CLSS public abstract interface !annotation jakarta.ws.rs.ApplicationPath
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[TYPE])
+intf java.lang.annotation.Annotation
+meth public abstract java.lang.String value()
+
+CLSS public jakarta.ws.rs.BadRequestException
+cons public init()
+cons public init(jakarta.ws.rs.core.Response)
+cons public init(jakarta.ws.rs.core.Response,java.lang.Throwable)
+cons public init(java.lang.String)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response,java.lang.Throwable)
+cons public init(java.lang.String,java.lang.Throwable)
+cons public init(java.lang.Throwable)
+supr jakarta.ws.rs.ClientErrorException
+hfds serialVersionUID
+
+CLSS public abstract interface !annotation jakarta.ws.rs.BeanParam
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[PARAMETER, METHOD, FIELD])
+intf java.lang.annotation.Annotation
+
+CLSS public jakarta.ws.rs.ClientErrorException
+cons public init(int)
+cons public init(int,java.lang.Throwable)
+cons public init(jakarta.ws.rs.core.Response$Status)
+cons public init(jakarta.ws.rs.core.Response$Status,java.lang.Throwable)
+cons public init(jakarta.ws.rs.core.Response)
+cons public init(jakarta.ws.rs.core.Response,java.lang.Throwable)
+cons public init(java.lang.String,int)
+cons public init(java.lang.String,int,java.lang.Throwable)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response$Status)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response$Status,java.lang.Throwable)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response,java.lang.Throwable)
+supr jakarta.ws.rs.WebApplicationException
+hfds serialVersionUID
+
+CLSS public abstract interface !annotation jakarta.ws.rs.ConstrainedTo
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[TYPE])
+intf java.lang.annotation.Annotation
+meth public abstract jakarta.ws.rs.RuntimeType value()
+
+CLSS public abstract interface !annotation jakarta.ws.rs.Consumes
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Inherited()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[TYPE, METHOD])
+intf java.lang.annotation.Annotation
+meth public abstract !hasdefault java.lang.String[] value()
+
+CLSS public abstract interface !annotation jakarta.ws.rs.CookieParam
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[PARAMETER, METHOD, FIELD])
+intf java.lang.annotation.Annotation
+meth public abstract java.lang.String value()
+
+CLSS public abstract interface !annotation jakarta.ws.rs.DELETE
+ anno 0 jakarta.ws.rs.HttpMethod(java.lang.String value="DELETE")
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[METHOD])
+intf java.lang.annotation.Annotation
+
+CLSS public abstract interface !annotation jakarta.ws.rs.DefaultValue
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[PARAMETER, METHOD, FIELD])
+intf java.lang.annotation.Annotation
+meth public abstract java.lang.String value()
+
+CLSS public abstract interface !annotation jakarta.ws.rs.Encoded
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[PARAMETER, METHOD, FIELD, CONSTRUCTOR, TYPE])
+intf java.lang.annotation.Annotation
+
+CLSS public jakarta.ws.rs.ForbiddenException
+cons public init()
+cons public init(jakarta.ws.rs.core.Response)
+cons public init(jakarta.ws.rs.core.Response,java.lang.Throwable)
+cons public init(java.lang.String)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response,java.lang.Throwable)
+cons public init(java.lang.String,java.lang.Throwable)
+cons public init(java.lang.Throwable)
+supr jakarta.ws.rs.ClientErrorException
+hfds serialVersionUID
+
+CLSS public abstract interface !annotation jakarta.ws.rs.FormParam
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[PARAMETER, METHOD, FIELD])
+intf java.lang.annotation.Annotation
+meth public abstract java.lang.String value()
+
+CLSS public abstract interface !annotation jakarta.ws.rs.GET
+ anno 0 jakarta.ws.rs.HttpMethod(java.lang.String value="GET")
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[METHOD])
+intf java.lang.annotation.Annotation
+
+CLSS public abstract interface !annotation jakarta.ws.rs.HEAD
+ anno 0 jakarta.ws.rs.HttpMethod(java.lang.String value="HEAD")
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[METHOD])
+intf java.lang.annotation.Annotation
+
+CLSS public abstract interface !annotation jakarta.ws.rs.HeaderParam
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[PARAMETER, METHOD, FIELD])
+intf java.lang.annotation.Annotation
+meth public abstract java.lang.String value()
+
+CLSS public abstract interface !annotation jakarta.ws.rs.HttpMethod
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[ANNOTATION_TYPE])
+fld public final static java.lang.String DELETE = "DELETE"
+fld public final static java.lang.String GET = "GET"
+fld public final static java.lang.String HEAD = "HEAD"
+fld public final static java.lang.String OPTIONS = "OPTIONS"
+fld public final static java.lang.String PATCH = "PATCH"
+fld public final static java.lang.String POST = "POST"
+fld public final static java.lang.String PUT = "PUT"
+intf java.lang.annotation.Annotation
+meth public abstract java.lang.String value()
+
+CLSS public jakarta.ws.rs.InternalServerErrorException
+cons public init()
+cons public init(jakarta.ws.rs.core.Response)
+cons public init(jakarta.ws.rs.core.Response,java.lang.Throwable)
+cons public init(java.lang.String)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response,java.lang.Throwable)
+cons public init(java.lang.String,java.lang.Throwable)
+cons public init(java.lang.Throwable)
+supr jakarta.ws.rs.ServerErrorException
+hfds serialVersionUID
+
+CLSS public abstract interface !annotation jakarta.ws.rs.MatrixParam
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[PARAMETER, METHOD, FIELD])
+intf java.lang.annotation.Annotation
+meth public abstract java.lang.String value()
+
+CLSS public abstract interface !annotation jakarta.ws.rs.NameBinding
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[ANNOTATION_TYPE])
+intf java.lang.annotation.Annotation
+
+CLSS public jakarta.ws.rs.NotAcceptableException
+cons public init()
+cons public init(jakarta.ws.rs.core.Response)
+cons public init(jakarta.ws.rs.core.Response,java.lang.Throwable)
+cons public init(java.lang.String)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response,java.lang.Throwable)
+cons public init(java.lang.String,java.lang.Throwable)
+cons public init(java.lang.Throwable)
+supr jakarta.ws.rs.ClientErrorException
+hfds serialVersionUID
+
+CLSS public jakarta.ws.rs.NotAllowedException
+cons public !varargs init(java.lang.String,java.lang.String,java.lang.String[])
+cons public !varargs init(java.lang.String,java.lang.String[])
+cons public !varargs init(java.lang.String,java.lang.Throwable,java.lang.String[])
+cons public !varargs init(java.lang.Throwable,java.lang.String[])
+cons public init(jakarta.ws.rs.core.Response)
+cons public init(jakarta.ws.rs.core.Response,java.lang.Throwable)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response,java.lang.Throwable)
+supr jakarta.ws.rs.ClientErrorException
+hfds serialVersionUID
+
+CLSS public jakarta.ws.rs.NotAuthorizedException
+cons public !varargs init(java.lang.Object,java.lang.Object[])
+cons public !varargs init(java.lang.String,java.lang.Object,java.lang.Object[])
+cons public !varargs init(java.lang.String,java.lang.Throwable,java.lang.Object,java.lang.Object[])
+cons public !varargs init(java.lang.Throwable,java.lang.Object,java.lang.Object[])
+cons public init(jakarta.ws.rs.core.Response)
+cons public init(jakarta.ws.rs.core.Response,java.lang.Throwable)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response,java.lang.Throwable)
+meth public java.util.List<java.lang.Object> getChallenges()
+supr jakarta.ws.rs.ClientErrorException
+hfds challenges,serialVersionUID
+
+CLSS public jakarta.ws.rs.NotFoundException
+cons public init()
+cons public init(jakarta.ws.rs.core.Response)
+cons public init(jakarta.ws.rs.core.Response,java.lang.Throwable)
+cons public init(java.lang.String)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response,java.lang.Throwable)
+cons public init(java.lang.String,java.lang.Throwable)
+cons public init(java.lang.Throwable)
+supr jakarta.ws.rs.ClientErrorException
+hfds serialVersionUID
+
+CLSS public jakarta.ws.rs.NotSupportedException
+cons public init()
+cons public init(jakarta.ws.rs.core.Response)
+cons public init(jakarta.ws.rs.core.Response,java.lang.Throwable)
+cons public init(java.lang.String)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response,java.lang.Throwable)
+cons public init(java.lang.String,java.lang.Throwable)
+cons public init(java.lang.Throwable)
+supr jakarta.ws.rs.ClientErrorException
+hfds serialVersionUID
+
+CLSS public abstract interface !annotation jakarta.ws.rs.OPTIONS
+ anno 0 jakarta.ws.rs.HttpMethod(java.lang.String value="OPTIONS")
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[METHOD])
+intf java.lang.annotation.Annotation
+
+CLSS public abstract interface !annotation jakarta.ws.rs.PATCH
+ anno 0 jakarta.ws.rs.HttpMethod(java.lang.String value="PATCH")
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[METHOD])
+intf java.lang.annotation.Annotation
+
+CLSS public abstract interface !annotation jakarta.ws.rs.POST
+ anno 0 jakarta.ws.rs.HttpMethod(java.lang.String value="POST")
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[METHOD])
+intf java.lang.annotation.Annotation
+
+CLSS public abstract interface !annotation jakarta.ws.rs.PUT
+ anno 0 jakarta.ws.rs.HttpMethod(java.lang.String value="PUT")
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[METHOD])
+intf java.lang.annotation.Annotation
+
+CLSS public abstract interface !annotation jakarta.ws.rs.Path
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[TYPE, METHOD])
+intf java.lang.annotation.Annotation
+meth public abstract java.lang.String value()
+
+CLSS public abstract interface !annotation jakarta.ws.rs.PathParam
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[PARAMETER, METHOD, FIELD])
+intf java.lang.annotation.Annotation
+meth public abstract java.lang.String value()
+
+CLSS public final jakarta.ws.rs.Priorities
+fld public final static int AUTHENTICATION = 1000
+fld public final static int AUTHORIZATION = 2000
+fld public final static int ENTITY_CODER = 4000
+fld public final static int HEADER_DECORATOR = 3000
+fld public final static int USER = 5000
+supr java.lang.Object
+
+CLSS public jakarta.ws.rs.ProcessingException
+cons public init(java.lang.String)
+cons public init(java.lang.String,java.lang.Throwable)
+cons public init(java.lang.Throwable)
+supr java.lang.RuntimeException
+hfds serialVersionUID
+
+CLSS public abstract interface !annotation jakarta.ws.rs.Produces
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Inherited()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[TYPE, METHOD])
+intf java.lang.annotation.Annotation
+meth public abstract !hasdefault java.lang.String[] value()
+
+CLSS public abstract interface !annotation jakarta.ws.rs.QueryParam
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[PARAMETER, METHOD, FIELD])
+intf java.lang.annotation.Annotation
+meth public abstract java.lang.String value()
+
+CLSS public jakarta.ws.rs.RedirectionException
+cons public init(int,java.net.URI)
+cons public init(jakarta.ws.rs.core.Response$Status,java.net.URI)
+cons public init(jakarta.ws.rs.core.Response)
+cons public init(java.lang.String,int,java.net.URI)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response$Status,java.net.URI)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response)
+meth public java.net.URI getLocation()
+supr jakarta.ws.rs.WebApplicationException
+hfds serialVersionUID
+
+CLSS public final !enum jakarta.ws.rs.RuntimeType
+fld public final static jakarta.ws.rs.RuntimeType CLIENT
+fld public final static jakarta.ws.rs.RuntimeType SERVER
+meth public static jakarta.ws.rs.RuntimeType valueOf(java.lang.String)
+meth public static jakarta.ws.rs.RuntimeType[] values()
+supr java.lang.Enum<jakarta.ws.rs.RuntimeType>
+
+CLSS public abstract interface jakarta.ws.rs.SeBootstrap
+innr public abstract interface static Configuration
+innr public abstract interface static Instance
+meth public static java.util.concurrent.CompletionStage<jakarta.ws.rs.SeBootstrap$Instance> start(jakarta.ws.rs.core.Application)
+meth public static java.util.concurrent.CompletionStage<jakarta.ws.rs.SeBootstrap$Instance> start(jakarta.ws.rs.core.Application,jakarta.ws.rs.SeBootstrap$Configuration)
+meth public static java.util.concurrent.CompletionStage<jakarta.ws.rs.SeBootstrap$Instance> start(java.lang.Class<? extends jakarta.ws.rs.core.Application>)
+meth public static java.util.concurrent.CompletionStage<jakarta.ws.rs.SeBootstrap$Instance> start(java.lang.Class<? extends jakarta.ws.rs.core.Application>,jakarta.ws.rs.SeBootstrap$Configuration)
+
+CLSS public abstract interface static jakarta.ws.rs.SeBootstrap$Configuration
+ outer jakarta.ws.rs.SeBootstrap
+fld public final static int DEFAULT_PORT = -1
+fld public final static int FREE_PORT = 0
+fld public final static java.lang.String HOST = "jakarta.ws.rs.SeBootstrap.Host"
+fld public final static java.lang.String PORT = "jakarta.ws.rs.SeBootstrap.Port"
+fld public final static java.lang.String PROTOCOL = "jakarta.ws.rs.SeBootstrap.Protocol"
+fld public final static java.lang.String ROOT_PATH = "jakarta.ws.rs.SeBootstrap.RootPath"
+fld public final static java.lang.String SSL_CLIENT_AUTHENTICATION = "jakarta.ws.rs.SeBootstrap.SSLClientAuthentication"
+fld public final static java.lang.String SSL_CONTEXT = "jakarta.ws.rs.SeBootstrap.SSLContext"
+innr public abstract interface static Builder
+innr public final static !enum SSLClientAuthentication
+meth public abstract java.lang.Object property(java.lang.String)
+meth public boolean hasProperty(java.lang.String)
+meth public int port()
+meth public jakarta.ws.rs.SeBootstrap$Configuration$SSLClientAuthentication sslClientAuthentication()
+meth public jakarta.ws.rs.core.UriBuilder baseUriBuilder()
+meth public java.lang.String host()
+meth public java.lang.String protocol()
+meth public java.lang.String rootPath()
+meth public java.net.URI baseUri()
+meth public javax.net.ssl.SSLContext sslContext()
+meth public static jakarta.ws.rs.SeBootstrap$Configuration$Builder builder()
+
+CLSS public abstract interface static jakarta.ws.rs.SeBootstrap$Configuration$Builder
+ outer jakarta.ws.rs.SeBootstrap$Configuration
+meth public abstract <%0 extends java.lang.Object> jakarta.ws.rs.SeBootstrap$Configuration$Builder from(java.util.function.BiFunction<java.lang.String,java.lang.Class<{%%0}>,java.util.Optional<{%%0}>>)
+meth public abstract jakarta.ws.rs.SeBootstrap$Configuration build()
+meth public abstract jakarta.ws.rs.SeBootstrap$Configuration$Builder property(java.lang.String,java.lang.Object)
+meth public jakarta.ws.rs.SeBootstrap$Configuration$Builder from(java.lang.Object)
+meth public jakarta.ws.rs.SeBootstrap$Configuration$Builder host(java.lang.String)
+meth public jakarta.ws.rs.SeBootstrap$Configuration$Builder port(java.lang.Integer)
+meth public jakarta.ws.rs.SeBootstrap$Configuration$Builder protocol(java.lang.String)
+meth public jakarta.ws.rs.SeBootstrap$Configuration$Builder rootPath(java.lang.String)
+meth public jakarta.ws.rs.SeBootstrap$Configuration$Builder sslClientAuthentication(jakarta.ws.rs.SeBootstrap$Configuration$SSLClientAuthentication)
+meth public jakarta.ws.rs.SeBootstrap$Configuration$Builder sslContext(javax.net.ssl.SSLContext)
+
+CLSS public final static !enum jakarta.ws.rs.SeBootstrap$Configuration$SSLClientAuthentication
+ outer jakarta.ws.rs.SeBootstrap$Configuration
+fld public final static jakarta.ws.rs.SeBootstrap$Configuration$SSLClientAuthentication MANDATORY
+fld public final static jakarta.ws.rs.SeBootstrap$Configuration$SSLClientAuthentication NONE
+fld public final static jakarta.ws.rs.SeBootstrap$Configuration$SSLClientAuthentication OPTIONAL
+meth public static jakarta.ws.rs.SeBootstrap$Configuration$SSLClientAuthentication valueOf(java.lang.String)
+meth public static jakarta.ws.rs.SeBootstrap$Configuration$SSLClientAuthentication[] values()
+supr java.lang.Enum<jakarta.ws.rs.SeBootstrap$Configuration$SSLClientAuthentication>
+
+CLSS public abstract interface static jakarta.ws.rs.SeBootstrap$Instance
+ outer jakarta.ws.rs.SeBootstrap
+innr public abstract interface static StopResult
+meth public abstract <%0 extends java.lang.Object> {%%0} unwrap(java.lang.Class<{%%0}>)
+meth public abstract jakarta.ws.rs.SeBootstrap$Configuration configuration()
+meth public abstract java.util.concurrent.CompletionStage<jakarta.ws.rs.SeBootstrap$Instance$StopResult> stop()
+meth public void stopOnShutdown(java.util.function.Consumer<jakarta.ws.rs.SeBootstrap$Instance$StopResult>)
+
+CLSS public abstract interface static jakarta.ws.rs.SeBootstrap$Instance$StopResult
+ outer jakarta.ws.rs.SeBootstrap$Instance
+meth public abstract <%0 extends java.lang.Object> {%%0} unwrap(java.lang.Class<{%%0}>)
+
+CLSS public jakarta.ws.rs.ServerErrorException
+cons public init(int)
+cons public init(int,java.lang.Throwable)
+cons public init(jakarta.ws.rs.core.Response$Status)
+cons public init(jakarta.ws.rs.core.Response$Status,java.lang.Throwable)
+cons public init(jakarta.ws.rs.core.Response)
+cons public init(jakarta.ws.rs.core.Response,java.lang.Throwable)
+cons public init(java.lang.String,int)
+cons public init(java.lang.String,int,java.lang.Throwable)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response$Status)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response$Status,java.lang.Throwable)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response,java.lang.Throwable)
+supr jakarta.ws.rs.WebApplicationException
+hfds serialVersionUID
+
+CLSS public jakarta.ws.rs.ServiceUnavailableException
+cons public init()
+cons public init(jakarta.ws.rs.core.Response)
+cons public init(jakarta.ws.rs.core.Response,java.lang.Throwable)
+cons public init(java.lang.Long)
+cons public init(java.lang.Long,java.lang.Throwable)
+cons public init(java.lang.String)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response,java.lang.Throwable)
+cons public init(java.lang.String,java.lang.Long)
+cons public init(java.lang.String,java.lang.Long,java.lang.Throwable)
+cons public init(java.lang.String,java.util.Date)
+cons public init(java.lang.String,java.util.Date,java.lang.Throwable)
+cons public init(java.util.Date)
+cons public init(java.util.Date,java.lang.Throwable)
+meth public boolean hasRetryAfter()
+meth public java.util.Date getRetryTime(java.util.Date)
+supr jakarta.ws.rs.ServerErrorException
+hfds serialVersionUID
+
+CLSS public jakarta.ws.rs.WebApplicationException
+cons public init()
+cons public init(int)
+cons public init(jakarta.ws.rs.core.Response$Status)
+cons public init(jakarta.ws.rs.core.Response)
+cons public init(java.lang.String)
+cons public init(java.lang.String,int)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response$Status)
+cons public init(java.lang.String,jakarta.ws.rs.core.Response)
+cons public init(java.lang.String,java.lang.Throwable)
+cons public init(java.lang.String,java.lang.Throwable,int)
+cons public init(java.lang.String,java.lang.Throwable,jakarta.ws.rs.core.Response$Status)
+cons public init(java.lang.String,java.lang.Throwable,jakarta.ws.rs.core.Response)
+cons public init(java.lang.Throwable)
+cons public init(java.lang.Throwable,int)
+cons public init(java.lang.Throwable,jakarta.ws.rs.core.Response$Status)
+cons public init(java.lang.Throwable,jakarta.ws.rs.core.Response)
+meth public jakarta.ws.rs.core.Response getResponse()
+supr java.lang.RuntimeException
+hfds response,serialVersionUID
+
+CLSS public abstract interface jakarta.ws.rs.client.AsyncInvoker
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> delete(jakarta.ws.rs.client.InvocationCallback<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> delete(jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> delete(java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> get(jakarta.ws.rs.client.InvocationCallback<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> get(jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> get(java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> method(java.lang.String,jakarta.ws.rs.client.Entity<?>,jakarta.ws.rs.client.InvocationCallback<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> method(java.lang.String,jakarta.ws.rs.client.Entity<?>,jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> method(java.lang.String,jakarta.ws.rs.client.Entity<?>,java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> method(java.lang.String,jakarta.ws.rs.client.InvocationCallback<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> method(java.lang.String,jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> method(java.lang.String,java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> options(jakarta.ws.rs.client.InvocationCallback<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> options(jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> options(java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> post(jakarta.ws.rs.client.Entity<?>,jakarta.ws.rs.client.InvocationCallback<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> post(jakarta.ws.rs.client.Entity<?>,jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> post(jakarta.ws.rs.client.Entity<?>,java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> put(jakarta.ws.rs.client.Entity<?>,jakarta.ws.rs.client.InvocationCallback<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> put(jakarta.ws.rs.client.Entity<?>,jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> put(jakarta.ws.rs.client.Entity<?>,java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> trace(jakarta.ws.rs.client.InvocationCallback<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> trace(jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> trace(java.lang.Class<{%%0}>)
+meth public abstract java.util.concurrent.Future<jakarta.ws.rs.core.Response> delete()
+meth public abstract java.util.concurrent.Future<jakarta.ws.rs.core.Response> get()
+meth public abstract java.util.concurrent.Future<jakarta.ws.rs.core.Response> head()
+meth public abstract java.util.concurrent.Future<jakarta.ws.rs.core.Response> head(jakarta.ws.rs.client.InvocationCallback<jakarta.ws.rs.core.Response>)
+meth public abstract java.util.concurrent.Future<jakarta.ws.rs.core.Response> method(java.lang.String)
+meth public abstract java.util.concurrent.Future<jakarta.ws.rs.core.Response> method(java.lang.String,jakarta.ws.rs.client.Entity<?>)
+meth public abstract java.util.concurrent.Future<jakarta.ws.rs.core.Response> options()
+meth public abstract java.util.concurrent.Future<jakarta.ws.rs.core.Response> post(jakarta.ws.rs.client.Entity<?>)
+meth public abstract java.util.concurrent.Future<jakarta.ws.rs.core.Response> put(jakarta.ws.rs.client.Entity<?>)
+meth public abstract java.util.concurrent.Future<jakarta.ws.rs.core.Response> trace()
+
+CLSS public abstract interface jakarta.ws.rs.client.Client
+intf jakarta.ws.rs.core.Configurable<jakarta.ws.rs.client.Client>
+intf java.lang.AutoCloseable
+meth public abstract jakarta.ws.rs.client.Invocation$Builder invocation(jakarta.ws.rs.core.Link)
+meth public abstract jakarta.ws.rs.client.WebTarget target(jakarta.ws.rs.core.Link)
+meth public abstract jakarta.ws.rs.client.WebTarget target(jakarta.ws.rs.core.UriBuilder)
+meth public abstract jakarta.ws.rs.client.WebTarget target(java.lang.String)
+meth public abstract jakarta.ws.rs.client.WebTarget target(java.net.URI)
+meth public abstract javax.net.ssl.HostnameVerifier getHostnameVerifier()
+meth public abstract javax.net.ssl.SSLContext getSslContext()
+meth public abstract void close()
+
+CLSS public abstract jakarta.ws.rs.client.ClientBuilder
+cons protected init()
+fld public final static java.lang.String JAXRS_DEFAULT_CLIENT_BUILDER_PROPERTY = "jakarta.ws.rs.client.ClientBuilder"
+intf jakarta.ws.rs.core.Configurable<jakarta.ws.rs.client.ClientBuilder>
+meth public abstract jakarta.ws.rs.client.Client build()
+meth public abstract jakarta.ws.rs.client.ClientBuilder connectTimeout(long,java.util.concurrent.TimeUnit)
+meth public abstract jakarta.ws.rs.client.ClientBuilder executorService(java.util.concurrent.ExecutorService)
+meth public abstract jakarta.ws.rs.client.ClientBuilder hostnameVerifier(javax.net.ssl.HostnameVerifier)
+meth public abstract jakarta.ws.rs.client.ClientBuilder keyStore(java.security.KeyStore,char[])
+meth public abstract jakarta.ws.rs.client.ClientBuilder readTimeout(long,java.util.concurrent.TimeUnit)
+meth public abstract jakarta.ws.rs.client.ClientBuilder scheduledExecutorService(java.util.concurrent.ScheduledExecutorService)
+meth public abstract jakarta.ws.rs.client.ClientBuilder sslContext(javax.net.ssl.SSLContext)
+meth public abstract jakarta.ws.rs.client.ClientBuilder trustStore(java.security.KeyStore)
+meth public abstract jakarta.ws.rs.client.ClientBuilder withConfig(jakarta.ws.rs.core.Configuration)
+meth public jakarta.ws.rs.client.ClientBuilder keyStore(java.security.KeyStore,java.lang.String)
+meth public static jakarta.ws.rs.client.Client newClient()
+meth public static jakarta.ws.rs.client.Client newClient(jakarta.ws.rs.core.Configuration)
+meth public static jakarta.ws.rs.client.ClientBuilder newBuilder()
+supr java.lang.Object
+hcls CreateErrorMessageAction
+
+CLSS public abstract interface jakarta.ws.rs.client.ClientRequestContext
+meth public abstract boolean hasEntity()
+meth public abstract jakarta.ws.rs.client.Client getClient()
+meth public abstract jakarta.ws.rs.core.Configuration getConfiguration()
+meth public abstract jakarta.ws.rs.core.MediaType getMediaType()
+meth public abstract jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.Object> getHeaders()
+meth public abstract jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.String> getStringHeaders()
+meth public abstract java.io.OutputStream getEntityStream()
+meth public abstract java.lang.Class<?> getEntityClass()
+meth public abstract java.lang.Object getEntity()
+meth public abstract java.lang.Object getProperty(java.lang.String)
+meth public abstract java.lang.String getHeaderString(java.lang.String)
+meth public abstract java.lang.String getMethod()
+meth public abstract java.lang.annotation.Annotation[] getEntityAnnotations()
+meth public abstract java.lang.reflect.Type getEntityType()
+meth public abstract java.net.URI getUri()
+meth public abstract java.util.Collection<java.lang.String> getPropertyNames()
+meth public abstract java.util.Date getDate()
+meth public abstract java.util.List<jakarta.ws.rs.core.MediaType> getAcceptableMediaTypes()
+meth public abstract java.util.List<java.util.Locale> getAcceptableLanguages()
+meth public abstract java.util.Locale getLanguage()
+meth public abstract java.util.Map<java.lang.String,jakarta.ws.rs.core.Cookie> getCookies()
+meth public abstract void abortWith(jakarta.ws.rs.core.Response)
+meth public abstract void removeProperty(java.lang.String)
+meth public abstract void setEntity(java.lang.Object)
+meth public abstract void setEntity(java.lang.Object,java.lang.annotation.Annotation[],jakarta.ws.rs.core.MediaType)
+meth public abstract void setEntityStream(java.io.OutputStream)
+meth public abstract void setMethod(java.lang.String)
+meth public abstract void setProperty(java.lang.String,java.lang.Object)
+meth public abstract void setUri(java.net.URI)
+meth public boolean hasProperty(java.lang.String)
+
+CLSS public abstract interface jakarta.ws.rs.client.ClientRequestFilter
+meth public abstract void filter(jakarta.ws.rs.client.ClientRequestContext) throws java.io.IOException
+
+CLSS public abstract interface jakarta.ws.rs.client.ClientResponseContext
+meth public abstract boolean hasEntity()
+meth public abstract boolean hasLink(java.lang.String)
+meth public abstract int getLength()
+meth public abstract int getStatus()
+meth public abstract jakarta.ws.rs.core.EntityTag getEntityTag()
+meth public abstract jakarta.ws.rs.core.Link getLink(java.lang.String)
+meth public abstract jakarta.ws.rs.core.Link$Builder getLinkBuilder(java.lang.String)
+meth public abstract jakarta.ws.rs.core.MediaType getMediaType()
+meth public abstract jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.String> getHeaders()
+meth public abstract jakarta.ws.rs.core.Response$StatusType getStatusInfo()
+meth public abstract java.io.InputStream getEntityStream()
+meth public abstract java.lang.String getHeaderString(java.lang.String)
+meth public abstract java.net.URI getLocation()
+meth public abstract java.util.Date getDate()
+meth public abstract java.util.Date getLastModified()
+meth public abstract java.util.Locale getLanguage()
+meth public abstract java.util.Map<java.lang.String,jakarta.ws.rs.core.NewCookie> getCookies()
+meth public abstract java.util.Set<jakarta.ws.rs.core.Link> getLinks()
+meth public abstract java.util.Set<java.lang.String> getAllowedMethods()
+meth public abstract void setEntityStream(java.io.InputStream)
+meth public abstract void setStatus(int)
+meth public abstract void setStatusInfo(jakarta.ws.rs.core.Response$StatusType)
+
+CLSS public abstract interface jakarta.ws.rs.client.ClientResponseFilter
+meth public abstract void filter(jakarta.ws.rs.client.ClientRequestContext,jakarta.ws.rs.client.ClientResponseContext) throws java.io.IOException
+
+CLSS public abstract interface jakarta.ws.rs.client.CompletionStageRxInvoker
+intf jakarta.ws.rs.client.RxInvoker<java.util.concurrent.CompletionStage>
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.CompletionStage<{%%0}> delete(jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.CompletionStage<{%%0}> delete(java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.CompletionStage<{%%0}> get(jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.CompletionStage<{%%0}> get(java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.CompletionStage<{%%0}> method(java.lang.String,jakarta.ws.rs.client.Entity<?>,jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.CompletionStage<{%%0}> method(java.lang.String,jakarta.ws.rs.client.Entity<?>,java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.CompletionStage<{%%0}> method(java.lang.String,jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.CompletionStage<{%%0}> method(java.lang.String,java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.CompletionStage<{%%0}> options(jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.CompletionStage<{%%0}> options(java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.CompletionStage<{%%0}> post(jakarta.ws.rs.client.Entity<?>,jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.CompletionStage<{%%0}> post(jakarta.ws.rs.client.Entity<?>,java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.CompletionStage<{%%0}> put(jakarta.ws.rs.client.Entity<?>,jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.CompletionStage<{%%0}> put(jakarta.ws.rs.client.Entity<?>,java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.CompletionStage<{%%0}> trace(jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.CompletionStage<{%%0}> trace(java.lang.Class<{%%0}>)
+meth public abstract java.util.concurrent.CompletionStage<jakarta.ws.rs.core.Response> delete()
+meth public abstract java.util.concurrent.CompletionStage<jakarta.ws.rs.core.Response> get()
+meth public abstract java.util.concurrent.CompletionStage<jakarta.ws.rs.core.Response> head()
+meth public abstract java.util.concurrent.CompletionStage<jakarta.ws.rs.core.Response> method(java.lang.String)
+meth public abstract java.util.concurrent.CompletionStage<jakarta.ws.rs.core.Response> method(java.lang.String,jakarta.ws.rs.client.Entity<?>)
+meth public abstract java.util.concurrent.CompletionStage<jakarta.ws.rs.core.Response> options()
+meth public abstract java.util.concurrent.CompletionStage<jakarta.ws.rs.core.Response> post(jakarta.ws.rs.client.Entity<?>)
+meth public abstract java.util.concurrent.CompletionStage<jakarta.ws.rs.core.Response> put(jakarta.ws.rs.client.Entity<?>)
+meth public abstract java.util.concurrent.CompletionStage<jakarta.ws.rs.core.Response> trace()
+
+CLSS public final jakarta.ws.rs.client.Entity<%0 extends java.lang.Object>
+meth public boolean equals(java.lang.Object)
+meth public int hashCode()
+meth public jakarta.ws.rs.core.MediaType getMediaType()
+meth public jakarta.ws.rs.core.Variant getVariant()
+meth public java.lang.String getEncoding()
+meth public java.lang.String toString()
+meth public java.lang.annotation.Annotation[] getAnnotations()
+meth public java.util.Locale getLanguage()
+meth public static <%0 extends java.lang.Object> jakarta.ws.rs.client.Entity<{%%0}> entity({%%0},jakarta.ws.rs.core.MediaType)
+meth public static <%0 extends java.lang.Object> jakarta.ws.rs.client.Entity<{%%0}> entity({%%0},jakarta.ws.rs.core.MediaType,java.lang.annotation.Annotation[])
+meth public static <%0 extends java.lang.Object> jakarta.ws.rs.client.Entity<{%%0}> entity({%%0},jakarta.ws.rs.core.Variant)
+meth public static <%0 extends java.lang.Object> jakarta.ws.rs.client.Entity<{%%0}> entity({%%0},jakarta.ws.rs.core.Variant,java.lang.annotation.Annotation[])
+meth public static <%0 extends java.lang.Object> jakarta.ws.rs.client.Entity<{%%0}> entity({%%0},java.lang.String)
+meth public static <%0 extends java.lang.Object> jakarta.ws.rs.client.Entity<{%%0}> html({%%0})
+meth public static <%0 extends java.lang.Object> jakarta.ws.rs.client.Entity<{%%0}> json({%%0})
+meth public static <%0 extends java.lang.Object> jakarta.ws.rs.client.Entity<{%%0}> text({%%0})
+meth public static <%0 extends java.lang.Object> jakarta.ws.rs.client.Entity<{%%0}> xhtml({%%0})
+meth public static <%0 extends java.lang.Object> jakarta.ws.rs.client.Entity<{%%0}> xml({%%0})
+meth public static jakarta.ws.rs.client.Entity<jakarta.ws.rs.core.Form> form(jakarta.ws.rs.core.Form)
+meth public static jakarta.ws.rs.client.Entity<jakarta.ws.rs.core.Form> form(jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.String>)
+meth public {jakarta.ws.rs.client.Entity%0} getEntity()
+supr java.lang.Object
+hfds EMPTY_ANNOTATIONS,annotations,entity,variant
+
+CLSS public abstract interface jakarta.ws.rs.client.Invocation
+innr public abstract interface static Builder
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> submit(jakarta.ws.rs.client.InvocationCallback<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> submit(jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> java.util.concurrent.Future<{%%0}> submit(java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {%%0} invoke(jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {%%0} invoke(java.lang.Class<{%%0}>)
+meth public abstract jakarta.ws.rs.client.Invocation property(java.lang.String,java.lang.Object)
+meth public abstract jakarta.ws.rs.core.Response invoke()
+meth public abstract java.util.concurrent.Future<jakarta.ws.rs.core.Response> submit()
+
+CLSS public abstract interface static jakarta.ws.rs.client.Invocation$Builder
+ outer jakarta.ws.rs.client.Invocation
+intf jakarta.ws.rs.client.SyncInvoker
+meth public abstract !varargs jakarta.ws.rs.client.Invocation$Builder accept(jakarta.ws.rs.core.MediaType[])
+meth public abstract !varargs jakarta.ws.rs.client.Invocation$Builder accept(java.lang.String[])
+meth public abstract !varargs jakarta.ws.rs.client.Invocation$Builder acceptEncoding(java.lang.String[])
+meth public abstract !varargs jakarta.ws.rs.client.Invocation$Builder acceptLanguage(java.lang.String[])
+meth public abstract !varargs jakarta.ws.rs.client.Invocation$Builder acceptLanguage(java.util.Locale[])
+meth public abstract <%0 extends jakarta.ws.rs.client.RxInvoker> {%%0} rx(java.lang.Class<{%%0}>)
+meth public abstract jakarta.ws.rs.client.AsyncInvoker async()
+meth public abstract jakarta.ws.rs.client.CompletionStageRxInvoker rx()
+meth public abstract jakarta.ws.rs.client.Invocation build(java.lang.String)
+meth public abstract jakarta.ws.rs.client.Invocation build(java.lang.String,jakarta.ws.rs.client.Entity<?>)
+meth public abstract jakarta.ws.rs.client.Invocation buildDelete()
+meth public abstract jakarta.ws.rs.client.Invocation buildGet()
+meth public abstract jakarta.ws.rs.client.Invocation buildPost(jakarta.ws.rs.client.Entity<?>)
+meth public abstract jakarta.ws.rs.client.Invocation buildPut(jakarta.ws.rs.client.Entity<?>)
+meth public abstract jakarta.ws.rs.client.Invocation$Builder cacheControl(jakarta.ws.rs.core.CacheControl)
+meth public abstract jakarta.ws.rs.client.Invocation$Builder cookie(jakarta.ws.rs.core.Cookie)
+meth public abstract jakarta.ws.rs.client.Invocation$Builder cookie(java.lang.String,java.lang.String)
+meth public abstract jakarta.ws.rs.client.Invocation$Builder header(java.lang.String,java.lang.Object)
+meth public abstract jakarta.ws.rs.client.Invocation$Builder headers(jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.Object>)
+meth public abstract jakarta.ws.rs.client.Invocation$Builder property(java.lang.String,java.lang.Object)
+
+CLSS public abstract interface jakarta.ws.rs.client.InvocationCallback<%0 extends java.lang.Object>
+meth public abstract void completed({jakarta.ws.rs.client.InvocationCallback%0})
+meth public abstract void failed(java.lang.Throwable)
+
+CLSS public jakarta.ws.rs.client.ResponseProcessingException
+cons public init(jakarta.ws.rs.core.Response,java.lang.String)
+cons public init(jakarta.ws.rs.core.Response,java.lang.String,java.lang.Throwable)
+cons public init(jakarta.ws.rs.core.Response,java.lang.Throwable)
+meth public jakarta.ws.rs.core.Response getResponse()
+supr jakarta.ws.rs.ProcessingException
+hfds response,serialVersionUID
+
+CLSS public abstract interface jakarta.ws.rs.client.RxInvoker<%0 extends java.lang.Object>
+meth public abstract <%0 extends java.lang.Object> {jakarta.ws.rs.client.RxInvoker%0} delete(jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {jakarta.ws.rs.client.RxInvoker%0} delete(java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {jakarta.ws.rs.client.RxInvoker%0} get(jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {jakarta.ws.rs.client.RxInvoker%0} get(java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {jakarta.ws.rs.client.RxInvoker%0} method(java.lang.String,jakarta.ws.rs.client.Entity<?>,jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {jakarta.ws.rs.client.RxInvoker%0} method(java.lang.String,jakarta.ws.rs.client.Entity<?>,java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {jakarta.ws.rs.client.RxInvoker%0} method(java.lang.String,jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {jakarta.ws.rs.client.RxInvoker%0} method(java.lang.String,java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {jakarta.ws.rs.client.RxInvoker%0} options(jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {jakarta.ws.rs.client.RxInvoker%0} options(java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {jakarta.ws.rs.client.RxInvoker%0} post(jakarta.ws.rs.client.Entity<?>,jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {jakarta.ws.rs.client.RxInvoker%0} post(jakarta.ws.rs.client.Entity<?>,java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {jakarta.ws.rs.client.RxInvoker%0} put(jakarta.ws.rs.client.Entity<?>,jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {jakarta.ws.rs.client.RxInvoker%0} put(jakarta.ws.rs.client.Entity<?>,java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {jakarta.ws.rs.client.RxInvoker%0} trace(jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {jakarta.ws.rs.client.RxInvoker%0} trace(java.lang.Class<{%%0}>)
+meth public abstract {jakarta.ws.rs.client.RxInvoker%0} delete()
+meth public abstract {jakarta.ws.rs.client.RxInvoker%0} get()
+meth public abstract {jakarta.ws.rs.client.RxInvoker%0} head()
+meth public abstract {jakarta.ws.rs.client.RxInvoker%0} method(java.lang.String)
+meth public abstract {jakarta.ws.rs.client.RxInvoker%0} method(java.lang.String,jakarta.ws.rs.client.Entity<?>)
+meth public abstract {jakarta.ws.rs.client.RxInvoker%0} options()
+meth public abstract {jakarta.ws.rs.client.RxInvoker%0} post(jakarta.ws.rs.client.Entity<?>)
+meth public abstract {jakarta.ws.rs.client.RxInvoker%0} put(jakarta.ws.rs.client.Entity<?>)
+meth public abstract {jakarta.ws.rs.client.RxInvoker%0} trace()
+
+CLSS public abstract interface jakarta.ws.rs.client.RxInvokerProvider<%0 extends jakarta.ws.rs.client.RxInvoker>
+meth public abstract boolean isProviderFor(java.lang.Class<?>)
+meth public abstract {jakarta.ws.rs.client.RxInvokerProvider%0} getRxInvoker(jakarta.ws.rs.client.SyncInvoker,java.util.concurrent.ExecutorService)
+
+CLSS public abstract interface jakarta.ws.rs.client.SyncInvoker
+meth public abstract <%0 extends java.lang.Object> {%%0} delete(jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {%%0} delete(java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {%%0} get(jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {%%0} get(java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {%%0} method(java.lang.String,jakarta.ws.rs.client.Entity<?>,jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {%%0} method(java.lang.String,jakarta.ws.rs.client.Entity<?>,java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {%%0} method(java.lang.String,jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {%%0} method(java.lang.String,java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {%%0} options(jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {%%0} options(java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {%%0} post(jakarta.ws.rs.client.Entity<?>,jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {%%0} post(jakarta.ws.rs.client.Entity<?>,java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {%%0} put(jakarta.ws.rs.client.Entity<?>,jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {%%0} put(jakarta.ws.rs.client.Entity<?>,java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {%%0} trace(jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {%%0} trace(java.lang.Class<{%%0}>)
+meth public abstract jakarta.ws.rs.core.Response delete()
+meth public abstract jakarta.ws.rs.core.Response get()
+meth public abstract jakarta.ws.rs.core.Response head()
+meth public abstract jakarta.ws.rs.core.Response method(java.lang.String)
+meth public abstract jakarta.ws.rs.core.Response method(java.lang.String,jakarta.ws.rs.client.Entity<?>)
+meth public abstract jakarta.ws.rs.core.Response options()
+meth public abstract jakarta.ws.rs.core.Response post(jakarta.ws.rs.client.Entity<?>)
+meth public abstract jakarta.ws.rs.core.Response put(jakarta.ws.rs.client.Entity<?>)
+meth public abstract jakarta.ws.rs.core.Response trace()
+
+CLSS public abstract interface jakarta.ws.rs.client.WebTarget
+intf jakarta.ws.rs.core.Configurable<jakarta.ws.rs.client.WebTarget>
+meth public abstract !varargs jakarta.ws.rs.client.Invocation$Builder request(jakarta.ws.rs.core.MediaType[])
+meth public abstract !varargs jakarta.ws.rs.client.Invocation$Builder request(java.lang.String[])
+meth public abstract !varargs jakarta.ws.rs.client.WebTarget matrixParam(java.lang.String,java.lang.Object[])
+meth public abstract !varargs jakarta.ws.rs.client.WebTarget queryParam(java.lang.String,java.lang.Object[])
+meth public abstract jakarta.ws.rs.client.Invocation$Builder request()
+meth public abstract jakarta.ws.rs.client.WebTarget path(java.lang.String)
+meth public abstract jakarta.ws.rs.client.WebTarget resolveTemplate(java.lang.String,java.lang.Object)
+meth public abstract jakarta.ws.rs.client.WebTarget resolveTemplate(java.lang.String,java.lang.Object,boolean)
+meth public abstract jakarta.ws.rs.client.WebTarget resolveTemplateFromEncoded(java.lang.String,java.lang.Object)
+meth public abstract jakarta.ws.rs.client.WebTarget resolveTemplates(java.util.Map<java.lang.String,java.lang.Object>)
+meth public abstract jakarta.ws.rs.client.WebTarget resolveTemplates(java.util.Map<java.lang.String,java.lang.Object>,boolean)
+meth public abstract jakarta.ws.rs.client.WebTarget resolveTemplatesFromEncoded(java.util.Map<java.lang.String,java.lang.Object>)
+meth public abstract jakarta.ws.rs.core.UriBuilder getUriBuilder()
+meth public abstract java.net.URI getUri()
+
+CLSS public abstract interface jakarta.ws.rs.container.AsyncResponse
+fld public final static long NO_TIMEOUT = 0
+meth public abstract !varargs java.util.Map<java.lang.Class<?>,java.util.Collection<java.lang.Class<?>>> register(java.lang.Class<?>,java.lang.Class<?>[])
+meth public abstract !varargs java.util.Map<java.lang.Class<?>,java.util.Collection<java.lang.Class<?>>> register(java.lang.Object,java.lang.Object[])
+meth public abstract boolean cancel()
+meth public abstract boolean cancel(int)
+meth public abstract boolean cancel(java.util.Date)
+meth public abstract boolean isCancelled()
+meth public abstract boolean isDone()
+meth public abstract boolean isSuspended()
+meth public abstract boolean resume(java.lang.Object)
+meth public abstract boolean resume(java.lang.Throwable)
+meth public abstract boolean setTimeout(long,java.util.concurrent.TimeUnit)
+meth public abstract java.util.Collection<java.lang.Class<?>> register(java.lang.Class<?>)
+meth public abstract java.util.Collection<java.lang.Class<?>> register(java.lang.Object)
+meth public abstract void setTimeoutHandler(jakarta.ws.rs.container.TimeoutHandler)
+
+CLSS public abstract interface jakarta.ws.rs.container.CompletionCallback
+meth public abstract void onComplete(java.lang.Throwable)
+
+CLSS public abstract interface jakarta.ws.rs.container.ConnectionCallback
+meth public abstract void onDisconnect(jakarta.ws.rs.container.AsyncResponse)
+
+CLSS public abstract interface jakarta.ws.rs.container.ContainerRequestContext
+meth public abstract boolean hasEntity()
+meth public abstract int getLength()
+meth public abstract jakarta.ws.rs.core.MediaType getMediaType()
+meth public abstract jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.String> getHeaders()
+meth public abstract jakarta.ws.rs.core.Request getRequest()
+meth public abstract jakarta.ws.rs.core.SecurityContext getSecurityContext()
+meth public abstract jakarta.ws.rs.core.UriInfo getUriInfo()
+meth public abstract java.io.InputStream getEntityStream()
+meth public abstract java.lang.Object getProperty(java.lang.String)
+meth public abstract java.lang.String getHeaderString(java.lang.String)
+meth public abstract java.lang.String getMethod()
+meth public abstract java.util.Collection<java.lang.String> getPropertyNames()
+meth public abstract java.util.Date getDate()
+meth public abstract java.util.List<jakarta.ws.rs.core.MediaType> getAcceptableMediaTypes()
+meth public abstract java.util.List<java.util.Locale> getAcceptableLanguages()
+meth public abstract java.util.Locale getLanguage()
+meth public abstract java.util.Map<java.lang.String,jakarta.ws.rs.core.Cookie> getCookies()
+meth public abstract void abortWith(jakarta.ws.rs.core.Response)
+meth public abstract void removeProperty(java.lang.String)
+meth public abstract void setEntityStream(java.io.InputStream)
+meth public abstract void setMethod(java.lang.String)
+meth public abstract void setProperty(java.lang.String,java.lang.Object)
+meth public abstract void setRequestUri(java.net.URI)
+meth public abstract void setRequestUri(java.net.URI,java.net.URI)
+meth public abstract void setSecurityContext(jakarta.ws.rs.core.SecurityContext)
+meth public boolean hasProperty(java.lang.String)
+
+CLSS public abstract interface jakarta.ws.rs.container.ContainerRequestFilter
+meth public abstract void filter(jakarta.ws.rs.container.ContainerRequestContext) throws java.io.IOException
+
+CLSS public abstract interface jakarta.ws.rs.container.ContainerResponseContext
+meth public abstract boolean hasEntity()
+meth public abstract boolean hasLink(java.lang.String)
+meth public abstract int getLength()
+meth public abstract int getStatus()
+meth public abstract jakarta.ws.rs.core.EntityTag getEntityTag()
+meth public abstract jakarta.ws.rs.core.Link getLink(java.lang.String)
+meth public abstract jakarta.ws.rs.core.Link$Builder getLinkBuilder(java.lang.String)
+meth public abstract jakarta.ws.rs.core.MediaType getMediaType()
+meth public abstract jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.Object> getHeaders()
+meth public abstract jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.String> getStringHeaders()
+meth public abstract jakarta.ws.rs.core.Response$StatusType getStatusInfo()
+meth public abstract java.io.OutputStream getEntityStream()
+meth public abstract java.lang.Class<?> getEntityClass()
+meth public abstract java.lang.Object getEntity()
+meth public abstract java.lang.String getHeaderString(java.lang.String)
+meth public abstract java.lang.annotation.Annotation[] getEntityAnnotations()
+meth public abstract java.lang.reflect.Type getEntityType()
+meth public abstract java.net.URI getLocation()
+meth public abstract java.util.Date getDate()
+meth public abstract java.util.Date getLastModified()
+meth public abstract java.util.Locale getLanguage()
+meth public abstract java.util.Map<java.lang.String,jakarta.ws.rs.core.NewCookie> getCookies()
+meth public abstract java.util.Set<jakarta.ws.rs.core.Link> getLinks()
+meth public abstract java.util.Set<java.lang.String> getAllowedMethods()
+meth public abstract void setEntity(java.lang.Object)
+meth public abstract void setEntity(java.lang.Object,java.lang.annotation.Annotation[],jakarta.ws.rs.core.MediaType)
+meth public abstract void setEntityStream(java.io.OutputStream)
+meth public abstract void setStatus(int)
+meth public abstract void setStatusInfo(jakarta.ws.rs.core.Response$StatusType)
+
+CLSS public abstract interface jakarta.ws.rs.container.ContainerResponseFilter
+meth public abstract void filter(jakarta.ws.rs.container.ContainerRequestContext,jakarta.ws.rs.container.ContainerResponseContext) throws java.io.IOException
+
+CLSS public abstract interface jakarta.ws.rs.container.DynamicFeature
+meth public abstract void configure(jakarta.ws.rs.container.ResourceInfo,jakarta.ws.rs.core.FeatureContext)
+
+CLSS public abstract interface !annotation jakarta.ws.rs.container.PreMatching
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[TYPE])
+intf java.lang.annotation.Annotation
+
+CLSS public abstract interface jakarta.ws.rs.container.ResourceContext
+meth public abstract <%0 extends java.lang.Object> {%%0} getResource(java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {%%0} initResource({%%0})
+
+CLSS public abstract interface jakarta.ws.rs.container.ResourceInfo
+meth public abstract java.lang.Class<?> getResourceClass()
+meth public abstract java.lang.reflect.Method getResourceMethod()
+
+CLSS public abstract interface !annotation jakarta.ws.rs.container.Suspended
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[PARAMETER])
+intf java.lang.annotation.Annotation
+
+CLSS public abstract interface jakarta.ws.rs.container.TimeoutHandler
+meth public abstract void handleTimeout(jakarta.ws.rs.container.AsyncResponse)
+
+CLSS public abstract jakarta.ws.rs.core.AbstractMultivaluedMap<%0 extends java.lang.Object, %1 extends java.lang.Object>
+cons public init(java.util.Map<{jakarta.ws.rs.core.AbstractMultivaluedMap%0},java.util.List<{jakarta.ws.rs.core.AbstractMultivaluedMap%1}>>)
+fld protected final java.util.Map<{jakarta.ws.rs.core.AbstractMultivaluedMap%0},java.util.List<{jakarta.ws.rs.core.AbstractMultivaluedMap%1}>> store
+intf jakarta.ws.rs.core.MultivaluedMap<{jakarta.ws.rs.core.AbstractMultivaluedMap%0},{jakarta.ws.rs.core.AbstractMultivaluedMap%1}>
+intf java.io.Serializable
+meth protected final java.util.List<{jakarta.ws.rs.core.AbstractMultivaluedMap%1}> getValues({jakarta.ws.rs.core.AbstractMultivaluedMap%0})
+meth protected void addFirstNull(java.util.List<{jakarta.ws.rs.core.AbstractMultivaluedMap%1}>)
+meth protected void addNull(java.util.List<{jakarta.ws.rs.core.AbstractMultivaluedMap%1}>)
+meth public !varargs final void addAll({jakarta.ws.rs.core.AbstractMultivaluedMap%0},{jakarta.ws.rs.core.AbstractMultivaluedMap%1}[])
+meth public boolean containsKey(java.lang.Object)
+meth public boolean containsValue(java.lang.Object)
+meth public boolean equals(java.lang.Object)
+meth public boolean equalsIgnoreValueOrder(jakarta.ws.rs.core.MultivaluedMap<{jakarta.ws.rs.core.AbstractMultivaluedMap%0},{jakarta.ws.rs.core.AbstractMultivaluedMap%1}>)
+meth public boolean isEmpty()
+meth public final void add({jakarta.ws.rs.core.AbstractMultivaluedMap%0},{jakarta.ws.rs.core.AbstractMultivaluedMap%1})
+meth public final void addAll({jakarta.ws.rs.core.AbstractMultivaluedMap%0},java.util.List<{jakarta.ws.rs.core.AbstractMultivaluedMap%1}>)
+meth public final void addFirst({jakarta.ws.rs.core.AbstractMultivaluedMap%0},{jakarta.ws.rs.core.AbstractMultivaluedMap%1})
+meth public final void putSingle({jakarta.ws.rs.core.AbstractMultivaluedMap%0},{jakarta.ws.rs.core.AbstractMultivaluedMap%1})
+meth public final {jakarta.ws.rs.core.AbstractMultivaluedMap%1} getFirst({jakarta.ws.rs.core.AbstractMultivaluedMap%0})
+meth public int hashCode()
+meth public int size()
+meth public java.lang.String toString()
+meth public java.util.Collection<java.util.List<{jakarta.ws.rs.core.AbstractMultivaluedMap%1}>> values()
+meth public java.util.List<{jakarta.ws.rs.core.AbstractMultivaluedMap%1}> get(java.lang.Object)
+meth public java.util.List<{jakarta.ws.rs.core.AbstractMultivaluedMap%1}> put({jakarta.ws.rs.core.AbstractMultivaluedMap%0},java.util.List<{jakarta.ws.rs.core.AbstractMultivaluedMap%1}>)
+meth public java.util.List<{jakarta.ws.rs.core.AbstractMultivaluedMap%1}> remove(java.lang.Object)
+meth public java.util.Set<java.util.Map$Entry<{jakarta.ws.rs.core.AbstractMultivaluedMap%0},java.util.List<{jakarta.ws.rs.core.AbstractMultivaluedMap%1}>>> entrySet()
+meth public java.util.Set<{jakarta.ws.rs.core.AbstractMultivaluedMap%0}> keySet()
+meth public void clear()
+meth public void putAll(java.util.Map<? extends {jakarta.ws.rs.core.AbstractMultivaluedMap%0},? extends java.util.List<{jakarta.ws.rs.core.AbstractMultivaluedMap%1}>>)
+supr java.lang.Object
+
+CLSS public jakarta.ws.rs.core.Application
+cons public init()
+meth public java.util.Map<java.lang.String,java.lang.Object> getProperties()
+meth public java.util.Set<java.lang.Class<?>> getClasses()
+meth public java.util.Set<java.lang.Object> getSingletons()
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+supr java.lang.Object
+
+CLSS public jakarta.ws.rs.core.CacheControl
+cons public init()
+meth public boolean equals(java.lang.Object)
+meth public boolean isMustRevalidate()
+meth public boolean isNoCache()
+meth public boolean isNoStore()
+meth public boolean isNoTransform()
+meth public boolean isPrivate()
+meth public boolean isProxyRevalidate()
+meth public int getMaxAge()
+meth public int getSMaxAge()
+meth public int hashCode()
+meth public java.lang.String toString()
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+meth public java.util.List<java.lang.String> getNoCacheFields()
+meth public java.util.List<java.lang.String> getPrivateFields()
+meth public java.util.Map<java.lang.String,java.lang.String> getCacheExtension()
+meth public static jakarta.ws.rs.core.CacheControl valueOf(java.lang.String)
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+meth public void setMaxAge(int)
+meth public void setMustRevalidate(boolean)
+meth public void setNoCache(boolean)
+meth public void setNoStore(boolean)
+meth public void setNoTransform(boolean)
+meth public void setPrivate(boolean)
+meth public void setProxyRevalidate(boolean)
+meth public void setSMaxAge(int)
+supr java.lang.Object
+hfds HEADER_DELEGATE,cacheExtension,maxAge,mustRevalidate,noCache,noCacheFields,noStore,noTransform,privateFields,privateFlag,proxyRevalidate,sMaxAge
+
+CLSS public abstract interface jakarta.ws.rs.core.Configurable<%0 extends jakarta.ws.rs.core.Configurable>
+meth public abstract !varargs {jakarta.ws.rs.core.Configurable%0} register(java.lang.Class<?>,java.lang.Class<?>[])
+meth public abstract !varargs {jakarta.ws.rs.core.Configurable%0} register(java.lang.Object,java.lang.Class<?>[])
+meth public abstract jakarta.ws.rs.core.Configuration getConfiguration()
+meth public abstract {jakarta.ws.rs.core.Configurable%0} property(java.lang.String,java.lang.Object)
+meth public abstract {jakarta.ws.rs.core.Configurable%0} register(java.lang.Class<?>)
+meth public abstract {jakarta.ws.rs.core.Configurable%0} register(java.lang.Class<?>,int)
+meth public abstract {jakarta.ws.rs.core.Configurable%0} register(java.lang.Class<?>,java.util.Map<java.lang.Class<?>,java.lang.Integer>)
+meth public abstract {jakarta.ws.rs.core.Configurable%0} register(java.lang.Object)
+meth public abstract {jakarta.ws.rs.core.Configurable%0} register(java.lang.Object,int)
+meth public abstract {jakarta.ws.rs.core.Configurable%0} register(java.lang.Object,java.util.Map<java.lang.Class<?>,java.lang.Integer>)
+
+CLSS public abstract interface jakarta.ws.rs.core.Configuration
+meth public abstract boolean isEnabled(jakarta.ws.rs.core.Feature)
+meth public abstract boolean isEnabled(java.lang.Class<? extends jakarta.ws.rs.core.Feature>)
+meth public abstract boolean isRegistered(java.lang.Class<?>)
+meth public abstract boolean isRegistered(java.lang.Object)
+meth public abstract jakarta.ws.rs.RuntimeType getRuntimeType()
+meth public abstract java.lang.Object getProperty(java.lang.String)
+meth public abstract java.util.Collection<java.lang.String> getPropertyNames()
+meth public abstract java.util.Map<java.lang.Class<?>,java.lang.Integer> getContracts(java.lang.Class<?>)
+meth public abstract java.util.Map<java.lang.String,java.lang.Object> getProperties()
+meth public abstract java.util.Set<java.lang.Class<?>> getClasses()
+meth public abstract java.util.Set<java.lang.Object> getInstances()
+meth public boolean hasProperty(java.lang.String)
+
+CLSS public abstract interface !annotation jakarta.ws.rs.core.Context
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[PARAMETER, METHOD, FIELD])
+intf java.lang.annotation.Annotation
+
+CLSS public jakarta.ws.rs.core.Cookie
+cons protected init(jakarta.ws.rs.core.Cookie$AbstractCookieBuilder<?>)
+cons public init(java.lang.String,java.lang.String)
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+cons public init(java.lang.String,java.lang.String,java.lang.String,java.lang.String)
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+cons public init(java.lang.String,java.lang.String,java.lang.String,java.lang.String,int)
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+fld public final static int DEFAULT_VERSION = 1
+innr public abstract static AbstractCookieBuilder
+innr public static Builder
+meth public boolean equals(java.lang.Object)
+meth public int getVersion()
+meth public int hashCode()
+meth public java.lang.String getDomain()
+meth public java.lang.String getName()
+meth public java.lang.String getPath()
+meth public java.lang.String getValue()
+meth public java.lang.String toString()
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+meth public static jakarta.ws.rs.core.Cookie valueOf(java.lang.String)
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+supr java.lang.Object
+hfds HEADER_DELEGATE,domain,name,path,value,version
+
+CLSS public abstract static jakarta.ws.rs.core.Cookie$AbstractCookieBuilder<%0 extends jakarta.ws.rs.core.Cookie$AbstractCookieBuilder<{jakarta.ws.rs.core.Cookie$AbstractCookieBuilder%0}>>
+ outer jakarta.ws.rs.core.Cookie
+cons public init(java.lang.String)
+meth public abstract jakarta.ws.rs.core.Cookie build()
+meth public {jakarta.ws.rs.core.Cookie$AbstractCookieBuilder%0} domain(java.lang.String)
+meth public {jakarta.ws.rs.core.Cookie$AbstractCookieBuilder%0} path(java.lang.String)
+meth public {jakarta.ws.rs.core.Cookie$AbstractCookieBuilder%0} value(java.lang.String)
+meth public {jakarta.ws.rs.core.Cookie$AbstractCookieBuilder%0} version(int)
+supr java.lang.Object
+hfds domain,name,path,value,version
+
+CLSS public static jakarta.ws.rs.core.Cookie$Builder
+ outer jakarta.ws.rs.core.Cookie
+cons public init(java.lang.String)
+meth public jakarta.ws.rs.core.Cookie build()
+supr jakarta.ws.rs.core.Cookie$AbstractCookieBuilder<jakarta.ws.rs.core.Cookie$Builder>
+
+CLSS public abstract interface jakarta.ws.rs.core.EntityPart
+innr public abstract interface static Builder
+meth public abstract <%0 extends java.lang.Object> {%%0} getContent(jakarta.ws.rs.core.GenericType<{%%0}>) throws java.io.IOException
+meth public abstract <%0 extends java.lang.Object> {%%0} getContent(java.lang.Class<{%%0}>) throws java.io.IOException
+meth public abstract jakarta.ws.rs.core.MediaType getMediaType()
+meth public abstract jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.String> getHeaders()
+meth public abstract java.io.InputStream getContent()
+meth public abstract java.lang.String getName()
+meth public abstract java.util.Optional<java.lang.String> getFileName()
+meth public static jakarta.ws.rs.core.EntityPart$Builder withFileName(java.lang.String)
+meth public static jakarta.ws.rs.core.EntityPart$Builder withName(java.lang.String)
+
+CLSS public abstract interface static jakarta.ws.rs.core.EntityPart$Builder
+ outer jakarta.ws.rs.core.EntityPart
+meth public abstract !varargs jakarta.ws.rs.core.EntityPart$Builder header(java.lang.String,java.lang.String[])
+meth public abstract <%0 extends java.lang.Object> jakarta.ws.rs.core.EntityPart$Builder content({%%0},jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> jakarta.ws.rs.core.EntityPart$Builder content({%%0},java.lang.Class<? extends {%%0}>)
+meth public abstract jakarta.ws.rs.core.EntityPart build() throws java.io.IOException
+meth public abstract jakarta.ws.rs.core.EntityPart$Builder content(java.io.InputStream)
+meth public abstract jakarta.ws.rs.core.EntityPart$Builder fileName(java.lang.String)
+meth public abstract jakarta.ws.rs.core.EntityPart$Builder headers(jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.String>)
+meth public abstract jakarta.ws.rs.core.EntityPart$Builder mediaType(jakarta.ws.rs.core.MediaType)
+meth public abstract jakarta.ws.rs.core.EntityPart$Builder mediaType(java.lang.String)
+meth public jakarta.ws.rs.core.EntityPart$Builder content(java.lang.Object)
+meth public jakarta.ws.rs.core.EntityPart$Builder content(java.lang.String,java.io.InputStream)
+
+CLSS public jakarta.ws.rs.core.EntityTag
+cons public init(java.lang.String)
+cons public init(java.lang.String,boolean)
+meth public boolean equals(java.lang.Object)
+meth public boolean isWeak()
+meth public int hashCode()
+meth public java.lang.String getValue()
+meth public java.lang.String toString()
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+meth public static jakarta.ws.rs.core.EntityTag valueOf(java.lang.String)
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+supr java.lang.Object
+hfds HEADER_DELEGATE,value,weak
+
+CLSS public abstract interface jakarta.ws.rs.core.Feature
+meth public abstract boolean configure(jakarta.ws.rs.core.FeatureContext)
+
+CLSS public abstract interface jakarta.ws.rs.core.FeatureContext
+intf jakarta.ws.rs.core.Configurable<jakarta.ws.rs.core.FeatureContext>
+
+CLSS public jakarta.ws.rs.core.Form
+cons public init()
+cons public init(jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.String>)
+cons public init(java.lang.String,java.lang.String)
+meth public jakarta.ws.rs.core.Form param(java.lang.String,java.lang.String)
+meth public jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.String> asMap()
+supr java.lang.Object
+hfds parameters
+
+CLSS public jakarta.ws.rs.core.GenericEntity<%0 extends java.lang.Object>
+cons protected init({jakarta.ws.rs.core.GenericEntity%0})
+cons public init({jakarta.ws.rs.core.GenericEntity%0},java.lang.reflect.Type)
+meth public boolean equals(java.lang.Object)
+meth public final java.lang.Class<?> getRawType()
+meth public final java.lang.reflect.Type getType()
+meth public final {jakarta.ws.rs.core.GenericEntity%0} getEntity()
+meth public int hashCode()
+meth public java.lang.String toString()
+supr java.lang.Object
+hfds entity,rawType,type
+
+CLSS public jakarta.ws.rs.core.GenericType<%0 extends java.lang.Object>
+cons protected init()
+cons public init(java.lang.reflect.Type)
+meth public boolean equals(java.lang.Object)
+meth public final java.lang.Class<?> getRawType()
+meth public final java.lang.reflect.Type getType()
+meth public int hashCode()
+meth public java.lang.String toString()
+meth public static jakarta.ws.rs.core.GenericType forInstance(java.lang.Object)
+supr java.lang.Object
+hfds rawType,type
+
+CLSS public abstract interface jakarta.ws.rs.core.HttpHeaders
+fld public final static java.lang.String ACCEPT = "Accept"
+fld public final static java.lang.String ACCEPT_CHARSET = "Accept-Charset"
+fld public final static java.lang.String ACCEPT_ENCODING = "Accept-Encoding"
+fld public final static java.lang.String ACCEPT_LANGUAGE = "Accept-Language"
+fld public final static java.lang.String ALLOW = "Allow"
+fld public final static java.lang.String AUTHORIZATION = "Authorization"
+fld public final static java.lang.String CACHE_CONTROL = "Cache-Control"
+fld public final static java.lang.String CONTENT_DISPOSITION = "Content-Disposition"
+fld public final static java.lang.String CONTENT_ENCODING = "Content-Encoding"
+fld public final static java.lang.String CONTENT_ID = "Content-ID"
+fld public final static java.lang.String CONTENT_LANGUAGE = "Content-Language"
+fld public final static java.lang.String CONTENT_LENGTH = "Content-Length"
+fld public final static java.lang.String CONTENT_LOCATION = "Content-Location"
+fld public final static java.lang.String CONTENT_TYPE = "Content-Type"
+fld public final static java.lang.String COOKIE = "Cookie"
+fld public final static java.lang.String DATE = "Date"
+fld public final static java.lang.String ETAG = "ETag"
+fld public final static java.lang.String EXPECT = "Expect"
+fld public final static java.lang.String EXPIRES = "Expires"
+fld public final static java.lang.String HOST = "Host"
+fld public final static java.lang.String IF_MATCH = "If-Match"
+fld public final static java.lang.String IF_MODIFIED_SINCE = "If-Modified-Since"
+fld public final static java.lang.String IF_NONE_MATCH = "If-None-Match"
+fld public final static java.lang.String IF_UNMODIFIED_SINCE = "If-Unmodified-Since"
+fld public final static java.lang.String LAST_EVENT_ID_HEADER = "Last-Event-ID"
+fld public final static java.lang.String LAST_MODIFIED = "Last-Modified"
+fld public final static java.lang.String LINK = "Link"
+fld public final static java.lang.String LOCATION = "Location"
+fld public final static java.lang.String RETRY_AFTER = "Retry-After"
+fld public final static java.lang.String SET_COOKIE = "Set-Cookie"
+fld public final static java.lang.String USER_AGENT = "User-Agent"
+fld public final static java.lang.String VARY = "Vary"
+fld public final static java.lang.String WWW_AUTHENTICATE = "WWW-Authenticate"
+meth public abstract int getLength()
+meth public abstract jakarta.ws.rs.core.MediaType getMediaType()
+meth public abstract jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.String> getRequestHeaders()
+meth public abstract java.lang.String getHeaderString(java.lang.String)
+meth public abstract java.util.Date getDate()
+meth public abstract java.util.List<jakarta.ws.rs.core.MediaType> getAcceptableMediaTypes()
+meth public abstract java.util.List<java.lang.String> getRequestHeader(java.lang.String)
+meth public abstract java.util.List<java.util.Locale> getAcceptableLanguages()
+meth public abstract java.util.Locale getLanguage()
+meth public abstract java.util.Map<java.lang.String,jakarta.ws.rs.core.Cookie> getCookies()
+
+CLSS public abstract jakarta.ws.rs.core.Link
+cons public init()
+fld public final static java.lang.String REL = "rel"
+fld public final static java.lang.String TITLE = "title"
+fld public final static java.lang.String TYPE = "type"
+innr public abstract interface static Builder
+innr public static JaxbAdapter
+innr public static JaxbLink
+meth public abstract jakarta.ws.rs.core.UriBuilder getUriBuilder()
+meth public abstract java.lang.String getRel()
+meth public abstract java.lang.String getTitle()
+meth public abstract java.lang.String getType()
+meth public abstract java.lang.String toString()
+meth public abstract java.net.URI getUri()
+meth public abstract java.util.List<java.lang.String> getRels()
+meth public abstract java.util.Map<java.lang.String,java.lang.String> getParams()
+meth public static jakarta.ws.rs.core.Link valueOf(java.lang.String)
+meth public static jakarta.ws.rs.core.Link$Builder fromLink(jakarta.ws.rs.core.Link)
+meth public static jakarta.ws.rs.core.Link$Builder fromMethod(java.lang.Class<?>,java.lang.String)
+meth public static jakarta.ws.rs.core.Link$Builder fromPath(java.lang.String)
+meth public static jakarta.ws.rs.core.Link$Builder fromResource(java.lang.Class<?>)
+meth public static jakarta.ws.rs.core.Link$Builder fromUri(java.lang.String)
+meth public static jakarta.ws.rs.core.Link$Builder fromUri(java.net.URI)
+meth public static jakarta.ws.rs.core.Link$Builder fromUriBuilder(jakarta.ws.rs.core.UriBuilder)
+supr java.lang.Object
+
+CLSS public abstract interface static jakarta.ws.rs.core.Link$Builder
+ outer jakarta.ws.rs.core.Link
+meth public abstract !varargs jakarta.ws.rs.core.Link build(java.lang.Object[])
+meth public abstract !varargs jakarta.ws.rs.core.Link buildRelativized(java.net.URI,java.lang.Object[])
+meth public abstract jakarta.ws.rs.core.Link$Builder baseUri(java.lang.String)
+meth public abstract jakarta.ws.rs.core.Link$Builder baseUri(java.net.URI)
+meth public abstract jakarta.ws.rs.core.Link$Builder link(jakarta.ws.rs.core.Link)
+meth public abstract jakarta.ws.rs.core.Link$Builder link(java.lang.String)
+meth public abstract jakarta.ws.rs.core.Link$Builder param(java.lang.String,java.lang.String)
+meth public abstract jakarta.ws.rs.core.Link$Builder rel(java.lang.String)
+meth public abstract jakarta.ws.rs.core.Link$Builder title(java.lang.String)
+meth public abstract jakarta.ws.rs.core.Link$Builder type(java.lang.String)
+meth public abstract jakarta.ws.rs.core.Link$Builder uri(java.lang.String)
+meth public abstract jakarta.ws.rs.core.Link$Builder uri(java.net.URI)
+meth public abstract jakarta.ws.rs.core.Link$Builder uriBuilder(jakarta.ws.rs.core.UriBuilder)
+
+CLSS public static jakarta.ws.rs.core.Link$JaxbAdapter
+ outer jakarta.ws.rs.core.Link
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+cons public init()
+meth public jakarta.ws.rs.core.Link unmarshal(jakarta.ws.rs.core.Link$JaxbLink)
+meth public jakarta.ws.rs.core.Link$JaxbLink marshal(jakarta.ws.rs.core.Link)
+supr jakarta.xml.bind.annotation.adapters.XmlAdapter<jakarta.ws.rs.core.Link$JaxbLink,jakarta.ws.rs.core.Link>
+
+CLSS public static jakarta.ws.rs.core.Link$JaxbLink
+ outer jakarta.ws.rs.core.Link
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+cons public init()
+cons public init(java.net.URI)
+cons public init(java.net.URI,java.util.Map<javax.xml.namespace.QName,java.lang.Object>)
+meth public boolean equals(java.lang.Object)
+meth public int hashCode()
+meth public java.net.URI getUri()
+meth public java.util.Map<javax.xml.namespace.QName,java.lang.Object> getParams()
+supr java.lang.Object
+hfds params,uri
+
+CLSS public jakarta.ws.rs.core.MediaType
+cons public init()
+cons public init(java.lang.String,java.lang.String)
+cons public init(java.lang.String,java.lang.String,java.lang.String)
+cons public init(java.lang.String,java.lang.String,java.util.Map<java.lang.String,java.lang.String>)
+fld public final static jakarta.ws.rs.core.MediaType APPLICATION_ATOM_XML_TYPE
+fld public final static jakarta.ws.rs.core.MediaType APPLICATION_FORM_URLENCODED_TYPE
+fld public final static jakarta.ws.rs.core.MediaType APPLICATION_JSON_PATCH_JSON_TYPE
+fld public final static jakarta.ws.rs.core.MediaType APPLICATION_JSON_TYPE
+fld public final static jakarta.ws.rs.core.MediaType APPLICATION_OCTET_STREAM_TYPE
+fld public final static jakarta.ws.rs.core.MediaType APPLICATION_SVG_XML_TYPE
+fld public final static jakarta.ws.rs.core.MediaType APPLICATION_XHTML_XML_TYPE
+fld public final static jakarta.ws.rs.core.MediaType APPLICATION_XML_TYPE
+fld public final static jakarta.ws.rs.core.MediaType MULTIPART_FORM_DATA_TYPE
+fld public final static jakarta.ws.rs.core.MediaType SERVER_SENT_EVENTS_TYPE
+fld public final static jakarta.ws.rs.core.MediaType TEXT_HTML_TYPE
+fld public final static jakarta.ws.rs.core.MediaType TEXT_PLAIN_TYPE
+fld public final static jakarta.ws.rs.core.MediaType TEXT_XML_TYPE
+fld public final static jakarta.ws.rs.core.MediaType WILDCARD_TYPE
+fld public final static java.lang.String APPLICATION_ATOM_XML = "application/atom+xml"
+fld public final static java.lang.String APPLICATION_FORM_URLENCODED = "application/x-www-form-urlencoded"
+fld public final static java.lang.String APPLICATION_JSON = "application/json"
+fld public final static java.lang.String APPLICATION_JSON_PATCH_JSON = "application/json-patch+json"
+fld public final static java.lang.String APPLICATION_OCTET_STREAM = "application/octet-stream"
+fld public final static java.lang.String APPLICATION_SVG_XML = "application/svg+xml"
+fld public final static java.lang.String APPLICATION_XHTML_XML = "application/xhtml+xml"
+fld public final static java.lang.String APPLICATION_XML = "application/xml"
+fld public final static java.lang.String CHARSET_PARAMETER = "charset"
+fld public final static java.lang.String MEDIA_TYPE_WILDCARD = "*"
+fld public final static java.lang.String MULTIPART_FORM_DATA = "multipart/form-data"
+fld public final static java.lang.String SERVER_SENT_EVENTS = "text/event-stream"
+fld public final static java.lang.String TEXT_HTML = "text/html"
+fld public final static java.lang.String TEXT_PLAIN = "text/plain"
+fld public final static java.lang.String TEXT_XML = "text/xml"
+fld public final static java.lang.String WILDCARD = "*/*"
+meth public boolean equals(java.lang.Object)
+meth public boolean isCompatible(jakarta.ws.rs.core.MediaType)
+meth public boolean isWildcardSubtype()
+meth public boolean isWildcardType()
+meth public int hashCode()
+meth public jakarta.ws.rs.core.MediaType withCharset(java.lang.String)
+meth public java.lang.String getSubtype()
+meth public java.lang.String getType()
+meth public java.lang.String toString()
+meth public java.util.Map<java.lang.String,java.lang.String> getParameters()
+meth public static jakarta.ws.rs.core.MediaType valueOf(java.lang.String)
+supr java.lang.Object
+hfds hash,parameters,subtype,type
+
+CLSS public jakarta.ws.rs.core.MultivaluedHashMap<%0 extends java.lang.Object, %1 extends java.lang.Object>
+cons public init()
+cons public init(int)
+cons public init(int,float)
+cons public init(jakarta.ws.rs.core.MultivaluedMap<? extends {jakarta.ws.rs.core.MultivaluedHashMap%0},? extends {jakarta.ws.rs.core.MultivaluedHashMap%1}>)
+cons public init(java.util.Map<? extends {jakarta.ws.rs.core.MultivaluedHashMap%0},? extends {jakarta.ws.rs.core.MultivaluedHashMap%1}>)
+intf java.io.Serializable
+supr jakarta.ws.rs.core.AbstractMultivaluedMap<{jakarta.ws.rs.core.MultivaluedHashMap%0},{jakarta.ws.rs.core.MultivaluedHashMap%1}>
+hfds serialVersionUID
+
+CLSS public abstract interface jakarta.ws.rs.core.MultivaluedMap<%0 extends java.lang.Object, %1 extends java.lang.Object>
+intf java.util.Map<{jakarta.ws.rs.core.MultivaluedMap%0},java.util.List<{jakarta.ws.rs.core.MultivaluedMap%1}>>
+meth public abstract !varargs void addAll({jakarta.ws.rs.core.MultivaluedMap%0},{jakarta.ws.rs.core.MultivaluedMap%1}[])
+meth public abstract boolean equalsIgnoreValueOrder(jakarta.ws.rs.core.MultivaluedMap<{jakarta.ws.rs.core.MultivaluedMap%0},{jakarta.ws.rs.core.MultivaluedMap%1}>)
+meth public abstract void add({jakarta.ws.rs.core.MultivaluedMap%0},{jakarta.ws.rs.core.MultivaluedMap%1})
+meth public abstract void addAll({jakarta.ws.rs.core.MultivaluedMap%0},java.util.List<{jakarta.ws.rs.core.MultivaluedMap%1}>)
+meth public abstract void addFirst({jakarta.ws.rs.core.MultivaluedMap%0},{jakarta.ws.rs.core.MultivaluedMap%1})
+meth public abstract void putSingle({jakarta.ws.rs.core.MultivaluedMap%0},{jakarta.ws.rs.core.MultivaluedMap%1})
+meth public abstract {jakarta.ws.rs.core.MultivaluedMap%1} getFirst({jakarta.ws.rs.core.MultivaluedMap%0})
+
+CLSS public jakarta.ws.rs.core.NewCookie
+cons protected init(jakarta.ws.rs.core.NewCookie$AbstractNewCookieBuilder<?>)
+cons public init(jakarta.ws.rs.core.Cookie)
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+cons public init(jakarta.ws.rs.core.Cookie,java.lang.String,int,boolean)
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+cons public init(jakarta.ws.rs.core.Cookie,java.lang.String,int,java.util.Date,boolean,boolean)
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+cons public init(jakarta.ws.rs.core.Cookie,java.lang.String,int,java.util.Date,boolean,boolean,jakarta.ws.rs.core.NewCookie$SameSite)
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+cons public init(java.lang.String,java.lang.String)
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+cons public init(java.lang.String,java.lang.String,java.lang.String,java.lang.String,int,java.lang.String,int,boolean)
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+cons public init(java.lang.String,java.lang.String,java.lang.String,java.lang.String,int,java.lang.String,int,java.util.Date,boolean,boolean)
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+cons public init(java.lang.String,java.lang.String,java.lang.String,java.lang.String,int,java.lang.String,int,java.util.Date,boolean,boolean,jakarta.ws.rs.core.NewCookie$SameSite)
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+cons public init(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,int,boolean)
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+cons public init(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,int,boolean,boolean)
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+fld public final static int DEFAULT_MAX_AGE = -1
+innr public abstract static AbstractNewCookieBuilder
+innr public final static !enum SameSite
+innr public static Builder
+meth public boolean equals(java.lang.Object)
+meth public boolean isHttpOnly()
+meth public boolean isSecure()
+meth public int getMaxAge()
+meth public int hashCode()
+meth public jakarta.ws.rs.core.Cookie toCookie()
+meth public jakarta.ws.rs.core.NewCookie$SameSite getSameSite()
+meth public java.lang.String getComment()
+meth public java.lang.String toString()
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+meth public java.util.Date getExpiry()
+meth public static jakarta.ws.rs.core.NewCookie valueOf(java.lang.String)
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="")
+supr jakarta.ws.rs.core.Cookie
+hfds DELEGATE,comment,expiry,httpOnly,maxAge,sameSite,secure
+
+CLSS public abstract static jakarta.ws.rs.core.NewCookie$AbstractNewCookieBuilder<%0 extends jakarta.ws.rs.core.NewCookie$AbstractNewCookieBuilder<{jakarta.ws.rs.core.NewCookie$AbstractNewCookieBuilder%0}>>
+ outer jakarta.ws.rs.core.NewCookie
+cons public init(jakarta.ws.rs.core.Cookie)
+cons public init(java.lang.String)
+meth public abstract jakarta.ws.rs.core.NewCookie build()
+meth public {jakarta.ws.rs.core.NewCookie$AbstractNewCookieBuilder%0} comment(java.lang.String)
+meth public {jakarta.ws.rs.core.NewCookie$AbstractNewCookieBuilder%0} expiry(java.util.Date)
+meth public {jakarta.ws.rs.core.NewCookie$AbstractNewCookieBuilder%0} httpOnly(boolean)
+meth public {jakarta.ws.rs.core.NewCookie$AbstractNewCookieBuilder%0} maxAge(int)
+meth public {jakarta.ws.rs.core.NewCookie$AbstractNewCookieBuilder%0} sameSite(jakarta.ws.rs.core.NewCookie$SameSite)
+meth public {jakarta.ws.rs.core.NewCookie$AbstractNewCookieBuilder%0} secure(boolean)
+supr jakarta.ws.rs.core.Cookie$AbstractCookieBuilder<jakarta.ws.rs.core.NewCookie$AbstractNewCookieBuilder<{jakarta.ws.rs.core.NewCookie$AbstractNewCookieBuilder%0}>>
+hfds comment,expiry,httpOnly,maxAge,sameSite,secure
+
+CLSS public static jakarta.ws.rs.core.NewCookie$Builder
+ outer jakarta.ws.rs.core.NewCookie
+cons public init(jakarta.ws.rs.core.Cookie)
+cons public init(java.lang.String)
+meth public jakarta.ws.rs.core.NewCookie build()
+supr jakarta.ws.rs.core.NewCookie$AbstractNewCookieBuilder<jakarta.ws.rs.core.NewCookie$Builder>
+
+CLSS public final static !enum jakarta.ws.rs.core.NewCookie$SameSite
+ outer jakarta.ws.rs.core.NewCookie
+fld public final static jakarta.ws.rs.core.NewCookie$SameSite LAX
+fld public final static jakarta.ws.rs.core.NewCookie$SameSite NONE
+fld public final static jakarta.ws.rs.core.NewCookie$SameSite STRICT
+meth public static jakarta.ws.rs.core.NewCookie$SameSite valueOf(java.lang.String)
+meth public static jakarta.ws.rs.core.NewCookie$SameSite[] values()
+supr java.lang.Enum<jakarta.ws.rs.core.NewCookie$SameSite>
+
+CLSS public jakarta.ws.rs.core.NoContentException
+cons public init(java.lang.String)
+cons public init(java.lang.String,java.lang.Throwable)
+cons public init(java.lang.Throwable)
+supr java.io.IOException
+hfds serialVersionUID
+
+CLSS public abstract interface jakarta.ws.rs.core.PathSegment
+meth public abstract jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.String> getMatrixParameters()
+meth public abstract java.lang.String getPath()
+
+CLSS public abstract interface jakarta.ws.rs.core.Request
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder evaluatePreconditions()
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder evaluatePreconditions(jakarta.ws.rs.core.EntityTag)
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder evaluatePreconditions(java.util.Date)
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder evaluatePreconditions(java.util.Date,jakarta.ws.rs.core.EntityTag)
+meth public abstract jakarta.ws.rs.core.Variant selectVariant(java.util.List<jakarta.ws.rs.core.Variant>)
+meth public abstract java.lang.String getMethod()
+
+CLSS public abstract jakarta.ws.rs.core.Response
+cons protected init()
+innr public abstract interface static StatusType
+innr public abstract static ResponseBuilder
+innr public final static !enum Status
+intf java.lang.AutoCloseable
+meth public abstract <%0 extends java.lang.Object> {%%0} readEntity(jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {%%0} readEntity(jakarta.ws.rs.core.GenericType<{%%0}>,java.lang.annotation.Annotation[])
+meth public abstract <%0 extends java.lang.Object> {%%0} readEntity(java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {%%0} readEntity(java.lang.Class<{%%0}>,java.lang.annotation.Annotation[])
+meth public abstract boolean bufferEntity()
+meth public abstract boolean hasEntity()
+meth public abstract boolean hasLink(java.lang.String)
+meth public abstract int getLength()
+meth public abstract int getStatus()
+meth public abstract jakarta.ws.rs.core.EntityTag getEntityTag()
+meth public abstract jakarta.ws.rs.core.Link getLink(java.lang.String)
+meth public abstract jakarta.ws.rs.core.Link$Builder getLinkBuilder(java.lang.String)
+meth public abstract jakarta.ws.rs.core.MediaType getMediaType()
+meth public abstract jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.Object> getMetadata()
+meth public abstract jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.String> getStringHeaders()
+meth public abstract jakarta.ws.rs.core.Response$StatusType getStatusInfo()
+meth public abstract java.lang.Object getEntity()
+meth public abstract java.lang.String getHeaderString(java.lang.String)
+meth public abstract java.net.URI getLocation()
+meth public abstract java.util.Date getDate()
+meth public abstract java.util.Date getLastModified()
+meth public abstract java.util.Locale getLanguage()
+meth public abstract java.util.Map<java.lang.String,jakarta.ws.rs.core.NewCookie> getCookies()
+meth public abstract java.util.Set<jakarta.ws.rs.core.Link> getLinks()
+meth public abstract java.util.Set<java.lang.String> getAllowedMethods()
+meth public abstract void close()
+meth public boolean isClosed()
+meth public jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.Object> getHeaders()
+meth public static jakarta.ws.rs.core.Response$ResponseBuilder accepted()
+meth public static jakarta.ws.rs.core.Response$ResponseBuilder accepted(java.lang.Object)
+meth public static jakarta.ws.rs.core.Response$ResponseBuilder created(java.net.URI)
+meth public static jakarta.ws.rs.core.Response$ResponseBuilder fromResponse(jakarta.ws.rs.core.Response)
+meth public static jakarta.ws.rs.core.Response$ResponseBuilder noContent()
+meth public static jakarta.ws.rs.core.Response$ResponseBuilder notAcceptable(java.util.List<jakarta.ws.rs.core.Variant>)
+meth public static jakarta.ws.rs.core.Response$ResponseBuilder notModified()
+meth public static jakarta.ws.rs.core.Response$ResponseBuilder notModified(jakarta.ws.rs.core.EntityTag)
+meth public static jakarta.ws.rs.core.Response$ResponseBuilder notModified(java.lang.String)
+meth public static jakarta.ws.rs.core.Response$ResponseBuilder ok()
+meth public static jakarta.ws.rs.core.Response$ResponseBuilder ok(java.lang.Object)
+meth public static jakarta.ws.rs.core.Response$ResponseBuilder ok(java.lang.Object,jakarta.ws.rs.core.MediaType)
+meth public static jakarta.ws.rs.core.Response$ResponseBuilder ok(java.lang.Object,jakarta.ws.rs.core.Variant)
+meth public static jakarta.ws.rs.core.Response$ResponseBuilder ok(java.lang.Object,java.lang.String)
+meth public static jakarta.ws.rs.core.Response$ResponseBuilder seeOther(java.net.URI)
+meth public static jakarta.ws.rs.core.Response$ResponseBuilder serverError()
+meth public static jakarta.ws.rs.core.Response$ResponseBuilder status(int)
+meth public static jakarta.ws.rs.core.Response$ResponseBuilder status(int,java.lang.String)
+meth public static jakarta.ws.rs.core.Response$ResponseBuilder status(jakarta.ws.rs.core.Response$Status)
+meth public static jakarta.ws.rs.core.Response$ResponseBuilder status(jakarta.ws.rs.core.Response$StatusType)
+meth public static jakarta.ws.rs.core.Response$ResponseBuilder temporaryRedirect(java.net.URI)
+supr java.lang.Object
+
+CLSS public abstract static jakarta.ws.rs.core.Response$ResponseBuilder
+ outer jakarta.ws.rs.core.Response
+cons protected init()
+meth protected static jakarta.ws.rs.core.Response$ResponseBuilder newInstance()
+meth public abstract !varargs jakarta.ws.rs.core.Response$ResponseBuilder allow(java.lang.String[])
+meth public abstract !varargs jakarta.ws.rs.core.Response$ResponseBuilder cookie(jakarta.ws.rs.core.NewCookie[])
+meth public abstract !varargs jakarta.ws.rs.core.Response$ResponseBuilder links(jakarta.ws.rs.core.Link[])
+meth public abstract !varargs jakarta.ws.rs.core.Response$ResponseBuilder variants(jakarta.ws.rs.core.Variant[])
+meth public abstract jakarta.ws.rs.core.Response build()
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder allow(java.util.Set<java.lang.String>)
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder cacheControl(jakarta.ws.rs.core.CacheControl)
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder clone()
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder contentLocation(java.net.URI)
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder encoding(java.lang.String)
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder entity(java.lang.Object)
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder entity(java.lang.Object,java.lang.annotation.Annotation[])
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder expires(java.util.Date)
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder header(java.lang.String,java.lang.Object)
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder language(java.lang.String)
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder language(java.util.Locale)
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder lastModified(java.util.Date)
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder link(java.lang.String,java.lang.String)
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder link(java.net.URI,java.lang.String)
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder location(java.net.URI)
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder replaceAll(jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.Object>)
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder status(int)
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder status(int,java.lang.String)
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder tag(jakarta.ws.rs.core.EntityTag)
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder tag(java.lang.String)
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder type(jakarta.ws.rs.core.MediaType)
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder type(java.lang.String)
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder variant(jakarta.ws.rs.core.Variant)
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder variants(java.util.List<jakarta.ws.rs.core.Variant>)
+meth public jakarta.ws.rs.core.Response$ResponseBuilder status(jakarta.ws.rs.core.Response$Status)
+meth public jakarta.ws.rs.core.Response$ResponseBuilder status(jakarta.ws.rs.core.Response$StatusType)
+supr java.lang.Object
+
+CLSS public final static !enum jakarta.ws.rs.core.Response$Status
+ outer jakarta.ws.rs.core.Response
+fld public final static jakarta.ws.rs.core.Response$Status ACCEPTED
+fld public final static jakarta.ws.rs.core.Response$Status BAD_GATEWAY
+fld public final static jakarta.ws.rs.core.Response$Status BAD_REQUEST
+fld public final static jakarta.ws.rs.core.Response$Status CONFLICT
+fld public final static jakarta.ws.rs.core.Response$Status CREATED
+fld public final static jakarta.ws.rs.core.Response$Status EXPECTATION_FAILED
+fld public final static jakarta.ws.rs.core.Response$Status FORBIDDEN
+fld public final static jakarta.ws.rs.core.Response$Status FOUND
+fld public final static jakarta.ws.rs.core.Response$Status GATEWAY_TIMEOUT
+fld public final static jakarta.ws.rs.core.Response$Status GONE
+fld public final static jakarta.ws.rs.core.Response$Status HTTP_VERSION_NOT_SUPPORTED
+fld public final static jakarta.ws.rs.core.Response$Status INTERNAL_SERVER_ERROR
+fld public final static jakarta.ws.rs.core.Response$Status LENGTH_REQUIRED
+fld public final static jakarta.ws.rs.core.Response$Status METHOD_NOT_ALLOWED
+fld public final static jakarta.ws.rs.core.Response$Status MOVED_PERMANENTLY
+fld public final static jakarta.ws.rs.core.Response$Status MULTIPLE_CHOICES
+fld public final static jakarta.ws.rs.core.Response$Status NETWORK_AUTHENTICATION_REQUIRED
+fld public final static jakarta.ws.rs.core.Response$Status NOT_ACCEPTABLE
+fld public final static jakarta.ws.rs.core.Response$Status NOT_FOUND
+fld public final static jakarta.ws.rs.core.Response$Status NOT_IMPLEMENTED
+fld public final static jakarta.ws.rs.core.Response$Status NOT_MODIFIED
+fld public final static jakarta.ws.rs.core.Response$Status NO_CONTENT
+fld public final static jakarta.ws.rs.core.Response$Status OK
+fld public final static jakarta.ws.rs.core.Response$Status PARTIAL_CONTENT
+fld public final static jakarta.ws.rs.core.Response$Status PAYMENT_REQUIRED
+fld public final static jakarta.ws.rs.core.Response$Status PERMANENT_REDIRECT
+fld public final static jakarta.ws.rs.core.Response$Status PRECONDITION_FAILED
+fld public final static jakarta.ws.rs.core.Response$Status PRECONDITION_REQUIRED
+fld public final static jakarta.ws.rs.core.Response$Status PROXY_AUTHENTICATION_REQUIRED
+fld public final static jakarta.ws.rs.core.Response$Status REQUESTED_RANGE_NOT_SATISFIABLE
+fld public final static jakarta.ws.rs.core.Response$Status REQUEST_ENTITY_TOO_LARGE
+fld public final static jakarta.ws.rs.core.Response$Status REQUEST_HEADER_FIELDS_TOO_LARGE
+fld public final static jakarta.ws.rs.core.Response$Status REQUEST_TIMEOUT
+fld public final static jakarta.ws.rs.core.Response$Status REQUEST_URI_TOO_LONG
+fld public final static jakarta.ws.rs.core.Response$Status RESET_CONTENT
+fld public final static jakarta.ws.rs.core.Response$Status SEE_OTHER
+fld public final static jakarta.ws.rs.core.Response$Status SERVICE_UNAVAILABLE
+fld public final static jakarta.ws.rs.core.Response$Status TEMPORARY_REDIRECT
+fld public final static jakarta.ws.rs.core.Response$Status TOO_MANY_REQUESTS
+fld public final static jakarta.ws.rs.core.Response$Status UNAUTHORIZED
+fld public final static jakarta.ws.rs.core.Response$Status UNAVAILABLE_FOR_LEGAL_REASONS
+fld public final static jakarta.ws.rs.core.Response$Status UNSUPPORTED_MEDIA_TYPE
+fld public final static jakarta.ws.rs.core.Response$Status USE_PROXY
+innr public final static !enum Family
+intf jakarta.ws.rs.core.Response$StatusType
+meth public int getStatusCode()
+meth public jakarta.ws.rs.core.Response$Status$Family getFamily()
+meth public java.lang.String getReasonPhrase()
+meth public java.lang.String toString()
+meth public static jakarta.ws.rs.core.Response$Status fromStatusCode(int)
+meth public static jakarta.ws.rs.core.Response$Status valueOf(java.lang.String)
+meth public static jakarta.ws.rs.core.Response$Status[] values()
+supr java.lang.Enum<jakarta.ws.rs.core.Response$Status>
+hfds code,family,reason
+
+CLSS public final static !enum jakarta.ws.rs.core.Response$Status$Family
+ outer jakarta.ws.rs.core.Response$Status
+fld public final static jakarta.ws.rs.core.Response$Status$Family CLIENT_ERROR
+fld public final static jakarta.ws.rs.core.Response$Status$Family INFORMATIONAL
+fld public final static jakarta.ws.rs.core.Response$Status$Family OTHER
+fld public final static jakarta.ws.rs.core.Response$Status$Family REDIRECTION
+fld public final static jakarta.ws.rs.core.Response$Status$Family SERVER_ERROR
+fld public final static jakarta.ws.rs.core.Response$Status$Family SUCCESSFUL
+meth public static jakarta.ws.rs.core.Response$Status$Family familyOf(int)
+meth public static jakarta.ws.rs.core.Response$Status$Family valueOf(java.lang.String)
+meth public static jakarta.ws.rs.core.Response$Status$Family[] values()
+supr java.lang.Enum<jakarta.ws.rs.core.Response$Status$Family>
+
+CLSS public abstract interface static jakarta.ws.rs.core.Response$StatusType
+ outer jakarta.ws.rs.core.Response
+meth public abstract int getStatusCode()
+meth public abstract jakarta.ws.rs.core.Response$Status$Family getFamily()
+meth public abstract java.lang.String getReasonPhrase()
+meth public jakarta.ws.rs.core.Response$Status toEnum()
+
+CLSS public abstract interface jakarta.ws.rs.core.SecurityContext
+fld public final static java.lang.String BASIC_AUTH = "BASIC"
+fld public final static java.lang.String CLIENT_CERT_AUTH = "CLIENT_CERT"
+fld public final static java.lang.String DIGEST_AUTH = "DIGEST"
+fld public final static java.lang.String FORM_AUTH = "FORM"
+meth public abstract boolean isSecure()
+meth public abstract boolean isUserInRole(java.lang.String)
+meth public abstract java.lang.String getAuthenticationScheme()
+meth public abstract java.security.Principal getUserPrincipal()
+
+CLSS public abstract interface jakarta.ws.rs.core.StreamingOutput
+meth public abstract void write(java.io.OutputStream) throws java.io.IOException
+
+CLSS public abstract jakarta.ws.rs.core.UriBuilder
+cons protected init()
+meth public abstract !varargs jakarta.ws.rs.core.UriBuilder matrixParam(java.lang.String,java.lang.Object[])
+meth public abstract !varargs jakarta.ws.rs.core.UriBuilder queryParam(java.lang.String,java.lang.Object[])
+meth public abstract !varargs jakarta.ws.rs.core.UriBuilder replaceMatrixParam(java.lang.String,java.lang.Object[])
+meth public abstract !varargs jakarta.ws.rs.core.UriBuilder replaceQueryParam(java.lang.String,java.lang.Object[])
+meth public abstract !varargs jakarta.ws.rs.core.UriBuilder segment(java.lang.String[])
+meth public abstract !varargs java.net.URI build(java.lang.Object[])
+meth public abstract !varargs java.net.URI buildFromEncoded(java.lang.Object[])
+meth public abstract jakarta.ws.rs.core.UriBuilder clone()
+meth public abstract jakarta.ws.rs.core.UriBuilder fragment(java.lang.String)
+meth public abstract jakarta.ws.rs.core.UriBuilder host(java.lang.String)
+meth public abstract jakarta.ws.rs.core.UriBuilder path(java.lang.Class)
+meth public abstract jakarta.ws.rs.core.UriBuilder path(java.lang.Class,java.lang.String)
+meth public abstract jakarta.ws.rs.core.UriBuilder path(java.lang.String)
+meth public abstract jakarta.ws.rs.core.UriBuilder path(java.lang.reflect.Method)
+meth public abstract jakarta.ws.rs.core.UriBuilder port(int)
+meth public abstract jakarta.ws.rs.core.UriBuilder replaceMatrix(java.lang.String)
+meth public abstract jakarta.ws.rs.core.UriBuilder replacePath(java.lang.String)
+meth public abstract jakarta.ws.rs.core.UriBuilder replaceQuery(java.lang.String)
+meth public abstract jakarta.ws.rs.core.UriBuilder resolveTemplate(java.lang.String,java.lang.Object)
+meth public abstract jakarta.ws.rs.core.UriBuilder resolveTemplate(java.lang.String,java.lang.Object,boolean)
+meth public abstract jakarta.ws.rs.core.UriBuilder resolveTemplateFromEncoded(java.lang.String,java.lang.Object)
+meth public abstract jakarta.ws.rs.core.UriBuilder resolveTemplates(java.util.Map<java.lang.String,java.lang.Object>)
+meth public abstract jakarta.ws.rs.core.UriBuilder resolveTemplates(java.util.Map<java.lang.String,java.lang.Object>,boolean)
+meth public abstract jakarta.ws.rs.core.UriBuilder resolveTemplatesFromEncoded(java.util.Map<java.lang.String,java.lang.Object>)
+meth public abstract jakarta.ws.rs.core.UriBuilder scheme(java.lang.String)
+meth public abstract jakarta.ws.rs.core.UriBuilder schemeSpecificPart(java.lang.String)
+meth public abstract jakarta.ws.rs.core.UriBuilder uri(java.lang.String)
+meth public abstract jakarta.ws.rs.core.UriBuilder uri(java.net.URI)
+meth public abstract jakarta.ws.rs.core.UriBuilder userInfo(java.lang.String)
+meth public abstract java.lang.String toTemplate()
+meth public abstract java.net.URI build(java.lang.Object[],boolean)
+meth public abstract java.net.URI buildFromEncodedMap(java.util.Map<java.lang.String,?>)
+meth public abstract java.net.URI buildFromMap(java.util.Map<java.lang.String,?>)
+meth public abstract java.net.URI buildFromMap(java.util.Map<java.lang.String,?>,boolean)
+meth public static jakarta.ws.rs.core.UriBuilder fromLink(jakarta.ws.rs.core.Link)
+meth public static jakarta.ws.rs.core.UriBuilder fromMethod(java.lang.Class<?>,java.lang.String)
+meth public static jakarta.ws.rs.core.UriBuilder fromPath(java.lang.String)
+meth public static jakarta.ws.rs.core.UriBuilder fromResource(java.lang.Class<?>)
+meth public static jakarta.ws.rs.core.UriBuilder fromUri(java.lang.String)
+meth public static jakarta.ws.rs.core.UriBuilder fromUri(java.net.URI)
+meth public static jakarta.ws.rs.core.UriBuilder newInstance()
+supr java.lang.Object
+
+CLSS public jakarta.ws.rs.core.UriBuilderException
+cons public init()
+cons public init(java.lang.String)
+cons public init(java.lang.String,java.lang.Throwable)
+cons public init(java.lang.Throwable)
+supr java.lang.RuntimeException
+hfds serialVersionUID
+
+CLSS public abstract interface jakarta.ws.rs.core.UriInfo
+meth public abstract jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.String> getPathParameters()
+meth public abstract jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.String> getPathParameters(boolean)
+meth public abstract jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.String> getQueryParameters()
+meth public abstract jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.String> getQueryParameters(boolean)
+meth public abstract jakarta.ws.rs.core.UriBuilder getAbsolutePathBuilder()
+meth public abstract jakarta.ws.rs.core.UriBuilder getBaseUriBuilder()
+meth public abstract jakarta.ws.rs.core.UriBuilder getRequestUriBuilder()
+meth public abstract java.lang.String getPath()
+meth public abstract java.lang.String getPath(boolean)
+meth public abstract java.net.URI getAbsolutePath()
+meth public abstract java.net.URI getBaseUri()
+meth public abstract java.net.URI getRequestUri()
+meth public abstract java.net.URI relativize(java.net.URI)
+meth public abstract java.net.URI resolve(java.net.URI)
+meth public abstract java.util.List<jakarta.ws.rs.core.PathSegment> getPathSegments()
+meth public abstract java.util.List<jakarta.ws.rs.core.PathSegment> getPathSegments(boolean)
+meth public abstract java.util.List<java.lang.Object> getMatchedResources()
+meth public abstract java.util.List<java.lang.String> getMatchedURIs()
+meth public abstract java.util.List<java.lang.String> getMatchedURIs(boolean)
+
+CLSS public jakarta.ws.rs.core.Variant
+cons public init(jakarta.ws.rs.core.MediaType,java.lang.String,java.lang.String)
+cons public init(jakarta.ws.rs.core.MediaType,java.lang.String,java.lang.String,java.lang.String)
+cons public init(jakarta.ws.rs.core.MediaType,java.lang.String,java.lang.String,java.lang.String,java.lang.String)
+cons public init(jakarta.ws.rs.core.MediaType,java.util.Locale,java.lang.String)
+innr public abstract static VariantListBuilder
+meth public !varargs static jakarta.ws.rs.core.Variant$VariantListBuilder encodings(java.lang.String[])
+meth public !varargs static jakarta.ws.rs.core.Variant$VariantListBuilder languages(java.util.Locale[])
+meth public !varargs static jakarta.ws.rs.core.Variant$VariantListBuilder mediaTypes(jakarta.ws.rs.core.MediaType[])
+meth public boolean equals(java.lang.Object)
+meth public int hashCode()
+meth public jakarta.ws.rs.core.MediaType getMediaType()
+meth public java.lang.String getEncoding()
+meth public java.lang.String getLanguageString()
+meth public java.lang.String toString()
+meth public java.util.Locale getLanguage()
+supr java.lang.Object
+hfds encoding,language,mediaType
+
+CLSS public abstract static jakarta.ws.rs.core.Variant$VariantListBuilder
+ outer jakarta.ws.rs.core.Variant
+cons protected init()
+meth public abstract !varargs jakarta.ws.rs.core.Variant$VariantListBuilder encodings(java.lang.String[])
+meth public abstract !varargs jakarta.ws.rs.core.Variant$VariantListBuilder languages(java.util.Locale[])
+meth public abstract !varargs jakarta.ws.rs.core.Variant$VariantListBuilder mediaTypes(jakarta.ws.rs.core.MediaType[])
+meth public abstract jakarta.ws.rs.core.Variant$VariantListBuilder add()
+meth public abstract java.util.List<jakarta.ws.rs.core.Variant> build()
+meth public static jakarta.ws.rs.core.Variant$VariantListBuilder newInstance()
+supr java.lang.Object
+
+CLSS public abstract interface jakarta.ws.rs.ext.ContextResolver<%0 extends java.lang.Object>
+meth public abstract {jakarta.ws.rs.ext.ContextResolver%0} getContext(java.lang.Class<?>)
+
+CLSS public abstract interface jakarta.ws.rs.ext.ExceptionMapper<%0 extends java.lang.Throwable>
+meth public abstract jakarta.ws.rs.core.Response toResponse({jakarta.ws.rs.ext.ExceptionMapper%0})
+
+CLSS public abstract interface jakarta.ws.rs.ext.InterceptorContext
+meth public abstract jakarta.ws.rs.core.MediaType getMediaType()
+meth public abstract java.lang.Class<?> getType()
+meth public abstract java.lang.Object getProperty(java.lang.String)
+meth public abstract java.lang.annotation.Annotation[] getAnnotations()
+meth public abstract java.lang.reflect.Type getGenericType()
+meth public abstract java.util.Collection<java.lang.String> getPropertyNames()
+meth public abstract void removeProperty(java.lang.String)
+meth public abstract void setAnnotations(java.lang.annotation.Annotation[])
+meth public abstract void setGenericType(java.lang.reflect.Type)
+meth public abstract void setMediaType(jakarta.ws.rs.core.MediaType)
+meth public abstract void setProperty(java.lang.String,java.lang.Object)
+meth public abstract void setType(java.lang.Class<?>)
+meth public boolean hasProperty(java.lang.String)
+
+CLSS public abstract interface jakarta.ws.rs.ext.MessageBodyReader<%0 extends java.lang.Object>
+meth public abstract boolean isReadable(java.lang.Class<?>,java.lang.reflect.Type,java.lang.annotation.Annotation[],jakarta.ws.rs.core.MediaType)
+meth public abstract {jakarta.ws.rs.ext.MessageBodyReader%0} readFrom(java.lang.Class<{jakarta.ws.rs.ext.MessageBodyReader%0}>,java.lang.reflect.Type,java.lang.annotation.Annotation[],jakarta.ws.rs.core.MediaType,jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.String>,java.io.InputStream) throws java.io.IOException
+
+CLSS public abstract interface jakarta.ws.rs.ext.MessageBodyWriter<%0 extends java.lang.Object>
+meth public abstract boolean isWriteable(java.lang.Class<?>,java.lang.reflect.Type,java.lang.annotation.Annotation[],jakarta.ws.rs.core.MediaType)
+meth public abstract void writeTo({jakarta.ws.rs.ext.MessageBodyWriter%0},java.lang.Class<?>,java.lang.reflect.Type,java.lang.annotation.Annotation[],jakarta.ws.rs.core.MediaType,jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.Object>,java.io.OutputStream) throws java.io.IOException
+meth public long getSize({jakarta.ws.rs.ext.MessageBodyWriter%0},java.lang.Class<?>,java.lang.reflect.Type,java.lang.annotation.Annotation[],jakarta.ws.rs.core.MediaType)
+
+CLSS public abstract interface jakarta.ws.rs.ext.ParamConverter<%0 extends java.lang.Object>
+innr public abstract interface static !annotation Lazy
+meth public abstract java.lang.String toString({jakarta.ws.rs.ext.ParamConverter%0})
+meth public abstract {jakarta.ws.rs.ext.ParamConverter%0} fromString(java.lang.String)
+
+CLSS public abstract interface static !annotation jakarta.ws.rs.ext.ParamConverter$Lazy
+ outer jakarta.ws.rs.ext.ParamConverter
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[TYPE])
+intf java.lang.annotation.Annotation
+
+CLSS public abstract interface jakarta.ws.rs.ext.ParamConverterProvider
+meth public abstract <%0 extends java.lang.Object> jakarta.ws.rs.ext.ParamConverter<{%%0}> getConverter(java.lang.Class<{%%0}>,java.lang.reflect.Type,java.lang.annotation.Annotation[])
+
+CLSS public abstract interface !annotation jakarta.ws.rs.ext.Provider
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[TYPE])
+intf java.lang.annotation.Annotation
+
+CLSS public abstract interface jakarta.ws.rs.ext.Providers
+meth public abstract <%0 extends java.lang.Object> jakarta.ws.rs.ext.ContextResolver<{%%0}> getContextResolver(java.lang.Class<{%%0}>,jakarta.ws.rs.core.MediaType)
+meth public abstract <%0 extends java.lang.Object> jakarta.ws.rs.ext.MessageBodyReader<{%%0}> getMessageBodyReader(java.lang.Class<{%%0}>,java.lang.reflect.Type,java.lang.annotation.Annotation[],jakarta.ws.rs.core.MediaType)
+meth public abstract <%0 extends java.lang.Object> jakarta.ws.rs.ext.MessageBodyWriter<{%%0}> getMessageBodyWriter(java.lang.Class<{%%0}>,java.lang.reflect.Type,java.lang.annotation.Annotation[],jakarta.ws.rs.core.MediaType)
+meth public abstract <%0 extends java.lang.Throwable> jakarta.ws.rs.ext.ExceptionMapper<{%%0}> getExceptionMapper(java.lang.Class<{%%0}>)
+
+CLSS public abstract interface jakarta.ws.rs.ext.ReaderInterceptor
+meth public abstract java.lang.Object aroundReadFrom(jakarta.ws.rs.ext.ReaderInterceptorContext) throws java.io.IOException
+
+CLSS public abstract interface jakarta.ws.rs.ext.ReaderInterceptorContext
+intf jakarta.ws.rs.ext.InterceptorContext
+meth public abstract jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.String> getHeaders()
+meth public abstract java.io.InputStream getInputStream()
+meth public abstract java.lang.Object proceed() throws java.io.IOException
+meth public abstract void setInputStream(java.io.InputStream)
+
+CLSS public abstract jakarta.ws.rs.ext.RuntimeDelegate
+cons protected init()
+fld public final static java.lang.String JAXRS_RUNTIME_DELEGATE_PROPERTY = "jakarta.ws.rs.ext.RuntimeDelegate"
+innr public abstract interface static HeaderDelegate
+meth public abstract <%0 extends java.lang.Object> jakarta.ws.rs.ext.RuntimeDelegate$HeaderDelegate<{%%0}> createHeaderDelegate(java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {%%0} createEndpoint(jakarta.ws.rs.core.Application,java.lang.Class<{%%0}>)
+meth public abstract jakarta.ws.rs.SeBootstrap$Configuration$Builder createConfigurationBuilder()
+meth public abstract jakarta.ws.rs.core.EntityPart$Builder createEntityPartBuilder(java.lang.String)
+meth public abstract jakarta.ws.rs.core.Link$Builder createLinkBuilder()
+meth public abstract jakarta.ws.rs.core.Response$ResponseBuilder createResponseBuilder()
+meth public abstract jakarta.ws.rs.core.UriBuilder createUriBuilder()
+meth public abstract jakarta.ws.rs.core.Variant$VariantListBuilder createVariantListBuilder()
+meth public abstract java.util.concurrent.CompletionStage<jakarta.ws.rs.SeBootstrap$Instance> bootstrap(jakarta.ws.rs.core.Application,jakarta.ws.rs.SeBootstrap$Configuration)
+meth public abstract java.util.concurrent.CompletionStage<jakarta.ws.rs.SeBootstrap$Instance> bootstrap(java.lang.Class<? extends jakarta.ws.rs.core.Application>,jakarta.ws.rs.SeBootstrap$Configuration)
+meth public static jakarta.ws.rs.ext.RuntimeDelegate getInstance()
+meth public static void setInstance(jakarta.ws.rs.ext.RuntimeDelegate)
+supr java.lang.Object
+hfds RD_LOCK,cachedDelegate,suppressAccessChecksPermission
+
+CLSS public abstract interface static jakarta.ws.rs.ext.RuntimeDelegate$HeaderDelegate<%0 extends java.lang.Object>
+ outer jakarta.ws.rs.ext.RuntimeDelegate
+meth public abstract java.lang.String toString({jakarta.ws.rs.ext.RuntimeDelegate$HeaderDelegate%0})
+meth public abstract {jakarta.ws.rs.ext.RuntimeDelegate$HeaderDelegate%0} fromString(java.lang.String)
+
+CLSS public abstract interface jakarta.ws.rs.ext.WriterInterceptor
+meth public abstract void aroundWriteTo(jakarta.ws.rs.ext.WriterInterceptorContext) throws java.io.IOException
+
+CLSS public abstract interface jakarta.ws.rs.ext.WriterInterceptorContext
+intf jakarta.ws.rs.ext.InterceptorContext
+meth public abstract jakarta.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.Object> getHeaders()
+meth public abstract java.io.OutputStream getOutputStream()
+meth public abstract java.lang.Object getEntity()
+meth public abstract void proceed() throws java.io.IOException
+meth public abstract void setEntity(java.lang.Object)
+meth public abstract void setOutputStream(java.io.OutputStream)
+
+CLSS public abstract interface jakarta.ws.rs.sse.InboundSseEvent
+intf jakarta.ws.rs.sse.SseEvent
+meth public abstract <%0 extends java.lang.Object> {%%0} readData(jakarta.ws.rs.core.GenericType<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {%%0} readData(jakarta.ws.rs.core.GenericType<{%%0}>,jakarta.ws.rs.core.MediaType)
+meth public abstract <%0 extends java.lang.Object> {%%0} readData(java.lang.Class<{%%0}>)
+meth public abstract <%0 extends java.lang.Object> {%%0} readData(java.lang.Class<{%%0}>,jakarta.ws.rs.core.MediaType)
+meth public abstract boolean isEmpty()
+meth public abstract java.lang.String readData()
+
+CLSS public abstract interface jakarta.ws.rs.sse.OutboundSseEvent
+innr public abstract interface static Builder
+intf jakarta.ws.rs.sse.SseEvent
+meth public abstract jakarta.ws.rs.core.MediaType getMediaType()
+meth public abstract java.lang.Class<?> getType()
+meth public abstract java.lang.Object getData()
+meth public abstract java.lang.reflect.Type getGenericType()
+
+CLSS public abstract interface static jakarta.ws.rs.sse.OutboundSseEvent$Builder
+ outer jakarta.ws.rs.sse.OutboundSseEvent
+meth public abstract jakarta.ws.rs.sse.OutboundSseEvent build()
+meth public abstract jakarta.ws.rs.sse.OutboundSseEvent$Builder comment(java.lang.String)
+meth public abstract jakarta.ws.rs.sse.OutboundSseEvent$Builder data(jakarta.ws.rs.core.GenericType,java.lang.Object)
+meth public abstract jakarta.ws.rs.sse.OutboundSseEvent$Builder data(java.lang.Class,java.lang.Object)
+meth public abstract jakarta.ws.rs.sse.OutboundSseEvent$Builder data(java.lang.Object)
+meth public abstract jakarta.ws.rs.sse.OutboundSseEvent$Builder id(java.lang.String)
+meth public abstract jakarta.ws.rs.sse.OutboundSseEvent$Builder mediaType(jakarta.ws.rs.core.MediaType)
+meth public abstract jakarta.ws.rs.sse.OutboundSseEvent$Builder name(java.lang.String)
+meth public abstract jakarta.ws.rs.sse.OutboundSseEvent$Builder reconnectDelay(long)
+
+CLSS public abstract interface jakarta.ws.rs.sse.Sse
+meth public abstract jakarta.ws.rs.sse.OutboundSseEvent$Builder newEventBuilder()
+meth public abstract jakarta.ws.rs.sse.SseBroadcaster newBroadcaster()
+meth public jakarta.ws.rs.sse.OutboundSseEvent newEvent(java.lang.String)
+meth public jakarta.ws.rs.sse.OutboundSseEvent newEvent(java.lang.String,java.lang.String)
+
+CLSS public abstract interface jakarta.ws.rs.sse.SseBroadcaster
+intf java.lang.AutoCloseable
+meth public abstract java.util.concurrent.CompletionStage<?> broadcast(jakarta.ws.rs.sse.OutboundSseEvent)
+meth public abstract void close()
+meth public abstract void close(boolean)
+meth public abstract void onClose(java.util.function.Consumer<jakarta.ws.rs.sse.SseEventSink>)
+meth public abstract void onError(java.util.function.BiConsumer<jakarta.ws.rs.sse.SseEventSink,java.lang.Throwable>)
+meth public abstract void register(jakarta.ws.rs.sse.SseEventSink)
+
+CLSS public abstract interface jakarta.ws.rs.sse.SseEvent
+fld public final static long RECONNECT_NOT_SET = -1
+meth public abstract boolean isReconnectDelaySet()
+meth public abstract java.lang.String getComment()
+meth public abstract java.lang.String getId()
+meth public abstract java.lang.String getName()
+meth public abstract long getReconnectDelay()
+
+CLSS public abstract interface jakarta.ws.rs.sse.SseEventSink
+intf java.lang.AutoCloseable
+meth public abstract boolean isClosed()
+meth public abstract java.util.concurrent.CompletionStage<?> send(jakarta.ws.rs.sse.OutboundSseEvent)
+meth public abstract void close()
+
+CLSS public abstract interface jakarta.ws.rs.sse.SseEventSource
+innr public abstract static Builder
+intf java.lang.AutoCloseable
+meth public abstract boolean close(long,java.util.concurrent.TimeUnit)
+meth public abstract boolean isOpen()
+meth public abstract void open()
+meth public abstract void register(java.util.function.Consumer<jakarta.ws.rs.sse.InboundSseEvent>)
+meth public abstract void register(java.util.function.Consumer<jakarta.ws.rs.sse.InboundSseEvent>,java.util.function.Consumer<java.lang.Throwable>)
+meth public abstract void register(java.util.function.Consumer<jakarta.ws.rs.sse.InboundSseEvent>,java.util.function.Consumer<java.lang.Throwable>,java.lang.Runnable)
+meth public static jakarta.ws.rs.sse.SseEventSource$Builder target(jakarta.ws.rs.client.WebTarget)
+meth public void close()
+
+CLSS public abstract static jakarta.ws.rs.sse.SseEventSource$Builder
+ outer jakarta.ws.rs.sse.SseEventSource
+cons protected init()
+fld public final static java.lang.String JAXRS_DEFAULT_SSE_BUILDER_PROPERTY = "jakarta.ws.rs.sse.SseEventSource.Builder"
+meth protected abstract jakarta.ws.rs.sse.SseEventSource$Builder target(jakarta.ws.rs.client.WebTarget)
+meth public abstract jakarta.ws.rs.sse.SseEventSource build()
+meth public abstract jakarta.ws.rs.sse.SseEventSource$Builder reconnectingEvery(long,java.util.concurrent.TimeUnit)
+supr java.lang.Object
+
+CLSS public abstract jakarta.xml.bind.annotation.adapters.XmlAdapter<%0 extends java.lang.Object, %1 extends java.lang.Object>
+cons protected init()
+meth public abstract {jakarta.xml.bind.annotation.adapters.XmlAdapter%0} marshal({jakarta.xml.bind.annotation.adapters.XmlAdapter%1}) throws java.lang.Exception
+meth public abstract {jakarta.xml.bind.annotation.adapters.XmlAdapter%1} unmarshal({jakarta.xml.bind.annotation.adapters.XmlAdapter%0}) throws java.lang.Exception
+supr java.lang.Object
+
+CLSS public java.io.IOException
+cons public init()
+cons public init(java.lang.String)
+cons public init(java.lang.String,java.lang.Throwable)
+cons public init(java.lang.Throwable)
+supr java.lang.Exception
+hfds serialVersionUID
+
+CLSS public abstract interface java.io.Serializable
+
+CLSS public abstract interface java.lang.AutoCloseable
+meth public abstract void close() throws java.lang.Exception
+
+CLSS public abstract interface java.lang.Comparable<%0 extends java.lang.Object>
+meth public abstract int compareTo({java.lang.Comparable%0})
+
+CLSS public abstract interface !annotation java.lang.Deprecated
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE])
+intf java.lang.annotation.Annotation
+meth public abstract !hasdefault boolean forRemoval()
+meth public abstract !hasdefault java.lang.String since()
+
+CLSS public abstract java.lang.Enum<%0 extends java.lang.Enum<{java.lang.Enum%0}>>
+cons protected init(java.lang.String,int)
+intf java.io.Serializable
+intf java.lang.Comparable<{java.lang.Enum%0}>
+meth protected final java.lang.Object clone() throws java.lang.CloneNotSupportedException
+meth protected final void finalize()
+meth public final boolean equals(java.lang.Object)
+meth public final int compareTo({java.lang.Enum%0})
+meth public final int hashCode()
+meth public final int ordinal()
+meth public final java.lang.Class<{java.lang.Enum%0}> getDeclaringClass()
+meth public final java.lang.String name()
+meth public java.lang.String toString()
+meth public static <%0 extends java.lang.Enum<{%%0}>> {%%0} valueOf(java.lang.Class<{%%0}>,java.lang.String)
+supr java.lang.Object
+hfds name,ordinal
+
+CLSS public java.lang.Exception
+cons protected init(java.lang.String,java.lang.Throwable,boolean,boolean)
+cons public init()
+cons public init(java.lang.String)
+cons public init(java.lang.String,java.lang.Throwable)
+cons public init(java.lang.Throwable)
+supr java.lang.Throwable
+hfds serialVersionUID
+
+CLSS public java.lang.Object
+cons public init()
+meth protected java.lang.Object clone() throws java.lang.CloneNotSupportedException
+meth protected void finalize() throws java.lang.Throwable
+ anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="9")
+meth public boolean equals(java.lang.Object)
+meth public final java.lang.Class<?> getClass()
+meth public final void notify()
+meth public final void notifyAll()
+meth public final void wait() throws java.lang.InterruptedException
+meth public final void wait(long) throws java.lang.InterruptedException
+meth public final void wait(long,int) throws java.lang.InterruptedException
+meth public int hashCode()
+meth public java.lang.String toString()
+
+CLSS public java.lang.RuntimeException
+cons protected init(java.lang.String,java.lang.Throwable,boolean,boolean)
+cons public init()
+cons public init(java.lang.String)
+cons public init(java.lang.String,java.lang.Throwable)
+cons public init(java.lang.Throwable)
+supr java.lang.Exception
+hfds serialVersionUID
+
+CLSS public java.lang.Throwable
+cons protected init(java.lang.String,java.lang.Throwable,boolean,boolean)
+cons public init()
+cons public init(java.lang.String)
+cons public init(java.lang.String,java.lang.Throwable)
+cons public init(java.lang.Throwable)
+intf java.io.Serializable
+meth public final java.lang.Throwable[] getSuppressed()
+meth public final void addSuppressed(java.lang.Throwable)
+meth public java.lang.StackTraceElement[] getStackTrace()
+meth public java.lang.String getLocalizedMessage()
+meth public java.lang.String getMessage()
+meth public java.lang.String toString()
+meth public java.lang.Throwable fillInStackTrace()
+meth public java.lang.Throwable getCause()
+meth public java.lang.Throwable initCause(java.lang.Throwable)
+meth public void printStackTrace()
+meth public void printStackTrace(java.io.PrintStream)
+meth public void printStackTrace(java.io.PrintWriter)
+meth public void setStackTrace(java.lang.StackTraceElement[])
+supr java.lang.Object
+hfds CAUSE_CAPTION,EMPTY_THROWABLE_ARRAY,NULL_CAUSE_MESSAGE,SELF_SUPPRESSION_MESSAGE,SUPPRESSED_CAPTION,SUPPRESSED_SENTINEL,UNASSIGNED_STACK,backtrace,cause,depth,detailMessage,serialVersionUID,stackTrace,suppressedExceptions
+hcls PrintStreamOrWriter,SentinelHolder,WrappedPrintStream,WrappedPrintWriter
+
+CLSS public abstract interface java.lang.annotation.Annotation
+meth public abstract boolean equals(java.lang.Object)
+meth public abstract int hashCode()
+meth public abstract java.lang.Class<? extends java.lang.annotation.Annotation> annotationType()
+meth public abstract java.lang.String toString()
+
+CLSS public abstract interface !annotation java.lang.annotation.Documented
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[ANNOTATION_TYPE])
+intf java.lang.annotation.Annotation
+
+CLSS public abstract interface !annotation java.lang.annotation.Inherited
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[ANNOTATION_TYPE])
+intf java.lang.annotation.Annotation
+
+CLSS public abstract interface !annotation java.lang.annotation.Retention
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[ANNOTATION_TYPE])
+intf java.lang.annotation.Annotation
+meth public abstract java.lang.annotation.RetentionPolicy value()
+
+CLSS public abstract interface !annotation java.lang.annotation.Target
+ anno 0 java.lang.annotation.Documented()
+ anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
+ anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[ANNOTATION_TYPE])
+intf java.lang.annotation.Annotation
+meth public abstract java.lang.annotation.ElementType[] value()
+
+CLSS public abstract interface java.util.Map<%0 extends java.lang.Object, %1 extends java.lang.Object>
+innr public abstract interface static Entry
+meth public !varargs static <%0 extends java.lang.Object, %1 extends java.lang.Object> java.util.Map<{%%0},{%%1}> ofEntries(java.util.Map$Entry<? extends {%%0},? extends {%%1}>[])
+ anno 0 java.lang.SafeVarargs()
+meth public abstract boolean containsKey(java.lang.Object)
+meth public abstract boolean containsValue(java.lang.Object)
+meth public abstract boolean equals(java.lang.Object)
+meth public abstract boolean isEmpty()
+meth public abstract int hashCode()
+meth public abstract int size()
+meth public abstract java.util.Collection<{java.util.Map%1}> values()
+meth public abstract java.util.Set<java.util.Map$Entry<{java.util.Map%0},{java.util.Map%1}>> entrySet()
+meth public abstract java.util.Set<{java.util.Map%0}> keySet()
+meth public abstract void clear()
+meth public abstract void putAll(java.util.Map<? extends {java.util.Map%0},? extends {java.util.Map%1}>)
+meth public abstract {java.util.Map%1} get(java.lang.Object)
+meth public abstract {java.util.Map%1} put({java.util.Map%0},{java.util.Map%1})
+meth public abstract {java.util.Map%1} remove(java.lang.Object)
+meth public boolean remove(java.lang.Object,java.lang.Object)
+meth public boolean replace({java.util.Map%0},{java.util.Map%1},{java.util.Map%1})
+meth public static <%0 extends java.lang.Object, %1 extends java.lang.Object> java.util.Map$Entry<{%%0},{%%1}> entry({%%0},{%%1})
+meth public static <%0 extends java.lang.Object, %1 extends java.lang.Object> java.util.Map<{%%0},{%%1}> copyOf(java.util.Map<? extends {%%0},? extends {%%1}>)
+meth public static <%0 extends java.lang.Object, %1 extends java.lang.Object> java.util.Map<{%%0},{%%1}> of()
+meth public static <%0 extends java.lang.Object, %1 extends java.lang.Object> java.util.Map<{%%0},{%%1}> of({%%0},{%%1})
+meth public static <%0 extends java.lang.Object, %1 extends java.lang.Object> java.util.Map<{%%0},{%%1}> of({%%0},{%%1},{%%0},{%%1})
+meth public static <%0 extends java.lang.Object, %1 extends java.lang.Object> java.util.Map<{%%0},{%%1}> of({%%0},{%%1},{%%0},{%%1},{%%0},{%%1})
+meth public static <%0 extends java.lang.Object, %1 extends java.lang.Object> java.util.Map<{%%0},{%%1}> of({%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1})
+meth public static <%0 extends java.lang.Object, %1 extends java.lang.Object> java.util.Map<{%%0},{%%1}> of({%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1})
+meth public static <%0 extends java.lang.Object, %1 extends java.lang.Object> java.util.Map<{%%0},{%%1}> of({%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1})
+meth public static <%0 extends java.lang.Object, %1 extends java.lang.Object> java.util.Map<{%%0},{%%1}> of({%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1})
+meth public static <%0 extends java.lang.Object, %1 extends java.lang.Object> java.util.Map<{%%0},{%%1}> of({%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1})
+meth public static <%0 extends java.lang.Object, %1 extends java.lang.Object> java.util.Map<{%%0},{%%1}> of({%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1})
+meth public static <%0 extends java.lang.Object, %1 extends java.lang.Object> java.util.Map<{%%0},{%%1}> of({%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1},{%%0},{%%1})
+meth public void forEach(java.util.function.BiConsumer<? super {java.util.Map%0},? super {java.util.Map%1}>)
+meth public void replaceAll(java.util.function.BiFunction<? super {java.util.Map%0},? super {java.util.Map%1},? extends {java.util.Map%1}>)
+meth public {java.util.Map%1} compute({java.util.Map%0},java.util.function.BiFunction<? super {java.util.Map%0},? super {java.util.Map%1},? extends {java.util.Map%1}>)
+meth public {java.util.Map%1} computeIfAbsent({java.util.Map%0},java.util.function.Function<? super {java.util.Map%0},? extends {java.util.Map%1}>)
+meth public {java.util.Map%1} computeIfPresent({java.util.Map%0},java.util.function.BiFunction<? super {java.util.Map%0},? super {java.util.Map%1},? extends {java.util.Map%1}>)
+meth public {java.util.Map%1} getOrDefault(java.lang.Object,{java.util.Map%1})
+meth public {java.util.Map%1} merge({java.util.Map%0},{java.util.Map%1},java.util.function.BiFunction<? super {java.util.Map%1},? super {java.util.Map%1},? extends {java.util.Map%1}>)
+meth public {java.util.Map%1} putIfAbsent({java.util.Map%0},{java.util.Map%1})
+meth public {java.util.Map%1} replace({java.util.Map%0},{java.util.Map%1})
diff --git a/jaxrs-tck/src/main/resources/jakarta/ws/rs/tck/signaturetest/sig-test-pkg-list.txt b/jaxrs-tck/src/main/resources/jakarta/ws/rs/tck/signaturetest/sig-test-pkg-list.txt
new file mode 100644
index 0000000..e4a04a5
--- /dev/null
+++ b/jaxrs-tck/src/main/resources/jakarta/ws/rs/tck/signaturetest/sig-test-pkg-list.txt
@@ -0,0 +1,30 @@
+#
+# Copyright (c) 2018, 2020 Oracle and/or its affiliates. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License v. 2.0, which is available at
+# http://www.eclipse.org/legal/epl-2.0.
+#
+# This Source Code may also be made available under the following Secondary
+# Licenses when the conditions for such availability set forth in the
+# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+# version 2 with the GNU Classpath Exception, which is available at
+# https://www.gnu.org/software/classpath/license.html.
+#
+# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+#
+
+##
+# This file contains a list of all the packages
+# contained in the signature files for this
+# deliverable. This file is used to exclude valid
+# sub-packages from being verified when their
+# parent package's signature is checked.
+##
+
+jakarta.ws.rs
+jakarta.ws.rs.client
+jakarta.ws.rs.container
+jakarta.ws.rs.core
+jakarta.ws.rs.ext
+jakarta.ws.rs.sse
diff --git a/jaxrs-tck/src/main/resources/jakarta/ws/rs/tck/signaturetest/sig-test.map b/jaxrs-tck/src/main/resources/jakarta/ws/rs/tck/signaturetest/sig-test.map
new file mode 100644
index 0000000..895b2be
--- /dev/null
+++ b/jaxrs-tck/src/main/resources/jakarta/ws/rs/tck/signaturetest/sig-test.map
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2018, 2020 Oracle and/or its affiliates. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License v. 2.0, which is available at
+# http://www.eclipse.org/legal/epl-2.0.
+#
+# This Source Code may also be made available under the following Secondary
+# Licenses when the conditions for such availability set forth in the
+# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+# version 2 with the GNU Classpath Exception, which is available at
+# https://www.gnu.org/software/classpath/license.html.
+#
+# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+#
+
+###############################################################
+# The signature test mapping file for the JAX-RS TCK.
+###############################################################
+jakarta.ws.rs=3.1.0
diff --git a/jersey-tck/pom.xml b/jersey-tck/pom.xml
index e4caf57..376801d 100644
--- a/jersey-tck/pom.xml
+++ b/jersey-tck/pom.xml
@@ -59,6 +59,12 @@
<dependencies>
<dependency>
+ <groupId>org.junit.jupiter</groupId>
+ <artifactId>junit-jupiter</artifactId>
+ <version>${junit.jupiter.version}</version>
+ </dependency>
+
+ <dependency>
<groupId>org.glassfish.hk2</groupId>
<artifactId>hk2-locator</artifactId>
<version>3.0.0</version>
@@ -122,6 +128,11 @@
<scope>test</scope>
</dependency>
<dependency>
+ <groupId>org.netbeans.tools</groupId>
+ <artifactId>sigtest-maven-plugin</artifactId>
+ <version>1.4</version>
+ </dependency>
+ <dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-binding</artifactId>
<version>${jersey.version}</version>
@@ -393,6 +404,9 @@
<authuser>javajoe</authuser>
<authpassword>javajoe</authpassword>
<porting.ts.url.class.1>jakarta.ws.rs.tck.lib.implementation.sun.common.SunRIURL</porting.ts.url.class.1>
+ <jimage.dir>${project.build.directory}/jdk11-bundle</jimage.dir>
+ <optional.tech.packages.to.ignore>jakarta.xml.bind</optional.tech.packages.to.ignore>
+ <signature.sigTestClasspath>${project.build.directory}/glassfish6/glassfish/modules/jakarta.ws.rs-api.jar:${project.build.directory}/glassfish6/glassfish/modules/jakarta.xml.bind-api.jar:${project.build.directory}/jdk11-bundle/java.base:${project.build.directory}/jdk11-bundle/java.rmi:${project.build.directory}/jdk11-bundle/java.sql:${project.build.directory}/jdk11-bundle/java.naming</signature.sigTestClasspath>
</systemPropertyVariables>
<environmentVariables>
<GLASSFISH_HOME>${project.build.directory}/glassfish6</GLASSFISH_HOME>