Merge commit '137a95c8cbbd9db910808f6b4d19210f8dfec4bc' into stable-2.8
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/GerritWicketFilter.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/GerritWicketFilter.java
index d2d557f..a9d0601 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/GerritWicketFilter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/GerritWicketFilter.java
@@ -14,11 +14,9 @@
 package com.googlesource.gerrit.plugins.gitblit;
 
 import java.io.IOException;
-import java.io.InputStream;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.Properties;
 import java.util.Vector;
 
 import javax.servlet.FilterChain;
@@ -30,17 +28,12 @@
 import javax.servlet.ServletResponse;
 
 import org.apache.wicket.protocol.http.WicketFilter;
-import org.eclipse.jgit.lib.Config;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.gitblit.Constants;
 import com.gitblit.GitBlit;
-import com.gitblit.IStoredSettings;
-import com.google.gerrit.common.data.GerritConfig;
 import com.google.gerrit.httpd.WebSession;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.LocalDiskRepositoryManager;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
@@ -48,33 +41,27 @@
 import com.googlesource.gerrit.plugins.gitblit.app.GerritToGitBlitWebApp;
 import com.googlesource.gerrit.plugins.gitblit.app.GitBlitSettings;
 import com.googlesource.gerrit.plugins.gitblit.auth.GerritAuthFilter;
-import com.googlesource.gerrit.plugins.gitblit.auth.GerritToGitBlitUserService;
 
 @Singleton
 public class GerritWicketFilter extends WicketFilter {
-  private static final String GITBLIT_GERRIT_PROPERTIES = "/gitblit.properties";
   private static final Logger log = LoggerFactory
       .getLogger(GerritWicketFilter.class);
 
-  private final LocalDiskRepositoryManager repoManager;
   private final Provider<WebSession> webSession;
   @SuppressWarnings("unused")
   // We need Guice to create the GerritGitBlit instance
   private final GerritGitBlit gitBlit;
   private final GerritAuthFilter gerritAuthFilter;
-  private final GitBlitUrlsConfig config;
+  private final GitBlitSettings settings;
 
   @Inject
-  public GerritWicketFilter(final LocalDiskRepositoryManager repoManager,
+  public GerritWicketFilter(
       final Provider<WebSession> webSession, final GerritGitBlit gitBlit,
-      final GerritAuthFilter gerritAuthFilter, final @GerritServerConfig Config config,
-      final GerritConfig gerritConfig) {
-
-    this.repoManager = repoManager;
+      final GerritAuthFilter gerritAuthFilter, final GitBlitSettings settings) {
     this.webSession = webSession;
     this.gitBlit = gitBlit;
     this.gerritAuthFilter = gerritAuthFilter;
-    this.config = new GitBlitUrlsConfig(config);
+    this.settings = settings;
   }
 
   @Override
@@ -82,29 +69,7 @@
     showGitBlitBanner();
 
     try {
-      InputStream resin =
-          getClass().getResourceAsStream(GITBLIT_GERRIT_PROPERTIES);
-      Properties properties = null;
-      try {
-        properties = new Properties();
-        properties.load(resin);
-        properties.put("git.repositoriesFolder", repoManager.getBasePath()
-            .getAbsolutePath());
-        properties.put("realm.userService",
-            GerritToGitBlitUserService.class.getName());
-        if (properties.get("web.otherUrls") != null) {
-	    properties.put("web.otherUrls",
-                (config.getGitHttpUrl() + " " + config.getGitSshUrl()).trim()
-                + " " + properties.get("web.otherUrls"));
-        } else {
-            properties.put("web.otherUrls",
-                (config.getGitHttpUrl() + " " + config.getGitSshUrl()).trim());
-        }
-      } finally {
-        resin.close();
-      }
-      IStoredSettings settings = new GitBlitSettings(properties);
-      GitBlit.self().configureContext(settings, repoManager.getBasePath(),
+      GitBlit.self().configureContext(settings, settings.getBasePath(),
           false);
       GitBlit.self().contextInitialized(
           new ServletContextEvent(filterConfig.getServletContext()));
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GerritToGitBlitWebApp.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GerritToGitBlitWebApp.java
index d291279..419487c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GerritToGitBlitWebApp.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GerritToGitBlitWebApp.java
@@ -24,7 +24,7 @@
     protected IRequestCycleProcessor newRequestCycleProcessor() {
         return new WebRequestCycleProcessor() {
             protected IRequestCodingStrategy newRequestCodingStrategy() {
-                return new StaticCodingStrategy();
+                return new StaticCodingStrategy("summary/", "project/");
             }
         };
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GitBlitSettings.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GitBlitSettings.java
index f11e715..2f93f52 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GitBlitSettings.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GitBlitSettings.java
@@ -13,17 +13,48 @@
 // limitations under the License.
 package com.googlesource.gerrit.plugins.gitblit.app;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.Map;
 import java.util.Properties;
 
+import org.eclipse.jgit.lib.Config;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import com.gitblit.IStoredSettings;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.git.LocalDiskRepositoryManager;
+import com.google.inject.Inject;
+import com.googlesource.gerrit.plugins.gitblit.GitBlitUrlsConfig;
+import com.googlesource.gerrit.plugins.gitblit.auth.GerritToGitBlitUserService;
 
 public class GitBlitSettings extends IStoredSettings {
-  private Properties properties;
+  private static final String GITBLIT_GERRIT_PROPERTIES = "/gitblit.properties";
 
-  public GitBlitSettings(Properties properties) {
+  private final LocalDiskRepositoryManager repoManager;
+  private final GitBlitUrlsConfig config;
+  private final File etcDir;
+
+  private Properties properties;
+  private File gitblitPropertiesFile;
+
+  @Inject
+  public GitBlitSettings(final LocalDiskRepositoryManager repoManager,
+      final @GerritServerConfig Config config, final SitePaths sitePaths)
+      throws IOException {
     super(GitBlitSettings.class);
-    this.properties = properties;
+    this.properties = new Properties();
+    this.repoManager = repoManager;
+    this.config = new GitBlitUrlsConfig(config);
+    this.etcDir = sitePaths.etc_dir;
+    load();
   }
 
   @Override
@@ -36,4 +67,65 @@
     properties.putAll(updatedSettings);
     return true;
   }
+
+  private void load() throws IOException {
+    InputStream resin = openPropertiesFile();
+    try {
+      properties = new Properties();
+      properties.load(resin);
+      properties.put("git.repositoriesFolder", repoManager.getBasePath()
+          .getAbsolutePath());
+      properties.put("realm.userService",
+          GerritToGitBlitUserService.class.getName());
+      if (properties.get("web.otherUrls") != null) {
+        properties.put("web.otherUrls",
+            (config.getGitHttpUrl() + " " + config.getGitSshUrl()).trim() + " "
+                + properties.get("web.otherUrls"));
+      } else {
+        properties.put("web.otherUrls",
+            (config.getGitHttpUrl() + " " + config.getGitSshUrl()).trim());
+      }
+    } finally {
+      resin.close();
+    }
+  }
+
+  private InputStream openPropertiesFile() {
+    InputStream gitblitPropertiesIn;
+    gitblitPropertiesFile = new File(etcDir, GITBLIT_GERRIT_PROPERTIES);
+    if (gitblitPropertiesFile.exists()) {
+      try {
+        gitblitPropertiesIn = new FileInputStream(gitblitPropertiesFile);
+      } catch (FileNotFoundException e) {
+        // this would never happen as we checked for file existence before
+        throw new IllegalStateException(e);
+      }
+    } else {
+      gitblitPropertiesIn =
+          getClass().getResourceAsStream(GITBLIT_GERRIT_PROPERTIES);
+    }
+    return gitblitPropertiesIn;
+  }
+
+  public File getBasePath() {
+    return repoManager.getBasePath();
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder stringSettings = new StringBuilder();
+    if (!gitblitPropertiesFile.exists()) {
+      stringSettings.append(GITBLIT_GERRIT_PROPERTIES
+          + " from gitblit plugin jar");
+    } else {
+      stringSettings.append(gitblitPropertiesFile.getAbsolutePath()
+          + " (lastModified: "
+          + new SimpleDateFormat().format(new Date(gitblitPropertiesFile
+              .lastModified())) + ")");
+    }
+
+    stringSettings.append(" with values ");
+    stringSettings.append(properties.toString());
+    return stringSettings.toString();
+  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/StaticCodingStrategy.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/StaticCodingStrategy.java
index 5dd9e5f..f196e27 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/StaticCodingStrategy.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/StaticCodingStrategy.java
@@ -17,8 +17,17 @@
 import org.apache.wicket.RequestCycle;
 import org.apache.wicket.protocol.http.request.WebRequestCodingStrategy;
 import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class StaticCodingStrategy extends WebRequestCodingStrategy {
+  private static final Logger LOG = LoggerFactory
+      .getLogger(StaticCodingStrategy.class);
+  private String[] ignoreResourceUrlPrefixes;
+
+  public StaticCodingStrategy(String... ignoreResourceUrlPrefixes) {
+    this.ignoreResourceUrlPrefixes = ignoreResourceUrlPrefixes;
+  }
 
   @Override
   public String rewriteStaticRelativeUrl(String url) {
@@ -28,12 +37,25 @@
       return url;
     }
 
+    if(isMatchingIgnoreUrlPrefixes(url)) {
+      return url;
+    }
+
     int depth =
         ((ServletWebRequest) RequestCycle.get().getRequest())
             .getDepthRelativeToWicketHandler();
     return getRelativeStaticUrl(url, depth);
   }
 
+  private boolean isMatchingIgnoreUrlPrefixes(String url) {
+    for (String ignoredUrlPrefix : ignoreResourceUrlPrefixes) {
+      if(url.startsWith(ignoredUrlPrefix)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
   public static String getRelativePrefix(Request request) {
     int depth = ((ServletWebRequest) request).getDepthRelativeToWicketHandler();
 
@@ -60,6 +82,8 @@
                                  // file
     urlBuffer.append(url);
 
+    LOG.debug("Rewriting URL " + url + " to " + urlBuffer);
+
     return urlBuffer.toString();
   }
 }