/**
* Copyright (C) 2013 Red Hat, Inc. (jdcasey@commonjava.org)
*
* 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.discover;
import java.net.URI;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.commonjava.maven.atlas.graph.rel.ProjectRelationship;
import org.commonjava.maven.atlas.ident.ref.ProjectVersionRef;
import org.commonjava.maven.atlas.ident.ref.SimpleProjectVersionRef;
import org.commonjava.maven.atlas.ident.util.JoinString;
public final class DiscoveryResult
{
private final ProjectVersionRef selected;
private final URI source;
private Set<ProjectRelationship<?, ?>> rejected;
private Set<ProjectRelationship<?, ?>> discovered;
private transient Set<ProjectRelationship<?, ?>> accepted;
private Map<String, String> metadata;
public DiscoveryResult( final URI source, final ProjectVersionRef selected,
final Set<ProjectRelationship<?, ?>> discovered )
{
this( source, selected, discovered, Collections.<ProjectRelationship<?, ?>> emptySet() );
}
public DiscoveryResult( final URI source, final ProjectVersionRef selected,
final Set<ProjectRelationship<?, ?>> discovered, final Set<ProjectRelationship<?, ?>> rejected )
{
this.source = source;
this.selected = selected;
this.discovered = discovered == null ? null : new HashSet<ProjectRelationship<?, ?>>( discovered );
this.rejected = rejected;
}
public DiscoveryResult( final URI source, final DiscoveryResult original,
final Set<ProjectRelationship<?, ?>> newlyRejected )
{
this.source = source;
this.selected = original.getSelectedRef();
this.discovered = original.getAllDiscoveredRelationships();
if ( this.discovered != null )
{
this.discovered = new HashSet<ProjectRelationship<?, ?>>( this.discovered );
}
this.rejected = new HashSet<ProjectRelationship<?, ?>>();
rejected.addAll( original.getRejectedRelationships() );
rejected.addAll( newlyRejected );
}
public URI getSource()
{
return source;
}
public void setRejectedRelationships( final Set<ProjectRelationship<?, ?>> rejected )
{
this.rejected = rejected;
this.accepted = null;
}
public void setDiscoveredRelationships( final Set<ProjectRelationship<?, ?>> discovered )
{
this.discovered = discovered;
this.accepted = null;
}
public ProjectVersionRef getSelectedRef()
{
return selected;
}
public Set<ProjectRelationship<?, ?>> getRejectedRelationships()
{
return rejected;
}
public Set<ProjectRelationship<?, ?>> getAllDiscoveredRelationships()
{
return discovered;
}
public Set<ProjectRelationship<?, ?>> getAcceptedRelationships()
{
if ( discovered == null )
{
return null;
}
if ( accepted == null )
{
accepted = new HashSet<ProjectRelationship<?, ?>>( discovered );
accepted.removeAll( rejected );
}
return accepted;
}
@Override
public synchronized String toString()
{
return String.format( "DiscoveryResult [selected=%s]\n %s", selected, discovered == null ? "-NONE-"
: new JoinString( "\n ", new HashSet<ProjectRelationship<?, ?>>( discovered ) ) );
}
public synchronized boolean removeDiscoveredRelationship( final ProjectRelationship<?, ?> rel )
{
final boolean result = discovered.remove( rel );
accepted = null;
return result;
}
public synchronized boolean addDiscoveredRelationship( final ProjectRelationship<?, ?> rel )
{
final boolean result = discovered.add( rel );
accepted = null;
return result;
}
public boolean removeRejectedRelationship( final ProjectRelationship<?, ?> rel )
{
final boolean result = rejected.remove( rel );
accepted = null;
return result;
}
public boolean addRejectedRelationship( final ProjectRelationship<?, ?> rel )
{
final boolean result = rejected.add( rel );
accepted = null;
return result;
}
public void setMetadata( final Map<String, String> metadata )
{
this.metadata = metadata;
}
public Map<String, String> getMetadata()
{
return metadata;
}
}