]> source.dussan.org Git - gitblit.git/commitdiff
Implemented optional page caching
authorJames Moger <james.moger@gitblit.com>
Fri, 19 Jul 2013 14:46:16 +0000 (10:46 -0400)
committerJames Moger <james.moger@gitblit.com>
Fri, 19 Jul 2013 14:50:32 +0000 (10:50 -0400)
34 files changed:
releases.moxie
src/main/distrib/data/gitblit.properties
src/main/java/WEB-INF/web.xml
src/main/java/com/gitblit/GitBlit.java
src/main/java/com/gitblit/LogoServlet.java
src/main/java/com/gitblit/PagesServlet.java
src/main/java/com/gitblit/wicket/CacheControl.java [new file with mode: 0644]
src/main/java/com/gitblit/wicket/GitBlitWebApp.java
src/main/java/com/gitblit/wicket/GitblitWicketFilter.java [new file with mode: 0644]
src/main/java/com/gitblit/wicket/pages/ActivityPage.java
src/main/java/com/gitblit/wicket/pages/BasePage.java
src/main/java/com/gitblit/wicket/pages/BlamePage.java
src/main/java/com/gitblit/wicket/pages/BlobDiffPage.java
src/main/java/com/gitblit/wicket/pages/BlobPage.java
src/main/java/com/gitblit/wicket/pages/BranchesPage.java
src/main/java/com/gitblit/wicket/pages/CommitDiffPage.java
src/main/java/com/gitblit/wicket/pages/CommitPage.java
src/main/java/com/gitblit/wicket/pages/DocsPage.java
src/main/java/com/gitblit/wicket/pages/GitSearchPage.java
src/main/java/com/gitblit/wicket/pages/HistoryPage.java
src/main/java/com/gitblit/wicket/pages/LogPage.java
src/main/java/com/gitblit/wicket/pages/MarkdownPage.java
src/main/java/com/gitblit/wicket/pages/MetricsPage.java
src/main/java/com/gitblit/wicket/pages/MyDashboardPage.java
src/main/java/com/gitblit/wicket/pages/OverviewPage.java
src/main/java/com/gitblit/wicket/pages/PatchPage.java
src/main/java/com/gitblit/wicket/pages/ProjectPage.java
src/main/java/com/gitblit/wicket/pages/ReflogPage.java
src/main/java/com/gitblit/wicket/pages/RepositoriesPage.java
src/main/java/com/gitblit/wicket/pages/RepositoryPage.java
src/main/java/com/gitblit/wicket/pages/SummaryPage.java
src/main/java/com/gitblit/wicket/pages/TagPage.java
src/main/java/com/gitblit/wicket/pages/TagsPage.java
src/main/java/com/gitblit/wicket/pages/TreePage.java

index 258435da7e591689dab66ae98e31c304716ceec0..49149a80108af6047de22e4721cbae6e62bc341a 100644 (file)
@@ -20,14 +20,18 @@ r18: {
     changes:
        - updated Chinese translation
        - updated Dutch translation
-    additions: ~
+    additions:
+       - Added optional browser-side page caching using Last-Modified and Cache-Control for the dashboard, activity, project, and several repository pages
     dependencyChanges: ~
+       settings:
+       - { name: 'web.pageCacheExpires', defaultValue: 0 }
     contributors:
        - Rainer Alföldi 
        - Liyu Wang
        - Jeroen Baten
        - James Moger
        - Stardrad Yin
+       - Chad Horohoe
 }
 
 #
index f6ed3833a21db149946dc637a16d9922f348ccba..1ee6d8007d38ed66a6c8072eaa376efb43a8b3c8 100644 (file)
@@ -616,6 +616,13 @@ web.enableRpcAdministration = false
 # BASEFOLDER\r
 web.robots.txt = ${baseFolder}/robots.txt\r
 \r
+# The number of minutes to cache a page in the browser since the last request.\r
+# The default value is 0 minutes.  A value <= 0 disables all page caching which\r
+# is the default behavior for Gitblit <= 1.3.0.\r
+#\r
+# SINCE 1.3.1\r
+web.pageCacheExpires = 0\r
+\r
 # If true, the web ui layout will respond and adapt to the browser's dimensions.\r
 # if false, the web ui will use a 940px fixed-width layout.\r
 # http://twitter.github.com/bootstrap/scaffolding.html#responsive\r
index bf121663d63fdb80bc7d5cca1fd253ce92cc078a..cf7146515a868262d2af6909e759d17b90ba848f 100644 (file)
     <filter>\r
         <filter-name>wicketFilter</filter-name>\r
         <filter-class>\r
-            org.apache.wicket.protocol.http.WicketFilter\r
+            com.gitblit.wicket.GitblitWicketFilter\r
         </filter-class>\r
         <init-param>\r
             <param-name>applicationClassName</param-name>\r
index 35ef7708a048d401d4e9457988779a38b50c59ac..efdaad1e9546f317f630b9f0c9a0f8d2eaa5f0a6 100644 (file)
@@ -232,6 +232,33 @@ public class GitBlit implements ServletContextListener {
                }
                return gitblit;
        }
+       
+       /**
+        * Returns the boot date of the Gitblit server.
+        * 
+        * @return the boot date of Gitblit
+        */
+       public static Date getBootDate() {
+               return self().serverStatus.bootDate;
+       }
+       
+       /**
+        * Returns the most recent change date of any repository served by Gitblit.
+        * 
+        * @return a date
+        */
+       public static Date getLastActivityDate() {
+               Date date = null;
+               for (String name : self().getRepositoryList()) {
+                       Repository r = self().getRepository(name);
+                       Date lastChange = JGitUtils.getLastChange(r).when;
+                       r.close();
+                       if (lastChange != null && (date == null || lastChange.after(date))) {
+                               date = lastChange;
+                       }
+               }
+               return date;
+       }
 
        /**
         * Determine if this is the GO variant of Gitblit.
index c8820ed39b70fa7af2f8c1b3d77ad7a2939ef716..823e464c8e6a58dc9840221b92ea386d53efedf3 100644 (file)
@@ -76,6 +76,7 @@ public class LogoServlet extends HttpServlet {
                                contentType = "image/png";\r
                        }\r
                        response.setContentType(contentType);\r
+                       response.setHeader("Cache-Control", "public, max-age=3600, must-revalidate");\r
                        OutputStream os = response.getOutputStream();\r
                        byte[] buf = new byte[4096];\r
                        int bytesRead = is.read(buf);\r
index 9516b357dcd38edc6ecc52b6b7825e1712f0ff0d..fc71bc506fdc93c35fc5db9d4f975c8ef4a7f7de 100644 (file)
@@ -141,7 +141,6 @@ public class PagesServlet extends HttpServlet {
                                r.close();\r
                                return;\r
                        }\r
-                       response.setDateHeader("Last-Modified", JGitUtils.getCommitDate(commit).getTime());\r
 \r
                        String [] encodings = GitBlit.getEncodings();\r
 \r
@@ -226,6 +225,8 @@ public class PagesServlet extends HttpServlet {
 \r
                        try {\r
                                // output the content\r
+                               response.setHeader("Cache-Control", "public, max-age=3600, must-revalidate");\r
+                               response.setDateHeader("Last-Modified", JGitUtils.getCommitDate(commit).getTime());\r
                                response.getOutputStream().write(content);\r
                                response.flushBuffer();\r
                        } catch (Throwable t) {\r
diff --git a/src/main/java/com/gitblit/wicket/CacheControl.java b/src/main/java/com/gitblit/wicket/CacheControl.java
new file mode 100644 (file)
index 0000000..f72fe3a
--- /dev/null
@@ -0,0 +1,40 @@
+/*\r
+ * Copyright 2013 gitblit.com.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *     http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+package com.gitblit.wicket;\r
+\r
+import java.lang.annotation.Documented;\r
+import java.lang.annotation.Retention;\r
+import java.lang.annotation.RetentionPolicy;\r
+\r
+/**\r
+ * Page attribute to control what date as last-modified for the browser cache.\r
+ * \r
+ * http://betterexplained.com/articles/how-to-optimize-your-site-with-http-caching\r
+ * https://developers.google.com/speed/docs/best-practices/caching\r
+ * \r
+ * @author James Moger\r
+ *\r
+ */\r
+@Documented\r
+@Retention(RetentionPolicy.RUNTIME)\r
+public @interface CacheControl {\r
+       \r
+       public static enum LastModified {\r
+               BOOT, ACTIVITY, PROJECT, REPOSITORY, COMMIT, NONE\r
+       }\r
+       \r
+       LastModified value() default LastModified.NONE;\r
+}
\ No newline at end of file
index cdae09318805eb439fa5d98ba2d85657511ae0a9..74ccac7d1552afbca2ed5d405b880bd4ad81b6ac 100644 (file)
@@ -15,7 +15,9 @@
  */\r
 package com.gitblit.wicket;\r
 \r
+import java.util.HashMap;\r
 import java.util.Locale;\r
+import java.util.Map;\r
 \r
 import org.apache.wicket.Application;\r
 import org.apache.wicket.Page;\r
@@ -71,6 +73,8 @@ public class GitBlitWebApp extends WebApplication {
 \r
        public final static Class<? extends BasePage> HOME_PAGE_CLASS = MyDashboardPage.class;\r
        \r
+       private final Map<String, CacheControl> cacheablePages = new HashMap<String, CacheControl>();\r
+       \r
        @Override\r
        public void init() {\r
                super.init();\r
@@ -149,6 +153,12 @@ public class GitBlitWebApp extends WebApplication {
                        parameters = new String[] {};\r
                }\r
                mount(new GitblitParamUrlCodingStrategy(location, clazz, parameters));\r
+               \r
+               // map the mount point to the cache control definition \r
+               if (clazz.isAnnotationPresent(CacheControl.class)) {\r
+                       CacheControl cacheControl = clazz.getAnnotation(CacheControl.class);\r
+                       cacheablePages.put(location.substring(1), cacheControl);\r
+               }\r
        }\r
 \r
        @Override\r
@@ -156,6 +166,14 @@ public class GitBlitWebApp extends WebApplication {
                return HOME_PAGE_CLASS;\r
        }\r
        \r
+       public boolean isCacheablePage(String mountPoint) {\r
+               return cacheablePages.containsKey(mountPoint);\r
+       }\r
+\r
+       public CacheControl getCacheControl(String mountPoint) {\r
+               return cacheablePages.get(mountPoint);\r
+       }\r
+\r
        @Override\r
        public final Session newSession(Request request, Response response) {\r
                GitBlitWebSession gitBlitWebSession = new GitBlitWebSession(request);\r
diff --git a/src/main/java/com/gitblit/wicket/GitblitWicketFilter.java b/src/main/java/com/gitblit/wicket/GitblitWicketFilter.java
new file mode 100644 (file)
index 0000000..f46c51e
--- /dev/null
@@ -0,0 +1,145 @@
+/*\r
+ * Copyright 2013 gitblit.com.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *     http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+package com.gitblit.wicket;\r
+\r
+import java.util.Date;\r
+\r
+import javax.servlet.http.HttpServletRequest;\r
+\r
+import org.apache.wicket.protocol.http.WicketFilter;\r
+import org.apache.wicket.util.string.Strings;\r
+import org.eclipse.jgit.lib.Repository;\r
+import org.eclipse.jgit.revwalk.RevCommit;\r
+\r
+import com.gitblit.GitBlit;\r
+import com.gitblit.Keys;\r
+import com.gitblit.models.ProjectModel;\r
+import com.gitblit.models.RepositoryModel;\r
+import com.gitblit.utils.JGitUtils;\r
+import com.gitblit.utils.StringUtils;\r
+\r
+/**\r
+ * \r
+ * Customization of the WicketFilter to allow smart browser-side caching of\r
+ * some pages.\r
+ * \r
+ * @author James Moger\r
+ *\r
+ */\r
+public class GitblitWicketFilter extends WicketFilter {\r
+       \r
+       /**\r
+        * Determines the last-modified date of the requested resource.\r
+        * \r
+        * @param servletRequest\r
+        * @return The last modified time stamp\r
+        */\r
+       protected long getLastModified(final HttpServletRequest servletRequest) {\r
+               final String pathInfo = getRelativePath(servletRequest);\r
+               if (Strings.isEmpty(pathInfo))\r
+                       return -1;\r
+               long lastModified = super.getLastModified(servletRequest);\r
+               if (lastModified > -1) {\r
+                       return lastModified;\r
+               }\r
+               \r
+               // try to match request against registered CacheControl pages\r
+               String [] paths = pathInfo.split("/");\r
+               \r
+               String page = paths[0];\r
+               String repo = "";\r
+               String commitId = "";\r
+               if (paths.length >= 2) {\r
+                       repo = paths[1];\r
+               }\r
+               if (paths.length >= 3) {\r
+                       commitId = paths[2];\r
+               }\r
+               \r
+               if (!StringUtils.isEmpty(servletRequest.getParameter("r"))) {\r
+                       repo = servletRequest.getParameter("r");\r
+               }\r
+               if (!StringUtils.isEmpty(servletRequest.getParameter("h"))) {\r
+                       commitId = servletRequest.getParameter("h");\r
+               }\r
+               \r
+               repo = repo.replace("%2f", "/").replace("%2F", "/").replace(GitBlit.getChar(Keys.web.forwardSlashCharacter, '/'), '/');\r
+\r
+               GitBlitWebApp app = (GitBlitWebApp) getWebApplication();\r
+               int expires = GitBlit.getInteger(Keys.web.pageCacheExpires, 0);\r
+               if (!StringUtils.isEmpty(page) && app.isCacheablePage(page) && expires > 0) {\r
+                       // page can be cached by the browser\r
+                       CacheControl cacheControl = app.getCacheControl(page);\r
+                       Date bootDate = GitBlit.getBootDate();\r
+                       switch (cacheControl.value()) {\r
+                       case ACTIVITY:\r
+                               // returns the last activity date of the server\r
+                               Date activityDate = GitBlit.getLastActivityDate();\r
+                               if (activityDate != null) {\r
+                                       return activityDate.after(bootDate) ? activityDate.getTime() : bootDate.getTime();\r
+                               }\r
+                               return bootDate.getTime();\r
+                       case BOOT:\r
+                               // return the boot date of the server\r
+                               return bootDate.getTime();\r
+                       case PROJECT:\r
+                               // return the latest change date for the project OR the boot date\r
+                               ProjectModel project = GitBlit.self().getProjectModel(StringUtils.getRootPath(repo));\r
+                               if (project != null) {\r
+                                       return project.lastChange.after(bootDate) ? project.lastChange.getTime() : bootDate.getTime();\r
+                               }\r
+                               break;\r
+                       case REPOSITORY:\r
+                               // return the lastest change date for the repository OR the boot\r
+                               // date, whichever is latest\r
+                               RepositoryModel repository = GitBlit.self().getRepositoryModel(repo);\r
+                               if (repository != null && repository.lastChange != null) {\r
+                                       return repository.lastChange.after(bootDate) ? repository.lastChange.getTime() : bootDate.getTime();\r
+                               }\r
+                               break;\r
+                       case COMMIT:\r
+                               // get the date of the specified commit\r
+                               if (StringUtils.isEmpty(commitId)) {\r
+                                       // no commit id, use boot date\r
+                                       return bootDate.getTime();\r
+                               } else {\r
+                                       // last modified date is the commit date \r
+                                       Repository r = null;\r
+                                       try {\r
+                                               // return the timestamp of the associated commit\r
+                                               r = GitBlit.self().getRepository(repo);\r
+                                               if (r != null) {\r
+                                                       RevCommit commit = JGitUtils.getCommit(r, commitId);\r
+                                                       if (commit != null) {\r
+                                                               Date date = JGitUtils.getCommitDate(commit);\r
+                                                               return date.after(bootDate) ? date.getTime() : bootDate.getTime();\r
+                                                       }\r
+                                               }\r
+                                       } finally {\r
+                                               if (r != null) {\r
+                                                       r.close();\r
+                                               }\r
+                                       }\r
+                               }\r
+                               break;\r
+                       default:\r
+                               break;\r
+                       }\r
+               }                       \r
+\r
+               return -1;\r
+       }\r
+}\r
index 694fa603a88876b6250e4adc30b8e5f97abe75f0..413403b4e1a018ecb93489953907fcb49cdc9814 100644 (file)
@@ -35,7 +35,9 @@ import com.gitblit.models.Metric;
 import com.gitblit.models.RepositoryModel;\r
 import com.gitblit.utils.ActivityUtils;\r
 import com.gitblit.utils.StringUtils;\r
+import com.gitblit.wicket.CacheControl;\r
 import com.gitblit.wicket.PageRegistration;\r
+import com.gitblit.wicket.CacheControl.LastModified;\r
 import com.gitblit.wicket.PageRegistration.DropDownMenuItem;\r
 import com.gitblit.wicket.PageRegistration.DropDownMenuRegistration;\r
 import com.gitblit.wicket.WicketUtils;\r
@@ -52,6 +54,8 @@ import com.gitblit.wicket.panels.ActivityPanel;
  * @author James Moger\r
  * \r
  */\r
+\r
+@CacheControl(LastModified.ACTIVITY)\r
 public class ActivityPage extends RootPage {\r
 \r
        public ActivityPage(PageParameters params) {\r
index 71713cd96920ee381b315524133cd2498e096013..c9e11b0899f098443b453bee9608fd6f870174d2 100644 (file)
@@ -40,7 +40,10 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.link.ExternalLink;\r
 import org.apache.wicket.markup.html.panel.FeedbackPanel;\r
 import org.apache.wicket.protocol.http.RequestUtils;\r
+import org.apache.wicket.protocol.http.WebResponse;\r
 import org.apache.wicket.protocol.http.servlet.ServletWebRequest;\r
+import org.apache.wicket.util.time.Duration;\r
+import org.apache.wicket.util.time.Time;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 \r
@@ -56,6 +59,7 @@ import com.gitblit.models.TeamModel;
 import com.gitblit.models.UserModel;\r
 import com.gitblit.utils.StringUtils;\r
 import com.gitblit.utils.TimeUtils;\r
+import com.gitblit.wicket.CacheControl;\r
 import com.gitblit.wicket.GitBlitWebApp;\r
 import com.gitblit.wicket.GitBlitWebSession;\r
 import com.gitblit.wicket.WicketUtils;\r
@@ -121,7 +125,68 @@ public abstract class BasePage extends SessionPage {
                        Application.get().getMarkupSettings().setStripWicketTags(false);\r
                }\r
                super.onAfterRender();\r
-       }       \r
+       }\r
+               \r
+       @Override\r
+       protected void setHeaders(WebResponse response) {\r
+               int expires = GitBlit.getInteger(Keys.web.pageCacheExpires, 0);\r
+               if (expires > 0) {\r
+                       // pages are personalized for the authenticated user so they must be\r
+                       // marked private to prohibit proxy servers from caching them\r
+                       response.setHeader("Cache-Control", "private, must-revalidate");\r
+                       setLastModified();\r
+               } else {\r
+                       // use default Wicket caching behavior\r
+                       super.setHeaders(response);\r
+               }\r
+       }\r
+       \r
+       /**\r
+        * Sets the last-modified header date, if appropriate, for this page.  The\r
+        * date used is determined by the CacheControl annotation.\r
+        * \r
+        */\r
+       protected void setLastModified() {\r
+               if (getClass().isAnnotationPresent(CacheControl.class)) {\r
+                       CacheControl cacheControl = getClass().getAnnotation(CacheControl.class);\r
+                       switch (cacheControl.value()) {\r
+                       case ACTIVITY:\r
+                               setLastModified(GitBlit.getLastActivityDate());\r
+                               break;\r
+                       case BOOT:\r
+                               setLastModified(GitBlit.getBootDate());\r
+                               break;\r
+                       case NONE:\r
+                               break;\r
+                       default:\r
+                               logger.warn(getClass().getSimpleName() + ": unhandled LastModified type " + cacheControl.value());\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+       \r
+       /**\r
+        * Sets the last-modified header field and the expires field.\r
+        * \r
+        * @param when\r
+        */\r
+       protected final void setLastModified(Date when) {\r
+               if (when == null) {\r
+                       return;\r
+               }\r
+               \r
+               if (when.before(GitBlit.getBootDate())) {\r
+                       // last-modified can not be before the Gitblit boot date\r
+                       // this helps ensure that pages are properly refreshed after a\r
+                       // server config change\r
+                       when = GitBlit.getBootDate();\r
+               }\r
+               \r
+               int expires = GitBlit.getInteger(Keys.web.pageCacheExpires, 0);\r
+               WebResponse response = (WebResponse) getResponse();\r
+               response.setLastModifiedTime(Time.valueOf(when));\r
+               response.setDateHeader("Expires", System.currentTimeMillis() + Duration.minutes(expires).getMilliseconds());\r
+       }\r
 \r
        protected void setupPage(String repositoryName, String pageName) {\r
                String siteName = GitBlit.getString(Keys.web.siteName, Constants.NAME);\r
index 51489150d60f59e93e53e8272bebfb09e385c334..53bd233d77bc8d62f80ba93d1a51e12c0a7b5bea 100644 (file)
@@ -37,11 +37,14 @@ import com.gitblit.models.PathModel;
 import com.gitblit.utils.DiffUtils;\r
 import com.gitblit.utils.JGitUtils;\r
 import com.gitblit.utils.StringUtils;\r
+import com.gitblit.wicket.CacheControl;\r
+import com.gitblit.wicket.CacheControl.LastModified;\r
 import com.gitblit.wicket.WicketUtils;\r
 import com.gitblit.wicket.panels.CommitHeaderPanel;\r
 import com.gitblit.wicket.panels.LinkPanel;\r
 import com.gitblit.wicket.panels.PathBreadcrumbsPanel;\r
 \r
+@CacheControl(LastModified.BOOT)\r
 public class BlamePage extends RepositoryPage {\r
 \r
        public BlamePage(PageParameters params) {\r
index 03edaa31400a0e634ac3f0cb2f06f087fff05814..c297bcaf2721744a95732aa8af00de5b1ea142c9 100644 (file)
@@ -27,10 +27,13 @@ import com.gitblit.utils.DiffUtils;
 import com.gitblit.utils.DiffUtils.DiffOutputType;\r
 import com.gitblit.utils.JGitUtils;\r
 import com.gitblit.utils.StringUtils;\r
+import com.gitblit.wicket.CacheControl;\r
+import com.gitblit.wicket.CacheControl.LastModified;\r
 import com.gitblit.wicket.WicketUtils;\r
 import com.gitblit.wicket.panels.CommitHeaderPanel;\r
 import com.gitblit.wicket.panels.PathBreadcrumbsPanel;\r
 \r
+@CacheControl(LastModified.BOOT)\r
 public class BlobDiffPage extends RepositoryPage {\r
 \r
        public BlobDiffPage(PageParameters params) {\r
index f6e99988acf514417f2bad9e6e1abef31f360f77..b104df2d5e4a2884bbc5fd0f98654addcf8c31fd 100644 (file)
@@ -32,11 +32,14 @@ import com.gitblit.GitBlit;
 import com.gitblit.Keys;\r
 import com.gitblit.utils.JGitUtils;\r
 import com.gitblit.utils.StringUtils;\r
+import com.gitblit.wicket.CacheControl;\r
 import com.gitblit.wicket.ExternalImage;\r
 import com.gitblit.wicket.WicketUtils;\r
+import com.gitblit.wicket.CacheControl.LastModified;\r
 import com.gitblit.wicket.panels.CommitHeaderPanel;\r
 import com.gitblit.wicket.panels.PathBreadcrumbsPanel;\r
 \r
+@CacheControl(LastModified.BOOT)\r
 public class BlobPage extends RepositoryPage {\r
 \r
        protected String fileExtension;\r
index 8684fb3d7ea55a8319a97d5c463c678f880c3eff..fe7483e4ff0fe44163cdb76ddb1c22fb3b9826b7 100644 (file)
@@ -17,8 +17,11 @@ package com.gitblit.wicket.pages;
 \r
 import org.apache.wicket.PageParameters;\r
 \r
+import com.gitblit.wicket.CacheControl;\r
+import com.gitblit.wicket.CacheControl.LastModified;\r
 import com.gitblit.wicket.panels.BranchesPanel;\r
 \r
+@CacheControl(LastModified.REPOSITORY)\r
 public class BranchesPage extends RepositoryPage {\r
 \r
        public BranchesPage(PageParameters params) {\r
index 6954808d70c37d3fe1167d4df89349a849e14ece..6f1b459801777bd5996969c89467a7e2bc13cf72 100644 (file)
@@ -16,7 +16,6 @@
 package com.gitblit.wicket.pages;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 import org.apache.wicket.PageParameters;
@@ -30,22 +29,21 @@ import org.eclipse.jgit.diff.DiffEntry.ChangeType;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.RevCommit;
 
-import com.gitblit.Constants;
 import com.gitblit.GitBlit;
 import com.gitblit.Keys;
 import com.gitblit.models.PathModel.PathChangeModel;
-import com.gitblit.models.GitNote;
 import com.gitblit.models.SubmoduleModel;
 import com.gitblit.utils.DiffUtils;
 import com.gitblit.utils.DiffUtils.DiffOutputType;
 import com.gitblit.utils.JGitUtils;
+import com.gitblit.wicket.CacheControl;
+import com.gitblit.wicket.CacheControl.LastModified;
 import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.panels.CommitHeaderPanel;
 import com.gitblit.wicket.panels.CommitLegendPanel;
-import com.gitblit.wicket.panels.GravatarImage;
 import com.gitblit.wicket.panels.LinkPanel;
-import com.gitblit.wicket.panels.RefsPanel;
 
+@CacheControl(LastModified.BOOT)
 public class CommitDiffPage extends RepositoryPage {
 
        public CommitDiffPage(PageParameters params) {
index b98dba5bd893122a8e925a180b803593520e008c..1d11d4433b05b455edfe884c3c1f340ccdcc5e48 100644 (file)
@@ -37,6 +37,8 @@ import com.gitblit.models.GitNote;
 import com.gitblit.models.PathModel.PathChangeModel;\r
 import com.gitblit.models.SubmoduleModel;\r
 import com.gitblit.utils.JGitUtils;\r
+import com.gitblit.wicket.CacheControl;\r
+import com.gitblit.wicket.CacheControl.LastModified;\r
 import com.gitblit.wicket.WicketUtils;\r
 import com.gitblit.wicket.panels.CommitHeaderPanel;\r
 import com.gitblit.wicket.panels.CommitLegendPanel;\r
@@ -45,6 +47,7 @@ import com.gitblit.wicket.panels.GravatarImage;
 import com.gitblit.wicket.panels.LinkPanel;\r
 import com.gitblit.wicket.panels.RefsPanel;\r
 \r
+@CacheControl(LastModified.BOOT)\r
 public class CommitPage extends RepositoryPage {\r
 \r
        public CommitPage(PageParameters params) {\r
index 9ddc98d31672094f1e8429ea3bd389640b41b6a9..9330316e596332331354f05af17a04cf14e9f71c 100644 (file)
@@ -30,9 +30,12 @@ import com.gitblit.Keys;
 import com.gitblit.models.PathModel;\r
 import com.gitblit.utils.ByteFormat;\r
 import com.gitblit.utils.JGitUtils;\r
+import com.gitblit.wicket.CacheControl;\r
 import com.gitblit.wicket.WicketUtils;\r
+import com.gitblit.wicket.CacheControl.LastModified;\r
 import com.gitblit.wicket.panels.LinkPanel;\r
 \r
+@CacheControl(LastModified.REPOSITORY)\r
 public class DocsPage extends RepositoryPage {\r
 \r
        public DocsPage(PageParameters params) {\r
index 154bdcc7ea84e770b2cabaeb43eb4fa404482f9e..446531abdc69b7655f801c17226a55e55a52dfc6 100644 (file)
@@ -19,9 +19,12 @@ import org.apache.wicket.PageParameters;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;\r
 \r
 import com.gitblit.Constants;\r
+import com.gitblit.wicket.CacheControl;\r
 import com.gitblit.wicket.WicketUtils;\r
+import com.gitblit.wicket.CacheControl.LastModified;\r
 import com.gitblit.wicket.panels.SearchPanel;\r
 \r
+@CacheControl(LastModified.REPOSITORY)\r
 public class GitSearchPage extends RepositoryPage {\r
 \r
        public GitSearchPage(PageParameters params) {\r
index 314bdef7fe8c4eaebfe57e362f8cdb1ac7bc69d2..33bc54c17202afca7d9326b7c2d37969ca5326b1 100644 (file)
@@ -18,9 +18,12 @@ package com.gitblit.wicket.pages;
 import org.apache.wicket.PageParameters;\r
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;\r
 \r
+import com.gitblit.wicket.CacheControl;\r
 import com.gitblit.wicket.WicketUtils;\r
+import com.gitblit.wicket.CacheControl.LastModified;\r
 import com.gitblit.wicket.panels.HistoryPanel;\r
 \r
+@CacheControl(LastModified.REPOSITORY)\r
 public class HistoryPage extends RepositoryPage {\r
 \r
        public HistoryPage(PageParameters params) {\r
index ee8ddfef04195251136a6cd3820f5ce12d211f4b..1f4a9bf990d3930dddef1fbe0f30c84c5850e76a 100644 (file)
@@ -19,9 +19,12 @@ import org.apache.wicket.PageParameters;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;\r
 \r
 import com.gitblit.utils.StringUtils;\r
+import com.gitblit.wicket.CacheControl;\r
 import com.gitblit.wicket.WicketUtils;\r
+import com.gitblit.wicket.CacheControl.LastModified;\r
 import com.gitblit.wicket.panels.LogPanel;\r
 \r
+@CacheControl(LastModified.REPOSITORY)\r
 public class LogPage extends RepositoryPage {\r
 \r
        public LogPage(PageParameters params) {\r
index 7f82b648783a32a9c0446a69c85eb31ec808754b..df078c725a1259d1d49dca1a0c9d3e29c536db46 100644 (file)
@@ -29,8 +29,11 @@ import com.gitblit.GitBlit;
 import com.gitblit.utils.JGitUtils;\r
 import com.gitblit.utils.MarkdownUtils;\r
 import com.gitblit.utils.StringUtils;\r
+import com.gitblit.wicket.CacheControl;\r
 import com.gitblit.wicket.WicketUtils;\r
+import com.gitblit.wicket.CacheControl.LastModified;\r
 \r
+@CacheControl(LastModified.BOOT)\r
 public class MarkdownPage extends RepositoryPage {\r
 \r
        public MarkdownPage(PageParameters params) {\r
index 3195020df6cb30e7983e4b8bfbd4f2edcd5dcbef..3aa1fccdf1736ff8711c3bdc8cd6ce2156e2770e 100644 (file)
@@ -40,9 +40,12 @@ import org.wicketstuff.googlecharts.ShapeMarker;
 import com.gitblit.models.Metric;\r
 import com.gitblit.utils.MetricUtils;\r
 import com.gitblit.utils.StringUtils;\r
+import com.gitblit.wicket.CacheControl;\r
 import com.gitblit.wicket.WicketUtils;\r
+import com.gitblit.wicket.CacheControl.LastModified;\r
 import com.gitblit.wicket.charting.SecureChart;\r
 \r
+@CacheControl(LastModified.REPOSITORY)\r
 public class MetricsPage extends RepositoryPage {\r
 \r
        public MetricsPage(PageParameters params) {\r
index d951da3104e661f2758a99505b8ba6f81fad3235..32c128da2b74520f1cc289ad0134d788ccfcd227 100644 (file)
@@ -43,11 +43,14 @@ import com.gitblit.models.UserModel;
 import com.gitblit.utils.ArrayUtils;\r
 import com.gitblit.utils.MarkdownUtils;\r
 import com.gitblit.utils.StringUtils;\r
+import com.gitblit.wicket.CacheControl;\r
 import com.gitblit.wicket.GitBlitWebSession;\r
 import com.gitblit.wicket.WicketUtils;\r
+import com.gitblit.wicket.CacheControl.LastModified;\r
 import com.gitblit.wicket.panels.FilterableProjectList;\r
 import com.gitblit.wicket.panels.FilterableRepositoryList;\r
 \r
+@CacheControl(LastModified.ACTIVITY)\r
 public class MyDashboardPage extends DashboardPage {\r
 \r
        public MyDashboardPage() {\r
index ff6326d40a39054ba71b4971846eb9a462aae247..e1de9f397e8619708ac17b44e7f9aaa52c72a610 100644 (file)
@@ -34,8 +34,10 @@ import com.gitblit.models.Metric;
 import com.gitblit.models.RepositoryModel;\r
 import com.gitblit.models.UserModel;\r
 import com.gitblit.utils.JGitUtils;\r
+import com.gitblit.wicket.CacheControl;\r
 import com.gitblit.wicket.GitBlitWebSession;\r
 import com.gitblit.wicket.WicketUtils;\r
+import com.gitblit.wicket.CacheControl.LastModified;\r
 import com.gitblit.wicket.charting.GoogleChart;\r
 import com.gitblit.wicket.charting.GoogleCharts;\r
 import com.gitblit.wicket.charting.GoogleLineChart;\r
@@ -45,6 +47,7 @@ import com.gitblit.wicket.panels.ReflogPanel;
 import com.gitblit.wicket.panels.RepositoryUrlPanel;\r
 import com.gitblit.wicket.panels.TagsPanel;\r
 \r
+@CacheControl(LastModified.REPOSITORY)\r
 public class OverviewPage extends RepositoryPage {\r
 \r
        public OverviewPage(PageParameters params) {\r
index 878cfb457c0c7e3e8701bc524ea84fb240f57fb6..be959d01b1c4ed0daee47d0a0df57acbe7cbdd12 100644 (file)
@@ -25,9 +25,12 @@ import com.gitblit.GitBlit;
 import com.gitblit.utils.DiffUtils;\r
 import com.gitblit.utils.JGitUtils;\r
 import com.gitblit.utils.StringUtils;\r
+import com.gitblit.wicket.CacheControl;\r
+import com.gitblit.wicket.CacheControl.LastModified;\r
 import com.gitblit.wicket.GitBlitWebSession;\r
 import com.gitblit.wicket.WicketUtils;\r
 \r
+@CacheControl(LastModified.BOOT)\r
 public class PatchPage extends WebPage {\r
 \r
        public PatchPage(PageParameters params) {\r
index 97a31f98b5aa5e1bca517c6c28a507b31cdb47b9..c938891301addb484dbee40227997506ec2f439b 100644 (file)
@@ -33,6 +33,8 @@ import com.gitblit.models.RepositoryModel;
 import com.gitblit.models.UserModel;\r
 import com.gitblit.utils.MarkdownUtils;\r
 import com.gitblit.utils.StringUtils;\r
+import com.gitblit.wicket.CacheControl;\r
+import com.gitblit.wicket.CacheControl.LastModified;\r
 import com.gitblit.wicket.GitBlitWebApp;\r
 import com.gitblit.wicket.GitBlitWebSession;\r
 import com.gitblit.wicket.GitblitRedirectException;\r
@@ -42,6 +44,7 @@ import com.gitblit.wicket.PageRegistration.DropDownMenuRegistration;
 import com.gitblit.wicket.WicketUtils;\r
 import com.gitblit.wicket.panels.FilterableRepositoryList;\r
 \r
+@CacheControl(LastModified.PROJECT)\r
 public class ProjectPage extends DashboardPage {\r
        \r
        List<ProjectModel> projectModels = new ArrayList<ProjectModel>();\r
@@ -60,6 +63,26 @@ public class ProjectPage extends DashboardPage {
                return RepositoriesPage.class;\r
        }\r
 \r
+       @Override\r
+       protected void setLastModified() {\r
+               if (getClass().isAnnotationPresent(CacheControl.class)) {\r
+                       CacheControl cacheControl = getClass().getAnnotation(CacheControl.class);\r
+                       switch (cacheControl.value()) {\r
+                       case PROJECT:\r
+                               String projectName = WicketUtils.getProjectName(getPageParameters());\r
+                               if (!StringUtils.isEmpty(projectName)) {\r
+                                       ProjectModel project = getProjectModel(projectName);\r
+                                       if (project != null) {\r
+                                               setLastModified(project.lastChange);\r
+                                       }\r
+                               }\r
+                               break;\r
+                       default:\r
+                               super.setLastModified();\r
+                       }\r
+               }\r
+       }\r
+       \r
        private void setup(PageParameters params) {\r
                setupPage("", "");\r
                // check to see if we should display a login message\r
index 884f616723d65bcdab977cf76c09df1c39a3acf7..c97b2cc18544de4843ed4a7a29cd2772f8534ae5 100644 (file)
@@ -18,9 +18,12 @@ package com.gitblit.wicket.pages;
 import org.apache.wicket.PageParameters;\r
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;\r
 \r
+import com.gitblit.wicket.CacheControl;\r
 import com.gitblit.wicket.WicketUtils;\r
+import com.gitblit.wicket.CacheControl.LastModified;\r
 import com.gitblit.wicket.panels.ReflogPanel;\r
 \r
+@CacheControl(LastModified.REPOSITORY)\r
 public class ReflogPage extends RepositoryPage {\r
 \r
        public ReflogPage(PageParameters params) {\r
index 7d4d68c7f9ba2dab20a83a8bbef57a43362f72ca..a4a1ab585188b681a279ff3ea494d7c109564654 100644 (file)
@@ -33,13 +33,16 @@ import com.gitblit.Keys;
 import com.gitblit.models.RepositoryModel;\r
 import com.gitblit.utils.MarkdownUtils;\r
 import com.gitblit.utils.StringUtils;\r
+import com.gitblit.wicket.CacheControl;\r
 import com.gitblit.wicket.GitBlitWebSession;\r
 import com.gitblit.wicket.PageRegistration;\r
+import com.gitblit.wicket.CacheControl.LastModified;\r
 import com.gitblit.wicket.PageRegistration.DropDownMenuItem;\r
 import com.gitblit.wicket.PageRegistration.DropDownMenuRegistration;\r
 import com.gitblit.wicket.WicketUtils;\r
 import com.gitblit.wicket.panels.RepositoriesPanel;\r
 \r
+@CacheControl(LastModified.ACTIVITY)\r
 public class RepositoriesPage extends RootPage {\r
 \r
        public RepositoriesPage() {\r
index 372b68d0493ac37a8a997e4666a223f27a0bd7d3..f5b8c96ecddf2970d13528987d58d6b67ea4db3f 100644 (file)
@@ -19,6 +19,7 @@ import java.io.Serializable;
 import java.text.MessageFormat;\r
 import java.util.ArrayList;\r
 import java.util.Arrays;\r
+import java.util.Date;\r
 import java.util.HashMap;\r
 import java.util.LinkedHashMap;\r
 import java.util.LinkedHashSet;\r
@@ -63,6 +64,7 @@ import com.gitblit.utils.JGitUtils;
 import com.gitblit.utils.RefLogUtils;\r
 import com.gitblit.utils.StringUtils;\r
 import com.gitblit.utils.TicgitUtils;\r
+import com.gitblit.wicket.CacheControl;\r
 import com.gitblit.wicket.GitBlitWebSession;\r
 import com.gitblit.wicket.PageRegistration;\r
 import com.gitblit.wicket.PageRegistration.OtherPageLink;\r
@@ -572,6 +574,30 @@ public abstract class RepositoryPage extends RootPage {
                setupPage(repositoryName, "/ " + getPageName());\r
                super.onBeforeRender();\r
        }\r
+       \r
+       @Override\r
+       protected void setLastModified() {\r
+               if (getClass().isAnnotationPresent(CacheControl.class)) {\r
+                       CacheControl cacheControl = getClass().getAnnotation(CacheControl.class);\r
+                       switch (cacheControl.value()) {\r
+                       case REPOSITORY:\r
+                               RepositoryModel repository = getRepositoryModel();\r
+                               if (repository != null) {\r
+                                       setLastModified(repository.lastChange);\r
+                               }\r
+                               break;\r
+                       case COMMIT:\r
+                               RevCommit commit = getCommit();\r
+                               if (commit != null) {\r
+                                       Date commitDate = JGitUtils.getCommitDate(commit);\r
+                                       setLastModified(commitDate);\r
+                               }\r
+                               break;\r
+                       default:\r
+                               super.setLastModified();\r
+                       }\r
+               }\r
+       }\r
 \r
        protected PageParameters newRepositoryParameter() {\r
                return WicketUtils.newRepositoryParameter(repositoryName);\r
index c231b2ba97973ae6d213f587fda23dbb4ffa681d..17c41eb2dda5c866d68a17aa005da320ab559228 100644 (file)
@@ -50,8 +50,10 @@ import com.gitblit.models.UserModel;
 import com.gitblit.utils.JGitUtils;\r
 import com.gitblit.utils.MarkdownUtils;\r
 import com.gitblit.utils.StringUtils;\r
+import com.gitblit.wicket.CacheControl;\r
 import com.gitblit.wicket.GitBlitWebSession;\r
 import com.gitblit.wicket.WicketUtils;\r
+import com.gitblit.wicket.CacheControl.LastModified;\r
 import com.gitblit.wicket.charting.SecureChart;\r
 import com.gitblit.wicket.panels.BranchesPanel;\r
 import com.gitblit.wicket.panels.LinkPanel;\r
@@ -59,6 +61,7 @@ import com.gitblit.wicket.panels.LogPanel;
 import com.gitblit.wicket.panels.RepositoryUrlPanel;\r
 import com.gitblit.wicket.panels.TagsPanel;\r
 \r
+@CacheControl(LastModified.REPOSITORY)\r
 public class SummaryPage extends RepositoryPage {\r
 \r
        public SummaryPage(PageParameters params) {\r
index 6deef783164dfb3f2a7df620e419b419560a1e9f..13c10111c13fd41a3c511817922032dae8395278 100644 (file)
@@ -28,11 +28,14 @@ import org.eclipse.jgit.lib.Repository;
 \r
 import com.gitblit.models.RefModel;\r
 import com.gitblit.utils.JGitUtils;\r
+import com.gitblit.wicket.CacheControl;\r
+import com.gitblit.wicket.CacheControl.LastModified;\r
 import com.gitblit.wicket.WicketUtils;\r
 import com.gitblit.wicket.panels.GravatarImage;\r
 import com.gitblit.wicket.panels.LinkPanel;\r
 import com.gitblit.wicket.panels.RefsPanel;\r
 \r
+@CacheControl(LastModified.BOOT)\r
 public class TagPage extends RepositoryPage {\r
 \r
        public TagPage(PageParameters params) {\r
index b052531e8a9eab8ee01022cc1b07e71cf0cec1c1..2abb410a8c7268aa7bd6f42fad4fa19325264ebc 100644 (file)
@@ -17,8 +17,11 @@ package com.gitblit.wicket.pages;
 \r
 import org.apache.wicket.PageParameters;\r
 \r
+import com.gitblit.wicket.CacheControl;\r
+import com.gitblit.wicket.CacheControl.LastModified;\r
 import com.gitblit.wicket.panels.TagsPanel;\r
 \r
+@CacheControl(LastModified.REPOSITORY)\r
 public class TagsPage extends RepositoryPage {\r
 \r
        public TagsPage(PageParameters params) {\r
index bc27f0c2d310bb99bafe7e8540cc3d82fe2aa2b5..25bcd67aa7c5ebe284f7a551ab71bdef9147dc7d 100644 (file)
@@ -33,12 +33,15 @@ import com.gitblit.models.PathModel;
 import com.gitblit.models.SubmoduleModel;\r
 import com.gitblit.utils.ByteFormat;\r
 import com.gitblit.utils.JGitUtils;\r
+import com.gitblit.wicket.CacheControl;\r
+import com.gitblit.wicket.CacheControl.LastModified;\r
 import com.gitblit.wicket.WicketUtils;\r
 import com.gitblit.wicket.panels.CommitHeaderPanel;\r
 import com.gitblit.wicket.panels.CompressedDownloadsPanel;\r
 import com.gitblit.wicket.panels.LinkPanel;\r
 import com.gitblit.wicket.panels.PathBreadcrumbsPanel;\r
 \r
+@CacheControl(LastModified.BOOT)\r
 public class TreePage extends RepositoryPage {\r
 \r
        public TreePage(PageParameters params) {\r