package aQute.bnd.url;
import static aQute.libg.slf4j.GradleLogging.LIFECYCLE;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import aQute.bnd.service.Plugin;
import aQute.bnd.service.Registry;
import aQute.bnd.service.RegistryPlugin;
import aQute.bnd.service.url.URLConnectionHandler;
import aQute.lib.strings.Strings;
import aQute.libg.glob.Glob;
import aQute.service.reporter.Reporter;
/**
* Base class for the URL Connection handlers. This class implements some
* convenient methods like the matching. In general you should subclass and
* implement {@link #handle(URLConnection)}. Be aware to call the
* {@link #matches(URLConnection)} method to verify the plugin is applicable.
*/
public class DefaultURLConnectionHandler implements URLConnectionHandler, Plugin, RegistryPlugin, Reporter {
private final static Logger logger = LoggerFactory.getLogger(DefaultURLConnectionHandler.class);
interface Config {
String match();
}
private final Set<Glob> matchers = new HashSet<Glob>();
private Reporter reporter;
protected Registry registry = null;
/**
* Not doing anything is perfect ok
*/
public void handle(URLConnection connection) throws Exception {}
/**
* Verify if the URL matches one of our globs. If there are no globs, we
* always return true.
*/
public boolean matches(URL url) {
if (matchers.isEmpty())
return true;
String string = url.toString();
for (Glob g : matchers) {
if (g.matcher(string).matches())
return true;
}
return false;
}
/**
* Convenience method to make it easier to verify connections
*
* @param connection The connection to match
* @return true if this connection should be handled.
*/
protected boolean matches(URLConnection connection) {
return matches(connection.getURL());
}
/**
* We are a @link {@link RegistryPlugin} for convenience to our subclasses.
*/
public void setRegistry(Registry registry) {
this.registry = registry;
}
/**
* Set the properties for this plugin. Subclasses should call this method
* before they handle their own properties.
*/
public void setProperties(Map<String,String> map) throws Exception {
String matches = map.get(MATCH);
if (matches != null) {
for (String p : matches.split("\\s*,\\s*")) {
matchers.add(new Glob(p));
}
}
}
public void setReporter(Reporter processor) {
this.reporter = processor;
}
// Delegated reporter methods for convenience
public List<String> getWarnings() {
return reporter.getWarnings();
}
public List<String> getErrors() {
return reporter.getErrors();
}
public Location getLocation(String msg) {
return reporter.getLocation(msg);
}
public boolean isOk() {
return reporter.isOk();
}
public SetLocation error(String format, Object... args) {
return reporter.error(format, args);
}
public SetLocation warning(String format, Object... args) {
return reporter.warning(format, args);
}
/**
* @deprecated Use SLF4J Logger.debug instead.
*/
@Deprecated
public void trace(String format, Object... args) {
if (logger.isDebugEnabled()) {
logger.debug("{}", Strings.format(format, args));
}
}
/**
* @deprecated Use SLF4J
* Logger.info(aQute.libg.slf4j.GradleLogging.LIFECYCLE)
* instead.
*/
@Deprecated
public void progress(float progress, String format, Object... args) {
if (logger.isInfoEnabled(LIFECYCLE)) {
String message = Strings.format(format, args);
if (progress > 0)
logger.info(LIFECYCLE, "[{}] {}", (int) progress, message);
else
logger.info(LIFECYCLE, "{}", message);
}
}
public SetLocation exception(Throwable t, String format, Object... args) {
return reporter.exception(t, format, args);
}
public boolean isPedantic() {
return reporter.isPedantic();
}
}