jakarta.json.bind.spi.JsonbProvider Maven / Gradle / Ivy
/*
* Copyright (c) 2016, 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
*/
package jakarta.json.bind.spi;
import jakarta.json.bind.JsonbBuilder;
import jakarta.json.bind.JsonbException;
import java.util.Iterator;
import java.util.ServiceLoader;
/**
* Service provider for JSON Binding implementations.
*
* Provider implementors must implement all abstract methods.
*
* API clients can obtain instance of default provider by calling:
*
* {@code
* JsonbProvider provider = JsonbProvider.provider();
* }}
*
* Specific provider instance lookup:
*
* {@code
* JsonbProvider provider;
* try {
* JsonbProvider.provider("foo.bar.ProviderImpl");
* } catch (JsonbException e) {
* // provider not found or could not be instantiated
* }}
* where '{@code foo.bar.ProviderImpl}' is a vendor implementation class extending
* {@link jakarta.json.bind.spi.JsonbProvider} and identified to service loader as
* specified in {@link java.util.ServiceLoader} documentation.
*
* All the methods in this class are allowed to be called by multiple concurrent
* threads.
*
* @see jakarta.json.bind.Jsonb
* @see java.util.ServiceLoader
* @since JSON Binding 1.0
*/
public abstract class JsonbProvider {
/**
* A constant representing the name of the default
* {@link jakarta.json.bind.spi.JsonbProvider JsonbProvider} implementation class.
*/
private static final String DEFAULT_PROVIDER = "org.eclipse.yasson.JsonBindingProvider";
/**
* Protected constructor.
*/
protected JsonbProvider() {
}
/**
* Creates a JSON Binding provider object by using the
* {@link java.util.ServiceLoader#load(Class)} method. The first provider of
* {@code JsonbProvider} class from list of providers returned by
* {@code ServiceLoader.load} call is returned. If there are no available
* service providers, this method tries to load the default service provider using
* {@link Class#forName(String)} method.
*
* @see java.util.ServiceLoader
*
* @throws JsonbException if there is no provider found, or there is a problem
* instantiating the provider instance.
*
* @return {@code JsonbProvider} instance
*/
@SuppressWarnings("UseSpecificCatch")
public static JsonbProvider provider() {
ServiceLoader loader = ServiceLoader.load(JsonbProvider.class);
Iterator it = loader.iterator();
if (it.hasNext()) {
return it.next();
}
try {
Class> clazz = Class.forName(DEFAULT_PROVIDER);
return (JsonbProvider) clazz.newInstance();
} catch (ClassNotFoundException x) {
throw new JsonbException("JSON Binding provider " + DEFAULT_PROVIDER + " not found", x);
} catch (Exception x) {
throw new JsonbException("JSON Binding provider " + DEFAULT_PROVIDER
+ " could not be instantiated: " + x, x);
}
}
/**
* Creates a JSON Binding provider object by using the
* {@link java.util.ServiceLoader#load(Class)} method, matching {@code providerName}.
* The first provider of {@code JsonbProvider} class from list of providers returned by
* {@code ServiceLoader.load} call, matching providerName is returned.
* If no such provider is found, JsonbException is thrown.
*
* @param providerName
* Class name ({@code class.getName()}) to be chosen from the list of providers
* returned by {@code ServiceLoader.load(JsonbProvider.class)} call.
*
* @throws JsonbException if there is no provider found, or there is a problem
* instantiating the provider instance.
*
* @throws NullPointerException if providerName is {@code null}.
*
* @see java.util.ServiceLoader
*
* @return {@code JsonbProvider} instance
*/
@SuppressWarnings("UseSpecificCatch")
public static JsonbProvider provider(final String providerName) {
if (providerName == null) {
throw new IllegalArgumentException();
}
ServiceLoader loader = ServiceLoader.load(JsonbProvider.class);
Iterator it = loader.iterator();
while (it.hasNext()) {
JsonbProvider provider = it.next();
if (providerName.equals(provider.getClass().getName())) {
return provider;
}
}
throw new JsonbException("JSON Binding provider " + providerName + " not found",
new ClassNotFoundException(providerName));
}
/**
* Returns a new instance of {@link jakarta.json.bind.JsonbBuilder JsonbBuilder} class.
*
* {@link jakarta.json.bind.JsonbBuilder JsonbBuilder} provides necessary getter
* methods to access required parameters.
*
* @return JsonbBuilder
* A new instance of class implementing {@link jakarta.json.bind.JsonbBuilder}.
* Always a non-null valid object.
*
* @see jakarta.json.bind.Jsonb
* @see jakarta.json.bind.JsonbBuilder
*
* @throws JsonbException
* If an error was encountered while creating the {@link JsonbBuilder} instance.
*/
public abstract JsonbBuilder create();
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy