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

org.commonjava.cartographer.graph.MultiGraphCalculator Maven / Gradle / Ivy

/**
 * Copyright (C) 2013 Red Hat, Inc. ([email protected])
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.commonjava.cartographer.graph;

import org.apache.commons.io.IOUtils;
import org.commonjava.maven.atlas.graph.RelationshipGraph;
import org.commonjava.maven.atlas.graph.RelationshipGraphException;
import org.commonjava.maven.atlas.graph.RelationshipGraphFactory;
import org.commonjava.maven.atlas.graph.ViewParams;
import org.commonjava.maven.atlas.graph.rel.ProjectRelationship;
import org.commonjava.maven.atlas.ident.ref.ProjectVersionRef;
import org.commonjava.cartographer.CartoDataException;
import org.commonjava.cartographer.request.GraphCalculation;
import org.commonjava.cartographer.request.GraphComposition;
import org.commonjava.cartographer.request.GraphDescription;

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * Created by jdcasey on 8/11/15.
 */
@ApplicationScoped
public class MultiGraphCalculator
{

    @Inject
    private RelationshipGraphFactory graphFactory;

    public MultiGraphCalculator(){}

    public MultiGraphCalculator( RelationshipGraphFactory factory )
    {
        this.graphFactory = factory;
    }

    public GraphCalculation calculateFromParamMap( final GraphComposition composition,
                                                   final Map paramMap )
                    throws CartoDataException
    {
        final Map graphMap = new HashMap<>();
        try
        {
            for ( final GraphDescription desc : composition )
            {
                final ViewParams params = paramMap.get( desc );
                RelationshipGraph graph;
                try
                {
                    graph = graphFactory.open( params, false );
                }
                catch ( final RelationshipGraphException e )
                {
                    throw new CartoDataException( "Failed to open graph: {}. Reason: {}", e, params, e.getMessage() );
                }
                graphMap.put( desc, graph );
            }

            return calculateFromGraphMap( composition, graphMap );
        }
        finally
        {
            for ( final RelationshipGraph graph : graphMap.values() )
            {
                IOUtils.closeQuietly( graph );
            }
        }
    }

    public GraphCalculation calculateFromGraphMap( final GraphComposition composition,
                                                   final Map graphMap )
                    throws CartoDataException
    {
        Set> result = null;
        Set roots = null;

        out: for ( final GraphDescription desc : composition.getGraphs() )
        {
            final RelationshipGraph graph = graphMap.get( desc );

            if ( graph == null )
            {
                throw new CartoDataException( "Cannot retrieve web for: {}.", graph );
            }

            if ( result == null )
            {
                result = new HashSet<>( graph.getAllRelationships() );
                roots = new HashSet<>( graph.getRoots() );
            }
            else
            {
                switch ( composition.getCalculation() )
                {
                    case SUBTRACT:
                    {
                        result.removeAll( graph.getAllRelationships() );

                        if ( result.isEmpty() )
                        {
                            break out;
                        }

                        break;
                    }
                    case ADD:
                    {
                        result.addAll( graph.getAllRelationships() );
                        roots.addAll( graph.getRoots() );
                        break;
                    }
                    case INTERSECT:
                    {
                        result.retainAll( graph.getAllRelationships() );
                        roots.addAll( graph.getRoots() );

                        if ( result.isEmpty() )
                        {
                            break out;
                        }

                        break;
                    }
                }
            }
        }

        return new GraphCalculation( composition.getCalculation(), composition.getGraphs(), roots, result );
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy