package org.handwerkszeug.mvnhack.repository.impl;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import org.handwerkszeug.common.util.Streams;
import org.handwerkszeug.common.util.UrlUtil;
import org.handwerkszeug.mvnhack.Constants;
import org.handwerkszeug.mvnhack.repository.Artifact;
import org.handwerkszeug.mvnhack.repository.Configuration;
import org.handwerkszeug.mvnhack.repository.Context;
import org.handwerkszeug.mvnhack.repository.Destination;
import org.handwerkszeug.mvnhack.repository.Repository;
public class DefaultContext implements Context {
protected Map<String, Artifact> resolved;
protected Configuration configuration;
protected Map<String, String> managedDependencies;
public DefaultContext(Configuration configuration) {
this.configuration = configuration;
this.resolved = new HashMap<String, Artifact>();
this.managedDependencies = new HashMap<String, String>();
}
public DefaultContext(Configuration configuration,
Map<String, Artifact> resolved) {
this.configuration = configuration;
this.resolved = resolved;
this.managedDependencies = new HashMap<String, String>();
}
protected void addResolved(Artifact artifact) {
resolved.put(toId(artifact.getGroupId(), artifact.getArtifactId(),
artifact.getVersion()), artifact);
}
protected String toId(String groupId, String artifactId, String version) {
return ArtifactUtil.toPath(groupId, artifactId, version, "");
}
@Override
public void addManagedDependency(Artifact artifact) {
this.managedDependencies.put(toManagedId(artifact), artifact
.getVersion());
}
@Override
public String getManagedDependency(Artifact artifact) {
return this.managedDependencies.get(toManagedId(artifact));
}
protected String toManagedId(Artifact artifact) {
return artifact.getGroupId() + '/' + artifact.getArtifactId();
}
@Override
public Artifact resolve(String groupId, String artifactId, String version) {
String id = toId(groupId, artifactId, version);
Artifact result = resolved.get(id);
if (result == null) {
for (Repository r : configuration.getRepositories()) {
Artifact a = r.load(this, groupId, artifactId, version);
if (a != null) {
for (Destination d : configuration.getDestinations()) {
d.copyFrom(this, r, a);
}
addResolved(a);
resolveDependencies(a);
return a;
}
}
}
return result;
}
protected void resolveDependencies(Artifact a) {
List<Artifact> list = new ArrayList<Artifact>();
for (Artifact d : a.getDependencies()) {
DefaultContext c = new DefaultContext(this.configuration,
this.resolved);
Artifact resolve = c.resolve(d.getGroupId(), d.getArtifactId(), d
.getVersion());
list.add(resolve);
}
a.getDependencies().clear();
a.getDependencies().addAll(list);
}
@Override
public InputStream open(Artifact artifact, URL url) {
URL from = findLocal(artifact, url);
Constants.LOG.log(Level.INFO, "read from {0}", from);
InputStream result = UrlUtil.open(from);
return result;
}
protected URL findLocal(Artifact artifact, URL url) {
for (Destination d : configuration.getDestinations()) {
File f = d.toDestination(artifact, url);
if (f != null && f.exists()) {
return UrlUtil.toURL(f);
}
}
return url;
}
@Override
public void close(InputStream stream) {
Streams.close(stream);
}
}