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

org.glassfish.jersey.model.internal.RankedProvider Maven / Gradle / Ivy

Go to download

A bundle project producing JAX-RS RI bundles. The primary artifact is an "all-in-one" OSGi-fied JAX-RS RI bundle (jaxrs-ri.jar). Attached to that are two compressed JAX-RS RI archives. The first archive (jaxrs-ri.zip) consists of binary RI bits and contains the API jar (under "api" directory), RI libraries (under "lib" directory) as well as all external RI dependencies (under "ext" directory). The secondary archive (jaxrs-ri-src.zip) contains buildable JAX-RS RI source bundle and contains the API jar (under "api" directory), RI sources (under "src" directory) as well as all external RI dependencies (under "ext" directory). The second archive also contains "build.xml" ANT script that builds the RI sources. To build the JAX-RS RI simply unzip the archive, cd to the created jaxrs-ri directory and invoke "ant" from the command line.

There is a newer version: 3.1.6
Show newest version
/*
 * Copyright (c) 2012, 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 org.glassfish.jersey.model.internal;

import java.lang.reflect.Type;
import java.util.Set;

import jakarta.ws.rs.Priorities;

import jakarta.annotation.Priority;

import org.glassfish.jersey.model.ContractProvider;

/**
 * Jersey ranked provider model.
 *
 * @param  service provider contract Java type.
 * @author Michal Gajdos
 */
public class RankedProvider {

    private final T provider;
    private final int rank;
    private final Set contractTypes;

    /**
     * Creates a new {@code RankedProvider} instance. The rank of the provider is obtained from the {@link jakarta.annotation.Priority}
     * annotation or is set to {@value jakarta.ws.rs.Priorities#USER} if the annotation is not present.
     *
     * @param provider service provider to create a {@code RankedProvider} instance from.
     */
    public RankedProvider(final T provider) {
        this.provider = provider;
        this.rank = computeRank(provider, ContractProvider.NO_PRIORITY);
        this.contractTypes = null;
    }

    /**
     * Creates a new {@code RankedProvider} instance for given {@code provider} with specific {@code rank} (> 0).
     *
     * @param provider service provider to create a {@code RankedProvider} instance from.
     * @param rank rank of this provider.
     */
    public RankedProvider(final T provider, final int rank) {
        this(provider, rank, null);
    }

    /**
     * Creates a new {@code RankedProvider} instance for given {@code provider} with specific {@code rank} (> 0).
     *
     * @param provider service provider to create a {@code RankedProvider} instance from.
     * @param rank rank of this provider.
     * @param contracts contracts implemented by the service provider
     */
    public RankedProvider(final T provider, final int rank, final Set contracts) {
        this.provider = provider;
        this.rank = computeRank(provider, rank);
        this.contractTypes = contracts;
    }

    private int computeRank(final T provider, final int rank) {
        if (rank > 0) {
            return rank;
        } else {
            Class clazz = provider.getClass();

            // when provided instance is a proxy (from weld), we need to get the right class to check for
            // @Priority annotation - proxy doesn't propagate isAnnotationPresent to the parent class.
            while (clazz.isSynthetic()) {
                clazz = clazz.getSuperclass();
            }

            if (clazz.isAnnotationPresent(Priority.class)) {
                return clazz.getAnnotation(Priority.class).value();
            } else {
                return Priorities.USER;
            }
        }
    }

    public T getProvider() {
        return provider;
    }

    public int getRank() {
        return rank;
    }

    /**
     * Get me set of implemented contracts.
     * Returns null if no contracts are implemented.
     *
     * @return set of contracts or null if no contracts have been implemented.
     */
    public Set getContractTypes() {
        return contractTypes;
    }

    @Override
    public String toString() {
        return provider.getClass().getName();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy