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

athenz.shade.zts.org.glassfish.jersey.message.filtering.ObjectGraphImpl Maven / Gradle / Ivy

There is a newer version: 1.11.59
Show newest version
/*
 * Copyright (c) 2013, 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
 */

package athenz.shade.zts.athenz.shade.zts.org.glassfish.jersey.message.filtering;

import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import athenz.shade.zts.athenz.shade.zts.org.glassfish.jersey.internal.util.collection.Views;
import athenz.shade.zts.athenz.shade.zts.org.glassfish.jersey.message.filtering.spi.EntityGraph;
import athenz.shade.zts.athenz.shade.zts.org.glassfish.jersey.message.filtering.spi.ObjectGraph;
import athenz.shade.zts.athenz.shade.zts.org.glassfish.jersey.message.filtering.spi.ScopeProvider;

/**
 * Default implementation of {@link ObjectGraph}.
 *
 * @author Michal Gajdos
 */
final class ObjectGraphImpl implements ObjectGraph {

    private final Set filteringScopes;

    private final Map, EntityGraph> classToGraph;
    private final EntityGraph graph;

    private Set fields;
    private Map subgraphs;

    ObjectGraphImpl(final Map, EntityGraph> classToGraph, final EntityGraph graph, final Set filteringScopes) {
        this.filteringScopes = filteringScopes;

        this.classToGraph = classToGraph;
        this.graph = graph;
    }

    @Override
    public Class getEntityClass() {
        return graph.getEntityClass();
    }

    @Override
    public Set getFields() {
        return getFields(null);
    }

    @Override
    public Set getFields(final String parent) {
        final Set childFilteringScopes = getFilteringScopes(parent);
        if (fields == null) {
            fields = graph.getFields(
                    Views.setUnionView(
                            childFilteringScopes,
                            Collections.singleton(ScopeProvider.DEFAULT_SCOPE)));
        }
        return fields;
    }

    @Override
    public Map getSubgraphs() {
        return getSubgraphs(null);
    }

    @Override
    public Map getSubgraphs(final String parent) {
        final Set childFilteringScopes = getFilteringScopes(parent);

        if (subgraphs == null) {
            final Map> contextSubgraphs = graph.getSubgraphs(childFilteringScopes);
            contextSubgraphs.putAll(graph.getSubgraphs(ScopeProvider.DEFAULT_SCOPE));

            subgraphs = Views.mapView(contextSubgraphs, new Function, ObjectGraph>() {

                @Override
                public ObjectGraph apply(final Class clazz) {
                    final EntityGraph entityGraph = classToGraph.get(clazz);

                    return entityGraph == null
                        ? new EmptyObjectGraph(clazz)
                        : new ObjectGraphImpl(classToGraph, entityGraph, filteringScopes);
                }
            });
        }
        return subgraphs;
    }

    private Set getFilteringScopes(final String parent) {
        Set childFilteringScopes = new HashSet<>();
        if (filteringScopes.contains(SelectableScopeResolver.DEFAULT_SCOPE) || parent == null) {
            childFilteringScopes = filteringScopes;
        } else {
            for (final String filteringScope : filteringScopes) {
                final Pattern p = Pattern.compile(SelectableScopeResolver.PREFIX + parent + "\\.(\\w+)(\\.\\w+)*$");
                final Matcher m = p.matcher(filteringScope);
                if (m.matches()) {
                    childFilteringScopes.add(SelectableScopeResolver.PREFIX + m.group(1));
                } else {
                    childFilteringScopes.add(filteringScope);
                }
            }
        }
        return childFilteringScopes;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy