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
}
#
# 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
<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
}
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.
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
r.close();\r
return;\r
}\r
- response.setDateHeader("Last-Modified", JGitUtils.getCommitDate(commit).getTime());\r
\r
String [] encodings = GitBlit.getEncodings();\r
\r
\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
--- /dev/null
+/*\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
*/\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
\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
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
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
--- /dev/null
+/*\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
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
* @author James Moger\r
* \r
*/\r
+\r
+@CacheControl(LastModified.ACTIVITY)\r
public class ActivityPage extends RootPage {\r
\r
public ActivityPage(PageParameters params) {\r
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
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
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
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
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
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
\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
package com.gitblit.wicket.pages;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
import org.apache.wicket.PageParameters;
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) {
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
\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
\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
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