in src/main/java/org/apache/sling/feature/io/artifacts/ArtifactManager.java [186:295]
public ArtifactHandler getArtifactHandler(final String url) throws IOException {
logger.debug("Trying to get artifact for {}", url);
final String path;
ArtifactId artifactId = null;
if ( url.startsWith("mvn:") ) {
// mvn url
try {
artifactId = ArtifactId.fromMvnUrl(url);
path = artifactId.toMvnPath();
} catch (final IllegalArgumentException iae) {
throw new IOException(iae.getMessage(), iae);
}
} else if ( url.startsWith(":") ) {
// repository path
path = url.substring(1);
} else if ( url.indexOf(":/") > 0 ) {
// absolute URL
int pos = url.indexOf(":/") + 2;
while ( url.charAt(pos) == '/') {
pos++;
}
final URL file = this.getArtifactFromProviders(url, url.substring(pos));
if ( file == null ) {
throw new IOException("Artifact " + url + " not found.");
}
return new ArtifactHandler(url, file);
} else {
// file (either relative or absolute)
final Path f = Paths.get(url);
if ( !Files.exists(f)) {
throw new IOException("Artifact " + url + " not found.");
}
return new ArtifactHandler(f);
}
logger.debug("Querying repositories for {}", path);
for(final String repoUrl : this.config.getRepositoryUrls()) {
final StringBuilder builder = new StringBuilder();
builder.append(repoUrl);
builder.append('/');
builder.append(path);
final String artifactUrl = builder.toString();
final int pos = artifactUrl.indexOf(":");
final String scheme = artifactUrl.substring(0, pos);
ArtifactProvider handler = this.providers.get(scheme);
if ( handler == null ) {
handler = this.providers.get("*");
}
if ( handler == null ) {
throw new IOException("No URL handler found for " + artifactUrl);
}
logger.debug("Checking {} to get artifact from {}", handler, artifactUrl);
final URL file = handler.getArtifact(artifactUrl, path);
if ( file != null ) {
logger.debug("Found artifact {}", artifactUrl);
return new ArtifactHandler(artifactUrl, file);
}
// check for SNAPSHOT
final int lastSlash = artifactUrl.lastIndexOf('/');
final int startSnapshot = artifactUrl.indexOf("-SNAPSHOT", lastSlash + 1);
if ( startSnapshot > -1 ) {
// special snapshot handling
final String metadataUrl = artifactUrl.substring(0, lastSlash) + "/maven-metadata.xml";
try {
final ArtifactHandler metadataHandler = this.getArtifactHandler(metadataUrl);
final String contents = getFileContents(metadataHandler);
final String latestVersion = getLatestSnapshot(contents);
if ( latestVersion != null ) {
final String name = artifactUrl.substring(lastSlash); // includes slash
final String fullURL = artifactUrl.substring(0, lastSlash) + name.replace("SNAPSHOT", latestVersion);
int pos2 = fullURL.indexOf(":/") + 2;
while ( fullURL.charAt(pos2) == '/') {
pos2++;
}
final URL file2 = this.getArtifactFromProviders(fullURL, path);
if ( file2 == null ) {
throw new IOException("Artifact " + fullURL + " not found.");
}
return new ArtifactHandler(artifactUrl, file2);
}
} catch ( final IOException ignore ) {
// we ignore this but report the original 404
}
}
}
// if we have an artifact id and using mvn is enabled, we try this as a last
// resort
if (artifactId != null && this.config.isUseMvn()) {
final Path file = getArtifactFromMvn(artifactId);
if (file != null) {
return new ArtifactHandler(file);
}
}
throw new IOException("Artifact " + url + " not found in any repository.");
}