/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.camel.catalog.maven;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import groovy.grape.Grape;
import groovy.lang.GroovyClassLoader;
import org.apache.camel.catalog.VersionManager;
/**
* A {@link VersionManager} that can load the resources using Maven to download needed artifacts from
* a local or remote Maven repository.
* <p/>
* This implementation uses Groovy Grape to download the Maven JARs.
*/
public class MavenVersionManager implements VersionManager {
private final ClassLoader classLoader = new GroovyClassLoader();
private String version;
private String runtimeProviderVersion;
private String cacheDirectory;
private boolean log;
/**
* Configures the directory for the download cache.
* <p/>
* The default folder is <tt>USER_HOME/.groovy/grape</tt>
*
* @param directory the directory.
*/
public void setCacheDirectory(String directory) {
this.cacheDirectory = directory;
}
/**
* Sets whether to log errors and warnings to System.out.
* By default nothing is logged.
*/
public void setLog(boolean log) {
this.log = log;
}
/**
* To add a 3rd party Maven repository.
*
* @param name the repository name
* @param url the repository url
*/
public void addMavenRepository(String name, String url) {
Map<String, Object> repo = new HashMap<>();
repo.put("name", name);
repo.put("root", url);
Grape.addResolver(repo);
}
@Override
public String getLoadedVersion() {
return version;
}
@Override
public boolean loadVersion(String version) {
try {
if (cacheDirectory != null) {
System.setProperty("grape.root", cacheDirectory);
}
Grape.setEnableAutoDownload(true);
Map<String, Object> param = new HashMap<>();
param.put("classLoader", classLoader);
param.put("group", "org.apache.camel");
param.put("module", "camel-catalog");
param.put("version", version);
Grape.grab(param);
this.version = version;
return true;
} catch (Exception e) {
if (log) {
System.out.print("WARN: Cannot load version " + version + " due " + e.getMessage());
}
return false;
}
}
@Override
public String getRuntimeProviderLoadedVersion() {
return runtimeProviderVersion;
}
@Override
public boolean loadRuntimeProviderVersion(String groupId, String artifactId, String version) {
try {
Grape.setEnableAutoDownload(true);
Map<String, Object> param = new HashMap<>();
param.put("classLoader", classLoader);
param.put("group", groupId);
param.put("module", artifactId);
param.put("version", version);
Grape.grab(param);
this.runtimeProviderVersion = version;
return true;
} catch (Exception e) {
if (log) {
System.out.print("WARN: Cannot load runtime provider version " + version + " due " + e.getMessage());
}
return false;
}
}
@Override
public InputStream getResourceAsStream(String name) {
InputStream is = null;
if (runtimeProviderVersion != null) {
is = doGetResourceAsStream(name, runtimeProviderVersion);
}
if (is == null && version != null) {
is = doGetResourceAsStream(name, version);
}
return is;
}
private InputStream doGetResourceAsStream(String name, String version) {
if (version == null) {
return null;
}
try {
URL found = null;
Enumeration<URL> urls = classLoader.getResources(name);
while (urls.hasMoreElements()) {
URL url = urls.nextElement();
if (url.getPath().contains(version)) {
found = url;
break;
}
}
if (found != null) {
return found.openStream();
}
} catch (IOException e) {
if (log) {
System.out.print("WARN: Cannot open resource " + name + " and version " + version + " due " + e.getMessage());
}
}
return null;
}
}