Repository: karaf Updated Branches: refs/heads/master d030dd797 -> 836ee90c7
[KARAF-3712] Add configuration properties for external repositories: expiration time and ignore failures Project: http://git-wip-us.apache.org/repos/asf/karaf/repo Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/836ee90c Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/836ee90c Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/836ee90c Branch: refs/heads/master Commit: 836ee90c76fa9aee46216cf7d333a5c352726e72 Parents: d030dd7 Author: Guillaume Nodet <[email protected]> Authored: Thu May 7 17:34:18 2015 +0200 Committer: Guillaume Nodet <[email protected]> Committed: Thu May 7 17:35:41 2015 +0200 ---------------------------------------------------------------------- .../apache/karaf/features/FeaturesService.java | 1 + .../karaf/features/internal/osgi/Activator.java | 6 ++- .../internal/repository/BaseRepository.java | 3 ++ .../internal/repository/JsonRepository.java | 16 ++++++-- .../features/internal/repository/UrlLoader.java | 16 +++++++- .../internal/repository/XmlRepository.java | 40 +++++++++++++------- 6 files changed, 61 insertions(+), 21 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/karaf/blob/836ee90c/features/core/src/main/java/org/apache/karaf/features/FeaturesService.java ---------------------------------------------------------------------- diff --git a/features/core/src/main/java/org/apache/karaf/features/FeaturesService.java b/features/core/src/main/java/org/apache/karaf/features/FeaturesService.java index b9bc831..82d246d 100644 --- a/features/core/src/main/java/org/apache/karaf/features/FeaturesService.java +++ b/features/core/src/main/java/org/apache/karaf/features/FeaturesService.java @@ -41,6 +41,7 @@ public interface FeaturesService { int DEFAULT_DOWNLOAD_THREADS = 8; long DEFAULT_SCHEDULE_DELAY = 250; int DEFAULT_SCHEDULE_MAX_RUN = 9; + long DEFAULT_REPOSITORY_EXPIRATION = 60000; // 1 minute enum Option { http://git-wip-us.apache.org/repos/asf/karaf/blob/836ee90c/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java ---------------------------------------------------------------------- diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java b/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java index e9fd1b8..bfa7ddb 100644 --- a/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java +++ b/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java @@ -143,13 +143,15 @@ public class Activator extends BaseActivator { List<Repository> repositories = new ArrayList<>(); String[] resourceRepositories = getString("resourceRepositories", "").split(","); + long repositoryExpiration = getLong("repositoryExpiration", FeaturesService.DEFAULT_REPOSITORY_EXPIRATION); + boolean repositoryIgnoreFailures = getBoolean("repositoryIgnoreFailures", true); for (String url : resourceRepositories) { url = url.trim(); if (!url.isEmpty()) { if (url.startsWith("json:")) { - repositories.add(new JsonRepository(url.substring("json:".length()))); + repositories.add(new JsonRepository(url.substring("json:".length()), repositoryExpiration, repositoryIgnoreFailures)); } else if (url.startsWith("xml:")) { - repositories.add(new XmlRepository(url.substring("xml:".length()))); + repositories.add(new XmlRepository(url.substring("xml:".length()), repositoryExpiration, repositoryIgnoreFailures)); } else { logger.warn("Unrecognized resource repository: " + url); } http://git-wip-us.apache.org/repos/asf/karaf/blob/836ee90c/features/core/src/main/java/org/apache/karaf/features/internal/repository/BaseRepository.java ---------------------------------------------------------------------- diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/repository/BaseRepository.java b/features/core/src/main/java/org/apache/karaf/features/internal/repository/BaseRepository.java index e4befcb..0c03b67 100644 --- a/features/core/src/main/java/org/apache/karaf/features/internal/repository/BaseRepository.java +++ b/features/core/src/main/java/org/apache/karaf/features/internal/repository/BaseRepository.java @@ -31,11 +31,14 @@ import org.osgi.resource.Capability; import org.osgi.resource.Requirement; import org.osgi.resource.Resource; import org.osgi.service.repository.Repository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** */ public class BaseRepository implements Repository { + protected final Logger logger = LoggerFactory.getLogger(getClass()); protected final List<Resource> resources; protected final Map<String, CapabilitySet> capSets; http://git-wip-us.apache.org/repos/asf/karaf/blob/836ee90c/features/core/src/main/java/org/apache/karaf/features/internal/repository/JsonRepository.java ---------------------------------------------------------------------- diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/repository/JsonRepository.java b/features/core/src/main/java/org/apache/karaf/features/internal/repository/JsonRepository.java index 270bcdf..92d8d73 100644 --- a/features/core/src/main/java/org/apache/karaf/features/internal/repository/JsonRepository.java +++ b/features/core/src/main/java/org/apache/karaf/features/internal/repository/JsonRepository.java @@ -42,16 +42,18 @@ public class JsonRepository extends BaseRepository { private static final Logger LOGGER = LoggerFactory.getLogger(JsonRepository.class); + private final boolean ignoreFailures; private final UrlLoader loader; private final ReadWriteLock lock = new ReentrantReadWriteLock(); - public JsonRepository(String url) { - loader = new UrlLoader(url) { + public JsonRepository(String url, long expiration, boolean ignoreFailures) { + loader = new UrlLoader(url, expiration) { @Override protected boolean doRead(InputStream is) throws IOException { return JsonRepository.this.doRead(is); } }; + this.ignoreFailures = ignoreFailures; } @Override @@ -77,7 +79,15 @@ public class JsonRepository extends BaseRepository { } private void checkAndLoadCache() { - loader.checkAndLoadCache(); + try { + loader.checkAndLoadCache(); + } catch (Exception e) { + if (ignoreFailures) { + logger.warn("Ignoring failure: " + e.getMessage(), e); + } else { + throw e; + } + } } protected boolean doRead(InputStream is) throws IOException { http://git-wip-us.apache.org/repos/asf/karaf/blob/836ee90c/features/core/src/main/java/org/apache/karaf/features/internal/repository/UrlLoader.java ---------------------------------------------------------------------- diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/repository/UrlLoader.java b/features/core/src/main/java/org/apache/karaf/features/internal/repository/UrlLoader.java index 123451c..a186915 100644 --- a/features/core/src/main/java/org/apache/karaf/features/internal/repository/UrlLoader.java +++ b/features/core/src/main/java/org/apache/karaf/features/internal/repository/UrlLoader.java @@ -34,13 +34,22 @@ public abstract class UrlLoader { public static final String GZIP = "gzip"; private final String url; + private final long expiration; private long lastModified; + private long lastChecked; - public UrlLoader(String url) { + public UrlLoader(String url, long expiration) { this.url = url; + this.expiration = expiration; } protected boolean checkAndLoadCache() { + long time = System.currentTimeMillis(); + if (lastChecked > 0) { + if (expiration < 0 || time - lastChecked < expiration) { + return false; + } + } try { URLConnection connection = new java.net.URL(url).openConnection(); if (connection instanceof HttpURLConnection) { @@ -51,14 +60,16 @@ public abstract class UrlLoader { con.setRequestProperty(HEADER_ACCEPT_ENCODING, GZIP); int rc = con.getResponseCode(); if (rc == HTTP_NOT_MODIFIED) { + lastChecked = time; return false; } if (rc != HTTP_OK) { - throw new IOException("Unexpected http response: " + rc + " " + con.getResponseMessage()); + throw new IOException("Unexpected http response loading " + url + " : " + rc + " " + con.getResponseMessage()); } } long lm = connection.getLastModified(); if (lm > 0 && lm <= lastModified) { + lastChecked = time; return false; } try ( @@ -75,6 +86,7 @@ public abstract class UrlLoader { } boolean r = doRead(is); lastModified = lm; + lastChecked = time; return r; } } catch (IOException e) { http://git-wip-us.apache.org/repos/asf/karaf/blob/836ee90c/features/core/src/main/java/org/apache/karaf/features/internal/repository/XmlRepository.java ---------------------------------------------------------------------- diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/repository/XmlRepository.java b/features/core/src/main/java/org/apache/karaf/features/internal/repository/XmlRepository.java index 0ff574e..e6fadbb 100644 --- a/features/core/src/main/java/org/apache/karaf/features/internal/repository/XmlRepository.java +++ b/features/core/src/main/java/org/apache/karaf/features/internal/repository/XmlRepository.java @@ -45,11 +45,15 @@ import static org.osgi.framework.namespace.IdentityNamespace.IDENTITY_NAMESPACE; public class XmlRepository extends BaseRepository { protected final String url; + protected final long expiration; + protected final boolean ignoreFailures; protected final Map<String, XmlLoader> loaders = new HashMap<String, XmlLoader>(); protected final ReadWriteLock lock = new ReentrantReadWriteLock(); - public XmlRepository(String url) { + public XmlRepository(String url, long expiration, boolean ignoreFailures) { this.url = url; + this.expiration = expiration; + this.ignoreFailures = ignoreFailures; } @Override @@ -109,14 +113,22 @@ public class XmlRepository extends BaseRepository { } private void checkAndLoadCache() { - if (checkAndLoadReferrals(url, Integer.MAX_VALUE)) { - lock.writeLock().lock(); - try { - resources.clear(); - capSets.clear(); - populate(loaders.get(url).xml, Integer.MAX_VALUE); - } finally { - lock.writeLock().unlock(); + try { + if (checkAndLoadReferrals(url, Integer.MAX_VALUE)) { + lock.writeLock().lock(); + try { + resources.clear(); + capSets.clear(); + populate(loaders.get(url).xml, Integer.MAX_VALUE); + } finally { + lock.writeLock().unlock(); + } + } + } catch (Exception e) { + if (ignoreFailures) { + logger.warn("Ignoring failure: " + e.getMessage(), e); + } else { + throw e; } } } @@ -137,7 +149,7 @@ public class XmlRepository extends BaseRepository { if (hopCount > 0) { XmlLoader loader = loaders.get(url); if (loader == null) { - loader = new XmlLoader(url); + loader = new XmlLoader(url, expiration); loaders.put(url, loader); } modified = loader.checkAndLoadCache(); @@ -152,12 +164,12 @@ public class XmlRepository extends BaseRepository { protected StaxParser.XmlRepository xml; - public XmlLoader(String url) { - super(url); + public XmlLoader(String url, long expiration) { + super(url, expiration); } - public XmlLoader(String url, StaxParser.XmlRepository xml) { - super(url); + public XmlLoader(String url, long expiration, StaxParser.XmlRepository xml) { + super(url, expiration); this.xml = xml; }
