/**
* 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.INTERNAL.graph.discover;
import org.commonjava.cartographer.CartoDataException;
import org.commonjava.cartographer.graph.discover.DiscoveryConfig;
import org.commonjava.cartographer.graph.discover.DiscoveryResult;
import org.commonjava.cartographer.graph.discover.meta.MetadataScannerSupport;
import org.commonjava.cartographer.graph.discover.patch.PatcherSupport;
import org.commonjava.cartographer.spi.graph.discover.ProjectRelationshipDiscoverer;
import org.commonjava.cartographer.graph.RelationshipGraph;
import org.commonjava.cartographer.graph.RelationshipGraphException;
import org.commonjava.maven.atlas.graph.model.EProjectDirectRelationships;
import org.commonjava.maven.atlas.graph.rel.ProjectRelationship;
import org.commonjava.maven.atlas.ident.ref.ProjectVersionRef;
import org.commonjava.maven.galley.TransferException;
import org.commonjava.maven.galley.maven.ArtifactManager;
import org.commonjava.maven.galley.maven.GalleyMavenException;
import org.commonjava.maven.galley.maven.model.view.MavenPomView;
import org.commonjava.maven.galley.maven.parse.MavenPomReader;
import org.commonjava.maven.galley.maven.rel.MavenModelProcessor;
import org.commonjava.maven.galley.model.Location;
import org.commonjava.maven.galley.model.Transfer;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Alternative;
import javax.inject.Inject;
import javax.inject.Named;
import java.util.List;
import java.util.Map;
import java.util.Set;
@ApplicationScoped
@Named
@Alternative
public class DiscovererImpl
implements ProjectRelationshipDiscoverer
{
@Inject
private ArtifactManager artifactManager;
@Inject
private MavenModelProcessor modelProcessor;
@Inject
private PatcherSupport patchers;
@Inject
private MetadataScannerSupport metadataScanners;
@Inject
private MavenPomReader pomReader;
protected DiscovererImpl()
{
}
public DiscovererImpl( final MavenModelProcessor modelProcessor, final MavenPomReader pomReader,
final ArtifactManager artifactManager, final PatcherSupport patchers,
final MetadataScannerSupport metadataScanners )
{
this.modelProcessor = modelProcessor;
this.pomReader = pomReader;
this.artifactManager = artifactManager;
this.patchers = patchers;
this.metadataScanners = metadataScanners;
}
@Override
public ProjectVersionRef resolveSpecificVersion( final ProjectVersionRef ref, final DiscoveryConfig discoveryConfig )
throws CartoDataException
{
final List<? extends Location> locations = discoveryConfig.getLocations();
try
{
return artifactManager.resolveVariableVersion( locations, ref );
}
catch ( final TransferException e )
{
throw new CartoDataException( "Failed to graph variable version for: {}. Reason: {}", e, ref,
e.getMessage() );
}
}
@Override
public DiscoveryResult discoverRelationships( final ProjectVersionRef ref, final RelationshipGraph graph,
final DiscoveryConfig discoveryConfig )
throws CartoDataException
{
ProjectVersionRef specific = ref;
if ( !ref.isSpecificVersion() )
{
specific = resolveSpecificVersion( ref, discoveryConfig );
}
if ( specific == null )
{
specific = ref;
}
final List<? extends Location> locations = discoveryConfig.getLocations();
Transfer transfer;
final MavenPomView pomView;
try
{
transfer = artifactManager.retrieveFirst( locations, specific.asPomArtifact() );
if ( transfer == null )
{
return null;
}
pomView = pomReader.read( specific, transfer, locations );
}
catch ( final TransferException e )
{
throw new CartoDataException( "Failed to retrieve POM: {} from: {}. Reason: {}", e, specific, locations,
e.getMessage() );
}
catch ( final GalleyMavenException e )
{
throw new CartoDataException( "Failed to parse POM: {} from: {}. Reason: {}", e, specific, locations,
e.getMessage() );
}
DiscoveryResult result = null;
if ( pomView != null )
{
try
{
EProjectDirectRelationships rels =
modelProcessor.readRelationships( pomView, discoveryConfig.getDiscoverySource(),
discoveryConfig.getProcessorConfig() );
result = new DiscoveryResult( discoveryConfig.getDiscoverySource(), specific, rels.getExactAllRelationships() );
}
catch ( GalleyMavenException e )
{
throw new CartoDataException( "Failed to read relationships from POM: %s. Reason: %s", e, pomView,
e.getMessage() );
}
}
if ( result != null )
{
result = patchers.patch( result, discoveryConfig.getEnabledPatchers(), locations, pomView, transfer );
final Map<String, String> metadata =
metadataScanners.scan( result.getSelectedRef(), locations, pomView, transfer );
result.setMetadata( metadata );
if ( discoveryConfig.isStoreRelationships() )
{
final Set<ProjectRelationship<?, ?>> rejected;
try
{
rejected = graph.storeRelationships( result.getAcceptedRelationships() );
graph.addMetadata( result.getSelectedRef(), metadata );
}
catch ( final RelationshipGraphException e )
{
throw new CartoDataException( "Failed to store relationships or metadata for: {}. Reason: {}", e,
result.getSelectedRef(), e.getMessage() );
}
result = new DiscoveryResult( result.getSource(), result, rejected );
}
}
return result;
}
}