All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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