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;
         }
 

Reply via email to