From a848375081d89fec31d87bed1fd169d0a1c1dcb9 Mon Sep 17 00:00:00 2001 From: Martin Spielmann Date: Thu, 28 Jul 2016 16:47:30 +0200 Subject: [PATCH 01/25] switched to java 8 and wicket 7.4.0 --- .classpath | 25 +++--- .gitignore | 1 + .project | 6 ++ build.moxie | 14 ++-- gitblit.iml | 132 ++++++++++++++++++++++++-------- src/test/config/test-users.conf | 8 ++ 6 files changed, 135 insertions(+), 51 deletions(-) diff --git a/.classpath b/.classpath index ccf6a4e03..8b8844362 100644 --- a/.classpath +++ b/.classpath @@ -17,9 +17,18 @@ - - - + + + + + + + + + + + + @@ -48,7 +57,7 @@ - + @@ -64,7 +73,6 @@ - @@ -79,8 +87,6 @@ - - @@ -93,10 +99,5 @@ - - - - - diff --git a/.gitignore b/.gitignore index e268ccbc1..c7244b85d 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,4 @@ tags /**/init.lua /**/session /nbproject/private +/target/ diff --git a/.project b/.project index 90c747bcb..f2e777550 100644 --- a/.project +++ b/.project @@ -15,8 +15,14 @@ + + org.eclipse.m2e.core.maven2Builder + + + + org.eclipse.m2e.core.maven2Nature org.eclipse.jdt.core.javanature net.sf.eclipsecs.core.CheckstyleNature diff --git a/build.moxie b/build.moxie index e84ab4010..1431e5ee2 100644 --- a/build.moxie +++ b/build.moxie @@ -68,14 +68,14 @@ resourceDirectories: - compile 'src/main/resources' - site 'src/site/resources' -# compile for Java 7 class format +# compile for Java 8 class format tasks: { 'mx:javac' : { - source: 1.7 - target: 1.7 - compiler: javac1.7 + source: 1.8 + target: 1.8 + compiler: javac1.8 encoding: UTF-8 - # stop complaints about bootstrap classpath when compiling with Java 7 + # stop complaints about bootstrap classpath when compiling with Java 8 compilerArgs: '-Xlint:-options' } } @@ -104,7 +104,7 @@ repositories: central, eclipse-snapshots, eclipse, gitblit properties: { jetty.version : 9.2.13.v20150730 slf4j.version : 1.7.12 - wicket.version : 1.4.22 + wicket.version : 7.4.0 lucene.version : 4.10.4 jgit.version : 4.1.1.201511131810-r groovy.version : 2.4.4 @@ -140,7 +140,7 @@ dependencies: - compile 'com.sun.mail:javax.mail:1.5.1' :war - compile 'javax.servlet:javax.servlet-api:3.1.0' :fedclient - compile 'org.eclipse.jetty.aggregate:jetty-all:${jetty.version}' @jar -- compile 'org.apache.wicket:wicket:${wicket.version}' :war !org.mockito +- compile 'org.apache.wicket:wicket-core:${wicket.version}' :war !org.mockito - compile 'org.apache.wicket:wicket-auth-roles:${wicket.version}' :war !org.mockito - compile 'org.apache.wicket:wicket-extensions:${wicket.version}' :war !org.mockito - compile 'org.apache.lucene:lucene-core:${lucene.version}' :war :fedclient diff --git a/gitblit.iml b/gitblit.iml index 93331b20b..ec6dc5e16 100644 --- a/gitblit.iml +++ b/gitblit.iml @@ -146,35 +146,123 @@ - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -490,7 +578,9 @@ - + + + @@ -656,17 +746,6 @@ - - - - - - - - - - - @@ -832,17 +911,6 @@ - - - - - - - - - - - diff --git a/src/test/config/test-users.conf b/src/test/config/test-users.conf index 4361410c7..dfb2e46af 100644 --- a/src/test/config/test-users.conf +++ b/src/test/config/test-users.conf @@ -1,3 +1,11 @@ +[user "TicketRefTest"] + password = admin + displayName = TicketRefTest + emailAddress = TicketRefTest@example.com + accountType = LOCAL + emailMeOnMyTicketChanges = true + role = "#none" + repository = RW+:ticketreferencetest.git [user "admin"] password = admin cookie = dd94709528bb1c83d08f3088d4043f4742891f4f From 613eaad7815dcd27078daa798d2bcc90e77e5702 Mon Sep 17 00:00:00 2001 From: Martin Spielmann Date: Thu, 28 Jul 2016 16:51:13 +0200 Subject: [PATCH 02/25] replaced PageParameter imports which moved into another package --- src/main/java/com/gitblit/models/Menu.java | 2 +- src/main/java/com/gitblit/models/NavLink.java | 2 +- src/main/java/com/gitblit/wicket/GitBlitWebSession.java | 2 +- src/main/java/com/gitblit/wicket/GitblitRedirectException.java | 2 +- src/main/java/com/gitblit/wicket/SessionlessForm.java | 2 +- src/main/java/com/gitblit/wicket/WicketUtils.java | 2 +- src/main/java/com/gitblit/wicket/pages/ActivityPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/BasePage.java | 2 +- src/main/java/com/gitblit/wicket/pages/BlamePage.java | 2 +- src/main/java/com/gitblit/wicket/pages/BlobDiffPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/BlobPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/BranchesPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/CommitDiffPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/CommitPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/ComparePage.java | 2 +- src/main/java/com/gitblit/wicket/pages/DashboardPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/DocPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/DocsPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/EditFilePage.java | 2 +- src/main/java/com/gitblit/wicket/pages/EditMilestonePage.java | 2 +- src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/EditTeamPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/EditTicketPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/EditUserPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/EmptyRepositoryPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/ExportTicketPage.java | 2 +- .../com/gitblit/wicket/pages/FederationRegistrationPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/FilestorePage.java | 2 +- src/main/java/com/gitblit/wicket/pages/ForkPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/ForksPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/GitSearchPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/HistoryPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/LogPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/LuceneSearchPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/MetricsPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/MyDashboardPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/MyTicketsPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/NewMilestonePage.java | 2 +- src/main/java/com/gitblit/wicket/pages/NewTicketPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/NoDocsPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/NoTicketsPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/OverviewPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/PatchPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/ProjectPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/ProjectsPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/RawPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/ReflogPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/RepositoriesPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/RepositoryPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/ReviewProposalPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/RootPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/RootSubPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/SendProposalPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/SessionPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/SummaryPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/TagPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/TagsPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/TicketPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/TicketsPage.java | 2 +- src/main/java/com/gitblit/wicket/pages/TreePage.java | 2 +- src/main/java/com/gitblit/wicket/pages/UserPage.java | 2 +- src/main/java/com/gitblit/wicket/panels/BranchesPanel.java | 2 +- src/main/java/com/gitblit/wicket/panels/CommentPanel.java | 2 +- src/main/java/com/gitblit/wicket/panels/LinkPanel.java | 2 +- src/main/java/com/gitblit/wicket/panels/PagerPanel.java | 2 +- .../java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java | 2 +- src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.java | 2 +- src/main/java/com/gitblit/wicket/panels/TicketListPanel.java | 2 +- src/main/java/com/gitblit/wicket/panels/TicketSearchForm.java | 2 +- 69 files changed, 69 insertions(+), 69 deletions(-) diff --git a/src/main/java/com/gitblit/models/Menu.java b/src/main/java/com/gitblit/models/Menu.java index 7c949b3fd..0f2efa265 100644 --- a/src/main/java/com/gitblit/models/Menu.java +++ b/src/main/java/com/gitblit/models/Menu.java @@ -2,7 +2,7 @@ import java.io.Serializable; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.WebPage; import com.gitblit.utils.StringUtils; diff --git a/src/main/java/com/gitblit/models/NavLink.java b/src/main/java/com/gitblit/models/NavLink.java index 993d69545..a12a37d8d 100644 --- a/src/main/java/com/gitblit/models/NavLink.java +++ b/src/main/java/com/gitblit/models/NavLink.java @@ -19,7 +19,7 @@ import java.util.ArrayList; import java.util.List; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.WebPage; import com.gitblit.models.Menu.MenuItem; diff --git a/src/main/java/com/gitblit/wicket/GitBlitWebSession.java b/src/main/java/com/gitblit/wicket/GitBlitWebSession.java index 31ccf1f5a..59dfc9875 100644 --- a/src/main/java/com/gitblit/wicket/GitBlitWebSession.java +++ b/src/main/java/com/gitblit/wicket/GitBlitWebSession.java @@ -21,7 +21,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import org.apache.wicket.Page; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.RedirectToUrlException; import org.apache.wicket.Request; import org.apache.wicket.Session; diff --git a/src/main/java/com/gitblit/wicket/GitblitRedirectException.java b/src/main/java/com/gitblit/wicket/GitblitRedirectException.java index 4721f0ad7..a8f9b29b7 100644 --- a/src/main/java/com/gitblit/wicket/GitblitRedirectException.java +++ b/src/main/java/com/gitblit/wicket/GitblitRedirectException.java @@ -17,7 +17,7 @@ import org.apache.wicket.AbstractRestartResponseException; import org.apache.wicket.Page; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.RequestCycle; import org.apache.wicket.protocol.http.RequestUtils; import org.apache.wicket.request.target.basic.RedirectRequestTarget; diff --git a/src/main/java/com/gitblit/wicket/SessionlessForm.java b/src/main/java/com/gitblit/wicket/SessionlessForm.java index 6f7907174..207513d3d 100644 --- a/src/main/java/com/gitblit/wicket/SessionlessForm.java +++ b/src/main/java/com/gitblit/wicket/SessionlessForm.java @@ -18,7 +18,7 @@ import java.text.MessageFormat; import org.apache.wicket.Component; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.MarkupStream; import org.apache.wicket.markup.html.form.StatelessForm; diff --git a/src/main/java/com/gitblit/wicket/WicketUtils.java b/src/main/java/com/gitblit/wicket/WicketUtils.java index 99c1e08f0..13d02e603 100644 --- a/src/main/java/com/gitblit/wicket/WicketUtils.java +++ b/src/main/java/com/gitblit/wicket/WicketUtils.java @@ -27,7 +27,7 @@ import javax.servlet.http.HttpServletRequest; import org.apache.wicket.Component; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.Request; import org.apache.wicket.behavior.AttributeAppender; import org.apache.wicket.behavior.HeaderContributor; diff --git a/src/main/java/com/gitblit/wicket/pages/ActivityPage.java b/src/main/java/com/gitblit/wicket/pages/ActivityPage.java index c505a6664..3e71e4d20 100644 --- a/src/main/java/com/gitblit/wicket/pages/ActivityPage.java +++ b/src/main/java/com/gitblit/wicket/pages/ActivityPage.java @@ -24,7 +24,7 @@ import java.util.Map; import java.util.Set; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.behavior.HeaderContributor; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.panel.Fragment; diff --git a/src/main/java/com/gitblit/wicket/pages/BasePage.java b/src/main/java/com/gitblit/wicket/pages/BasePage.java index 0d99f5e52..801736ea4 100644 --- a/src/main/java/com/gitblit/wicket/pages/BasePage.java +++ b/src/main/java/com/gitblit/wicket/pages/BasePage.java @@ -36,7 +36,7 @@ import org.apache.commons.io.IOUtils; import org.apache.wicket.Application; import org.apache.wicket.Page; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.RedirectToUrlException; import org.apache.wicket.markup.html.CSSPackageResource; import org.apache.wicket.markup.html.basic.Label; diff --git a/src/main/java/com/gitblit/wicket/pages/BlamePage.java b/src/main/java/com/gitblit/wicket/pages/BlamePage.java index 2fcca0ae1..b9c1bc82a 100644 --- a/src/main/java/com/gitblit/wicket/pages/BlamePage.java +++ b/src/main/java/com/gitblit/wicket/pages/BlamePage.java @@ -28,7 +28,7 @@ import java.util.TreeSet; import org.apache.wicket.Component; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; diff --git a/src/main/java/com/gitblit/wicket/pages/BlobDiffPage.java b/src/main/java/com/gitblit/wicket/pages/BlobDiffPage.java index adf815e6d..cf0413e3a 100644 --- a/src/main/java/com/gitblit/wicket/pages/BlobDiffPage.java +++ b/src/main/java/com/gitblit/wicket/pages/BlobDiffPage.java @@ -17,7 +17,7 @@ import java.util.List; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.eclipse.jgit.lib.Repository; diff --git a/src/main/java/com/gitblit/wicket/pages/BlobPage.java b/src/main/java/com/gitblit/wicket/pages/BlobPage.java index 1ef8f227b..f88346424 100644 --- a/src/main/java/com/gitblit/wicket/pages/BlobPage.java +++ b/src/main/java/com/gitblit/wicket/pages/BlobPage.java @@ -20,7 +20,7 @@ import java.util.Map; import org.apache.wicket.Component; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.RedirectException; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.image.Image; diff --git a/src/main/java/com/gitblit/wicket/pages/BranchesPage.java b/src/main/java/com/gitblit/wicket/pages/BranchesPage.java index fe7483e4f..d30a68c7b 100644 --- a/src/main/java/com/gitblit/wicket/pages/BranchesPage.java +++ b/src/main/java/com/gitblit/wicket/pages/BranchesPage.java @@ -15,7 +15,7 @@ */ package com.gitblit.wicket.pages; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import com.gitblit.wicket.CacheControl; import com.gitblit.wicket.CacheControl.LastModified; diff --git a/src/main/java/com/gitblit/wicket/pages/CommitDiffPage.java b/src/main/java/com/gitblit/wicket/pages/CommitDiffPage.java index f127517d0..6e301d741 100644 --- a/src/main/java/com/gitblit/wicket/pages/CommitDiffPage.java +++ b/src/main/java/com/gitblit/wicket/pages/CommitDiffPage.java @@ -20,7 +20,7 @@ import java.util.Arrays; import java.util.List; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.link.ExternalLink; diff --git a/src/main/java/com/gitblit/wicket/pages/CommitPage.java b/src/main/java/com/gitblit/wicket/pages/CommitPage.java index 3998204d1..c9d168038 100644 --- a/src/main/java/com/gitblit/wicket/pages/CommitPage.java +++ b/src/main/java/com/gitblit/wicket/pages/CommitPage.java @@ -20,7 +20,7 @@ import java.util.Arrays; import java.util.List; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.link.ExternalLink; diff --git a/src/main/java/com/gitblit/wicket/pages/ComparePage.java b/src/main/java/com/gitblit/wicket/pages/ComparePage.java index 7e7ac2f5d..910c14678 100644 --- a/src/main/java/com/gitblit/wicket/pages/ComparePage.java +++ b/src/main/java/com/gitblit/wicket/pages/ComparePage.java @@ -19,7 +19,7 @@ import java.util.ArrayList; import java.util.List; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.DropDownChoice; diff --git a/src/main/java/com/gitblit/wicket/pages/DashboardPage.java b/src/main/java/com/gitblit/wicket/pages/DashboardPage.java index 9c10e01b2..73c6686f1 100644 --- a/src/main/java/com/gitblit/wicket/pages/DashboardPage.java +++ b/src/main/java/com/gitblit/wicket/pages/DashboardPage.java @@ -28,7 +28,7 @@ import java.util.TimeZone; import java.util.TreeSet; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.behavior.HeaderContributor; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.panel.Fragment; diff --git a/src/main/java/com/gitblit/wicket/pages/DocPage.java b/src/main/java/com/gitblit/wicket/pages/DocPage.java index 5d711343b..0ff50a859 100644 --- a/src/main/java/com/gitblit/wicket/pages/DocPage.java +++ b/src/main/java/com/gitblit/wicket/pages/DocPage.java @@ -17,7 +17,7 @@ import java.util.List; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.link.ExternalLink; diff --git a/src/main/java/com/gitblit/wicket/pages/DocsPage.java b/src/main/java/com/gitblit/wicket/pages/DocsPage.java index 524438626..68d47a9a8 100644 --- a/src/main/java/com/gitblit/wicket/pages/DocsPage.java +++ b/src/main/java/com/gitblit/wicket/pages/DocsPage.java @@ -18,7 +18,7 @@ import java.util.List; import org.apache.wicket.Component; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; diff --git a/src/main/java/com/gitblit/wicket/pages/EditFilePage.java b/src/main/java/com/gitblit/wicket/pages/EditFilePage.java index dbf8a79e2..bee642dfa 100644 --- a/src/main/java/com/gitblit/wicket/pages/EditFilePage.java +++ b/src/main/java/com/gitblit/wicket/pages/EditFilePage.java @@ -22,7 +22,7 @@ import java.util.List; import java.util.Set; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextArea; diff --git a/src/main/java/com/gitblit/wicket/pages/EditMilestonePage.java b/src/main/java/com/gitblit/wicket/pages/EditMilestonePage.java index dc3266543..ccb807c63 100644 --- a/src/main/java/com/gitblit/wicket/pages/EditMilestonePage.java +++ b/src/main/java/com/gitblit/wicket/pages/EditMilestonePage.java @@ -20,7 +20,7 @@ import java.util.Date; import java.util.List; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.RestartResponseException; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxButton; diff --git a/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java index 6bcf6f514..4ca4820a2 100644 --- a/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java +++ b/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java @@ -26,7 +26,7 @@ import java.util.Map; import java.util.Set; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior; import org.apache.wicket.behavior.SimpleAttributeModifier; diff --git a/src/main/java/com/gitblit/wicket/pages/EditTeamPage.java b/src/main/java/com/gitblit/wicket/pages/EditTeamPage.java index a43d8db05..f94747acd 100644 --- a/src/main/java/com/gitblit/wicket/pages/EditTeamPage.java +++ b/src/main/java/com/gitblit/wicket/pages/EditTeamPage.java @@ -24,7 +24,7 @@ import java.util.List; import java.util.Set; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.extensions.markup.html.form.palette.Palette; import org.apache.wicket.markup.html.form.Button; diff --git a/src/main/java/com/gitblit/wicket/pages/EditTicketPage.java b/src/main/java/com/gitblit/wicket/pages/EditTicketPage.java index 192b48caa..cacdc4ab0 100644 --- a/src/main/java/com/gitblit/wicket/pages/EditTicketPage.java +++ b/src/main/java/com/gitblit/wicket/pages/EditTicketPage.java @@ -22,7 +22,7 @@ import java.util.Set; import java.util.TreeSet; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.markup.html.basic.Label; diff --git a/src/main/java/com/gitblit/wicket/pages/EditUserPage.java b/src/main/java/com/gitblit/wicket/pages/EditUserPage.java index 220bee3f6..720d311e1 100644 --- a/src/main/java/com/gitblit/wicket/pages/EditUserPage.java +++ b/src/main/java/com/gitblit/wicket/pages/EditUserPage.java @@ -21,7 +21,7 @@ import java.util.Iterator; import java.util.List; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.extensions.markup.html.form.palette.Palette; import org.apache.wicket.markup.html.form.Button; diff --git a/src/main/java/com/gitblit/wicket/pages/EmptyRepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/EmptyRepositoryPage.java index 72d1e1a42..a65a1febb 100644 --- a/src/main/java/com/gitblit/wicket/pages/EmptyRepositoryPage.java +++ b/src/main/java/com/gitblit/wicket/pages/EmptyRepositoryPage.java @@ -19,7 +19,7 @@ import javax.servlet.http.HttpServletRequest; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.protocol.http.WebRequest; diff --git a/src/main/java/com/gitblit/wicket/pages/ExportTicketPage.java b/src/main/java/com/gitblit/wicket/pages/ExportTicketPage.java index 57f61f784..54abe9659 100644 --- a/src/main/java/com/gitblit/wicket/pages/ExportTicketPage.java +++ b/src/main/java/com/gitblit/wicket/pages/ExportTicketPage.java @@ -16,7 +16,7 @@ package com.gitblit.wicket.pages; import org.apache.wicket.IRequestTarget; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.RequestCycle; import org.apache.wicket.protocol.http.WebResponse; import org.slf4j.Logger; diff --git a/src/main/java/com/gitblit/wicket/pages/FederationRegistrationPage.java b/src/main/java/com/gitblit/wicket/pages/FederationRegistrationPage.java index c26c9757a..7c46e6212 100644 --- a/src/main/java/com/gitblit/wicket/pages/FederationRegistrationPage.java +++ b/src/main/java/com/gitblit/wicket/pages/FederationRegistrationPage.java @@ -18,7 +18,7 @@ import java.util.Collections; import java.util.List; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.data.DataView; diff --git a/src/main/java/com/gitblit/wicket/pages/FilestorePage.java b/src/main/java/com/gitblit/wicket/pages/FilestorePage.java index 29b3d60db..497b31407 100644 --- a/src/main/java/com/gitblit/wicket/pages/FilestorePage.java +++ b/src/main/java/com/gitblit/wicket/pages/FilestorePage.java @@ -24,7 +24,7 @@ import java.util.List; import org.apache.commons.io.FileUtils; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; diff --git a/src/main/java/com/gitblit/wicket/pages/ForkPage.java b/src/main/java/com/gitblit/wicket/pages/ForkPage.java index 12020128f..90a7ee3be 100644 --- a/src/main/java/com/gitblit/wicket/pages/ForkPage.java +++ b/src/main/java/com/gitblit/wicket/pages/ForkPage.java @@ -17,7 +17,7 @@ import java.text.MessageFormat; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.slf4j.LoggerFactory; diff --git a/src/main/java/com/gitblit/wicket/pages/ForksPage.java b/src/main/java/com/gitblit/wicket/pages/ForksPage.java index 045f5f7e2..dbfb3d67b 100644 --- a/src/main/java/com/gitblit/wicket/pages/ForksPage.java +++ b/src/main/java/com/gitblit/wicket/pages/ForksPage.java @@ -20,7 +20,7 @@ import java.util.List; import org.apache.wicket.Component; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.data.DataView; diff --git a/src/main/java/com/gitblit/wicket/pages/GitSearchPage.java b/src/main/java/com/gitblit/wicket/pages/GitSearchPage.java index befa5f108..0dfae3bee 100644 --- a/src/main/java/com/gitblit/wicket/pages/GitSearchPage.java +++ b/src/main/java/com/gitblit/wicket/pages/GitSearchPage.java @@ -15,7 +15,7 @@ */ package com.gitblit.wicket.pages; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import com.gitblit.Constants; diff --git a/src/main/java/com/gitblit/wicket/pages/HistoryPage.java b/src/main/java/com/gitblit/wicket/pages/HistoryPage.java index 3021cb3c5..9b04f3bb2 100644 --- a/src/main/java/com/gitblit/wicket/pages/HistoryPage.java +++ b/src/main/java/com/gitblit/wicket/pages/HistoryPage.java @@ -15,7 +15,7 @@ */ package com.gitblit.wicket.pages; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import com.gitblit.wicket.CacheControl; diff --git a/src/main/java/com/gitblit/wicket/pages/LogPage.java b/src/main/java/com/gitblit/wicket/pages/LogPage.java index 411d7edd7..9c9b7398e 100644 --- a/src/main/java/com/gitblit/wicket/pages/LogPage.java +++ b/src/main/java/com/gitblit/wicket/pages/LogPage.java @@ -15,7 +15,7 @@ */ package com.gitblit.wicket.pages; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import com.gitblit.utils.StringUtils; diff --git a/src/main/java/com/gitblit/wicket/pages/LuceneSearchPage.java b/src/main/java/com/gitblit/wicket/pages/LuceneSearchPage.java index 1d81061e5..90661a6c7 100644 --- a/src/main/java/com/gitblit/wicket/pages/LuceneSearchPage.java +++ b/src/main/java/com/gitblit/wicket/pages/LuceneSearchPage.java @@ -22,7 +22,7 @@ import java.util.Set; import org.apache.wicket.Component; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.ListMultipleChoice; diff --git a/src/main/java/com/gitblit/wicket/pages/MetricsPage.java b/src/main/java/com/gitblit/wicket/pages/MetricsPage.java index 96113b0f6..630e38fe3 100644 --- a/src/main/java/com/gitblit/wicket/pages/MetricsPage.java +++ b/src/main/java/com/gitblit/wicket/pages/MetricsPage.java @@ -25,7 +25,7 @@ import java.util.Date; import java.util.List; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.behavior.HeaderContributor; import org.apache.wicket.markup.html.basic.Label; import org.eclipse.jgit.lib.Repository; diff --git a/src/main/java/com/gitblit/wicket/pages/MyDashboardPage.java b/src/main/java/com/gitblit/wicket/pages/MyDashboardPage.java index 0f7d602bb..ee24b6a92 100644 --- a/src/main/java/com/gitblit/wicket/pages/MyDashboardPage.java +++ b/src/main/java/com/gitblit/wicket/pages/MyDashboardPage.java @@ -30,7 +30,7 @@ import java.util.Set; import org.apache.wicket.Component; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.panel.Fragment; import org.eclipse.jgit.lib.Constants; diff --git a/src/main/java/com/gitblit/wicket/pages/MyTicketsPage.java b/src/main/java/com/gitblit/wicket/pages/MyTicketsPage.java index bfcedf6e8..f9940cc57 100644 --- a/src/main/java/com/gitblit/wicket/pages/MyTicketsPage.java +++ b/src/main/java/com/gitblit/wicket/pages/MyTicketsPage.java @@ -22,7 +22,7 @@ import java.util.HashMap; import java.util.List; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.repeater.Item; diff --git a/src/main/java/com/gitblit/wicket/pages/NewMilestonePage.java b/src/main/java/com/gitblit/wicket/pages/NewMilestonePage.java index 2250f38a2..833c6d473 100644 --- a/src/main/java/com/gitblit/wicket/pages/NewMilestonePage.java +++ b/src/main/java/com/gitblit/wicket/pages/NewMilestonePage.java @@ -17,7 +17,7 @@ import java.util.Date; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.RestartResponseException; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxButton; diff --git a/src/main/java/com/gitblit/wicket/pages/NewTicketPage.java b/src/main/java/com/gitblit/wicket/pages/NewTicketPage.java index 0c52505c6..5092e66fc 100644 --- a/src/main/java/com/gitblit/wicket/pages/NewTicketPage.java +++ b/src/main/java/com/gitblit/wicket/pages/NewTicketPage.java @@ -22,7 +22,7 @@ import java.util.Set; import java.util.TreeSet; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.markup.html.basic.Label; diff --git a/src/main/java/com/gitblit/wicket/pages/NoDocsPage.java b/src/main/java/com/gitblit/wicket/pages/NoDocsPage.java index 7dcc02272..bb70294f5 100644 --- a/src/main/java/com/gitblit/wicket/pages/NoDocsPage.java +++ b/src/main/java/com/gitblit/wicket/pages/NoDocsPage.java @@ -15,7 +15,7 @@ */ package com.gitblit.wicket.pages; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; public class NoDocsPage extends RepositoryPage { diff --git a/src/main/java/com/gitblit/wicket/pages/NoTicketsPage.java b/src/main/java/com/gitblit/wicket/pages/NoTicketsPage.java index 8e98a00f5..a1645ab1d 100644 --- a/src/main/java/com/gitblit/wicket/pages/NoTicketsPage.java +++ b/src/main/java/com/gitblit/wicket/pages/NoTicketsPage.java @@ -15,7 +15,7 @@ */ package com.gitblit.wicket.pages; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import com.gitblit.models.UserModel; diff --git a/src/main/java/com/gitblit/wicket/pages/OverviewPage.java b/src/main/java/com/gitblit/wicket/pages/OverviewPage.java index 1979f97f3..d9dd10fa9 100644 --- a/src/main/java/com/gitblit/wicket/pages/OverviewPage.java +++ b/src/main/java/com/gitblit/wicket/pages/OverviewPage.java @@ -19,7 +19,7 @@ import java.util.ArrayList; import java.util.List; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.behavior.HeaderContributor; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; diff --git a/src/main/java/com/gitblit/wicket/pages/PatchPage.java b/src/main/java/com/gitblit/wicket/pages/PatchPage.java index bd904e1f7..05a5c952b 100644 --- a/src/main/java/com/gitblit/wicket/pages/PatchPage.java +++ b/src/main/java/com/gitblit/wicket/pages/PatchPage.java @@ -15,7 +15,7 @@ */ package com.gitblit.wicket.pages; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; diff --git a/src/main/java/com/gitblit/wicket/pages/ProjectPage.java b/src/main/java/com/gitblit/wicket/pages/ProjectPage.java index d358b775d..5da07e6dc 100644 --- a/src/main/java/com/gitblit/wicket/pages/ProjectPage.java +++ b/src/main/java/com/gitblit/wicket/pages/ProjectPage.java @@ -21,7 +21,7 @@ import java.util.List; import org.apache.wicket.Component; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.ExternalLink; diff --git a/src/main/java/com/gitblit/wicket/pages/ProjectsPage.java b/src/main/java/com/gitblit/wicket/pages/ProjectsPage.java index 132a39dd7..4cdeb0090 100644 --- a/src/main/java/com/gitblit/wicket/pages/ProjectsPage.java +++ b/src/main/java/com/gitblit/wicket/pages/ProjectsPage.java @@ -18,7 +18,7 @@ import java.util.Collections; import java.util.List; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.data.DataView; diff --git a/src/main/java/com/gitblit/wicket/pages/RawPage.java b/src/main/java/com/gitblit/wicket/pages/RawPage.java index c43574782..ebbf4b12b 100644 --- a/src/main/java/com/gitblit/wicket/pages/RawPage.java +++ b/src/main/java/com/gitblit/wicket/pages/RawPage.java @@ -25,7 +25,7 @@ import javax.servlet.http.HttpServletResponse; import org.apache.wicket.IRequestTarget; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.RequestCycle; import org.apache.wicket.protocol.http.WebRequest; import org.apache.wicket.protocol.http.WebResponse; diff --git a/src/main/java/com/gitblit/wicket/pages/ReflogPage.java b/src/main/java/com/gitblit/wicket/pages/ReflogPage.java index 44fb2227b..3c89e65e4 100644 --- a/src/main/java/com/gitblit/wicket/pages/ReflogPage.java +++ b/src/main/java/com/gitblit/wicket/pages/ReflogPage.java @@ -15,7 +15,7 @@ */ package com.gitblit.wicket.pages; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import com.gitblit.wicket.CacheControl; diff --git a/src/main/java/com/gitblit/wicket/pages/RepositoriesPage.java b/src/main/java/com/gitblit/wicket/pages/RepositoriesPage.java index 660b4ed1a..06df01399 100644 --- a/src/main/java/com/gitblit/wicket/pages/RepositoriesPage.java +++ b/src/main/java/com/gitblit/wicket/pages/RepositoriesPage.java @@ -25,7 +25,7 @@ import java.util.List; import org.apache.wicket.Component; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.eclipse.jgit.lib.Constants; diff --git a/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java index 36c5ae16c..9e5db9f2f 100644 --- a/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java +++ b/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java @@ -27,7 +27,7 @@ import java.util.Set; import org.apache.wicket.Component; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.RestartResponseException; import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.markup.html.basic.Label; diff --git a/src/main/java/com/gitblit/wicket/pages/ReviewProposalPage.java b/src/main/java/com/gitblit/wicket/pages/ReviewProposalPage.java index ceca1ec22..ec785eafd 100644 --- a/src/main/java/com/gitblit/wicket/pages/ReviewProposalPage.java +++ b/src/main/java/com/gitblit/wicket/pages/ReviewProposalPage.java @@ -19,7 +19,7 @@ import java.util.ArrayList; import java.util.List; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import com.gitblit.Constants.FederationToken; diff --git a/src/main/java/com/gitblit/wicket/pages/RootPage.java b/src/main/java/com/gitblit/wicket/pages/RootPage.java index 12779ca26..480ecf839 100644 --- a/src/main/java/com/gitblit/wicket/pages/RootPage.java +++ b/src/main/java/com/gitblit/wicket/pages/RootPage.java @@ -35,7 +35,7 @@ import javax.servlet.http.HttpServletResponse; import org.apache.wicket.MarkupContainer; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.RequestCycle; import org.apache.wicket.behavior.HeaderContributor; import org.apache.wicket.markup.html.IHeaderContributor; diff --git a/src/main/java/com/gitblit/wicket/pages/RootSubPage.java b/src/main/java/com/gitblit/wicket/pages/RootSubPage.java index 62d07a7f8..40ccfda98 100644 --- a/src/main/java/com/gitblit/wicket/pages/RootSubPage.java +++ b/src/main/java/com/gitblit/wicket/pages/RootSubPage.java @@ -18,7 +18,7 @@ import java.util.ArrayList; import java.util.List; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.Session; import org.apache.wicket.markup.html.basic.Label; diff --git a/src/main/java/com/gitblit/wicket/pages/SendProposalPage.java b/src/main/java/com/gitblit/wicket/pages/SendProposalPage.java index 9ccf1aa2e..aa073cf77 100644 --- a/src/main/java/com/gitblit/wicket/pages/SendProposalPage.java +++ b/src/main/java/com/gitblit/wicket/pages/SendProposalPage.java @@ -19,7 +19,7 @@ import java.util.ArrayList; import java.util.List; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.markup.html.form.Form; diff --git a/src/main/java/com/gitblit/wicket/pages/SessionPage.java b/src/main/java/com/gitblit/wicket/pages/SessionPage.java index d715aaeef..7dd0d06d8 100644 --- a/src/main/java/com/gitblit/wicket/pages/SessionPage.java +++ b/src/main/java/com/gitblit/wicket/pages/SessionPage.java @@ -18,7 +18,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.protocol.http.WebRequest; import org.apache.wicket.protocol.http.WebResponse; diff --git a/src/main/java/com/gitblit/wicket/pages/SummaryPage.java b/src/main/java/com/gitblit/wicket/pages/SummaryPage.java index 3cfa152e8..adf3026fd 100644 --- a/src/main/java/com/gitblit/wicket/pages/SummaryPage.java +++ b/src/main/java/com/gitblit/wicket/pages/SummaryPage.java @@ -23,7 +23,7 @@ import java.util.List; import org.apache.wicket.Component; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.behavior.HeaderContributor; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; diff --git a/src/main/java/com/gitblit/wicket/pages/TagPage.java b/src/main/java/com/gitblit/wicket/pages/TagPage.java index ffeea6f23..1aa6c15d7 100644 --- a/src/main/java/com/gitblit/wicket/pages/TagPage.java +++ b/src/main/java/com/gitblit/wicket/pages/TagPage.java @@ -20,7 +20,7 @@ import java.util.Date; import java.util.List; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.basic.Label; import org.eclipse.jgit.lib.Constants; diff --git a/src/main/java/com/gitblit/wicket/pages/TagsPage.java b/src/main/java/com/gitblit/wicket/pages/TagsPage.java index d6b8abb26..367cd54e5 100644 --- a/src/main/java/com/gitblit/wicket/pages/TagsPage.java +++ b/src/main/java/com/gitblit/wicket/pages/TagsPage.java @@ -15,7 +15,7 @@ */ package com.gitblit.wicket.pages; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import com.gitblit.wicket.CacheControl; import com.gitblit.wicket.CacheControl.LastModified; diff --git a/src/main/java/com/gitblit/wicket/pages/TicketPage.java b/src/main/java/com/gitblit/wicket/pages/TicketPage.java index cd049f4d2..c1e1cd899 100644 --- a/src/main/java/com/gitblit/wicket/pages/TicketPage.java +++ b/src/main/java/com/gitblit/wicket/pages/TicketPage.java @@ -35,7 +35,7 @@ import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.MarkupContainer; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.RestartResponseException; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.behavior.SimpleAttributeModifier; diff --git a/src/main/java/com/gitblit/wicket/pages/TicketsPage.java b/src/main/java/com/gitblit/wicket/pages/TicketsPage.java index ecfed250f..bc4009bef 100644 --- a/src/main/java/com/gitblit/wicket/pages/TicketsPage.java +++ b/src/main/java/com/gitblit/wicket/pages/TicketsPage.java @@ -25,7 +25,7 @@ import java.util.TreeSet; import org.apache.wicket.Component; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; diff --git a/src/main/java/com/gitblit/wicket/pages/TreePage.java b/src/main/java/com/gitblit/wicket/pages/TreePage.java index eecad26e0..ad594fc7d 100644 --- a/src/main/java/com/gitblit/wicket/pages/TreePage.java +++ b/src/main/java/com/gitblit/wicket/pages/TreePage.java @@ -18,7 +18,7 @@ import java.io.OutputStream; import java.util.List; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.link.ExternalLink; diff --git a/src/main/java/com/gitblit/wicket/pages/UserPage.java b/src/main/java/com/gitblit/wicket/pages/UserPage.java index ea68f25b1..39235acbb 100644 --- a/src/main/java/com/gitblit/wicket/pages/UserPage.java +++ b/src/main/java/com/gitblit/wicket/pages/UserPage.java @@ -23,7 +23,7 @@ import java.util.List; import java.util.Locale; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.markup.html.basic.Label; diff --git a/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java b/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java index 7a564aa59..3b9482f61 100644 --- a/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java @@ -21,7 +21,7 @@ import java.util.Collections; import java.util.List; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.link.ExternalLink; diff --git a/src/main/java/com/gitblit/wicket/panels/CommentPanel.java b/src/main/java/com/gitblit/wicket/panels/CommentPanel.java index 2bc088998..e3cf44889 100644 --- a/src/main/java/com/gitblit/wicket/panels/CommentPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/CommentPanel.java @@ -15,7 +15,7 @@ */ package com.gitblit.wicket.panels; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.markup.html.basic.Label; diff --git a/src/main/java/com/gitblit/wicket/panels/LinkPanel.java b/src/main/java/com/gitblit/wicket/panels/LinkPanel.java index aa09be093..06169a3e4 100644 --- a/src/main/java/com/gitblit/wicket/panels/LinkPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/LinkPanel.java @@ -19,7 +19,7 @@ import java.util.concurrent.Callable; import org.apache.wicket.Component; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.basic.Label; diff --git a/src/main/java/com/gitblit/wicket/panels/PagerPanel.java b/src/main/java/com/gitblit/wicket/panels/PagerPanel.java index 2d774c414..fa7de792e 100644 --- a/src/main/java/com/gitblit/wicket/panels/PagerPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/PagerPanel.java @@ -19,7 +19,7 @@ import java.util.ArrayList; import java.util.List; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.data.DataView; diff --git a/src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java b/src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java index efcb1cb6a..73b72bbc0 100644 --- a/src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java @@ -19,7 +19,7 @@ import org.apache.wicket.Component; import org.apache.wicket.Localizer; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.link.ExternalLink; diff --git a/src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.java b/src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.java index c3f07099d..e36fcd6e6 100644 --- a/src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.java @@ -24,7 +24,7 @@ import java.util.List; import java.util.Map; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.extensions.markup.html.repeater.data.sort.OrderByBorder; import org.apache.wicket.extensions.markup.html.repeater.util.SortParam; import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider; diff --git a/src/main/java/com/gitblit/wicket/panels/TicketListPanel.java b/src/main/java/com/gitblit/wicket/panels/TicketListPanel.java index 1fbe87cd9..c15239fb7 100644 --- a/src/main/java/com/gitblit/wicket/panels/TicketListPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/TicketListPanel.java @@ -19,7 +19,7 @@ import java.util.ArrayList; import java.util.List; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.panel.Fragment; diff --git a/src/main/java/com/gitblit/wicket/panels/TicketSearchForm.java b/src/main/java/com/gitblit/wicket/panels/TicketSearchForm.java index 21bf1bab3..91ef39241 100644 --- a/src/main/java/com/gitblit/wicket/panels/TicketSearchForm.java +++ b/src/main/java/com/gitblit/wicket/panels/TicketSearchForm.java @@ -18,7 +18,7 @@ import java.io.Serializable; import java.text.MessageFormat; -import org.apache.wicket.PageParameters; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; From 9169d04dd253e68727b26a6b8bf45775f1e5d6c9 Mon Sep 17 00:00:00 2001 From: Martin Spielmann Date: Thu, 28 Jul 2016 17:26:16 +0200 Subject: [PATCH 03/25] started resolving compile errors. no functional changes made. onle replacements like PageParameters.put -> PageParameters.add --- src/main/java/com/gitblit/models/Menu.java | 7 ++--- .../com/gitblit/wicket/GitBlitWebSession.java | 8 +++--- .../wicket/GitblitRedirectException.java | 2 +- .../com/gitblit/wicket/Html5DateField.java | 2 +- .../com/gitblit/wicket/MarkupProcessor.java | 2 +- .../com/gitblit/wicket/SessionlessForm.java | 6 ++--- .../java/com/gitblit/wicket/WicketUtils.java | 27 +++++++++---------- .../gitblit/wicket/charting/Flotr2Charts.java | 18 ++++++++----- .../wicket/freemarker/FreemarkerPanel.java | 2 +- .../com/gitblit/wicket/ng/NgController.java | 9 ++++--- .../gitblit/wicket/pages/ActivityPage.java | 4 +-- .../wicket/pages/LuceneSearchPage.java | 20 +++++++------- .../gitblit/wicket/pages/MyTicketsPage.java | 14 +++++----- .../com/gitblit/wicket/pages/PatchPage.java | 2 +- .../com/gitblit/wicket/pages/RawPage.java | 9 +++---- .../com/gitblit/wicket/pages/RootPage.java | 14 +++++----- .../com/gitblit/wicket/pages/SessionPage.java | 4 +-- .../com/gitblit/wicket/pages/TicketPage.java | 2 +- .../com/gitblit/wicket/pages/TicketsPage.java | 6 ++--- .../wicket/panels/BooleanChoiceOption.java | 2 +- .../wicket/panels/ShockWaveComponent.java | 2 +- 21 files changed, 83 insertions(+), 79 deletions(-) diff --git a/src/main/java/com/gitblit/models/Menu.java b/src/main/java/com/gitblit/models/Menu.java index 0f2efa265..7fb46ddc7 100644 --- a/src/main/java/com/gitblit/models/Menu.java +++ b/src/main/java/com/gitblit/models/Menu.java @@ -108,8 +108,9 @@ public ParameterMenuItem(String displayText, String parameter, String value, isSelected = false; } else { parameters = new PageParameters(params); - if (parameters.containsKey(parameter)) { - isSelected = params.getString(parameter).equals(value); +// if (parameters.containsKey(parameter)) { + if (!parameters.get(parameter).isEmpty()) { + isSelected = params.get(parameter).toString().equals(value); // set the new selection value setParameter(parameter, value); } else { @@ -125,7 +126,7 @@ protected void setParameter(String parameter, String value) { if (StringUtils.isEmpty(value)) { this.parameters.remove(parameter); } else { - this.parameters.put(parameter, value); + this.parameters.add(parameter, value); } } } diff --git a/src/main/java/com/gitblit/wicket/GitBlitWebSession.java b/src/main/java/com/gitblit/wicket/GitBlitWebSession.java index 59dfc9875..7adbd359a 100644 --- a/src/main/java/com/gitblit/wicket/GitBlitWebSession.java +++ b/src/main/java/com/gitblit/wicket/GitBlitWebSession.java @@ -21,12 +21,12 @@ import java.util.concurrent.atomic.AtomicBoolean; import org.apache.wicket.Page; +import org.apache.wicket.request.Request; +import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.RedirectToUrlException; -import org.apache.wicket.Request; import org.apache.wicket.Session; import org.apache.wicket.protocol.http.RequestUtils; -import org.apache.wicket.protocol.http.WebRequestCycle; import org.apache.wicket.protocol.http.WebSession; import org.apache.wicket.protocol.http.request.WebClientInfo; @@ -64,10 +64,10 @@ public void invalidate() { */ public void cacheRequest(Class pageClass) { // build absolute url with correctly encoded parameters?! - Request req = WebRequestCycle.get().getRequest(); + Request req = RequestCycle.get().getRequest(); Map params = req.getRequestParameters().getParameters(); PageParameters pageParams = new PageParameters(params); - String relativeUrl = WebRequestCycle.get().urlFor(pageClass, pageParams).toString(); + String relativeUrl = RequestCycle.get().urlFor(pageClass, pageParams).toString(); requestUrl = RequestUtils.toAbsolutePath(relativeUrl); if (isTemporary()) { diff --git a/src/main/java/com/gitblit/wicket/GitblitRedirectException.java b/src/main/java/com/gitblit/wicket/GitblitRedirectException.java index a8f9b29b7..23ac7efa0 100644 --- a/src/main/java/com/gitblit/wicket/GitblitRedirectException.java +++ b/src/main/java/com/gitblit/wicket/GitblitRedirectException.java @@ -17,8 +17,8 @@ import org.apache.wicket.AbstractRestartResponseException; import org.apache.wicket.Page; +import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.RequestCycle; import org.apache.wicket.protocol.http.RequestUtils; import org.apache.wicket.request.target.basic.RedirectRequestTarget; diff --git a/src/main/java/com/gitblit/wicket/Html5DateField.java b/src/main/java/com/gitblit/wicket/Html5DateField.java index 927ee46ee..66b273dd3 100644 --- a/src/main/java/com/gitblit/wicket/Html5DateField.java +++ b/src/main/java/com/gitblit/wicket/Html5DateField.java @@ -10,7 +10,7 @@ import org.apache.wicket.markup.html.form.AbstractTextComponent.ITextFormatProvider; import org.apache.wicket.model.IModel; import org.apache.wicket.util.convert.IConverter; -import org.apache.wicket.util.convert.converters.DateConverter; +import org.apache.wicket.util.convert.converter.DateConverter; public class Html5DateField extends TextField implements ITextFormatProvider { diff --git a/src/main/java/com/gitblit/wicket/MarkupProcessor.java b/src/main/java/com/gitblit/wicket/MarkupProcessor.java index b20320499..7826a3b2e 100644 --- a/src/main/java/com/gitblit/wicket/MarkupProcessor.java +++ b/src/main/java/com/gitblit/wicket/MarkupProcessor.java @@ -30,7 +30,7 @@ import java.util.Map; import org.apache.wicket.Page; -import org.apache.wicket.RequestCycle; +import org.apache.wicket.request.cycle.RequestCycle; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.mylyn.wikitext.confluence.core.ConfluenceLanguage; diff --git a/src/main/java/com/gitblit/wicket/SessionlessForm.java b/src/main/java/com/gitblit/wicket/SessionlessForm.java index 207513d3d..0d66ebe8c 100644 --- a/src/main/java/com/gitblit/wicket/SessionlessForm.java +++ b/src/main/java/com/gitblit/wicket/SessionlessForm.java @@ -23,8 +23,8 @@ import org.apache.wicket.markup.MarkupStream; import org.apache.wicket.markup.html.form.StatelessForm; import org.apache.wicket.protocol.http.RequestUtils; -import org.apache.wicket.protocol.http.WicketURLDecoder; -import org.apache.wicket.protocol.http.request.WebRequestCodingStrategy; +//import org.apache.wicket.protocol.http.WicketURLDecoder; +//import org.apache.wicket.protocol.http.request.WebRequestCodingStrategy; import org.apache.wicket.util.string.AppendingStringBuffer; import org.apache.wicket.util.string.Strings; import org.slf4j.Logger; @@ -100,7 +100,7 @@ public SessionlessForm(String id, Class bookmarkablePageClas * The open tag for the body */ @Override - protected void onComponentTagBody(final MarkupStream markupStream, final ComponentTag openTag) + public void onComponentTagBody(final MarkupStream markupStream, final ComponentTag openTag) { // render the hidden bookmarkable page field AppendingStringBuffer buffer = new AppendingStringBuffer(HIDDEN_DIV_START); diff --git a/src/main/java/com/gitblit/wicket/WicketUtils.java b/src/main/java/com/gitblit/wicket/WicketUtils.java index 13d02e603..9a7782919 100644 --- a/src/main/java/com/gitblit/wicket/WicketUtils.java +++ b/src/main/java/com/gitblit/wicket/WicketUtils.java @@ -26,19 +26,18 @@ import javax.servlet.http.HttpServletRequest; +import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; +import org.apache.wicket.request.Request; +import org.apache.wicket.request.http.WebRequest; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.Request; +import org.apache.wicket.request.resource.ContextRelativeResource; import org.apache.wicket.behavior.AttributeAppender; import org.apache.wicket.behavior.HeaderContributor; -import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.markup.html.IHeaderContributor; -import org.apache.wicket.markup.html.IHeaderResponse; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.image.ContextImage; import org.apache.wicket.model.Model; -import org.apache.wicket.protocol.http.WebRequest; -import org.apache.wicket.resource.ContextRelativeResource; import org.eclipse.jgit.diff.DiffEntry.ChangeType; import com.gitblit.Constants; @@ -56,7 +55,7 @@ public class WicketUtils { public static void setCssClass(Component container, String value) { - container.add(new SimpleAttributeModifier("class", value)); + container.add(new AttributeModifier("class", value)); } public static void addCssClass(Component container, String value) { @@ -64,21 +63,21 @@ public static void addCssClass(Component container, String value) { } public static void setCssStyle(Component container, String value) { - container.add(new SimpleAttributeModifier("style", value)); + container.add(new AttributeModifier("style", value)); } public static void setCssBackground(Component container, String value) { String background = MessageFormat.format("background-color:{0};", StringUtils.getColor(value)); - container.add(new SimpleAttributeModifier("style", background)); + container.add(new AttributeModifier("style", background)); } public static Component setHtmlTooltip(Component container, String value) { - return container.add(new SimpleAttributeModifier("title", value)); + return container.add(new AttributeModifier("title", value)); } public static void setInputPlaceholder(Component container, String value) { - container.add(new SimpleAttributeModifier("placeholder", value)); + container.add(new AttributeModifier("placeholder", value)); } public static void setChangeTypeCssClass(Component container, ChangeType type) { @@ -506,11 +505,11 @@ public static PageParameters newOpenTicketsParameter(String repositoryName) { } public static String getProjectName(PageParameters params) { - return params.getString("p", ""); + return params.get("p").toString(""); } public static String getRepositoryName(PageParameters params) { - return params.getString("r", ""); + return params.get("r").toString(""); } public static String getObject(PageParameters params) { @@ -540,7 +539,7 @@ public static DiffComparator getDiffComparator(PageParameters params) { public static int getPage(PageParameters params) { // index from 1 - return params.getInt("pg", 1); + return params.get("pg").toInt(1); } public static String getRegEx(PageParameters params) { @@ -576,7 +575,7 @@ public static String getUrlParameter(PageParameters params) { } public static String getNameParameter(PageParameters params) { - return params.getString("n", ""); + return params.get("n").toString(""); } public static Label createDateLabel(String wicketId, Date date, TimeZone timeZone, TimeUtils timeUtils) { diff --git a/src/main/java/com/gitblit/wicket/charting/Flotr2Charts.java b/src/main/java/com/gitblit/wicket/charting/Flotr2Charts.java index 7a8adcf21..62bec9341 100644 --- a/src/main/java/com/gitblit/wicket/charting/Flotr2Charts.java +++ b/src/main/java/com/gitblit/wicket/charting/Flotr2Charts.java @@ -17,8 +17,12 @@ import javax.servlet.ServletContext; -import org.apache.wicket.markup.html.IHeaderResponse; +import org.apache.wicket.markup.head.IHeaderResponse; +import org.apache.wicket.markup.head.JavaScriptHeaderItem; +import org.apache.wicket.markup.head.OnDomReadyHeaderItem; import org.apache.wicket.protocol.http.WebApplication; +import org.apache.wicket.request.resource.ContextRelativeResource; +import org.apache.wicket.request.resource.ContextRelativeResourceReference; /** * Concrete class for Flotr2 charts @@ -37,14 +41,14 @@ public void renderHead(IHeaderResponse response) { ServletContext servletContext = WebApplication.get().getServletContext(); String contextPath = servletContext.getContextPath(); - response.renderJavascriptReference(contextPath + "/bootstrap/js/jquery.js"); - response.renderJavascriptReference(contextPath + "/flotr2/flotr2.min.js"); - response.renderCSSReference(contextPath + "/flotr2/flotr2.custom.css"); + response.render(JavaScriptHeaderItem.forReference(new ContextRelativeResourceReference(contextPath + "/bootstrap/js/jquery.js", false))); + response.render(JavaScriptHeaderItem.forReference(new ContextRelativeResourceReference(contextPath + "/flotr2/flotr2.min.js", false))); + response.render(JavaScriptHeaderItem.forReference(new ContextRelativeResourceReference(contextPath + "/flotr2/flotr2.custom.css", false))); // prepare draw chart function StringBuilder sb = new StringBuilder(); - line(sb, "$( document ).ready(function() {"); +// line(sb, "$( document ).ready(function() {"); line(sb, "try {"); // add charts to header for (Chart chart : charts) { @@ -57,8 +61,8 @@ public void renderHead(IHeaderResponse response) { line(sb, " }"); line(sb, "}"); // end draw chart function - line(sb, "});"); - response.renderJavascript(sb.toString(), null); +// line(sb, "});"); + response.render(OnDomReadyHeaderItem.forScript(sb.toString())); } @Override diff --git a/src/main/java/com/gitblit/wicket/freemarker/FreemarkerPanel.java b/src/main/java/com/gitblit/wicket/freemarker/FreemarkerPanel.java index aaf1a1351..f5d1726d7 100644 --- a/src/main/java/com/gitblit/wicket/freemarker/FreemarkerPanel.java +++ b/src/main/java/com/gitblit/wicket/freemarker/FreemarkerPanel.java @@ -120,7 +120,7 @@ private Template getTemplate() * MarkupStream, org.apache.wicket.markup.ComponentTag) */ @Override - protected void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) + public void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) { if (!Strings.isEmpty(stackTraceAsString)) { diff --git a/src/main/java/com/gitblit/wicket/ng/NgController.java b/src/main/java/com/gitblit/wicket/ng/NgController.java index 19e419a02..ea15dcf2e 100644 --- a/src/main/java/com/gitblit/wicket/ng/NgController.java +++ b/src/main/java/com/gitblit/wicket/ng/NgController.java @@ -19,9 +19,10 @@ import java.util.HashMap; import java.util.Map; -import org.apache.wicket.ResourceReference; +import org.apache.wicket.markup.head.IHeaderResponse; +import org.apache.wicket.markup.head.JavaScriptHeaderItem; import org.apache.wicket.markup.html.IHeaderContributor; -import org.apache.wicket.markup.html.IHeaderResponse; +import org.apache.wicket.request.resource.PackageResourceReference; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -54,7 +55,7 @@ public void addVariable(String name, Object o) { @Override public void renderHead(IHeaderResponse response) { // add Google AngularJS reference - response.renderJavascriptReference(new ResourceReference(NgController.class, "angular.js")); + response.render(JavaScriptHeaderItem.forReference(new PackageResourceReference(NgController.class, "angular.js"))); Gson gson = new GsonBuilder().create(); @@ -69,7 +70,7 @@ public void renderHead(IHeaderResponse response) { } line(sb, "}"); - response.renderJavascript(sb.toString(), null); + response.render(JavaScriptHeaderItem.forScript(sb.toString(), "angularController")); } private void line(StringBuilder sb, String line) { diff --git a/src/main/java/com/gitblit/wicket/pages/ActivityPage.java b/src/main/java/com/gitblit/wicket/pages/ActivityPage.java index 3e71e4d20..af4e39f78 100644 --- a/src/main/java/com/gitblit/wicket/pages/ActivityPage.java +++ b/src/main/java/com/gitblit/wicket/pages/ActivityPage.java @@ -141,8 +141,8 @@ protected void addDropDownMenus(List navLinks) { PageParameters currentParameters = getPageParameters(); int daysBack = app().settings().getInteger(Keys.web.activityDuration, 7); - if (currentParameters != null && !currentParameters.containsKey("db")) { - currentParameters.put("db", daysBack); + if (currentParameters != null && currentParameters.get("db").isEmpty()) { + currentParameters.add("db", daysBack); } // preserve time filter options on repository choices diff --git a/src/main/java/com/gitblit/wicket/pages/LuceneSearchPage.java b/src/main/java/com/gitblit/wicket/pages/LuceneSearchPage.java index 90661a6c7..357b5036e 100644 --- a/src/main/java/com/gitblit/wicket/pages/LuceneSearchPage.java +++ b/src/main/java/com/gitblit/wicket/pages/LuceneSearchPage.java @@ -88,19 +88,19 @@ private void setup(PageParameters params) { page = WicketUtils.getPage(params); - if (params.containsKey("repositories")) { - String value = params.getString("repositories", ""); + if (!params.get("repositories").isEmpty()) { + String value = params.get("repositories").toString(""); List list = StringUtils.getStringsFromValue(value); repositories.addAll(list); } - allRepos = params.getAsBoolean("allrepos", false); + allRepos = params.get("allrepos").toBoolean(false); if (allRepos) { repositories.addAll(availableRepositories); } - if (params.containsKey("query")) { - query = params.getString("query", ""); + if (!params.get("query").isEmpty()) { + query = params.get("query").toString(""); } else { String value = WicketUtils.getSearchString(params); String type = WicketUtils.getSearchType(params); @@ -153,9 +153,9 @@ public void onSubmit() { return; } PageParameters params = new PageParameters(); - params.put("repositories", StringUtils.flattenStrings(repositoriesModel.getObject())); - params.put("query", queryModel.getObject()); - params.put("allrepos", allreposModel.getObject()); + params.add("repositories", StringUtils.flattenStrings(repositoriesModel.getObject())); + params.add("query", queryModel.getObject()); + params.add("allrepos", allreposModel.getObject()); LuceneSearchPage page = new LuceneSearchPage(params); setResponsePage(page); } @@ -249,8 +249,8 @@ public void populateItem(final Item item) { add(resultsView.setVisible(results.size() > 0)); PageParameters pagerParams = new PageParameters(); - pagerParams.put("repositories", StringUtils.flattenStrings(repositoriesModel.getObject())); - pagerParams.put("query", queryModel.getObject()); + pagerParams.add("repositories", StringUtils.flattenStrings(repositoriesModel.getObject())); + pagerParams.add("query", queryModel.getObject()); boolean showPager = false; int totalPages = 0; diff --git a/src/main/java/com/gitblit/wicket/pages/MyTicketsPage.java b/src/main/java/com/gitblit/wicket/pages/MyTicketsPage.java index f9940cc57..a8fcb8a61 100644 --- a/src/main/java/com/gitblit/wicket/pages/MyTicketsPage.java +++ b/src/main/java/com/gitblit/wicket/pages/MyTicketsPage.java @@ -74,13 +74,13 @@ public MyTicketsPage(PageParameters params) { final String username = currentUser.getName(); final String[] statiiParam = (params == null) ? TicketsUI.openStatii : params.getStringArray(Lucene.status.name()); - final String assignedToParam = (params == null) ? "" : params.getString(Lucene.responsible.name(), null); - final String milestoneParam = (params == null) ? "" : params.getString(Lucene.milestone.name(), null); - final String queryParam = (params == null) ? null : params.getString("q", null); - final String searchParam = (params == null) ? "" : params.getString("s", null); - final String sortBy = (params == null) ? "" : Lucene.fromString(params.getString("sort", Lucene.created.name())).name(); - final String repositoryId = (params == null) ? "" : params.getString(Lucene.rid.name(), null); - final boolean desc = (params == null) ? true : !"asc".equals(params.getString("direction", "desc")); + final String assignedToParam = (params == null) ? "" : params.get(Lucene.responsible.name()).toString(); + final String milestoneParam = (params == null) ? "" : params.get(Lucene.milestone.name()).toString(); + final String queryParam = (params == null) ? null : params.get("q").toString(); + final String searchParam = (params == null) ? "" : params.get("s").toString(); + final String sortBy = (params == null) ? "" : Lucene.fromString(params.get("sort").toString(Lucene.created.name())).name(); + final String repositoryId = (params == null) ? "" : params.get(Lucene.rid.name()).toString(); + final boolean desc = (params == null) ? true : !"asc".equals(params.get("direction").toString("desc")); // add the user title panel diff --git a/src/main/java/com/gitblit/wicket/pages/PatchPage.java b/src/main/java/com/gitblit/wicket/pages/PatchPage.java index 05a5c952b..384885ad1 100644 --- a/src/main/java/com/gitblit/wicket/pages/PatchPage.java +++ b/src/main/java/com/gitblit/wicket/pages/PatchPage.java @@ -36,7 +36,7 @@ public class PatchPage extends SessionPage { public PatchPage(final PageParameters params) { super(params); - if (!params.containsKey("r")) { + if (params.get("r").isEmpty()) { error(getString("gb.repositoryNotSpecified")); redirectToInterceptPage(new RepositoriesPage()); } diff --git a/src/main/java/com/gitblit/wicket/pages/RawPage.java b/src/main/java/com/gitblit/wicket/pages/RawPage.java index ebbf4b12b..2faa41852 100644 --- a/src/main/java/com/gitblit/wicket/pages/RawPage.java +++ b/src/main/java/com/gitblit/wicket/pages/RawPage.java @@ -24,11 +24,10 @@ import javax.servlet.http.HttpServletResponse; -import org.apache.wicket.IRequestTarget; +import org.apache.wicket.request.cycle.RequestCycle; +import org.apache.wicket.request.http.WebRequest; +import org.apache.wicket.request.http.WebResponse; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.RequestCycle; -import org.apache.wicket.protocol.http.WebRequest; -import org.apache.wicket.protocol.http.WebResponse; import org.apache.wicket.protocol.http.servlet.AbortWithWebErrorCodeException; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; @@ -52,7 +51,7 @@ public class RawPage extends SessionPage { public RawPage(final PageParameters params) { super(params); - if (!params.containsKey("r")) { + if (params.get("r").isEmpty()) { error(getString("gb.repositoryNotSpecified")); redirectToInterceptPage(new RepositoriesPage()); } diff --git a/src/main/java/com/gitblit/wicket/pages/RootPage.java b/src/main/java/com/gitblit/wicket/pages/RootPage.java index 480ecf839..9a28a1f7b 100644 --- a/src/main/java/com/gitblit/wicket/pages/RootPage.java +++ b/src/main/java/com/gitblit/wicket/pages/RootPage.java @@ -35,11 +35,13 @@ import javax.servlet.http.HttpServletResponse; import org.apache.wicket.MarkupContainer; +import org.apache.wicket.request.cycle.RequestCycle; +import org.apache.wicket.request.http.WebRequest; +import org.apache.wicket.request.http.WebResponse; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.RequestCycle; import org.apache.wicket.behavior.HeaderContributor; +import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.html.IHeaderContributor; -import org.apache.wicket.markup.html.IHeaderResponse; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.link.BookmarkablePageLink; @@ -49,8 +51,6 @@ import org.apache.wicket.markup.repeater.data.ListDataProvider; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; -import org.apache.wicket.protocol.http.WebRequest; -import org.apache.wicket.protocol.http.WebResponse; import com.gitblit.Constants; import com.gitblit.Constants.AuthenticationType; @@ -393,8 +393,8 @@ protected List getTimeFilterItems(PageParameters params) { clonedParams = new PageParameters(params); } - if (!clonedParams.containsKey("db")) { - clonedParams.put("db", daysBack); + if (clonedParams.get("db").isEmpty()) { + clonedParams.add("db", daysBack); } List items = new ArrayList(); @@ -434,7 +434,7 @@ protected List getRepositories(PageParameters params) { String set = WicketUtils.getSet(params); String regex = WicketUtils.getRegEx(params); String team = WicketUtils.getTeam(params); - int daysBack = params.getInt("db", 0); + int daysBack = params.get("db").toInt(0); int maxDaysBack = app().settings().getInteger(Keys.web.activityDurationMaximum, 30); List availableModels = getRepositoryModels(); diff --git a/src/main/java/com/gitblit/wicket/pages/SessionPage.java b/src/main/java/com/gitblit/wicket/pages/SessionPage.java index 7dd0d06d8..b4cf0db38 100644 --- a/src/main/java/com/gitblit/wicket/pages/SessionPage.java +++ b/src/main/java/com/gitblit/wicket/pages/SessionPage.java @@ -18,10 +18,10 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.apache.wicket.request.http.WebRequest; +import org.apache.wicket.request.http.WebResponse; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.WebPage; -import org.apache.wicket.protocol.http.WebRequest; -import org.apache.wicket.protocol.http.WebResponse; import com.gitblit.Constants; import com.gitblit.Constants.AuthenticationType; diff --git a/src/main/java/com/gitblit/wicket/pages/TicketPage.java b/src/main/java/com/gitblit/wicket/pages/TicketPage.java index c1e1cd899..9de3100dd 100644 --- a/src/main/java/com/gitblit/wicket/pages/TicketPage.java +++ b/src/main/java/com/gitblit/wicket/pages/TicketPage.java @@ -265,7 +265,7 @@ public TicketPage(PageParameters params) { } else { milestoneParameters = WicketUtils.newRepositoryParameter(repositoryName); } - milestoneParameters.put(Lucene.milestone.name(), ticket.milestone); + milestoneParameters.add(Lucene.milestone.name(), ticket.milestone); int progress = 0; int open = 0; int closed = 0; diff --git a/src/main/java/com/gitblit/wicket/pages/TicketsPage.java b/src/main/java/com/gitblit/wicket/pages/TicketsPage.java index bc4009bef..f99464af0 100644 --- a/src/main/java/com/gitblit/wicket/pages/TicketsPage.java +++ b/src/main/java/com/gitblit/wicket/pages/TicketsPage.java @@ -24,9 +24,9 @@ import java.util.Set; import java.util.TreeSet; +import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.panel.Fragment; @@ -367,7 +367,7 @@ public void populateItem(final Item item) { tq.color = StringUtils.getColor(tq.name); } String background = MessageFormat.format("background-color:{0};", tq.color); - swatch.add(new SimpleAttributeModifier("style", background)); + swatch.add(new AttributeModifier("style", background)); item.add(swatch); if (activeQuery.contains(tq.query)) { // selected @@ -377,7 +377,7 @@ public void populateItem(final Item item) { Label checked = new Label("checked"); WicketUtils.setCssClass(checked, "iconic-o-x"); item.add(checked); - item.add(new SimpleAttributeModifier("style", background)); + item.add(new AttributeModifier("style", background)); } else { // unselected String q = QueryBuilder.q(queryParam).toSubquery().and(tq.query).build(); diff --git a/src/main/java/com/gitblit/wicket/panels/BooleanChoiceOption.java b/src/main/java/com/gitblit/wicket/panels/BooleanChoiceOption.java index 98a700b76..9de3aa178 100644 --- a/src/main/java/com/gitblit/wicket/panels/BooleanChoiceOption.java +++ b/src/main/java/com/gitblit/wicket/panels/BooleanChoiceOption.java @@ -68,7 +68,7 @@ private void setup() { @Override protected void onUpdate(AjaxRequestTarget target) { choice.setEnabled(checkbox.getModelObject()); - target.addComponent(choice); + target.add(choice); if (!choice.isEnabled()) { choice.setModelObject(null); } diff --git a/src/main/java/com/gitblit/wicket/panels/ShockWaveComponent.java b/src/main/java/com/gitblit/wicket/panels/ShockWaveComponent.java index 78822c6df..416337f4e 100644 --- a/src/main/java/com/gitblit/wicket/panels/ShockWaveComponent.java +++ b/src/main/java/com/gitblit/wicket/panels/ShockWaveComponent.java @@ -22,9 +22,9 @@ import java.util.List; import java.util.Map; -import org.apache.wicket.Response; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.MarkupStream; +import org.apache.wicket.request.Response; import org.apache.wicket.util.value.IValueMap; /** From be0509f310c15bdf2765193cfa3b06fa4abfc87a Mon Sep 17 00:00:00 2001 From: Martin Spielmann Date: Thu, 28 Jul 2016 17:28:41 +0200 Subject: [PATCH 04/25] fix GitblitRedirectException --- .../wicket/GitblitRedirectException.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gitblit/wicket/GitblitRedirectException.java b/src/main/java/com/gitblit/wicket/GitblitRedirectException.java index 23ac7efa0..9eb76bfd2 100644 --- a/src/main/java/com/gitblit/wicket/GitblitRedirectException.java +++ b/src/main/java/com/gitblit/wicket/GitblitRedirectException.java @@ -15,12 +15,13 @@ */ package com.gitblit.wicket; -import org.apache.wicket.AbstractRestartResponseException; +//import org.apache.wicket.AbstractRestartResponseException; import org.apache.wicket.Page; -import org.apache.wicket.request.cycle.RequestCycle; +import org.apache.wicket.RestartResponseException; +//import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.protocol.http.RequestUtils; -import org.apache.wicket.request.target.basic.RedirectRequestTarget; +//import org.apache.wicket.protocol.http.RequestUtils; +//import org.apache.wicket.request.target.basic.RedirectRequestTarget; /** * This exception bypasses the servlet container rewriting relative redirect @@ -31,7 +32,7 @@ * * @author James Moger */ -public class GitblitRedirectException extends AbstractRestartResponseException { +public class GitblitRedirectException extends RestartResponseException { private static final long serialVersionUID = 1L; @@ -40,10 +41,11 @@ public GitblitRedirectException(Class pageClass) { } public GitblitRedirectException(Class pageClass, PageParameters params) { - RequestCycle cycle = RequestCycle.get(); - String relativeUrl = cycle.urlFor(pageClass, params).toString(); - String absoluteUrl = RequestUtils.toAbsolutePath(relativeUrl); - cycle.setRequestTarget(new RedirectRequestTarget(absoluteUrl)); - cycle.setRedirect(true); + super(pageClass, params); +// RequestCycle cycle = RequestCycle.get(); +// String relativeUrl = cycle.urlFor(pageClass, params).toString(); +// String absoluteUrl = RequestUtils.toAbsolutePath(relativeUrl); +// cycle.setRequestTarget(new RedirectRequestTarget(absoluteUrl)); +// cycle.setRedirect(true); } } From ed19912f080157c836fac708c6c77c5f74501a97 Mon Sep 17 00:00:00 2001 From: Martin Spielmann Date: Thu, 28 Jul 2016 17:31:56 +0200 Subject: [PATCH 05/25] fix GiBlitWebApp (mostly...) --- .../java/com/gitblit/wicket/GitBlitWebApp.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gitblit/wicket/GitBlitWebApp.java b/src/main/java/com/gitblit/wicket/GitBlitWebApp.java index c10d88732..15046bc1c 100644 --- a/src/main/java/com/gitblit/wicket/GitBlitWebApp.java +++ b/src/main/java/com/gitblit/wicket/GitBlitWebApp.java @@ -22,12 +22,14 @@ import java.util.TimeZone; import org.apache.wicket.Application; -import org.apache.wicket.Request; -import org.apache.wicket.Response; +import org.apache.wicket.RuntimeConfigurationType; import org.apache.wicket.Session; import org.apache.wicket.application.IClassResolver; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.protocol.http.WebApplication; +import org.apache.wicket.request.Request; +import org.apache.wicket.request.Response; +import org.apache.wicket.util.time.Duration; import ro.fortsoft.pf4j.PluginState; import ro.fortsoft.pf4j.PluginWrapper; @@ -191,7 +193,7 @@ public void init() { // configure the resource cache duration to 90 days for deployment if (!isDebugMode()) { - getResourceSettings().setDefaultCacheDuration(90 * 86400); + getResourceSettings().setDefaultCacheDuration(Duration.days(90)); } // setup the standard gitweb-ish urls @@ -477,11 +479,11 @@ public TimeZone getTimezone() { } @Override - public final String getConfigurationType() { + public final RuntimeConfigurationType getConfigurationType() { if (runtimeManager.isDebugMode()) { - return Application.DEVELOPMENT; + return RuntimeConfigurationType.DEVELOPMENT; } - return Application.DEPLOYMENT; + return RuntimeConfigurationType.DEPLOYMENT; } public static GitBlitWebApp get() { From 317c6b79051ff20d71287f2f4d60e7dd63a903df Mon Sep 17 00:00:00 2001 From: Martin Spielmann Date: Thu, 28 Jul 2016 18:54:30 +0200 Subject: [PATCH 06/25] Replaced SimpleAttributeModifier by AttributeModifier --- .../gitblit/utils/GitBlitRequestUtils.java | 17 +++++++++++++ .../com/gitblit/wicket/pages/BasePage.java | 17 ++++++------- .../com/gitblit/wicket/pages/BlamePage.java | 8 +++---- .../com/gitblit/wicket/pages/BlobPage.java | 4 ++-- .../wicket/pages/ChangePasswordPage.java | 9 +++---- .../com/gitblit/wicket/pages/CommitPage.java | 2 +- .../com/gitblit/wicket/pages/DocsPage.java | 10 ++++---- .../wicket/pages/EditRepositoryPage.java | 9 ++++--- .../gitblit/wicket/pages/EditTeamPage.java | 3 +-- .../gitblit/wicket/pages/EditUserPage.java | 4 ++-- .../wicket/pages/EmptyRepositoryPage.java | 4 ++-- .../wicket/pages/ExportTicketPage.java | 10 ++++---- .../gitblit/wicket/pages/FilestorePage.java | 9 +++---- .../wicket/pages/ImageDiffHandler.java | 2 +- .../com/gitblit/wicket/pages/LogoutPage.java | 15 ++++++------ .../wicket/pages/NewRepositoryPage.java | 4 ++-- .../gitblit/wicket/pages/RepositoryPage.java | 10 ++++---- .../com/gitblit/wicket/pages/SessionPage.java | 5 ++-- .../com/gitblit/wicket/pages/TicketPage.java | 9 ++++--- .../com/gitblit/wicket/pages/TicketsPage.java | 12 +++++----- .../com/gitblit/wicket/pages/TreePage.java | 2 +- .../gitblit/wicket/panels/BranchesPanel.java | 2 +- .../gitblit/wicket/panels/CommentPanel.java | 2 +- .../gitblit/wicket/panels/IconAjaxLink.java | 6 ++--- .../com/gitblit/wicket/panels/LinkPanel.java | 24 +++++++------------ .../com/gitblit/wicket/panels/LogPanel.java | 4 ++-- .../wicket/panels/MarkdownTextArea.java | 4 ++-- .../wicket/panels/ObjectContainer.java | 8 +++---- .../com/gitblit/wicket/panels/PagerPanel.java | 2 +- .../panels/RegistrantPermissionsPanel.java | 6 ++--- .../wicket/panels/RepositoryUrlPanel.java | 6 ++--- .../gitblit/wicket/panels/SimpleAjaxLink.java | 6 ++--- .../gitblit/wicket/panels/SshKeysPanel.java | 4 ++-- .../com/gitblit/wicket/panels/TagsPanel.java | 2 +- .../wicket/panels/TicketListPanel.java | 4 ++-- .../wicket/panels/TicketSearchForm.java | 2 +- 36 files changed, 128 insertions(+), 119 deletions(-) create mode 100644 src/main/java/com/gitblit/utils/GitBlitRequestUtils.java diff --git a/src/main/java/com/gitblit/utils/GitBlitRequestUtils.java b/src/main/java/com/gitblit/utils/GitBlitRequestUtils.java new file mode 100644 index 000000000..9a3593103 --- /dev/null +++ b/src/main/java/com/gitblit/utils/GitBlitRequestUtils.java @@ -0,0 +1,17 @@ +package com.gitblit.utils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.wicket.request.cycle.RequestCycle; + +public class GitBlitRequestUtils { + public static HttpServletRequest getServletRequest(){ + return (HttpServletRequest)RequestCycle.get().getRequest().getContainerRequest(); + } + + public static HttpServletResponse getServletResponse(){ + return (HttpServletResponse)RequestCycle.get().getResponse().getContainerResponse(); + } + +} diff --git a/src/main/java/com/gitblit/wicket/pages/BasePage.java b/src/main/java/com/gitblit/wicket/pages/BasePage.java index 801736ea4..4ade581ec 100644 --- a/src/main/java/com/gitblit/wicket/pages/BasePage.java +++ b/src/main/java/com/gitblit/wicket/pages/BasePage.java @@ -36,7 +36,10 @@ import org.apache.commons.io.IOUtils; import org.apache.wicket.Application; import org.apache.wicket.Page; +import org.apache.wicket.request.http.WebResponse; import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.request.resource.CssPackageResource; +import org.apache.wicket.request.resource.JavaScriptResourceReference; import org.apache.wicket.RedirectToUrlException; import org.apache.wicket.markup.html.CSSPackageResource; import org.apache.wicket.markup.html.basic.Label; @@ -45,7 +48,6 @@ import org.apache.wicket.markup.html.resources.JavascriptResourceReference; import org.apache.wicket.markup.repeater.RepeatingView; import org.apache.wicket.protocol.http.RequestUtils; -import org.apache.wicket.protocol.http.WebResponse; import org.apache.wicket.protocol.http.servlet.ServletWebRequest; import org.apache.wicket.request.target.basic.RedirectRequestTarget; import org.apache.wicket.util.time.Duration; @@ -62,6 +64,7 @@ import com.gitblit.models.ProjectModel; import com.gitblit.models.TeamModel; import com.gitblit.models.UserModel; +import com.gitblit.utils.GitBlitRequestUtils; import com.gitblit.utils.StringUtils; import com.gitblit.utils.TimeUtils; import com.gitblit.wicket.CacheControl; @@ -94,10 +97,10 @@ protected Logger logger() { private void customizeHeader() { if (app().settings().getBoolean(Keys.web.useResponsiveLayout, true)) { - add(CSSPackageResource.getHeaderContribution("bootstrap/css/bootstrap-responsive.css")); + add(CssPackageResource.getHeaderContribution("bootstrap/css/bootstrap-responsive.css")); } if (app().settings().getBoolean(Keys.web.hideHeader, false)) { - add(CSSPackageResource.getHeaderContribution("hideheader.css")); + add(CssPackageResource.getHeaderContribution("hideheader.css")); } } @@ -352,9 +355,7 @@ protected TimeZone getTimeZone() { } protected String getServerName() { - ServletWebRequest servletWebRequest = (ServletWebRequest) getRequest(); - HttpServletRequest req = servletWebRequest.getHttpServletRequest(); - return req.getServerName(); + return GitBlitRequestUtils.getServletRequest().getServerName(); } protected List getProjectModels() { @@ -371,7 +372,7 @@ protected List getProjects(PageParameters params) { boolean hasParameter = false; String regex = WicketUtils.getRegEx(params); String team = WicketUtils.getTeam(params); - int daysBack = params.getInt("db", 0); + int daysBack = params.get("db").toInt(0); int maxDaysBack = app().settings().getInteger(Keys.web.activityDurationMaximum, 30); List availableModels = getProjectModels(); @@ -527,7 +528,7 @@ private RepeatingView getBottomScriptContainer() { protected void addBottomScript(String scriptPath) { RepeatingView bottomScripts = getBottomScriptContainer(); Label script = new Label(bottomScripts.newChildId(), "\n"); + + urlFor(new JavaScriptResourceReference(this.getClass(), scriptPath)) + "'>\n"); bottomScripts.add(script.setEscapeModelStrings(false).setRenderBodyOnly(true)); } diff --git a/src/main/java/com/gitblit/wicket/pages/BlamePage.java b/src/main/java/com/gitblit/wicket/pages/BlamePage.java index b9c1bc82a..e9c2aca1c 100644 --- a/src/main/java/com/gitblit/wicket/pages/BlamePage.java +++ b/src/main/java/com/gitblit/wicket/pages/BlamePage.java @@ -27,9 +27,9 @@ import java.util.Set; import java.util.TreeSet; +import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.link.ExternalLink; @@ -90,7 +90,7 @@ public BlamePage(PageParameters params) { final String blobPath = WicketUtils.getPath(params); - final String blameTypeParam = params.getString("blametype", BlameType.COMMIT.toString()); + final String blameTypeParam = params.get("blametype").toString(BlameType.COMMIT.toString()); final BlameType activeBlameType = BlameType.get(blameTypeParam); RevCommit commit = getCommit(); @@ -145,7 +145,7 @@ public BlamePage(PageParameters params) { new BookmarkablePageLink(blameByLinkText, BlamePage.class, blameTypePageParam); if (activeBlameType == type) { - blameByPageLink.add(new SimpleAttributeModifier("style", "font-weight:bold;")); + blameByPageLink.add(new AttributeModifier("style", "font-weight:bold;")); } add(blameByPageLink); @@ -226,7 +226,7 @@ public void populateItem(final Item item) { break; } Component data = new Label("data", StringUtils.escapeForHtml(entry.data, true, tabLength)).setEscapeModelStrings(false); - data.add(new SimpleAttributeModifier("style", "background-color: " + color + ";")); + data.add(new AttributeModifier("style", "background-color: " + color + ";")); item.add(data); } }; diff --git a/src/main/java/com/gitblit/wicket/pages/BlobPage.java b/src/main/java/com/gitblit/wicket/pages/BlobPage.java index f88346424..a25068db7 100644 --- a/src/main/java/com/gitblit/wicket/pages/BlobPage.java +++ b/src/main/java/com/gitblit/wicket/pages/BlobPage.java @@ -20,8 +20,8 @@ import java.util.Map; import org.apache.wicket.Component; +import org.apache.wicket.RestartResponseException; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.RedirectException; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.image.Image; import org.apache.wicket.markup.html.link.BookmarkablePageLink; @@ -54,7 +54,7 @@ public BlobPage(PageParameters params) { String [] encodings = getEncodings(); if (StringUtils.isEmpty(objectId) && StringUtils.isEmpty(blobPath)) { - throw new RedirectException(TreePage.class, WicketUtils.newRepositoryParameter(repositoryName)); + throw new RestartResponseException(TreePage.class, WicketUtils.newRepositoryParameter(repositoryName)); } if (StringUtils.isEmpty(blobPath)) { diff --git a/src/main/java/com/gitblit/wicket/pages/ChangePasswordPage.java b/src/main/java/com/gitblit/wicket/pages/ChangePasswordPage.java index 259a4bf4f..8c91ac305 100644 --- a/src/main/java/com/gitblit/wicket/pages/ChangePasswordPage.java +++ b/src/main/java/com/gitblit/wicket/pages/ChangePasswordPage.java @@ -22,12 +22,11 @@ import org.apache.wicket.markup.html.form.StatelessForm; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; -import org.apache.wicket.protocol.http.WebRequest; -import org.apache.wicket.protocol.http.WebResponse; import com.gitblit.GitBlitException; import com.gitblit.Keys; import com.gitblit.models.UserModel; +import com.gitblit.utils.GitBlitRequestUtils; import com.gitblit.utils.StringUtils; import com.gitblit.wicket.GitBlitWebSession; import com.gitblit.wicket.NonTrimmedPasswordTextField; @@ -100,10 +99,8 @@ public void onSubmit() { try { app().gitblit().reviseUser(user.username, user); if (app().settings().getBoolean(Keys.web.allowCookieAuthentication, false)) { - WebRequest request = (WebRequest) getRequestCycle().getRequest(); - WebResponse response = (WebResponse) getRequestCycle().getResponse(); - app().authentication().setCookie(request.getHttpServletRequest(), - response.getHttpServletResponse(), user); + app().authentication().setCookie(GitBlitRequestUtils.getServletRequest(), + GitBlitRequestUtils.getServletResponse(), user); } } catch (GitBlitException e) { error(e.getMessage()); diff --git a/src/main/java/com/gitblit/wicket/pages/CommitPage.java b/src/main/java/com/gitblit/wicket/pages/CommitPage.java index c9d168038..6795af294 100644 --- a/src/main/java/com/gitblit/wicket/pages/CommitPage.java +++ b/src/main/java/com/gitblit/wicket/pages/CommitPage.java @@ -29,7 +29,7 @@ import org.apache.wicket.markup.repeater.data.DataView; import org.apache.wicket.markup.repeater.data.ListDataProvider; import org.apache.wicket.model.StringResourceModel; -import org.apache.wicket.request.target.resource.ResourceStreamRequestTarget; +//import org.apache.wicket.request.target.resource.ResourceStreamRequestTarget; import org.apache.wicket.util.resource.AbstractResourceStreamWriter; import org.apache.wicket.util.resource.IResourceStream; import org.eclipse.jgit.diff.DiffEntry.ChangeType; diff --git a/src/main/java/com/gitblit/wicket/pages/DocsPage.java b/src/main/java/com/gitblit/wicket/pages/DocsPage.java index 68d47a9a8..001444541 100644 --- a/src/main/java/com/gitblit/wicket/pages/DocsPage.java +++ b/src/main/java/com/gitblit/wicket/pages/DocsPage.java @@ -17,9 +17,9 @@ import java.util.List; +import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.link.ExternalLink; @@ -95,7 +95,7 @@ public void populateItem(final Item item) { item.add(link); if (counter == 0) { counter++; - item.add(new SimpleAttributeModifier("class", "active")); + item.add(new AttributeModifier("class", "active")); } } }; @@ -128,13 +128,13 @@ public void populateItem(final Item item) { Component content = new Label("content", doc.html) .setEscapeModelStrings(false); if (!MarkupSyntax.PLAIN.equals(doc.syntax)) { - content.add(new SimpleAttributeModifier("class", "markdown")); + content.add(new AttributeModifier("class", "markdown")); } item.add(content); - item.add(new SimpleAttributeModifier("id", file)); + item.add(new AttributeModifier("id", file)); if (counter == 0) { counter++; - item.add(new SimpleAttributeModifier("class", "tab-pane active")); + item.add(new AttributeModifier("class", "tab-pane active")); } } }; diff --git a/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java index 4ca4820a2..ae12d02fc 100644 --- a/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java +++ b/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java @@ -29,7 +29,6 @@ import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior; -import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.extensions.markup.html.form.palette.Palette; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; @@ -408,7 +407,7 @@ protected void onSubmit() { } // do not let the browser pre-populate these fields - form.add(new SimpleAttributeModifier("autocomplete", "off")); + form.add(new AttributeModifier("autocomplete", "off")); // @@ -638,9 +637,9 @@ protected void onUpdate(AjaxRequestTarget target) { repositoryModel.authorizationControl = AuthorizationControl.NAMED; } - target.addComponent(verifyCommitter); - target.addComponent(usersPalette); - target.addComponent(teamsPalette); + target.add(verifyCommitter); + target.add(usersPalette); + target.add(teamsPalette); } }; diff --git a/src/main/java/com/gitblit/wicket/pages/EditTeamPage.java b/src/main/java/com/gitblit/wicket/pages/EditTeamPage.java index f94747acd..9f9e6b1cb 100644 --- a/src/main/java/com/gitblit/wicket/pages/EditTeamPage.java +++ b/src/main/java/com/gitblit/wicket/pages/EditTeamPage.java @@ -25,7 +25,6 @@ import java.util.Set; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.extensions.markup.html.form.palette.Palette; import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.markup.html.form.CheckBox; @@ -220,7 +219,7 @@ protected void onSubmit() { }; // do not let the browser pre-populate these fields - form.add(new SimpleAttributeModifier("autocomplete", "off")); + form.add(new AttributeModifier("autocomplete", "off")); // not all user providers support manipulating team memberships boolean editMemberships = app().authentication().supportsTeamMembershipChanges(teamModel); diff --git a/src/main/java/com/gitblit/wicket/pages/EditUserPage.java b/src/main/java/com/gitblit/wicket/pages/EditUserPage.java index 720d311e1..af37af7f0 100644 --- a/src/main/java/com/gitblit/wicket/pages/EditUserPage.java +++ b/src/main/java/com/gitblit/wicket/pages/EditUserPage.java @@ -22,7 +22,7 @@ import java.util.List; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.behavior.SimpleAttributeModifier; +import org.apache.wicket.AttributeModifier; import org.apache.wicket.extensions.markup.html.form.palette.Palette; import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.markup.html.form.CheckBox; @@ -217,7 +217,7 @@ protected void onSubmit() { }; // do not let the browser pre-populate these fields - form.add(new SimpleAttributeModifier("autocomplete", "off")); + form.add(new AttributeModifier("autocomplete", "off")); // not all user providers support manipulating username and password boolean editCredentials = app().authentication().supportsCredentialChanges(userModel); diff --git a/src/main/java/com/gitblit/wicket/pages/EmptyRepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/EmptyRepositoryPage.java index a65a1febb..7c9a46b37 100644 --- a/src/main/java/com/gitblit/wicket/pages/EmptyRepositoryPage.java +++ b/src/main/java/com/gitblit/wicket/pages/EmptyRepositoryPage.java @@ -21,11 +21,11 @@ import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; -import org.apache.wicket.protocol.http.WebRequest; import com.gitblit.models.RepositoryModel; import com.gitblit.models.RepositoryUrl; import com.gitblit.models.UserModel; +import com.gitblit.utils.GitBlitRequestUtils; import com.gitblit.wicket.GitBlitWebSession; import com.gitblit.wicket.GitblitRedirectException; import com.gitblit.wicket.WicketUtils; @@ -54,7 +54,7 @@ public EmptyRepositoryPage(PageParameters params) { user = UserModel.ANONYMOUS; } - HttpServletRequest req = ((WebRequest) getRequest()).getHttpServletRequest(); + HttpServletRequest req = GitBlitRequestUtils.getServletRequest(); List repositoryUrls = app().services().getRepositoryUrls(req, user, repository); RepositoryUrl primaryUrl = repositoryUrls.size() == 0 ? null : repositoryUrls.get(0); String url = primaryUrl != null ? primaryUrl.url : ""; diff --git a/src/main/java/com/gitblit/wicket/pages/ExportTicketPage.java b/src/main/java/com/gitblit/wicket/pages/ExportTicketPage.java index 54abe9659..3d63550b0 100644 --- a/src/main/java/com/gitblit/wicket/pages/ExportTicketPage.java +++ b/src/main/java/com/gitblit/wicket/pages/ExportTicketPage.java @@ -15,10 +15,12 @@ */ package com.gitblit.wicket.pages; -import org.apache.wicket.IRequestTarget; +import org.apache.wicket.request.cycle.RequestCycle; +import org.apache.wicket.request.http.WebResponse; +//import org.apache.wicket.IRequestTarget; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.RequestCycle; -import org.apache.wicket.protocol.http.WebResponse; +//import org.apache.wicket.RequestCycle; +//import org.apache.wicket.protocol.http.WebResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,7 +39,7 @@ public class ExportTicketPage extends SessionPage { public ExportTicketPage(final PageParameters params) { super(params); - if (!params.containsKey("r")) { + if (params.get("r").isEmpty()) { error(getString("gb.repositoryNotSpecified")); redirectToInterceptPage(new RepositoriesPage()); } diff --git a/src/main/java/com/gitblit/wicket/pages/FilestorePage.java b/src/main/java/com/gitblit/wicket/pages/FilestorePage.java index 497b31407..6fc7b6d7a 100644 --- a/src/main/java/com/gitblit/wicket/pages/FilestorePage.java +++ b/src/main/java/com/gitblit/wicket/pages/FilestorePage.java @@ -243,7 +243,7 @@ protected enum SortBy { ok, pending, inprogress, error, deleted; } - private static class SortableFilestoreProvider extends SortableDataProvider { + private static class SortableFilestoreProvider extends SortableDataProvider { private static final long serialVersionUID = 1L; @@ -254,7 +254,7 @@ protected SortableFilestoreProvider(List list) { } @Override - public int size() { + public long size() { if (list == null) { return 0; } @@ -267,15 +267,16 @@ public IModel model(FilestoreModel header) { } @Override - public Iterator iterator(int first, int count) { + public Iterator iterator(long first, long count) { Collections.sort(list, new Comparator() { @Override public int compare(FilestoreModel o1, FilestoreModel o2) { return o2.getChangedOn().compareTo(o1.getChangedOn()); } }); - return list.subList(first, first + count).iterator(); + return list.subList(Math.toIntExact(first), Math.toIntExact(first + count)).iterator(); } + } } \ No newline at end of file diff --git a/src/main/java/com/gitblit/wicket/pages/ImageDiffHandler.java b/src/main/java/com/gitblit/wicket/pages/ImageDiffHandler.java index dc0c5ae82..cc06f44b2 100644 --- a/src/main/java/com/gitblit/wicket/pages/ImageDiffHandler.java +++ b/src/main/java/com/gitblit/wicket/pages/ImageDiffHandler.java @@ -19,7 +19,7 @@ import java.util.List; import org.apache.wicket.protocol.http.WebApplication; -import org.apache.wicket.protocol.http.WicketURLEncoder; +//import org.apache.wicket.protocol.http.WicketURLEncoder; import org.eclipse.jgit.diff.DiffEntry; import org.eclipse.jgit.diff.DiffEntry.Side; import org.jsoup.nodes.Element; diff --git a/src/main/java/com/gitblit/wicket/pages/LogoutPage.java b/src/main/java/com/gitblit/wicket/pages/LogoutPage.java index a8ae7d0fe..92d3d623b 100644 --- a/src/main/java/com/gitblit/wicket/pages/LogoutPage.java +++ b/src/main/java/com/gitblit/wicket/pages/LogoutPage.java @@ -15,10 +15,11 @@ */ package com.gitblit.wicket.pages; -import org.apache.wicket.protocol.http.WebRequest; -import org.apache.wicket.protocol.http.WebResponse; + +import org.apache.wicket.RestartResponseException; import com.gitblit.models.UserModel; +import com.gitblit.utils.GitBlitRequestUtils; import com.gitblit.wicket.GitBlitWebSession; public class LogoutPage extends BasePage { @@ -27,8 +28,7 @@ public LogoutPage() { super(); GitBlitWebSession session = GitBlitWebSession.get(); UserModel user = session.getUser(); - app().authentication().logout(((WebRequest) getRequest()).getHttpServletRequest(), - ((WebResponse) getResponse()).getHttpServletResponse(), user); + app().authentication().logout(GitBlitRequestUtils.getServletRequest(), GitBlitRequestUtils.getServletResponse(), user); session.invalidate(); /* @@ -36,14 +36,15 @@ public LogoutPage() { * If so, it is likely to be cached by the browser, and cannot be undone. Effectively, this means * that you cannot log out... */ - if ( ((WebRequest)getRequest()).getHttpServletRequest().getHeader("Authorization") != null ) { + if (GitBlitRequestUtils.getServletRequest().getHeader("Authorization") != null ) { // authentication will be done via this route anyway, show a page to close the browser: // this will be done by Wicket. setupPage(null, getString("gb.logout")); } else { - setRedirect(true); - setResponsePage(getApplication().getHomePage()); +// setRedirect(true); +// setResponsePage(getApplication().getHomePage()); + throw new RestartResponseException(getApplication().getHomePage()); } // not via WWW-Auth } // LogoutPage } \ No newline at end of file diff --git a/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java index d2589e6fa..b9e9f871e 100644 --- a/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java +++ b/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java @@ -22,7 +22,7 @@ import java.util.Collections; import java.util.List; -import org.apache.wicket.behavior.SimpleAttributeModifier; +import org.apache.wicket.AttributeModifier; import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.model.CompoundPropertyModel; @@ -151,7 +151,7 @@ protected void onSubmit() { }; // do not let the browser pre-populate these fields - form.add(new SimpleAttributeModifier("autocomplete", "off")); + form.add(new AttributeModifier("autocomplete", "off")); namePanel = new RepositoryNamePanel("namePanel", repositoryModel); form.add(namePanel); diff --git a/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java index 9e5db9f2f..c484e0742 100644 --- a/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java +++ b/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java @@ -26,10 +26,10 @@ import java.util.Map; import java.util.Set; +import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.RestartResponseException; -import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.TextField; @@ -134,9 +134,9 @@ public RepositoryPage(PageParameters params) { } } - if (params.containsKey(PARAM_STAR)) { + if (!params.get(PARAM_STAR).isEmpty()) { // set starred state - boolean star = params.getBoolean(PARAM_STAR); + boolean star = params.get(PARAM_STAR).toBoolean(); UserModel user = GitBlitWebSession.get().getUser(); if (user != null && user.isAuthenticated) { UserRepositoryPreferences prefs = user.getPreferences().getRepositoryPreferences(getRepositoryModel().name); @@ -354,7 +354,7 @@ protected void setupPage(String repositoryName, String pageName) { // (un)star link allows a user to star a repository if (user.isAuthenticated && model.hasCommits) { PageParameters starParams = DeepCopier.copy(getPageParameters()); - starParams.put(PARAM_STAR, !user.getPreferences().isStarredRepository(model.name)); + starParams.add(PARAM_STAR, !user.getPreferences().isStarredRepository(model.name)); String toggleStarUrl = getRequestCycle().urlFor(getClass(), starParams).toString(); if (user.getPreferences().isStarredRepository(model.name)) { // show unstar button @@ -419,7 +419,7 @@ protected void addToolbarButton(String wicketId, String iconClass, String label, WicketUtils.setCssClass(icon, iconClass); button.add(icon); button.add(new Label("label", label)); - button.add(new SimpleAttributeModifier("href", url)); + button.add(new AttributeModifier("href", url)); add(button); } diff --git a/src/main/java/com/gitblit/wicket/pages/SessionPage.java b/src/main/java/com/gitblit/wicket/pages/SessionPage.java index b4cf0db38..cb3a9bae1 100644 --- a/src/main/java/com/gitblit/wicket/pages/SessionPage.java +++ b/src/main/java/com/gitblit/wicket/pages/SessionPage.java @@ -27,6 +27,7 @@ import com.gitblit.Constants.AuthenticationType; import com.gitblit.Keys; import com.gitblit.models.UserModel; +import com.gitblit.utils.GitBlitRequestUtils; import com.gitblit.utils.StringUtils; import com.gitblit.wicket.GitBlitWebApp; import com.gitblit.wicket.GitBlitWebSession; @@ -53,8 +54,8 @@ protected GitBlitWebApp app() { private void login() { GitBlitWebSession session = GitBlitWebSession.get(); - HttpServletRequest request = ((WebRequest) getRequest()).getHttpServletRequest(); - HttpServletResponse response = ((WebResponse) getResponse()).getHttpServletResponse(); + HttpServletRequest request = GitBlitRequestUtils.getServletRequest(); + HttpServletResponse response = GitBlitRequestUtils.getServletResponse(); // If using container/external servlet authentication, use request attribute String authedUser = (String) request.getAttribute(Constants.ATTRIB_AUTHUSER); diff --git a/src/main/java/com/gitblit/wicket/pages/TicketPage.java b/src/main/java/com/gitblit/wicket/pages/TicketPage.java index 9de3100dd..53671b73a 100644 --- a/src/main/java/com/gitblit/wicket/pages/TicketPage.java +++ b/src/main/java/com/gitblit/wicket/pages/TicketPage.java @@ -38,7 +38,6 @@ import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.RestartResponseException; import org.apache.wicket.ajax.AjaxRequestTarget; -import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.image.ContextImage; import org.apache.wicket.markup.html.link.BookmarkablePageLink; @@ -51,7 +50,6 @@ import org.apache.wicket.markup.repeater.data.ListDataProvider; import org.apache.wicket.model.Model; import org.apache.wicket.protocol.http.RequestUtils; -import org.apache.wicket.protocol.http.WebRequest; import org.eclipse.jgit.diff.DiffEntry.ChangeType; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.Ref; @@ -87,6 +85,7 @@ import com.gitblit.utils.JGitUtils; import com.gitblit.utils.JGitUtils.MergeStatus; import com.gitblit.utils.CommitCache; +import com.gitblit.utils.GitBlitRequestUtils; import com.gitblit.utils.MarkdownUtils; import com.gitblit.utils.RefLogUtils; import com.gitblit.utils.StringUtils; @@ -635,7 +634,7 @@ public void populateItem(final Item item) { Label label = new Label("label", value); TicketLabel tLabel = app().tickets().getLabel(repository, value); String background = MessageFormat.format("background-color:{0};", tLabel.color); - label.add(new SimpleAttributeModifier("style", background)); + label.add(new AttributeModifier("style", background)); item.add(label); } }; @@ -1362,7 +1361,7 @@ protected void review(Score score) { } protected X setNewTarget(X x) { - x.add(new SimpleAttributeModifier("target", "_blank")); + x.add(new AttributeModifier("target", "_blank")); return x; } @@ -1569,7 +1568,7 @@ protected Component getMergeInstructions(UserModel user, RepositoryModel reposit * @return the primary repository url */ protected RepositoryUrl getRepositoryUrl(UserModel user, RepositoryModel repository) { - HttpServletRequest req = ((WebRequest) getRequest()).getHttpServletRequest(); + HttpServletRequest req = GitBlitRequestUtils.getServletRequest(); List urls = app().services().getRepositoryUrls(req, user, repository); if (ArrayUtils.isEmpty(urls)) { return null; diff --git a/src/main/java/com/gitblit/wicket/pages/TicketsPage.java b/src/main/java/com/gitblit/wicket/pages/TicketsPage.java index f99464af0..ed0ed63eb 100644 --- a/src/main/java/com/gitblit/wicket/pages/TicketsPage.java +++ b/src/main/java/com/gitblit/wicket/pages/TicketsPage.java @@ -88,12 +88,12 @@ public TicketsPage(PageParameters params) { boolean isAuthenticated = user != null && user.isAuthenticated; final String [] statiiParam = params.getStringArray(Lucene.status.name()); - final String assignedToParam = params.getString(Lucene.responsible.name(), null); - final String milestoneParam = params.getString(Lucene.milestone.name(), null); - final String queryParam = params.getString("q", null); - final String searchParam = params.getString("s", null); - final String sortBy = Lucene.fromString(params.getString("sort", Lucene.created.name())).name(); - final boolean desc = !"asc".equals(params.getString("direction", "desc")); + final String assignedToParam = params.get(Lucene.responsible.name()).toString(null); + final String milestoneParam = params.get(Lucene.milestone.name()).toString(null); + final String queryParam = params.get("q").toString(null); + final String searchParam = params.get("s").toString(null); + final String sortBy = Lucene.fromString(params.get("sort").toString( Lucene.created.name())).name(); + final boolean desc = !"asc".equals(params.get("direction").toString("desc")); // add search form add(new TicketSearchForm("ticketSearchForm", repositoryName, searchParam, getClass(), params)); diff --git a/src/main/java/com/gitblit/wicket/pages/TreePage.java b/src/main/java/com/gitblit/wicket/pages/TreePage.java index ad594fc7d..73a03f86b 100644 --- a/src/main/java/com/gitblit/wicket/pages/TreePage.java +++ b/src/main/java/com/gitblit/wicket/pages/TreePage.java @@ -27,7 +27,7 @@ import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.data.DataView; import org.apache.wicket.markup.repeater.data.ListDataProvider; -import org.apache.wicket.request.target.resource.ResourceStreamRequestTarget; +//import org.apache.wicket.request.target.resource.ResourceStreamRequestTarget; import org.apache.wicket.util.resource.AbstractResourceStreamWriter; import org.apache.wicket.util.resource.IResourceStream; import org.eclipse.jgit.lib.FileMode; diff --git a/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java b/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java index 3b9482f61..93dd14936 100644 --- a/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java @@ -32,7 +32,7 @@ import org.apache.wicket.markup.repeater.data.ListDataProvider; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.protocol.http.RequestUtils; -import org.apache.wicket.request.target.basic.RedirectRequestTarget; +//import org.apache.wicket.request.target.basic.RedirectRequestTarget; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; diff --git a/src/main/java/com/gitblit/wicket/panels/CommentPanel.java b/src/main/java/com/gitblit/wicket/panels/CommentPanel.java index e3cf44889..93d2b840e 100644 --- a/src/main/java/com/gitblit/wicket/panels/CommentPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/CommentPanel.java @@ -23,7 +23,7 @@ import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.protocol.http.RequestUtils; -import org.apache.wicket.request.target.basic.RedirectRequestTarget; +//import org.apache.wicket.request.target.basic.RedirectRequestTarget; import com.gitblit.models.RepositoryModel; import com.gitblit.models.TicketModel; diff --git a/src/main/java/com/gitblit/wicket/panels/IconAjaxLink.java b/src/main/java/com/gitblit/wicket/panels/IconAjaxLink.java index eb2288baa..a496db3b2 100644 --- a/src/main/java/com/gitblit/wicket/panels/IconAjaxLink.java +++ b/src/main/java/com/gitblit/wicket/panels/IconAjaxLink.java @@ -17,9 +17,9 @@ import java.text.MessageFormat; +import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.ajax.markup.html.AjaxLink; -import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.MarkupStream; import org.apache.wicket.model.IModel; @@ -36,12 +36,12 @@ public IconAjaxLink(String wicketId, String iconClass, IModel model) { } @Override - protected void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) { + public void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) { replaceComponentTagBody(markupStream, openTag, MessageFormat.format(" {1}", iconClass, getModelObject().toString())); } public void setNoFollow() { Component c = get("link"); - c.add(new SimpleAttributeModifier("rel", "nofollow")); + c.add(new AttributeModifier("rel", "nofollow")); } } diff --git a/src/main/java/com/gitblit/wicket/panels/LinkPanel.java b/src/main/java/com/gitblit/wicket/panels/LinkPanel.java index 06169a3e4..609a1e13e 100644 --- a/src/main/java/com/gitblit/wicket/panels/LinkPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/LinkPanel.java @@ -15,12 +15,9 @@ */ package com.gitblit.wicket.panels; -import java.io.OutputStream; -import java.util.concurrent.Callable; - +import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; @@ -29,13 +26,8 @@ import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; -import org.apache.wicket.request.target.resource.ResourceStreamRequestTarget; -import org.apache.wicket.util.resource.AbstractResourceStreamWriter; -import org.apache.wicket.util.resource.IResourceStream; -import com.gitblit.models.UserModel; import com.gitblit.utils.StringUtils; -import com.gitblit.wicket.GitBlitWebSession; import com.gitblit.wicket.WicketUtils; public class LinkPanel extends Panel { @@ -80,10 +72,10 @@ public LinkPanel(String wicketId, String bootstrapIcon, String linkCssClass, IMo link = new BookmarkablePageLink("link", clazz, parameters); } if (newWindow) { - link.add(new SimpleAttributeModifier("target", "_blank")); + link.add(new AttributeModifier("target", "_blank")); } if (linkCssClass != null) { - link.add(new SimpleAttributeModifier("class", linkCssClass)); + link.add(new AttributeModifier("class", linkCssClass)); } Label icon = new Label("icon"); if (StringUtils.isEmpty(bootstrapIcon)) { @@ -106,10 +98,10 @@ public LinkPanel(String wicketId, String linkCssClass, String label, String href this.labelModel = new Model(label); ExternalLink link = new ExternalLink("link", href); if (newWindow) { - link.add(new SimpleAttributeModifier("target", "_blank")); + link.add(new AttributeModifier("target", "_blank")); } if (linkCssClass != null) { - link.add(new SimpleAttributeModifier("class", linkCssClass)); + link.add(new AttributeModifier("class", linkCssClass)); } link.add(new Label("icon").setVisible(false)); link.add(new Label("label", labelModel)); @@ -122,7 +114,7 @@ public LinkPanel(String wicketId, String linkCssClass, String label, Link lin this.labelModel = new Model(label); if (linkCssClass != null) { - link.add(new SimpleAttributeModifier("class", linkCssClass)); + link.add(new AttributeModifier("class", linkCssClass)); } link.add(new Label("icon").setVisible(false)); @@ -132,12 +124,12 @@ public LinkPanel(String wicketId, String linkCssClass, String label, Link lin public void setNoFollow() { Component c = get("link"); - c.add(new SimpleAttributeModifier("rel", "nofollow")); + c.add(new AttributeModifier("rel", "nofollow")); } public void setTooltip(String tooltip) { Component c = get("link"); - c.add(new SimpleAttributeModifier("title", tooltip)); + c.add(new AttributeModifier("title", tooltip)); } } diff --git a/src/main/java/com/gitblit/wicket/panels/LogPanel.java b/src/main/java/com/gitblit/wicket/panels/LogPanel.java index e9d240d09..fe9f4d7c5 100644 --- a/src/main/java/com/gitblit/wicket/panels/LogPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/LogPanel.java @@ -19,8 +19,8 @@ import java.util.List; import java.util.Map; +import org.apache.wicket.AttributeModifier; import org.apache.wicket.MarkupContainer; -import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; @@ -85,7 +85,7 @@ public LogPanel(String wicketId, final String repositoryName, final String objec graph.setVisible(false); } else { // set the rowspan on the graph row and +1 for the graph row itself - graph.add(new SimpleAttributeModifier("rowspan", "" + (commits.size() + 1))); + graph.add(new AttributeModifier("rowspan", "" + (commits.size() + 1))); graph.add(new ExternalImage("image", BranchGraphServlet.asLink(baseUrl, repositoryName, commits.get(0).name(), commits.size()))); } diff --git a/src/main/java/com/gitblit/wicket/panels/MarkdownTextArea.java b/src/main/java/com/gitblit/wicket/panels/MarkdownTextArea.java index ade92c090..f922686f1 100644 --- a/src/main/java/com/gitblit/wicket/panels/MarkdownTextArea.java +++ b/src/main/java/com/gitblit/wicket/panels/MarkdownTextArea.java @@ -45,7 +45,7 @@ public MarkdownTextArea(String id, final IModel previewModel, final Labe protected void onUpdate(AjaxRequestTarget target) { renderPreview(previewModel); if (target != null) { - target.addComponent(previewLabel); + target.add(previewLabel); } } }); @@ -56,7 +56,7 @@ protected void onUpdate(AjaxRequestTarget target) { protected void onUpdate(AjaxRequestTarget target) { renderPreview(previewModel); if (target != null) { - target.addComponent(previewLabel); + target.add(previewLabel); } } }); diff --git a/src/main/java/com/gitblit/wicket/panels/ObjectContainer.java b/src/main/java/com/gitblit/wicket/panels/ObjectContainer.java index 3c09e7c72..e26673e44 100644 --- a/src/main/java/com/gitblit/wicket/panels/ObjectContainer.java +++ b/src/main/java/com/gitblit/wicket/panels/ObjectContainer.java @@ -20,16 +20,16 @@ import org.apache.wicket.Component; import org.apache.wicket.ResourceReference; -import org.apache.wicket.Response; +import org.apache.wicket.core.request.ClientInfo; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.MarkupStream; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.protocol.http.ClientProperties; -import org.apache.wicket.protocol.http.WebRequestCycle; import org.apache.wicket.protocol.http.WebSession; import org.apache.wicket.protocol.http.request.WebClientInfo; -import org.apache.wicket.request.ClientInfo; +import org.apache.wicket.request.Response; +import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.util.value.IValueMap; /** @@ -149,7 +149,7 @@ protected ClientProperties getClientProperties() { ClientInfo clientInfo = WebSession.get().getClientInfo(); if (clientInfo == null || !(clientInfo instanceof WebClientInfo)) { - clientInfo = new WebClientInfo((WebRequestCycle) getRequestCycle()); + clientInfo = new WebClientInfo(getRequestCycle()); WebSession.get().setClientInfo(clientInfo); } diff --git a/src/main/java/com/gitblit/wicket/panels/PagerPanel.java b/src/main/java/com/gitblit/wicket/panels/PagerPanel.java index fa7de792e..c80bb73ca 100644 --- a/src/main/java/com/gitblit/wicket/panels/PagerPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/PagerPanel.java @@ -69,7 +69,7 @@ public PagerPanel(String wicketId, final int currentPage, final int totalPages, public void populateItem(final Item item) { PageObject pageItem = item.getModelObject(); PageParameters pageParams = new PageParameters(baseParams); - pageParams.put("pg", pageItem.page); + pageParams.add("pg", pageItem.page); LinkPanel link = new LinkPanel("pageLink", null, pageItem.text, pageClass, pageParams); link.setRenderBodyOnly(true); item.add(link); diff --git a/src/main/java/com/gitblit/wicket/panels/RegistrantPermissionsPanel.java b/src/main/java/com/gitblit/wicket/panels/RegistrantPermissionsPanel.java index 447e17895..f1d7d6408 100644 --- a/src/main/java/com/gitblit/wicket/panels/RegistrantPermissionsPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/RegistrantPermissionsPanel.java @@ -214,7 +214,7 @@ public void populateItem(final Item item) { @Override protected void onUpdate(AjaxRequestTarget target) { - target.addComponent(permissionChoice); + target.add(permissionChoice); } }); } @@ -277,7 +277,7 @@ protected void onSubmit(AjaxRequestTarget target, Form form) { registrants.remove(rp.registrant); // force the panel to refresh - target.addComponent(RegistrantPermissionsPanel.this); + target.add(RegistrantPermissionsPanel.this); } }; addPermissionForm.add(button); @@ -339,7 +339,7 @@ protected void onBeforeRender() @Override protected void onSubmit(AjaxRequestTarget target, Form form) { RegistrantPermissionsPanel.this.activeState = buttonState; - target.addComponent(RegistrantPermissionsPanel.this); + target.add(RegistrantPermissionsPanel.this); } }; } diff --git a/src/main/java/com/gitblit/wicket/panels/RepositoryUrlPanel.java b/src/main/java/com/gitblit/wicket/panels/RepositoryUrlPanel.java index 207f12508..549c92b59 100644 --- a/src/main/java/com/gitblit/wicket/panels/RepositoryUrlPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/RepositoryUrlPanel.java @@ -24,15 +24,14 @@ import javax.servlet.http.HttpServletRequest; import org.apache.wicket.Component; -import org.apache.wicket.RequestCycle; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.image.ContextImage; import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.data.DataView; import org.apache.wicket.markup.repeater.data.ListDataProvider; -import org.apache.wicket.protocol.http.WebRequest; import org.apache.wicket.protocol.http.request.WebClientInfo; +import org.apache.wicket.request.cycle.RequestCycle; import com.gitblit.Constants.AccessPermission; import com.gitblit.Constants.AccessRestrictionType; @@ -41,6 +40,7 @@ import com.gitblit.models.RepositoryModel; import com.gitblit.models.RepositoryUrl; import com.gitblit.models.UserModel; +import com.gitblit.utils.GitBlitRequestUtils; import com.gitblit.utils.StringUtils; import com.gitblit.wicket.ExternalImage; import com.gitblit.wicket.GitBlitWebSession; @@ -78,7 +78,7 @@ public RepositoryUrlPanel(String wicketId, boolean onlyUrls, UserModel user, Rep protected void onInitialize() { super.onInitialize(); - HttpServletRequest req = ((WebRequest) getRequest()).getHttpServletRequest(); + HttpServletRequest req = GitBlitRequestUtils.getServletRequest(); List repositoryUrls = app().services().getRepositoryUrls(req, user, repository); // grab primary url from the top of the list diff --git a/src/main/java/com/gitblit/wicket/panels/SimpleAjaxLink.java b/src/main/java/com/gitblit/wicket/panels/SimpleAjaxLink.java index d74665226..6a3cca061 100644 --- a/src/main/java/com/gitblit/wicket/panels/SimpleAjaxLink.java +++ b/src/main/java/com/gitblit/wicket/panels/SimpleAjaxLink.java @@ -15,9 +15,9 @@ */ package com.gitblit.wicket.panels; +import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.ajax.markup.html.AjaxLink; -import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.MarkupStream; import org.apache.wicket.model.IModel; @@ -31,12 +31,12 @@ public SimpleAjaxLink(String wicketId, IModel model) { } @Override - protected void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) { + public void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) { replaceComponentTagBody(markupStream, openTag, getModelObject().toString()); } public void setNoFollow() { Component c = get("link"); - c.add(new SimpleAttributeModifier("rel", "nofollow")); + c.add(new AttributeModifier("rel", "nofollow")); } } diff --git a/src/main/java/com/gitblit/wicket/panels/SshKeysPanel.java b/src/main/java/com/gitblit/wicket/panels/SshKeysPanel.java index 15ebd67b7..a06f9c4db 100644 --- a/src/main/java/com/gitblit/wicket/panels/SshKeysPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/SshKeysPanel.java @@ -86,7 +86,7 @@ public void onClick(AjaxRequestTarget target) { keys.addAll(app().keys().getKeys(user.username)); // update the panel - target.addComponent(SshKeysPanel.this); + target.add(SshKeysPanel.this); } } }; @@ -159,7 +159,7 @@ protected void onSubmit(AjaxRequestTarget target, Form form) { keys.addAll(app().keys().getKeys(user.username)); // update the panel - target.addComponent(SshKeysPanel.this); + target.add(SshKeysPanel.this); } } }); diff --git a/src/main/java/com/gitblit/wicket/panels/TagsPanel.java b/src/main/java/com/gitblit/wicket/panels/TagsPanel.java index f1f827399..363708420 100644 --- a/src/main/java/com/gitblit/wicket/panels/TagsPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/TagsPanel.java @@ -17,7 +17,6 @@ import java.util.List; -import org.apache.wicket.RequestCycle; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; @@ -27,6 +26,7 @@ import org.apache.wicket.markup.repeater.data.DataView; import org.apache.wicket.markup.repeater.data.ListDataProvider; import org.apache.wicket.model.StringResourceModel; +import org.apache.wicket.request.cycle.RequestCycle; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Repository; diff --git a/src/main/java/com/gitblit/wicket/panels/TicketListPanel.java b/src/main/java/com/gitblit/wicket/panels/TicketListPanel.java index c15239fb7..b247228b2 100644 --- a/src/main/java/com/gitblit/wicket/panels/TicketListPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/TicketListPanel.java @@ -20,7 +20,7 @@ import java.util.List; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.behavior.SimpleAttributeModifier; +import org.apache.wicket.AttributeModifier; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.markup.repeater.Item; @@ -143,7 +143,7 @@ public void populateItem(final Item labelItem) { } String background = MessageFormat.format("background-color:{0};", tLabel.color); - label.add(new SimpleAttributeModifier("style", background)); + label.add(new AttributeModifier("style", background)); labelItem.add(label); } }; diff --git a/src/main/java/com/gitblit/wicket/panels/TicketSearchForm.java b/src/main/java/com/gitblit/wicket/panels/TicketSearchForm.java index 91ef39241..32f133d1c 100644 --- a/src/main/java/com/gitblit/wicket/panels/TicketSearchForm.java +++ b/src/main/java/com/gitblit/wicket/panels/TicketSearchForm.java @@ -22,7 +22,7 @@ import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; -import org.apache.wicket.request.target.basic.RedirectRequestTarget; +//import org.apache.wicket.request.target.basic.RedirectRequestTarget; import com.gitblit.utils.StringUtils; import com.gitblit.wicket.SessionlessForm; From 20f61441ca08ea3136504cb9e55f92929d81226b Mon Sep 17 00:00:00 2001 From: Martin Spielmann Date: Fri, 29 Jul 2016 19:00:46 +0200 Subject: [PATCH 07/25] Replaced HeaderContributors by Behaviors and fixed PageParameter methods --- .../com/gitblit/wicket/Html5DateField.java | 9 +- .../java/com/gitblit/wicket/WicketUtils.java | 299 +++++++----------- .../com/gitblit/wicket/charting/Charts.java | 3 +- .../gitblit/wicket/charting/Flotr2Charts.java | 3 +- .../com/gitblit/wicket/ng/NgController.java | 7 +- .../gitblit/wicket/pages/ActivityPage.java | 3 +- .../com/gitblit/wicket/pages/ComparePage.java | 2 +- .../gitblit/wicket/pages/DashboardPage.java | 3 +- .../wicket/pages/EditRepositoryPage.java | 16 + .../com/gitblit/wicket/pages/MetricsPage.java | 3 +- .../gitblit/wicket/pages/OverviewPage.java | 3 +- .../gitblit/wicket/pages/RepositoryPage.java | 2 +- .../com/gitblit/wicket/pages/RootPage.java | 35 +- .../com/gitblit/wicket/pages/SummaryPage.java | 3 +- .../com/gitblit/wicket/panels/BasePanel.java | 4 +- .../wicket/panels/FilterableProjectList.java | 3 +- .../panels/FilterableRepositoryList.java | 3 +- .../wicket/panels/ObjectContainer.java | 2 +- .../panels/RegistrantPermissionsPanel.java | 5 + .../wicket/panels/RepositoriesPanel.java | 20 +- 20 files changed, 188 insertions(+), 240 deletions(-) diff --git a/src/main/java/com/gitblit/wicket/Html5DateField.java b/src/main/java/com/gitblit/wicket/Html5DateField.java index 66b273dd3..e606272ad 100644 --- a/src/main/java/com/gitblit/wicket/Html5DateField.java +++ b/src/main/java/com/gitblit/wicket/Html5DateField.java @@ -105,8 +105,8 @@ public DateFormat getDateFormat(Locale locale) * @return A pattern-specific converter */ @Override - public IConverter getConverter(Class type) - { + public IConverter getConverter(Class type) { + if (converter == null) { return super.getConverter(type); @@ -148,9 +148,8 @@ private static String defaultDatePattern() } @Override - protected String getInputType() - { - return "date"; + protected String[] getInputTypes() { + return new String[]{"date"}; } } \ No newline at end of file diff --git a/src/main/java/com/gitblit/wicket/WicketUtils.java b/src/main/java/com/gitblit/wicket/WicketUtils.java index 9a7782919..356b35b69 100644 --- a/src/main/java/com/gitblit/wicket/WicketUtils.java +++ b/src/main/java/com/gitblit/wicket/WicketUtils.java @@ -33,8 +33,9 @@ import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.request.resource.ContextRelativeResource; import org.apache.wicket.behavior.AttributeAppender; -import org.apache.wicket.behavior.HeaderContributor; -import org.apache.wicket.markup.html.IHeaderContributor; +import org.apache.wicket.behavior.Behavior; +import org.apache.wicket.markup.head.IHeaderResponse; +import org.apache.wicket.markup.head.StringHeaderItem; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.image.ContextImage; import org.apache.wicket.model.Model; @@ -48,6 +49,7 @@ import com.gitblit.models.FederationModel; import com.gitblit.models.Metric; import com.gitblit.utils.DiffUtils.DiffComparator; +import com.gitblit.utils.GitBlitRequestUtils; import com.gitblit.utils.HttpUtils; import com.gitblit.utils.StringUtils; import com.gitblit.utils.TimeUtils; @@ -67,8 +69,7 @@ public static void setCssStyle(Component container, String value) { } public static void setCssBackground(Component container, String value) { - String background = MessageFormat.format("background-color:{0};", - StringUtils.getColor(value)); + String background = MessageFormat.format("background-color:{0};", StringUtils.getColor(value)); container.add(new AttributeModifier("style", background)); } @@ -174,8 +175,7 @@ public static ContextImage getFileImage(String wicketId, String filename) { return newImage(wicketId, "file_h_16x16.png"); } else if (filename.endsWith(".sln")) { return newImage(wicketId, "file_vs_16x16.png"); - } else if (filename.endsWith(".csv") || filename.endsWith(".xls") - || filename.endsWith(".xlsx")) { + } else if (filename.endsWith(".csv") || filename.endsWith(".xls") || filename.endsWith(".xlsx")) { return newImage(wicketId, "file_excel_16x16.png"); } else if (filename.endsWith(".doc") || filename.endsWith(".docx")) { return newImage(wicketId, "file_doc_16x16.png"); @@ -201,14 +201,11 @@ public static ContextImage getFileImage(String wicketId, String filename) { return newImage(wicketId, "file_16x16.png"); } - public static ContextImage getRegistrationImage(String wicketId, FederationModel registration, - Component c) { + public static ContextImage getRegistrationImage(String wicketId, FederationModel registration, Component c) { if (registration.isResultData()) { - return WicketUtils.newImage(wicketId, "information_16x16.png", - c.getString("gb.federationResults")); + return WicketUtils.newImage(wicketId, "information_16x16.png", c.getString("gb.federationResults")); } else { - return WicketUtils.newImage(wicketId, "arrow_left.png", - c.getString("gb.federationRegistration")); + return WicketUtils.newImage(wicketId, "arrow_left.png", c.getString("gb.federationRegistration")); } } @@ -250,17 +247,16 @@ public static ContextRelativeResource getResource(String file) { } public static String getGitblitURL(Request request) { - HttpServletRequest req = ((WebRequest) request).getHttpServletRequest(); + HttpServletRequest req = GitBlitRequestUtils.getServletRequest(); return HttpUtils.getGitblitURL(req); } - public static HeaderContributor syndicationDiscoveryLink(final String feedTitle, - final String url) { - return new HeaderContributor(new IHeaderContributor() { + public static Behavior syndicationDiscoveryLink(final String feedTitle, final String url) { + return new Behavior() { private static final long serialVersionUID = 1L; @Override - public void renderHead(IHeaderResponse response) { + public void renderHead(Component c, IHeaderResponse response) { String contentType = "application/rss+xml"; StringBuilder buffer = new StringBuilder(); @@ -268,226 +264,154 @@ public void renderHead(IHeaderResponse response) { buffer.append("type=\"").append(contentType).append("\" "); buffer.append("title=\"").append(feedTitle).append("\" "); buffer.append("href=\"").append(url).append("\" />"); - response.renderString(buffer.toString()); + response.render(StringHeaderItem.forString(buffer.toString())); } - }); + }; } public static PageParameters newTokenParameter(String token) { - Map parameterMap = new HashMap(); - parameterMap.put("t", token); - return new PageParameters(parameterMap); + return new PageParameters().add("t", token); } - public static PageParameters newRegistrationParameter(String url, - String name) { - Map parameterMap = new HashMap(); - parameterMap.put("u", url); - parameterMap.put("n", name); - return new PageParameters(parameterMap); + public static PageParameters newRegistrationParameter(String url, String name) { + return new PageParameters().add("u", url).add("n", name); } public static PageParameters newUsernameParameter(String username) { - Map parameterMap = new HashMap(); - parameterMap.put("user", username); - return new PageParameters(parameterMap); + return new PageParameters().add("user", username); } public static PageParameters newTeamnameParameter(String teamname) { - Map parameterMap = new HashMap(); - parameterMap.put("team", teamname); - return new PageParameters(parameterMap); + return new PageParameters().add("team", teamname); } public static PageParameters newProjectParameter(String projectName) { - Map parameterMap = new HashMap(); - parameterMap.put("p", projectName); - return new PageParameters(parameterMap); + return new PageParameters().add("p", projectName); } public static PageParameters newRepositoryParameter(String repositoryName) { - Map parameterMap = new HashMap(); - if (!StringUtils.isEmpty(repositoryName)) { - parameterMap.put("r", repositoryName); - } - return new PageParameters(parameterMap); + return new PageParameters().add("r", repositoryName); } public static PageParameters newObjectParameter(String objectId) { - Map parameterMap = new HashMap(); - parameterMap.put("h", objectId); - return new PageParameters(parameterMap); + return new PageParameters().add("h", objectId); } - public static PageParameters newObjectParameter(String repositoryName, - String objectId) { - Map parameterMap = new HashMap(); + public static PageParameters newObjectParameter(String repositoryName, String objectId) { if (StringUtils.isEmpty(objectId)) { return newRepositoryParameter(repositoryName); } - parameterMap.put("r", repositoryName); - parameterMap.put("h", objectId); - return new PageParameters(parameterMap); + return new PageParameters().add("r", repositoryName).add("h", objectId); } - public static PageParameters newDiffParameter(String repositoryName, - String objectId, DiffComparator diffComparator) { - Map parameterMap = new HashMap(); + public static PageParameters newDiffParameter(String repositoryName, String objectId, + DiffComparator diffComparator) { if (StringUtils.isEmpty(objectId)) { return newRepositoryParameter(repositoryName); } - parameterMap.put("r", repositoryName); - parameterMap.put("h", objectId); - parameterMap.put("w", "" + diffComparator.ordinal()); - return new PageParameters(parameterMap); + return new PageParameters().add("r", repositoryName).add("h", objectId).add("w", "" + diffComparator.ordinal()); } - public static PageParameters newDiffParameter(String repositoryName, - String objectId, DiffComparator diffComparator, String blobPath) { - Map parameterMap = new HashMap(); + public static PageParameters newDiffParameter(String repositoryName, String objectId, DiffComparator diffComparator, + String blobPath) { if (StringUtils.isEmpty(objectId)) { return newRepositoryParameter(repositoryName); } - parameterMap.put("r", repositoryName); - parameterMap.put("h", objectId); - parameterMap.put("w", "" + diffComparator.ordinal()); - parameterMap.put("f", blobPath); - return new PageParameters(parameterMap); + return newDiffParameter(repositoryName, objectId, diffComparator).add("f", blobPath); } - public static PageParameters newRangeParameter(String repositoryName, - String startRange, String endRange) { - Map parameterMap = new HashMap(); - parameterMap.put("r", repositoryName); - parameterMap.put("h", startRange + ".." + endRange); - return new PageParameters(parameterMap); + public static PageParameters newRangeParameter(String repositoryName, String startRange, String endRange) { + return new PageParameters().add("r", repositoryName).add("h", startRange + ".." + endRange); } - public static PageParameters newPathParameter(String repositoryName, - String objectId, String path) { - Map parameterMap = new HashMap(); + public static PageParameters newPathParameter(String repositoryName, String objectId, String path) { if (StringUtils.isEmpty(path)) { return newObjectParameter(repositoryName, objectId); } if (StringUtils.isEmpty(objectId)) { - parameterMap.put("r", repositoryName); - parameterMap.put("f", path); - return new PageParameters(parameterMap); + return new PageParameters().add("r", repositoryName).add("f", path); } - parameterMap.put("r", repositoryName); - parameterMap.put("h", objectId); - parameterMap.put("f", path); - return new PageParameters(parameterMap); + return new PageParameters().add("r", repositoryName).add("h", objectId).add("f", path); } - public static PageParameters newLogPageParameter(String repositoryName, - String objectId, int pageNumber) { - Map parameterMap = new HashMap(); + public static PageParameters newLogPageParameter(String repositoryName, String objectId, int pageNumber) { if (pageNumber <= 1) { return newObjectParameter(repositoryName, objectId); } if (StringUtils.isEmpty(objectId)) { - parameterMap.put("r", repositoryName); - parameterMap.put("pg", String.valueOf(pageNumber)); - return new PageParameters(parameterMap); + return new PageParameters().add("r", repositoryName).add("pg", String.valueOf(pageNumber)); } - parameterMap.put("r", repositoryName); - parameterMap.put("h", objectId); - parameterMap.put("pg", String.valueOf(pageNumber)); - return new PageParameters(parameterMap); + return new PageParameters().add("r", repositoryName).add("h", objectId).add("pg", String.valueOf(pageNumber)); } - public static PageParameters newHistoryPageParameter(String repositoryName, - String objectId, String path, int pageNumber) { - Map parameterMap = new HashMap(); + public static PageParameters newHistoryPageParameter(String repositoryName, String objectId, String path, int pageNumber) { if (pageNumber <= 1) { return newObjectParameter(repositoryName, objectId); } - if (StringUtils.isEmpty(objectId)) { - parameterMap.put("r", repositoryName); - parameterMap.put("f", path); - parameterMap.put("pg", String.valueOf(pageNumber)); - return new PageParameters(parameterMap); + + PageParameters pp = new PageParameters(); + pp.add("r", repositoryName); + pp.add("f", path); + pp.add("pg", String.valueOf(pageNumber)); + if (!StringUtils.isEmpty(objectId)) { + pp.add("h", objectId); } - parameterMap.put("r", repositoryName); - parameterMap.put("h", objectId); - parameterMap.put("f", path); - parameterMap.put("pg", String.valueOf(pageNumber)); - return new PageParameters(parameterMap); + return pp; } public static PageParameters newFilestorePageParameter(int pageNumber, String filter) { - Map parameterMap = new HashMap(); - + PageParameters pp = new PageParameters(); if (pageNumber > 1) { - parameterMap.put("pg", String.valueOf(pageNumber)); + pp.add("pg", String.valueOf(pageNumber)); } if (filter != null) { - parameterMap.put("s", String.valueOf(filter)); + pp.add("s", String.valueOf(filter)); } - - return new PageParameters(parameterMap); - } - - public static PageParameters newBlobDiffParameter(String repositoryName, - String baseCommitId, String commitId, String path) { - Map parameterMap = new HashMap(); - if (StringUtils.isEmpty(commitId)) { - parameterMap.put("r", repositoryName); - parameterMap.put("f", path); - parameterMap.put("hb", baseCommitId); - return new PageParameters(parameterMap); - } - parameterMap.put("r", repositoryName); - parameterMap.put("h", commitId); - parameterMap.put("f", path); - parameterMap.put("hb", baseCommitId); - return new PageParameters(parameterMap); - } - - public static PageParameters newSearchParameter(String repositoryName, - String commitId, String search, Constants.SearchType type) { - Map parameterMap = new HashMap(); - if (StringUtils.isEmpty(commitId)) { - parameterMap.put("r", repositoryName); - parameterMap.put("s", search); - parameterMap.put("st", type.name()); - return new PageParameters(parameterMap); - } - parameterMap.put("r", repositoryName); - parameterMap.put("h", commitId); - parameterMap.put("s", search); - parameterMap.put("st", type.name()); - return new PageParameters(parameterMap); - } - - public static PageParameters newSearchParameter(String repositoryName, - String commitId, String search, Constants.SearchType type, - int pageNumber) { - Map parameterMap = new HashMap(); - if (StringUtils.isEmpty(commitId)) { - parameterMap.put("r", repositoryName); - parameterMap.put("s", search); - parameterMap.put("st", type.name()); - parameterMap.put("pg", String.valueOf(pageNumber)); - return new PageParameters(parameterMap); - } - parameterMap.put("r", repositoryName); - parameterMap.put("h", commitId); - parameterMap.put("s", search); - parameterMap.put("st", type.name()); - parameterMap.put("pg", String.valueOf(pageNumber)); - return new PageParameters(parameterMap); - } - - public static PageParameters newBlameTypeParameter(String repositoryName, - String commitId, String path, String blameType) { - Map parameterMap = new HashMap(); - parameterMap.put("r", repositoryName); - parameterMap.put("h", commitId); - parameterMap.put("f", path); - parameterMap.put("blametype", blameType); - return new PageParameters(parameterMap); + + return pp; + } + + public static PageParameters newBlobDiffParameter(String repositoryName, String baseCommitId, String commitId, + String path) { + PageParameters pp = new PageParameters(); + pp.add("r", repositoryName); + pp.add("f", path); + pp.add("hb", baseCommitId); + if (!StringUtils.isEmpty(commitId)) { + pp.add("h", commitId); + } + return pp; + } + + public static PageParameters newSearchParameter(String repositoryName, String commitId, String search, + Constants.SearchType type) { + PageParameters pp = new PageParameters(); + pp.add("r", repositoryName); + pp.add("s", search); + pp.add("st", type.name()); + if (!StringUtils.isEmpty(commitId)) { + pp.add("h", commitId); + } + return pp; + } + + public static PageParameters newSearchParameter(String repositoryName, String commitId, String search, + Constants.SearchType type, int pageNumber) { + PageParameters pp = new PageParameters(); + pp.add("r", repositoryName); + pp.add("s", search); + pp.add("st", type.name()); + pp.add("pg", String.valueOf(pageNumber)); + if (!StringUtils.isEmpty(commitId)) { + pp.add("h", commitId); + } + return pp; + } + + public static PageParameters newBlameTypeParameter(String repositoryName, String commitId, String path, + String blameType) { + return new PageParameters().add("r", repositoryName).add("h", commitId).add("f", path).add("blametype", + blameType); } public static PageParameters newTicketsParameters(String repositoryName, String... states) { @@ -513,27 +437,27 @@ public static String getRepositoryName(PageParameters params) { } public static String getObject(PageParameters params) { - return params.getString("h", null); + return params.get("h").toString(null); } public static String getPath(PageParameters params) { - return params.getString("f", null); + return params.get("f").toString(null); } public static String getBaseObjectId(PageParameters params) { - return params.getString("hb", null); + return params.get("hb").toString(null); } public static String getSearchString(PageParameters params) { - return params.getString("s", null); + return params.get("s").toString(null); } public static String getSearchType(PageParameters params) { - return params.getString("st", null); + return params.get("st").toString(null); } public static DiffComparator getDiffComparator(PageParameters params) { - int ordinal = params.getInt("w", 0); + int ordinal = params.get("w").toInt(0); return DiffComparator.values()[ordinal]; } @@ -543,35 +467,35 @@ public static int getPage(PageParameters params) { } public static String getRegEx(PageParameters params) { - return params.getString("x", ""); + return params.get("x").toString(""); } public static String getSet(PageParameters params) { - return params.getString("set", ""); + return params.get("set").toString(""); } public static String getTeam(PageParameters params) { - return params.getString("team", ""); + return params.get("team").toString(""); } public static int getDaysBack(PageParameters params) { - return params.getInt("db", 0); + return params.get("db").toInt(0); } public static String getUsername(PageParameters params) { - return params.getString("user", ""); + return params.get("user").toString(""); } public static String getTeamname(PageParameters params) { - return params.getString("team", ""); + return params.get("team").toString(""); } public static String getToken(PageParameters params) { - return params.getString("t", ""); + return params.get("t").toString(""); } public static String getUrlParameter(PageParameters params) { - return params.getString("u", ""); + return params.get("u").toString(""); } public static String getNameParameter(PageParameters params) { @@ -582,7 +506,8 @@ public static Label createDateLabel(String wicketId, Date date, TimeZone timeZon return createDateLabel(wicketId, date, timeZone, timeUtils, true); } - public static Label createDateLabel(String wicketId, Date date, TimeZone timeZone, TimeUtils timeUtils, boolean setCss) { + public static Label createDateLabel(String wicketId, Date date, TimeZone timeZone, TimeUtils timeUtils, + boolean setCss) { String format = GitBlitWebApp.get().settings().getString(Keys.web.datestampShortFormat, "MM/dd/yy"); DateFormat df = new SimpleDateFormat(format); if (timeZone == null) { diff --git a/src/main/java/com/gitblit/wicket/charting/Charts.java b/src/main/java/com/gitblit/wicket/charting/Charts.java index 54a7689ba..fa765bbd1 100644 --- a/src/main/java/com/gitblit/wicket/charting/Charts.java +++ b/src/main/java/com/gitblit/wicket/charting/Charts.java @@ -18,6 +18,7 @@ import java.util.ArrayList; import java.util.List; +import org.apache.wicket.behavior.Behavior; import org.apache.wicket.markup.html.IHeaderContributor; /** @@ -26,7 +27,7 @@ * @author Tim Ryan * */ -public abstract class Charts implements IHeaderContributor { +public abstract class Charts extends Behavior { private static final long serialVersionUID = 1L; diff --git a/src/main/java/com/gitblit/wicket/charting/Flotr2Charts.java b/src/main/java/com/gitblit/wicket/charting/Flotr2Charts.java index 62bec9341..f6b994263 100644 --- a/src/main/java/com/gitblit/wicket/charting/Flotr2Charts.java +++ b/src/main/java/com/gitblit/wicket/charting/Flotr2Charts.java @@ -17,6 +17,7 @@ import javax.servlet.ServletContext; +import org.apache.wicket.Component; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.head.JavaScriptHeaderItem; import org.apache.wicket.markup.head.OnDomReadyHeaderItem; @@ -35,7 +36,7 @@ public class Flotr2Charts extends Charts { private static final long serialVersionUID = 1L; @Override - public void renderHead(IHeaderResponse response) { + public void renderHead(Component component, IHeaderResponse response) { // add Google Chart JS API reference ServletContext servletContext = WebApplication.get().getServletContext(); diff --git a/src/main/java/com/gitblit/wicket/ng/NgController.java b/src/main/java/com/gitblit/wicket/ng/NgController.java index ea15dcf2e..648a12d91 100644 --- a/src/main/java/com/gitblit/wicket/ng/NgController.java +++ b/src/main/java/com/gitblit/wicket/ng/NgController.java @@ -19,9 +19,10 @@ import java.util.HashMap; import java.util.Map; +import org.apache.wicket.Component; +import org.apache.wicket.behavior.Behavior; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.head.JavaScriptHeaderItem; -import org.apache.wicket.markup.html.IHeaderContributor; import org.apache.wicket.request.resource.PackageResourceReference; import com.google.gson.Gson; @@ -35,7 +36,7 @@ * @author James Moger * */ -public class NgController implements IHeaderContributor { +public class NgController extends Behavior { private static final long serialVersionUID = 1L; @@ -53,7 +54,7 @@ public void addVariable(String name, Object o) { } @Override - public void renderHead(IHeaderResponse response) { + public void renderHead(Component component, IHeaderResponse response) { // add Google AngularJS reference response.render(JavaScriptHeaderItem.forReference(new PackageResourceReference(NgController.class, "angular.js"))); diff --git a/src/main/java/com/gitblit/wicket/pages/ActivityPage.java b/src/main/java/com/gitblit/wicket/pages/ActivityPage.java index af4e39f78..f7c8ccf17 100644 --- a/src/main/java/com/gitblit/wicket/pages/ActivityPage.java +++ b/src/main/java/com/gitblit/wicket/pages/ActivityPage.java @@ -25,7 +25,6 @@ import java.util.Set; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.behavior.HeaderContributor; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.panel.Fragment; @@ -118,7 +117,7 @@ public ActivityPage(PageParameters params) { // create the activity charts if (app().settings().getBoolean(Keys.web.generateActivityGraph, true)) { Charts charts = createCharts(recentActivity); - add(new HeaderContributor(charts)); + add(charts); add(new Fragment("chartsPanel", "chartsFragment", this)); } else { add(new Label("chartsPanel").setVisible(false)); diff --git a/src/main/java/com/gitblit/wicket/pages/ComparePage.java b/src/main/java/com/gitblit/wicket/pages/ComparePage.java index 910c14678..2d1be64f3 100644 --- a/src/main/java/com/gitblit/wicket/pages/ComparePage.java +++ b/src/main/java/com/gitblit/wicket/pages/ComparePage.java @@ -33,7 +33,7 @@ import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.protocol.http.RequestUtils; -import org.apache.wicket.request.target.basic.RedirectRequestTarget; +//import org.apache.wicket.request.target.basic.RedirectRequestTarget; import org.eclipse.jgit.diff.DiffEntry.ChangeType; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; diff --git a/src/main/java/com/gitblit/wicket/pages/DashboardPage.java b/src/main/java/com/gitblit/wicket/pages/DashboardPage.java index 73c6686f1..0b2473342 100644 --- a/src/main/java/com/gitblit/wicket/pages/DashboardPage.java +++ b/src/main/java/com/gitblit/wicket/pages/DashboardPage.java @@ -29,7 +29,6 @@ import java.util.TreeSet; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.behavior.HeaderContributor; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.panel.Fragment; import org.eclipse.jgit.lib.Repository; @@ -240,7 +239,7 @@ protected void addCharts(Fragment frag, List recentChanges, Set> choices) { + return choices.getObject().get(Integer.valueOf(id)); + } } private class GCPeriodRenderer implements IChoiceRenderer { @@ -797,6 +803,11 @@ public String getDisplayValue(Integer value) { public String getIdValue(Integer value, int index) { return Integer.toString(index); } + + @Override + public Integer getObject(String id, IModel> choices) { + return choices.getObject().get(Integer.valueOf(id)); + } } private class MaxActivityCommitsRenderer implements IChoiceRenderer { @@ -821,5 +832,10 @@ public String getDisplayValue(Integer value) { public String getIdValue(Integer value, int index) { return Integer.toString(index); } + + @Override + public Integer getObject(String id, IModel> choices) { + return choices.getObject().get(Integer.valueOf(id)); + } } } diff --git a/src/main/java/com/gitblit/wicket/pages/MetricsPage.java b/src/main/java/com/gitblit/wicket/pages/MetricsPage.java index 630e38fe3..bf8a474aa 100644 --- a/src/main/java/com/gitblit/wicket/pages/MetricsPage.java +++ b/src/main/java/com/gitblit/wicket/pages/MetricsPage.java @@ -26,7 +26,6 @@ import java.util.List; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.behavior.HeaderContributor; import org.apache.wicket.markup.html.basic.Label; import org.eclipse.jgit.lib.Repository; @@ -72,7 +71,7 @@ public MetricsPage(PageParameters params) { createBarChart(charts, "dayOfWeekChart", getDayOfWeekMetrics(r, objectId)); createPieChart(charts, "authorsChart", getAuthorMetrics(r, objectId)); - add(new HeaderContributor(charts)); + add(charts); } diff --git a/src/main/java/com/gitblit/wicket/pages/OverviewPage.java b/src/main/java/com/gitblit/wicket/pages/OverviewPage.java index d9dd10fa9..4ec546910 100644 --- a/src/main/java/com/gitblit/wicket/pages/OverviewPage.java +++ b/src/main/java/com/gitblit/wicket/pages/OverviewPage.java @@ -20,7 +20,6 @@ import java.util.List; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.behavior.HeaderContributor; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.repeater.Item; @@ -147,7 +146,7 @@ && app().settings().getBoolean(Keys.web.generateActivityGraph, true)) { chart.setHeight(150); charts.addChart(chart); - add(new HeaderContributor(charts)); + add(charts); } } } diff --git a/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java index c484e0742..d351bc70c 100644 --- a/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java +++ b/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java @@ -37,7 +37,7 @@ import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; -import org.apache.wicket.request.target.basic.RedirectRequestTarget; +//import org.apache.wicket.request.target.basic.RedirectRequestTarget; import org.eclipse.jgit.diff.DiffEntry.ChangeType; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.Repository; diff --git a/src/main/java/com/gitblit/wicket/pages/RootPage.java b/src/main/java/com/gitblit/wicket/pages/RootPage.java index 9a28a1f7b..08c4e30b6 100644 --- a/src/main/java/com/gitblit/wicket/pages/RootPage.java +++ b/src/main/java/com/gitblit/wicket/pages/RootPage.java @@ -34,12 +34,14 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.apache.wicket.Component; import org.apache.wicket.MarkupContainer; +import org.apache.wicket.behavior.Behavior; import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.http.WebRequest; import org.apache.wicket.request.http.WebResponse; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.behavior.HeaderContributor; +import org.apache.wicket.markup.head.CssHeaderItem; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.html.IHeaderContributor; import org.apache.wicket.markup.html.basic.Label; @@ -68,6 +70,7 @@ import com.gitblit.models.RepositoryModel; import com.gitblit.models.TeamModel; import com.gitblit.models.UserModel; +import com.gitblit.utils.GitBlitRequestUtils; import com.gitblit.utils.ModelUtils; import com.gitblit.utils.StringUtils; import com.gitblit.wicket.GitBlitWebSession; @@ -78,6 +81,8 @@ import com.gitblit.wicket.panels.LinkPanel; import com.gitblit.wicket.panels.NavigationPanel; +import de.akquinet.devops.GitBlitServer4UITests; + /** * Root page is a topbar, navigable page like Repositories, Users, or * Federation. @@ -105,13 +110,13 @@ public RootPage(PageParameters params) { protected void setupPage(String repositoryName, String pageName) { // CSS header overrides - add(new HeaderContributor(new IHeaderContributor() { + add(new Behavior() { private static final long serialVersionUID = 1L; @Override - public void renderHead(IHeaderResponse response) { + public void renderHead(Component component, IHeaderResponse response) { StringBuilder buffer = new StringBuilder(); - buffer.append("\n"); - response.renderString(buffer.toString()); +// buffer.append("\n"); + response.render(CssHeaderItem.forCSS(buffer.toString(), "rootCss")); } - })); + }); boolean authenticateView = app().settings().getBoolean(Keys.web.authenticateViewPages, false); boolean authenticateAdmin = app().settings().getBoolean(Keys.web.authenticateAdminPages, true); @@ -255,8 +260,8 @@ private PageParameters getRootPageParameters() { params.remove("user"); // remove days back parameter if it is the default value - if (params.containsKey("db") - && params.getInt("db") == app().settings().getInteger(Keys.web.activityDuration, 7)) { + if (!params.get("db").isEmpty() + && params.get("db").toInt() == app().settings().getInteger(Keys.web.activityDuration, 7)) { params.remove("db"); } return params; @@ -271,8 +276,8 @@ protected boolean reusePageParameters() { private void loginUser(UserModel user) { if (user != null) { - HttpServletRequest request = ((WebRequest) getRequest()).getHttpServletRequest(); - HttpServletResponse response = ((WebResponse) getResponse()).getHttpServletResponse(); + HttpServletRequest request = GitBlitRequestUtils.getServletRequest(); + HttpServletResponse response = GitBlitRequestUtils.getServletResponse(); // Set the user into the session GitBlitWebSession session = GitBlitWebSession.get(); @@ -281,8 +286,8 @@ private void loginUser(UserModel user) { session.replaceSession(); session.setUser(user); - request = ((WebRequest) getRequest()).getHttpServletRequest(); - response = ((WebResponse) getResponse()).getHttpServletResponse(); + request = GitBlitRequestUtils.getServletRequest(); + response = GitBlitRequestUtils.getServletResponse(); request.getSession().setAttribute(Constants.ATTRIB_AUTHTYPE, AuthenticationType.CREDENTIALS); // Set Cookie @@ -569,7 +574,7 @@ public void onSubmit() { String username = RootPage.this.username.getObject(); char[] password = RootPage.this.password.getObject().toCharArray(); - HttpServletRequest request = ((WebRequest)RequestCycle.get().getRequest()).getHttpServletRequest(); + HttpServletRequest request = GitBlitRequestUtils.getServletRequest(); UserModel user = app().authentication().authenticate(username, password, request.getRemoteAddr()); if (user == null) { @@ -613,7 +618,7 @@ protected void onInitialize() { GitBlitWebSession session = GitBlitWebSession.get(); UserModel user = session.getUser(); boolean editCredentials = app().authentication().supportsCredentialChanges(user); - HttpServletRequest request = ((WebRequest) getRequest()).getHttpServletRequest(); + HttpServletRequest request = GitBlitRequestUtils.getServletRequest(); AuthenticationType authenticationType = (AuthenticationType) request.getAttribute(Constants.ATTRIB_AUTHTYPE); boolean standardLogin = (null != authenticationType) ? authenticationType.isStandard() : true; diff --git a/src/main/java/com/gitblit/wicket/pages/SummaryPage.java b/src/main/java/com/gitblit/wicket/pages/SummaryPage.java index adf3026fd..43f9c450e 100644 --- a/src/main/java/com/gitblit/wicket/pages/SummaryPage.java +++ b/src/main/java/com/gitblit/wicket/pages/SummaryPage.java @@ -24,7 +24,6 @@ import org.apache.wicket.Component; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.behavior.HeaderContributor; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.panel.Fragment; @@ -160,7 +159,7 @@ public void populateItem(final Item item) { add(new Label("commitsChart").setVisible(false)); } else { Charts charts = createCharts(metrics); - add(new HeaderContributor(charts)); + add(charts); } } diff --git a/src/main/java/com/gitblit/wicket/panels/BasePanel.java b/src/main/java/com/gitblit/wicket/panels/BasePanel.java index 73f8e4717..0f136ffd9 100644 --- a/src/main/java/com/gitblit/wicket/panels/BasePanel.java +++ b/src/main/java/com/gitblit/wicket/panels/BasePanel.java @@ -90,7 +90,7 @@ public static class JavascriptEventConfirmation extends AttributeModifier { private static final long serialVersionUID = 1L; public JavascriptEventConfirmation(String event, String msg) { - super(event, true, new Model(msg)); + super(event, new Model(msg)); } @Override @@ -112,7 +112,7 @@ public static class JavascriptTextPrompt extends AttributeModifier { private String initialValue = ""; public JavascriptTextPrompt(String event, String msg, String value) { - super(event, true, new Model(msg)); + super(event, new Model(msg)); initialValue = value; } diff --git a/src/main/java/com/gitblit/wicket/panels/FilterableProjectList.java b/src/main/java/com/gitblit/wicket/panels/FilterableProjectList.java index 3a269a939..952fba349 100644 --- a/src/main/java/com/gitblit/wicket/panels/FilterableProjectList.java +++ b/src/main/java/com/gitblit/wicket/panels/FilterableProjectList.java @@ -26,7 +26,6 @@ import java.util.List; import java.util.Map; -import org.apache.wicket.behavior.HeaderContributor; import org.apache.wicket.markup.html.basic.Label; import com.gitblit.Keys; @@ -121,7 +120,7 @@ public int compare(ProjectModel o1, ProjectModel o2) { // inject an AngularJS controller with static data NgController ctrl = new NgController(ngCtrl); ctrl.addVariable(ngList, list); - add(new HeaderContributor(ctrl)); + add(ctrl); } protected class ProjectListItem implements Serializable { diff --git a/src/main/java/com/gitblit/wicket/panels/FilterableRepositoryList.java b/src/main/java/com/gitblit/wicket/panels/FilterableRepositoryList.java index e4ce5ced6..bf97d4f1b 100644 --- a/src/main/java/com/gitblit/wicket/panels/FilterableRepositoryList.java +++ b/src/main/java/com/gitblit/wicket/panels/FilterableRepositoryList.java @@ -24,7 +24,6 @@ import java.util.List; import java.util.Map; -import org.apache.wicket.behavior.HeaderContributor; import org.apache.wicket.markup.html.basic.Label; import com.gitblit.Keys; @@ -140,7 +139,7 @@ protected void onInitialize() { // inject an AngularJS controller with static data NgController ctrl = new NgController(ngCtrl); ctrl.addVariable(ngList, list); - add(new HeaderContributor(ctrl)); + add(ctrl); } protected class RepoListItem implements Serializable { diff --git a/src/main/java/com/gitblit/wicket/panels/ObjectContainer.java b/src/main/java/com/gitblit/wicket/panels/ObjectContainer.java index e26673e44..63f7b2103 100644 --- a/src/main/java/com/gitblit/wicket/panels/ObjectContainer.java +++ b/src/main/java/com/gitblit/wicket/panels/ObjectContainer.java @@ -19,7 +19,7 @@ import java.util.List; import org.apache.wicket.Component; -import org.apache.wicket.ResourceReference; +//import org.apache.wicket.ResourceReference; import org.apache.wicket.core.request.ClientInfo; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.MarkupStream; diff --git a/src/main/java/com/gitblit/wicket/panels/RegistrantPermissionsPanel.java b/src/main/java/com/gitblit/wicket/panels/RegistrantPermissionsPanel.java index f1d7d6408..839d80f90 100644 --- a/src/main/java/com/gitblit/wicket/panels/RegistrantPermissionsPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/RegistrantPermissionsPanel.java @@ -312,6 +312,11 @@ public String getDisplayValue(AccessPermission type) { public String getIdValue(AccessPermission type, int index) { return Integer.toString(index); } + + @Override + public AccessPermission getObject(String id, IModel> choices) { + return choices.getObject().get(Integer.valueOf(id)); + } } private class ShowStateButton extends AjaxButton { diff --git a/src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.java b/src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.java index e36fcd6e6..877e21de1 100644 --- a/src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.java @@ -26,6 +26,7 @@ import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.extensions.markup.html.repeater.data.sort.OrderByBorder; +import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder; import org.apache.wicket.extensions.markup.html.repeater.util.SortParam; import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider; import org.apache.wicket.markup.html.basic.Label; @@ -307,9 +308,9 @@ public void populateItem(final Item item) { }; add(dataView); - if (dp instanceof SortableDataProvider) { + if (dp instanceof SortableDataProvider) { // add sortable header - SortableDataProvider sdp = (SortableDataProvider) dp; + SortableDataProvider sdp = (SortableDataProvider) dp; Fragment fragment = new Fragment("headerContent", "flatRepositoryHeader", this); fragment.add(newSort("orderByRepository", SortBy.repository, sdp, dataView)); fragment.add(newSort("orderByDescription", SortBy.description, sdp, dataView)); @@ -345,7 +346,7 @@ protected enum SortBy { repository, description, owner, date; } - protected OrderByBorder newSort(String wicketId, SortBy field, SortableDataProvider dp, + protected OrderByBorder newSort(String wicketId, SortBy field, SortableDataProvider dp, final DataView dataView) { return new OrderByBorder(wicketId, field.name(), dp) { private static final long serialVersionUID = 1L; @@ -357,7 +358,7 @@ protected void onSortChanged() { }; } - private static class SortableRepositoriesProvider extends SortableDataProvider { + private static class SortableRepositoriesProvider extends SortableDataProvider { private static final long serialVersionUID = 1L; @@ -365,11 +366,11 @@ private static class SortableRepositoriesProvider extends SortableDataProvider list) { this.list = list; - setSort(SortBy.date.name(), false); + setSort(SortBy.date.name(), SortOrder.DESCENDING); } @Override - public int size() { + public long size() { if (list == null) { return 0; } @@ -382,8 +383,8 @@ public IModel model(RepositoryModel header) { } @Override - public Iterator iterator(int first, int count) { - SortParam sp = getSort(); + public Iterator iterator(long first, long count) { + SortParam sp = getSort(); String prop = sp.getProperty(); final boolean asc = sp.isAscending(); @@ -430,7 +431,8 @@ public int compare(RepositoryModel o1, RepositoryModel o2) { } }); } - return list.subList(first, first + count).iterator(); + return list.subList(Math.toIntExact(first), Math.toIntExact(first + count)).iterator(); } + } } From c4b87a1ed554eba79bb464b207f7b340cbd568dc Mon Sep 17 00:00:00 2001 From: Martin Spielmann Date: Sat, 30 Jul 2016 10:07:10 +0200 Subject: [PATCH 08/25] updated package for RedirectToUrlException --- .../com/gitblit/wicket/GitBlitWebSession.java | 15 ++++++++++++--- .../com/gitblit/wicket/GitblitWicketFilter.java | 6 ++++++ .../java/com/gitblit/wicket/pages/BasePage.java | 2 +- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gitblit/wicket/GitBlitWebSession.java b/src/main/java/com/gitblit/wicket/GitBlitWebSession.java index 7adbd359a..8aa92d2f4 100644 --- a/src/main/java/com/gitblit/wicket/GitBlitWebSession.java +++ b/src/main/java/com/gitblit/wicket/GitBlitWebSession.java @@ -21,15 +21,18 @@ import java.util.concurrent.atomic.AtomicBoolean; import org.apache.wicket.Page; +import org.apache.wicket.request.IRequestParameters; import org.apache.wicket.request.Request; +import org.apache.wicket.request.Url; import org.apache.wicket.request.cycle.RequestCycle; +import org.apache.wicket.request.flow.RedirectToUrlException; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.RedirectToUrlException; import org.apache.wicket.Session; import org.apache.wicket.protocol.http.RequestUtils; import org.apache.wicket.protocol.http.WebSession; import org.apache.wicket.protocol.http.request.WebClientInfo; +import com.gitblit.GitBlitServer.Params; import com.gitblit.models.UserModel; public final class GitBlitWebSession extends WebSession { @@ -65,10 +68,16 @@ public void invalidate() { public void cacheRequest(Class pageClass) { // build absolute url with correctly encoded parameters?! Request req = RequestCycle.get().getRequest(); - Map params = req.getRequestParameters().getParameters(); - PageParameters pageParams = new PageParameters(params); + IRequestParameters params = req.getRequestParameters(); + PageParameters pageParams = new PageParameters(); + params.getParameterNames().forEach(name->{ + pageParams.add(name, params.getParameterValue(name)); + }); String relativeUrl = RequestCycle.get().urlFor(pageClass, pageParams).toString(); requestUrl = RequestUtils.toAbsolutePath(relativeUrl); +// String relativeUrl = RequestCycle.get().urlFor(pageClass, pageParams).toString(); +// requestUrl = RequestCycle.get().getUrlRenderer().renderFullUrl(Url.parse(relativeUrl)); + if (isTemporary()) { // we must bind the temporary session into the session store diff --git a/src/main/java/com/gitblit/wicket/GitblitWicketFilter.java b/src/main/java/com/gitblit/wicket/GitblitWicketFilter.java index 68ad84a51..9ada7dc65 100644 --- a/src/main/java/com/gitblit/wicket/GitblitWicketFilter.java +++ b/src/main/java/com/gitblit/wicket/GitblitWicketFilter.java @@ -81,6 +81,12 @@ protected IWebApplicationFactory getApplicationFactory() { public WebApplication createApplication(WicketFilter filter) { return webapp; } + + @Override + public void destroy(WicketFilter filter) { + // TODO Auto-generated method stub + + } }; } diff --git a/src/main/java/com/gitblit/wicket/pages/BasePage.java b/src/main/java/com/gitblit/wicket/pages/BasePage.java index 4ade581ec..e858d5e19 100644 --- a/src/main/java/com/gitblit/wicket/pages/BasePage.java +++ b/src/main/java/com/gitblit/wicket/pages/BasePage.java @@ -36,11 +36,11 @@ import org.apache.commons.io.IOUtils; import org.apache.wicket.Application; import org.apache.wicket.Page; +import org.apache.wicket.request.flow.RedirectToUrlException; import org.apache.wicket.request.http.WebResponse; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.request.resource.CssPackageResource; import org.apache.wicket.request.resource.JavaScriptResourceReference; -import org.apache.wicket.RedirectToUrlException; import org.apache.wicket.markup.html.CSSPackageResource; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.ExternalLink; From 0c59f89e4f551575a8720510c4f8609e7b1facf5 Mon Sep 17 00:00:00 2001 From: Martin Spielmann Date: Sat, 30 Jul 2016 10:21:30 +0200 Subject: [PATCH 09/25] removed GitBlitUrlCodingStrategy --- .../com/gitblit/wicket/GitBlitWebApp.java | 7 +- .../wicket/GitblitParamUrlCodingStrategy.java | 442 +++++++++--------- 2 files changed, 226 insertions(+), 223 deletions(-) diff --git a/src/main/java/com/gitblit/wicket/GitBlitWebApp.java b/src/main/java/com/gitblit/wicket/GitBlitWebApp.java index 15046bc1c..34024911e 100644 --- a/src/main/java/com/gitblit/wicket/GitBlitWebApp.java +++ b/src/main/java/com/gitblit/wicket/GitBlitWebApp.java @@ -282,8 +282,11 @@ public void mount(String location, Class clazz, String... par if (!settings.getBoolean(Keys.web.mountParameters, true)) { parameters = new String[] {}; } - mount(new GitblitParamUrlCodingStrategy(settings, xssFilter, location, clazz, parameters)); - + //TODO: check if needed with wichet-7 +// mount(new GitblitParamUrlCodingStrategy(settings, xssFilter, location, clazz, parameters)); + mount(location, clazz, parameters); + + // map the mount point to the cache control definition if (clazz.isAnnotationPresent(CacheControl.class)) { CacheControl cacheControl = clazz.getAnnotation(CacheControl.class); diff --git a/src/main/java/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java b/src/main/java/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java index 536f88f4b..b87a2913d 100644 --- a/src/main/java/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java +++ b/src/main/java/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java @@ -1,221 +1,221 @@ -/* - * Copyright 2011 gitblit.com. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.gitblit.wicket; - -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import org.apache.wicket.IRequestTarget; -import org.apache.wicket.Page; -import org.apache.wicket.protocol.http.request.WebRequestCodingStrategy; -import org.apache.wicket.request.RequestParameters; -import org.apache.wicket.request.target.coding.MixedParamUrlCodingStrategy; -import org.apache.wicket.util.string.AppendingStringBuffer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.gitblit.IStoredSettings; -import com.gitblit.Keys; -import com.gitblit.utils.XssFilter; - -/** - * Simple subclass of mixed parameter url coding strategy that works around the - * encoded forward-slash issue that is present in some servlet containers. - * - * https://issues.apache.org/jira/browse/WICKET-1303 - * http://tomcat.apache.org/security-6.html - * - * @author James Moger - * - */ -public class GitblitParamUrlCodingStrategy extends MixedParamUrlCodingStrategy { - - private final String[] parameterNames; - - private Logger logger = LoggerFactory.getLogger(GitblitParamUrlCodingStrategy.class); - - private IStoredSettings settings; - - private XssFilter xssFilter; - - /** - * Construct. - * - * @param - * @param mountPath - * mount path (not empty) - * @param bookmarkablePageClass - * class of mounted page (not null) - * @param parameterNames - * the parameter names (not null) - */ - public GitblitParamUrlCodingStrategy( - IStoredSettings settings, - XssFilter xssFilter, - String mountPath, - Class bookmarkablePageClass, String[] parameterNames) { - - super(mountPath, bookmarkablePageClass, parameterNames); - this.parameterNames = parameterNames; - this.settings = settings; - this.xssFilter = xssFilter; - } - - /** - * Url encodes a string that is mean for a URL path (e.g., between slashes) - * - * @param string - * string to be encoded - * @return encoded string - */ - @Override - protected String urlEncodePathComponent(String string) { - char altChar = settings.getChar(Keys.web.forwardSlashCharacter, '/'); - if (altChar != '/') { - string = string.replace('/', altChar); - } - return super.urlEncodePathComponent(string); - } - - /** - * Returns a decoded value of the given value (taken from a URL path - * section) - * - * @param value - * @return Decodes the value - */ - @Override - protected String urlDecodePathComponent(String value) { - char altChar = settings.getChar(Keys.web.forwardSlashCharacter, '/'); - if (altChar != '/') { - value = value.replace(altChar, '/'); - } - return super.urlDecodePathComponent(value); - } - - /** - * Gets the decoded request target. - * - * @param requestParameters - * the request parameters - * @return the decoded request target - */ - @Override - public IRequestTarget decode(RequestParameters requestParameters) { - Map parameterMap = (Map) requestParameters.getParameters(); - for (Map.Entry entry : parameterMap.entrySet()) { - String parameter = entry.getKey(); - if (parameter.startsWith(WebRequestCodingStrategy.NAME_SPACE)) { - // ignore Wicket parameters - continue; - } - - // sanitize Gitblit request parameters - Object o = entry.getValue(); - if (o instanceof String) { - String value = o.toString(); - String safeValue = xssFilter.none(value); - if (!value.equals(safeValue)) { - logger.warn("XSS filter triggered on {} URL parameter: {}={}", - getMountPath(), parameter, value); - parameterMap.put(parameter, safeValue); - } - } else if (o instanceof String[]) { - String[] values = (String[]) o; - for (int i = 0; i < values.length; i++) { - String value = values[i].toString(); - String safeValue = xssFilter.none(value); - if (!value.equals(safeValue)) { - logger.warn("XSS filter triggered on {} URL parameter: {}={}", - getMountPath(), parameter, value); - values[i] = safeValue; - } - } - } - } - - return super.decode(requestParameters); - } - - /** - * @see org.apache.wicket.request.target.coding.AbstractRequestTargetUrlCodingStrategy#appendParameters(org.apache.wicket.util.string.AppendingStringBuffer, - * java.util.Map) - */ - @Override - protected void appendParameters(AppendingStringBuffer url, Map parameters) - { - if (!url.endsWith("/")) - { - url.append("/"); - } - - Set parameterNamesToAdd = new HashSet(parameters.keySet()); - - // Find index of last specified parameter - boolean foundParameter = false; - int lastSpecifiedParameter = parameterNames.length; - while (lastSpecifiedParameter != 0 && !foundParameter) - { - foundParameter = parameters.containsKey(parameterNames[--lastSpecifiedParameter]); - } - - if (foundParameter) - { - for (int i = 0; i <= lastSpecifiedParameter; i++) - { - String parameterName = parameterNames[i]; - final Object param = parameters.get(parameterName); - String value = param instanceof String[] ? ((String[])param)[0] : ((param == null) - ? null : param.toString()); - if (value == null) - { - value = ""; - } - if (!url.endsWith("/")) - { - url.append("/"); - } - url.append(urlEncodePathComponent(value)); - parameterNamesToAdd.remove(parameterName); - } - } - - if (!parameterNamesToAdd.isEmpty()) - { - boolean first = true; - for (String parameterName : parameterNamesToAdd) - { - final Object param = parameters.get(parameterName); - if (param instanceof String[]) { - String [] values = (String[]) param; - for (String value : values) { - url.append(first ? '?' : '&'); - url.append(urlEncodeQueryComponent(parameterName)).append("=").append( - urlEncodeQueryComponent(value)); - first = false; - } - } else { - url.append(first ? '?' : '&'); - String value = String.valueOf(param); - url.append(urlEncodeQueryComponent(parameterName)).append("=").append( - urlEncodeQueryComponent(value)); - } - first = false; - } - } - } -} \ No newline at end of file +///* +// * Copyright 2011 gitblit.com. +// * +// * Licensed under the Apache License, Version 2.0 (the "License"); +// * you may not use this file except in compliance with the License. +// * You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, software +// * distributed under the License is distributed on an "AS IS" BASIS, +// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// * See the License for the specific language governing permissions and +// * limitations under the License. +// */ +//package com.gitblit.wicket; +// +//import java.util.HashSet; +//import java.util.Map; +//import java.util.Set; +// +//import org.apache.wicket.IRequestTarget; +//import org.apache.wicket.Page; +//import org.apache.wicket.protocol.http.request.WebRequestCodingStrategy; +//import org.apache.wicket.request.RequestParameters; +//import org.apache.wicket.request.target.coding.MixedParamUrlCodingStrategy; +//import org.apache.wicket.util.string.AppendingStringBuffer; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +// +//import com.gitblit.IStoredSettings; +//import com.gitblit.Keys; +//import com.gitblit.utils.XssFilter; +// +///** +// * Simple subclass of mixed parameter url coding strategy that works around the +// * encoded forward-slash issue that is present in some servlet containers. +// * +// * https://issues.apache.org/jira/browse/WICKET-1303 +// * http://tomcat.apache.org/security-6.html +// * +// * @author James Moger +// * +// */ +//public class GitblitParamUrlCodingStrategy extends MixedParamUrlCodingStrategy { +// +// private final String[] parameterNames; +// +// private Logger logger = LoggerFactory.getLogger(GitblitParamUrlCodingStrategy.class); +// +// private IStoredSettings settings; +// +// private XssFilter xssFilter; +// +// /** +// * Construct. +// * +// * @param +// * @param mountPath +// * mount path (not empty) +// * @param bookmarkablePageClass +// * class of mounted page (not null) +// * @param parameterNames +// * the parameter names (not null) +// */ +// public GitblitParamUrlCodingStrategy( +// IStoredSettings settings, +// XssFilter xssFilter, +// String mountPath, +// Class bookmarkablePageClass, String[] parameterNames) { +// +// super(mountPath, bookmarkablePageClass, parameterNames); +// this.parameterNames = parameterNames; +// this.settings = settings; +// this.xssFilter = xssFilter; +// } +// +// /** +// * Url encodes a string that is mean for a URL path (e.g., between slashes) +// * +// * @param string +// * string to be encoded +// * @return encoded string +// */ +// @Override +// protected String urlEncodePathComponent(String string) { +// char altChar = settings.getChar(Keys.web.forwardSlashCharacter, '/'); +// if (altChar != '/') { +// string = string.replace('/', altChar); +// } +// return super.urlEncodePathComponent(string); +// } +// +// /** +// * Returns a decoded value of the given value (taken from a URL path +// * section) +// * +// * @param value +// * @return Decodes the value +// */ +// @Override +// protected String urlDecodePathComponent(String value) { +// char altChar = settings.getChar(Keys.web.forwardSlashCharacter, '/'); +// if (altChar != '/') { +// value = value.replace(altChar, '/'); +// } +// return super.urlDecodePathComponent(value); +// } +// +// /** +// * Gets the decoded request target. +// * +// * @param requestParameters +// * the request parameters +// * @return the decoded request target +// */ +// @Override +// public IRequestTarget decode(RequestParameters requestParameters) { +// Map parameterMap = (Map) requestParameters.getParameters(); +// for (Map.Entry entry : parameterMap.entrySet()) { +// String parameter = entry.getKey(); +// if (parameter.startsWith(WebRequestCodingStrategy.NAME_SPACE)) { +// // ignore Wicket parameters +// continue; +// } +// +// // sanitize Gitblit request parameters +// Object o = entry.getValue(); +// if (o instanceof String) { +// String value = o.toString(); +// String safeValue = xssFilter.none(value); +// if (!value.equals(safeValue)) { +// logger.warn("XSS filter triggered on {} URL parameter: {}={}", +// getMountPath(), parameter, value); +// parameterMap.put(parameter, safeValue); +// } +// } else if (o instanceof String[]) { +// String[] values = (String[]) o; +// for (int i = 0; i < values.length; i++) { +// String value = values[i].toString(); +// String safeValue = xssFilter.none(value); +// if (!value.equals(safeValue)) { +// logger.warn("XSS filter triggered on {} URL parameter: {}={}", +// getMountPath(), parameter, value); +// values[i] = safeValue; +// } +// } +// } +// } +// +// return super.decode(requestParameters); +// } +// +// /** +// * @see org.apache.wicket.request.target.coding.AbstractRequestTargetUrlCodingStrategy#appendParameters(org.apache.wicket.util.string.AppendingStringBuffer, +// * java.util.Map) +// */ +// @Override +// protected void appendParameters(AppendingStringBuffer url, Map parameters) +// { +// if (!url.endsWith("/")) +// { +// url.append("/"); +// } +// +// Set parameterNamesToAdd = new HashSet(parameters.keySet()); +// +// // Find index of last specified parameter +// boolean foundParameter = false; +// int lastSpecifiedParameter = parameterNames.length; +// while (lastSpecifiedParameter != 0 && !foundParameter) +// { +// foundParameter = parameters.containsKey(parameterNames[--lastSpecifiedParameter]); +// } +// +// if (foundParameter) +// { +// for (int i = 0; i <= lastSpecifiedParameter; i++) +// { +// String parameterName = parameterNames[i]; +// final Object param = parameters.get(parameterName); +// String value = param instanceof String[] ? ((String[])param)[0] : ((param == null) +// ? null : param.toString()); +// if (value == null) +// { +// value = ""; +// } +// if (!url.endsWith("/")) +// { +// url.append("/"); +// } +// url.append(urlEncodePathComponent(value)); +// parameterNamesToAdd.remove(parameterName); +// } +// } +// +// if (!parameterNamesToAdd.isEmpty()) +// { +// boolean first = true; +// for (String parameterName : parameterNamesToAdd) +// { +// final Object param = parameters.get(parameterName); +// if (param instanceof String[]) { +// String [] values = (String[]) param; +// for (String value : values) { +// url.append(first ? '?' : '&'); +// url.append(urlEncodeQueryComponent(parameterName)).append("=").append( +// urlEncodeQueryComponent(value)); +// first = false; +// } +// } else { +// url.append(first ? '?' : '&'); +// String value = String.valueOf(param); +// url.append(urlEncodeQueryComponent(parameterName)).append("=").append( +// urlEncodeQueryComponent(value)); +// } +// first = false; +// } +// } +// } +//} \ No newline at end of file From f5bb095875d9062e9b121d86782baaa655709a49 Mon Sep 17 00:00:00 2001 From: Martin Spielmann Date: Sat, 30 Jul 2016 10:45:27 +0200 Subject: [PATCH 10/25] replaced RequestUtils.toAbsolutePath() and RedirectRequestTarget --- .../com/gitblit/utils/GitBlitRequestUtils.java | 10 +++++++++- .../com/gitblit/wicket/GitBlitWebSession.java | 7 +++---- .../wicket/GitblitRedirectException.java | 16 +++++++--------- .../com/gitblit/wicket/GitblitWicketFilter.java | 2 +- .../com/gitblit/wicket/SessionlessForm.java | 5 ++--- .../java/com/gitblit/wicket/pages/BasePage.java | 15 ++++++--------- .../com/gitblit/wicket/pages/ComparePage.java | 17 ++++++++--------- .../gitblit/wicket/pages/RepositoryPage.java | 7 ++++--- .../com/gitblit/wicket/pages/TicketPage.java | 3 +-- .../gitblit/wicket/panels/BranchesPanel.java | 8 ++++---- .../com/gitblit/wicket/panels/CommentPanel.java | 9 ++++----- .../gitblit/wicket/panels/TicketSearchForm.java | 6 +++--- 12 files changed, 52 insertions(+), 53 deletions(-) diff --git a/src/main/java/com/gitblit/utils/GitBlitRequestUtils.java b/src/main/java/com/gitblit/utils/GitBlitRequestUtils.java index 9a3593103..7a7e52905 100644 --- a/src/main/java/com/gitblit/utils/GitBlitRequestUtils.java +++ b/src/main/java/com/gitblit/utils/GitBlitRequestUtils.java @@ -3,7 +3,10 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.apache.wicket.Page; +import org.apache.wicket.request.Url; import org.apache.wicket.request.cycle.RequestCycle; +import org.apache.wicket.request.mapper.parameter.PageParameters; public class GitBlitRequestUtils { public static HttpServletRequest getServletRequest(){ @@ -13,5 +16,10 @@ public static HttpServletRequest getServletRequest(){ public static HttpServletResponse getServletResponse(){ return (HttpServletResponse)RequestCycle.get().getResponse().getContainerResponse(); } - + + public static String toAbsoluteUrl(Class pageClass, PageParameters params){ + String relativeUrl = RequestCycle.get().urlFor(pageClass, params).toString(); + return RequestCycle.get().getUrlRenderer().renderFullUrl(Url.parse(relativeUrl)); + } } + diff --git a/src/main/java/com/gitblit/wicket/GitBlitWebSession.java b/src/main/java/com/gitblit/wicket/GitBlitWebSession.java index 8aa92d2f4..0e53f3156 100644 --- a/src/main/java/com/gitblit/wicket/GitBlitWebSession.java +++ b/src/main/java/com/gitblit/wicket/GitBlitWebSession.java @@ -34,6 +34,7 @@ import com.gitblit.GitBlitServer.Params; import com.gitblit.models.UserModel; +import com.gitblit.utils.GitBlitRequestUtils; public final class GitBlitWebSession extends WebSession { @@ -73,10 +74,8 @@ public void cacheRequest(Class pageClass) { params.getParameterNames().forEach(name->{ pageParams.add(name, params.getParameterValue(name)); }); - String relativeUrl = RequestCycle.get().urlFor(pageClass, pageParams).toString(); - requestUrl = RequestUtils.toAbsolutePath(relativeUrl); -// String relativeUrl = RequestCycle.get().urlFor(pageClass, pageParams).toString(); -// requestUrl = RequestCycle.get().getUrlRenderer().renderFullUrl(Url.parse(relativeUrl)); + requestUrl = GitBlitRequestUtils.toAbsoluteUrl(pageClass, pageParams); + if (isTemporary()) { diff --git a/src/main/java/com/gitblit/wicket/GitblitRedirectException.java b/src/main/java/com/gitblit/wicket/GitblitRedirectException.java index 9eb76bfd2..13e246a34 100644 --- a/src/main/java/com/gitblit/wicket/GitblitRedirectException.java +++ b/src/main/java/com/gitblit/wicket/GitblitRedirectException.java @@ -15,13 +15,13 @@ */ package com.gitblit.wicket; -//import org.apache.wicket.AbstractRestartResponseException; import org.apache.wicket.Page; import org.apache.wicket.RestartResponseException; -//import org.apache.wicket.request.cycle.RequestCycle; +import org.apache.wicket.request.cycle.RequestCycle; +import org.apache.wicket.request.http.handler.RedirectRequestHandler; import org.apache.wicket.request.mapper.parameter.PageParameters; -//import org.apache.wicket.protocol.http.RequestUtils; -//import org.apache.wicket.request.target.basic.RedirectRequestTarget; + +import com.gitblit.utils.GitBlitRequestUtils; /** * This exception bypasses the servlet container rewriting relative redirect @@ -42,10 +42,8 @@ public GitblitRedirectException(Class pageClass) { public GitblitRedirectException(Class pageClass, PageParameters params) { super(pageClass, params); -// RequestCycle cycle = RequestCycle.get(); -// String relativeUrl = cycle.urlFor(pageClass, params).toString(); -// String absoluteUrl = RequestUtils.toAbsolutePath(relativeUrl); -// cycle.setRequestTarget(new RedirectRequestTarget(absoluteUrl)); -// cycle.setRedirect(true); + RequestCycle cycle = RequestCycle.get(); + String absoluteUrl = GitBlitRequestUtils.toAbsoluteUrl(pageClass,params); + cycle.scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(absoluteUrl)); } } diff --git a/src/main/java/com/gitblit/wicket/GitblitWicketFilter.java b/src/main/java/com/gitblit/wicket/GitblitWicketFilter.java index 9ada7dc65..8286acfce 100644 --- a/src/main/java/com/gitblit/wicket/GitblitWicketFilter.java +++ b/src/main/java/com/gitblit/wicket/GitblitWicketFilter.java @@ -129,7 +129,7 @@ protected long getLastModified(final HttpServletRequest servletRequest) { repo = repo.replace("%2f", "/").replace("%2F", "/").replace(settings.getChar(Keys.web.forwardSlashCharacter, '/'), '/'); - GitBlitWebApp app = (GitBlitWebApp) getWebApplication(); + GitBlitWebApp app = (GitBlitWebApp) getApplication(); int expires = settings.getInteger(Keys.web.pageCacheExpires, 0); if (!StringUtils.isEmpty(page) && app.isCacheablePage(page) && expires > 0) { // page can be cached by the browser diff --git a/src/main/java/com/gitblit/wicket/SessionlessForm.java b/src/main/java/com/gitblit/wicket/SessionlessForm.java index 0d66ebe8c..93a8d0fe6 100644 --- a/src/main/java/com/gitblit/wicket/SessionlessForm.java +++ b/src/main/java/com/gitblit/wicket/SessionlessForm.java @@ -30,6 +30,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.gitblit.utils.GitBlitRequestUtils; import com.gitblit.wicket.pages.BasePage; /** @@ -152,8 +153,6 @@ protected String getAbsoluteUrl() { } protected String getAbsoluteUrl(Class pageClass, PageParameters pageParameters) { - String relativeUrl = urlFor(pageClass, pageParameters).toString(); - String absoluteUrl = RequestUtils.toAbsolutePath(relativeUrl); - return absoluteUrl; + return GitBlitRequestUtils.toAbsoluteUrl(pageClass, pageParameters); } } diff --git a/src/main/java/com/gitblit/wicket/pages/BasePage.java b/src/main/java/com/gitblit/wicket/pages/BasePage.java index e858d5e19..1b44e8757 100644 --- a/src/main/java/com/gitblit/wicket/pages/BasePage.java +++ b/src/main/java/com/gitblit/wicket/pages/BasePage.java @@ -38,6 +38,7 @@ import org.apache.wicket.Page; import org.apache.wicket.request.flow.RedirectToUrlException; import org.apache.wicket.request.http.WebResponse; +import org.apache.wicket.request.http.handler.RedirectRequestHandler; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.request.resource.CssPackageResource; import org.apache.wicket.request.resource.JavaScriptResourceReference; @@ -49,7 +50,6 @@ import org.apache.wicket.markup.repeater.RepeatingView; import org.apache.wicket.protocol.http.RequestUtils; import org.apache.wicket.protocol.http.servlet.ServletWebRequest; -import org.apache.wicket.request.target.basic.RedirectRequestTarget; import org.apache.wicket.util.time.Duration; import org.apache.wicket.util.time.Time; import org.slf4j.Logger; @@ -113,9 +113,7 @@ protected String getCanonicalUrl() { } protected String getCanonicalUrl(Class clazz, PageParameters params) { - String relativeUrl = urlFor(clazz, params).toString(); - String canonicalUrl = RequestUtils.toAbsolutePath(relativeUrl); - return canonicalUrl; + return GitBlitRequestUtils.toAbsoluteUrl(clazz, params); } protected void redirectTo(Class pageClass) { @@ -124,7 +122,7 @@ protected void redirectTo(Class pageClass) { protected void redirectTo(Class pageClass, PageParameters parameters) { String absoluteUrl = getCanonicalUrl(pageClass, parameters); - getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl)); + getRequestCycle().scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(absoluteUrl)); } protected String getLanguageCode() { @@ -230,7 +228,7 @@ protected final void setLastModified(Date when) { int expires = app().settings().getInteger(Keys.web.pageCacheExpires, 0); WebResponse response = (WebResponse) getResponse(); response.setLastModifiedTime(Time.valueOf(when)); - response.setDateHeader("Expires", System.currentTimeMillis() + Duration.minutes(expires).getMilliseconds()); + response.addHeader("Expires", String.valueOf(System.currentTimeMillis() + Duration.minutes(expires).getMilliseconds())); } protected String getPageTitle(String repositoryName) { @@ -469,8 +467,7 @@ public void error(String message, Throwable t, Class toPage, Pag } if (toPage != null) { GitBlitWebSession.get().cacheErrorMessage(message); - String relativeUrl = urlFor(toPage, params).toString(); - String absoluteUrl = RequestUtils.toAbsolutePath(relativeUrl); + String absoluteUrl = GitBlitRequestUtils.toAbsoluteUrl(toPage, params); throw new RedirectToUrlException(absoluteUrl); } else { super.error(message); @@ -478,7 +475,7 @@ public void error(String message, Throwable t, Class toPage, Pag } public void authenticationError(String message) { - logger().error(getRequest().getURL() + " for " + GitBlitWebSession.get().getUsername()); + logger().error(getRequest().getUrl() + " for " + GitBlitWebSession.get().getUsername()); if (!GitBlitWebSession.get().isLoggedIn()) { // cache the request if we have not authenticated. // the request will continue after authentication. diff --git a/src/main/java/com/gitblit/wicket/pages/ComparePage.java b/src/main/java/com/gitblit/wicket/pages/ComparePage.java index 2d1be64f3..bbf866c04 100644 --- a/src/main/java/com/gitblit/wicket/pages/ComparePage.java +++ b/src/main/java/com/gitblit/wicket/pages/ComparePage.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.List; +import org.apache.wicket.request.http.handler.RedirectRequestHandler; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.CheckBox; @@ -33,7 +34,6 @@ import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.protocol.http.RequestUtils; -//import org.apache.wicket.request.target.basic.RedirectRequestTarget; import org.eclipse.jgit.diff.DiffEntry.ChangeType; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; @@ -45,6 +45,7 @@ import com.gitblit.models.SubmoduleModel; import com.gitblit.servlet.RawServlet; import com.gitblit.utils.DiffUtils; +import com.gitblit.utils.GitBlitRequestUtils; import com.gitblit.utils.DiffUtils.DiffComparator; import com.gitblit.utils.DiffUtils.DiffOutput; import com.gitblit.utils.DiffUtils.DiffOutputType; @@ -236,12 +237,11 @@ public void onSubmit() { PageParameters params = WicketUtils.newRangeParameter(repositoryName, from, to); if (ignoreWS) { - params.put("w", 1); + params.add("w", 1); } - String relativeUrl = urlFor(ComparePage.class, params).toString(); - String absoluteUrl = RequestUtils.toAbsolutePath(relativeUrl); - getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl)); + String absoluteUrl = GitBlitRequestUtils.toAbsoluteUrl(ComparePage.class, params); + getRequestCycle().scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(absoluteUrl)); } }; @@ -278,11 +278,10 @@ public void onSubmit() { PageParameters params = WicketUtils.newRangeParameter(repositoryName, from, to); if (ignoreWS) { - params.put("w", 1); + params.add("w", 1); } - String relativeUrl = urlFor(ComparePage.class, params).toString(); - String absoluteUrl = RequestUtils.toAbsolutePath(relativeUrl); - getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl)); + String absoluteUrl = GitBlitRequestUtils.toAbsoluteUrl(ComparePage.class, params); + getRequestCycle().scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(absoluteUrl)); } }; diff --git a/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java index d351bc70c..dd8df4a3e 100644 --- a/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java +++ b/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java @@ -28,6 +28,7 @@ import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; +import org.apache.wicket.request.http.handler.RedirectRequestHandler; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.RestartResponseException; import org.apache.wicket.markup.html.basic.Label; @@ -37,7 +38,6 @@ import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; -//import org.apache.wicket.request.target.basic.RedirectRequestTarget; import org.eclipse.jgit.diff.DiffEntry.ChangeType; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.Repository; @@ -63,6 +63,7 @@ import com.gitblit.utils.ArrayUtils; import com.gitblit.utils.BugtraqProcessor; import com.gitblit.utils.DeepCopier; +import com.gitblit.utils.GitBlitRequestUtils; import com.gitblit.utils.JGitUtils; import com.gitblit.utils.ModelUtils; import com.gitblit.utils.RefLogUtils; @@ -763,7 +764,7 @@ public void onSubmit() { if (StringUtils.isEmpty(searchString)) { // redirect to self to avoid wicket page update bug String absoluteUrl = getCanonicalUrl(); - getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl)); + getRequestCycle().scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(absoluteUrl)); return; } for (Constants.SearchType type : Constants.SearchType.values()) { @@ -785,7 +786,7 @@ public void onSubmit() { // mounted url parameters (issue-111) PageParameters params = WicketUtils.newSearchParameter(repositoryName, null, searchString, searchType); String absoluteUrl = getCanonicalUrl(searchPageClass, params); - getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl)); + getRequestCycle().scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(absoluteUrl)); } } } diff --git a/src/main/java/com/gitblit/wicket/pages/TicketPage.java b/src/main/java/com/gitblit/wicket/pages/TicketPage.java index 53671b73a..3ce5484ee 100644 --- a/src/main/java/com/gitblit/wicket/pages/TicketPage.java +++ b/src/main/java/com/gitblit/wicket/pages/TicketPage.java @@ -1722,8 +1722,7 @@ public void onClick() { } //Force reload of the page to rebuild ticket change cache - String relativeUrl = urlFor(TicketsPage.class, getPageParameters()).toString(); - String absoluteUrl = RequestUtils.toAbsolutePath(relativeUrl); + String absoluteUrl = GitBlitRequestUtils.toAbsoluteUrl(TicketsPage.class, getPageParameters()); setResponsePage(new RedirectPage(absoluteUrl)); } }; diff --git a/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java b/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java index 93dd14936..bc5cd8dfe 100644 --- a/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java @@ -21,6 +21,7 @@ import java.util.Collections; import java.util.List; +import org.apache.wicket.request.http.handler.RedirectRequestHandler; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; @@ -32,7 +33,6 @@ import org.apache.wicket.markup.repeater.data.ListDataProvider; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.protocol.http.RequestUtils; -//import org.apache.wicket.request.target.basic.RedirectRequestTarget; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; @@ -43,6 +43,7 @@ import com.gitblit.servlet.RawServlet; import com.gitblit.servlet.SyndicationServlet; import com.gitblit.utils.CommitCache; +import com.gitblit.utils.GitBlitRequestUtils; import com.gitblit.utils.JGitUtils; import com.gitblit.utils.RefLogUtils; import com.gitblit.utils.StringUtils; @@ -231,9 +232,8 @@ public void onClick() { // redirect to the owning page PageParameters params = WicketUtils.newRepositoryParameter(repositoryModel.name); - String relativeUrl = urlFor(getPage().getClass(), params).toString(); - String absoluteUrl = RequestUtils.toAbsolutePath(relativeUrl); - getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl)); + String absoluteUrl = GitBlitRequestUtils.toAbsoluteUrl(getPage().getClass(), params); + getRequestCycle().scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(absoluteUrl)); } }; diff --git a/src/main/java/com/gitblit/wicket/panels/CommentPanel.java b/src/main/java/com/gitblit/wicket/panels/CommentPanel.java index 93d2b840e..3de073463 100644 --- a/src/main/java/com/gitblit/wicket/panels/CommentPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/CommentPanel.java @@ -15,6 +15,7 @@ */ package com.gitblit.wicket.panels; +import org.apache.wicket.request.http.handler.RedirectRequestHandler; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxButton; @@ -22,12 +23,11 @@ import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; -import org.apache.wicket.protocol.http.RequestUtils; -//import org.apache.wicket.request.target.basic.RedirectRequestTarget; import com.gitblit.models.RepositoryModel; import com.gitblit.models.TicketModel; import com.gitblit.models.TicketModel.Change; +import com.gitblit.utils.GitBlitRequestUtils; import com.gitblit.models.UserModel; import com.gitblit.wicket.WicketUtils; import com.gitblit.wicket.pages.BasePage; @@ -103,9 +103,8 @@ public void onSubmit(AjaxRequestTarget target, Form form) { */ private void redirectTo(Class pageClass, PageParameters parameters) { - String relativeUrl = urlFor(pageClass, parameters).toString(); - String canonicalUrl = RequestUtils.toAbsolutePath(relativeUrl); - getRequestCycle().setRequestTarget(new RedirectRequestTarget(canonicalUrl)); + String absoluteUrl = GitBlitRequestUtils.toAbsoluteUrl(pageClass, parameters); + getRequestCycle().scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(absoluteUrl)); } }.setVisible(ticket != null && ticket.number > 0)); diff --git a/src/main/java/com/gitblit/wicket/panels/TicketSearchForm.java b/src/main/java/com/gitblit/wicket/panels/TicketSearchForm.java index 32f133d1c..75a12dc5e 100644 --- a/src/main/java/com/gitblit/wicket/panels/TicketSearchForm.java +++ b/src/main/java/com/gitblit/wicket/panels/TicketSearchForm.java @@ -18,11 +18,11 @@ import java.io.Serializable; import java.text.MessageFormat; +import org.apache.wicket.request.http.handler.RedirectRequestHandler; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; -//import org.apache.wicket.request.target.basic.RedirectRequestTarget; import com.gitblit.utils.StringUtils; import com.gitblit.wicket.SessionlessForm; @@ -64,7 +64,7 @@ public void onSubmit() { if (StringUtils.isEmpty(searchString)) { // redirect to self to avoid wicket page update bug String absoluteUrl = getAbsoluteUrl(); - getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl)); + getRequestCycle().scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(absoluteUrl)); return; } @@ -73,6 +73,6 @@ public void onSubmit() { PageParameters params = WicketUtils.newRepositoryParameter(repositoryName); params.add("s", searchString); String absoluteUrl = getAbsoluteUrl(pageClass, params); - getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl)); + getRequestCycle().scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(absoluteUrl)); } } From 15685d3b2d316b46b0e0a87401d946de1882893a Mon Sep 17 00:00:00 2001 From: Martin Spielmann Date: Sat, 30 Jul 2016 11:07:56 +0200 Subject: [PATCH 11/25] Replaced getRelativePathPrefixToContextRoot with method in GitBlitRequestUtils --- .../gitblit/utils/GitBlitRequestUtils.java | 36 +++++++++++++++---- .../com/gitblit/wicket/MarkupProcessor.java | 7 ++-- .../com/gitblit/wicket/pages/BasePage.java | 2 +- .../gitblit/wicket/pages/EditTeamPage.java | 1 + .../com/gitblit/wicket/pages/ProjectPage.java | 3 +- .../com/gitblit/wicket/pages/RawPage.java | 17 ++++----- .../gitblit/wicket/pages/RepositoryPage.java | 6 ++-- .../com/gitblit/wicket/pages/TreePage.java | 3 +- .../wicket/panels/ProjectRepositoryPanel.java | 3 +- 9 files changed, 53 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/gitblit/utils/GitBlitRequestUtils.java b/src/main/java/com/gitblit/utils/GitBlitRequestUtils.java index 7a7e52905..74b3854b0 100644 --- a/src/main/java/com/gitblit/utils/GitBlitRequestUtils.java +++ b/src/main/java/com/gitblit/utils/GitBlitRequestUtils.java @@ -4,22 +4,44 @@ import javax.servlet.http.HttpServletResponse; import org.apache.wicket.Page; +import org.apache.wicket.protocol.http.servlet.ServletWebRequest; +import org.apache.wicket.request.Request; import org.apache.wicket.request.Url; import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.mapper.parameter.PageParameters; public class GitBlitRequestUtils { - public static HttpServletRequest getServletRequest(){ - return (HttpServletRequest)RequestCycle.get().getRequest().getContainerRequest(); + public static HttpServletRequest getServletRequest() { + return (HttpServletRequest) RequestCycle.get().getRequest().getContainerRequest(); } - - public static HttpServletResponse getServletResponse(){ - return (HttpServletResponse)RequestCycle.get().getResponse().getContainerResponse(); + + public static HttpServletResponse getServletResponse() { + return (HttpServletResponse) RequestCycle.get().getResponse().getContainerResponse(); } - public static String toAbsoluteUrl(Class pageClass, PageParameters params){ + public static String toAbsoluteUrl(Class pageClass, PageParameters params) { String relativeUrl = RequestCycle.get().urlFor(pageClass, params).toString(); return RequestCycle.get().getUrlRenderer().renderFullUrl(Url.parse(relativeUrl)); } -} + /** + * COPIED FROM WICKET 1.3 Docs: + * + * Gets a prefix to make this relative to the context root. + * + * For example, if your context root is http://server.com/myApp/ and the + * request is for /myApp/mountedPage/, then the prefix returned might be + * "../../". + * + * For a particular technology, this might return either an absolute prefix + * or a relative one. + */ + public static String getRelativePathPrefixToContextRoot() { + // String contextUrl = + // RequestCycle.get().getRequest().getRelativePathPrefixToContextRoot(); + // TODO: test it! i thing deeper mounted pages will not work yet + Request r = RequestCycle.get().getRequest(); + String p = r.getPrefixToContextPath(); + return p; + } +} diff --git a/src/main/java/com/gitblit/wicket/MarkupProcessor.java b/src/main/java/com/gitblit/wicket/MarkupProcessor.java index 7826a3b2e..50d646974 100644 --- a/src/main/java/com/gitblit/wicket/MarkupProcessor.java +++ b/src/main/java/com/gitblit/wicket/MarkupProcessor.java @@ -57,6 +57,7 @@ import com.gitblit.Keys; import com.gitblit.models.PathModel; import com.gitblit.servlet.RawServlet; +import com.gitblit.utils.GitBlitRequestUtils; import com.gitblit.utils.JGitUtils; import com.gitblit.utils.MarkdownUtils; import com.gitblit.utils.StringUtils; @@ -268,7 +269,7 @@ public void image(Attributes attributes, String imagePath) { if (imagePath.indexOf("://") == -1) { // relative image String path = doc.getRelativePath(imagePath); - String contextUrl = RequestCycle.get().getRequest().getRelativePathPrefixToContextRoot(); + String contextUrl = GitBlitRequestUtils.getRelativePathPrefixToContextRoot(); url = RawServlet.asLink(contextUrl, repositoryName, commitId, path); } else { // absolute image @@ -325,7 +326,7 @@ public Rendering render(ExpImageNode node, String text) { if (node.url.indexOf("://") == -1) { // repository-relative image link String path = doc.getRelativePath(node.url); - String contextUrl = RequestCycle.get().getRequest().getRelativePathPrefixToContextRoot(); + String contextUrl = GitBlitRequestUtils.getRelativePathPrefixToContextRoot(); String url = RawServlet.asLink(contextUrl, repositoryName, commitId, path); return new Rendering(url, text); } @@ -339,7 +340,7 @@ public Rendering render(RefImageNode node, String url, String title, String alt) if (url.indexOf("://") == -1) { // repository-relative image link String path = doc.getRelativePath(url); - String contextUrl = RequestCycle.get().getRequest().getRelativePathPrefixToContextRoot(); + String contextUrl = GitBlitRequestUtils.getRelativePathPrefixToContextRoot(); String wurl = RawServlet.asLink(contextUrl, repositoryName, commitId, path); rendering = new Rendering(wurl, alt); } else { diff --git a/src/main/java/com/gitblit/wicket/pages/BasePage.java b/src/main/java/com/gitblit/wicket/pages/BasePage.java index 1b44e8757..06b6a6b83 100644 --- a/src/main/java/com/gitblit/wicket/pages/BasePage.java +++ b/src/main/java/com/gitblit/wicket/pages/BasePage.java @@ -105,7 +105,7 @@ private void customizeHeader() { } protected String getContextUrl() { - return getRequest().getRelativePathPrefixToContextRoot(); + return GitBlitRequestUtils.getRelativePathPrefixToContextRoot(); } protected String getCanonicalUrl() { diff --git a/src/main/java/com/gitblit/wicket/pages/EditTeamPage.java b/src/main/java/com/gitblit/wicket/pages/EditTeamPage.java index 9f9e6b1cb..8c735a5de 100644 --- a/src/main/java/com/gitblit/wicket/pages/EditTeamPage.java +++ b/src/main/java/com/gitblit/wicket/pages/EditTeamPage.java @@ -25,6 +25,7 @@ import java.util.Set; import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.AttributeModifier; import org.apache.wicket.extensions.markup.html.form.palette.Palette; import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.markup.html.form.CheckBox; diff --git a/src/main/java/com/gitblit/wicket/pages/ProjectPage.java b/src/main/java/com/gitblit/wicket/pages/ProjectPage.java index 5da07e6dc..101f89e1f 100644 --- a/src/main/java/com/gitblit/wicket/pages/ProjectPage.java +++ b/src/main/java/com/gitblit/wicket/pages/ProjectPage.java @@ -35,6 +35,7 @@ import com.gitblit.models.RepositoryModel; import com.gitblit.models.UserModel; import com.gitblit.servlet.SyndicationServlet; +import com.gitblit.utils.GitBlitRequestUtils; import com.gitblit.utils.MarkdownUtils; import com.gitblit.utils.StringUtils; import com.gitblit.wicket.CacheControl; @@ -107,7 +108,7 @@ private void setup(PageParameters params) { add(new Label("projectTitle", project.getDisplayName())); add(new Label("projectDescription", project.description)); - String feedLink = SyndicationServlet.asLink(getRequest().getRelativePathPrefixToContextRoot(), projectName, null, 0); + String feedLink = SyndicationServlet.asLink(GitBlitRequestUtils.getRelativePathPrefixToContextRoot(), projectName, null, 0); add(new ExternalLink("syndication", feedLink)); add(WicketUtils.syndicationDiscoveryLink(SyndicationServlet.getTitle(project.getDisplayName(), diff --git a/src/main/java/com/gitblit/wicket/pages/RawPage.java b/src/main/java/com/gitblit/wicket/pages/RawPage.java index 2faa41852..5f94198ea 100644 --- a/src/main/java/com/gitblit/wicket/pages/RawPage.java +++ b/src/main/java/com/gitblit/wicket/pages/RawPage.java @@ -27,8 +27,8 @@ import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.http.WebRequest; import org.apache.wicket.request.http.WebResponse; +import org.apache.wicket.request.http.flow.AbortWithHttpErrorCodeException; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.protocol.http.servlet.AbortWithWebErrorCodeException; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.slf4j.Logger; @@ -37,6 +37,7 @@ import com.gitblit.Keys; import com.gitblit.models.RepositoryModel; import com.gitblit.models.UserModel; +import com.gitblit.utils.GitBlitRequestUtils; import com.gitblit.utils.JGitUtils; import com.gitblit.utils.StringUtils; import com.gitblit.wicket.GitBlitWebSession; @@ -95,7 +96,7 @@ public void respond(RequestCycle requestCycle) { final String objectNotFound = MessageFormat.format("Raw page failed to find object {0} in {1}", objectId, repositoryName); logger.error(objectNotFound); - throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, objectNotFound); + throw new AbortWithHttpErrorCodeException(HttpServletResponse.SC_NOT_FOUND, objectNotFound); } contentType = "application/octet-stream"; response.setContentType(contentType); @@ -112,7 +113,7 @@ public void respond(RequestCycle requestCycle) { final String commitNotFound = MessageFormat.format("Raw page failed to find commit {0} in {1}", objectId, repositoryName); logger.error(commitNotFound); - throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, commitNotFound); + throw new AbortWithHttpErrorCodeException(HttpServletResponse.SC_NOT_FOUND, commitNotFound); } String filename = blobPath; @@ -148,7 +149,7 @@ public void respond(RequestCycle requestCycle) { byte[] image = JGitUtils.getByteContent(r, commit.getTree(), blobPath, true); if (image == null) { logger.error(blobNotFound); - throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound); + throw new AbortWithHttpErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound); } contentType = "image/" + extension.toLowerCase(); response.setContentType(contentType); @@ -164,7 +165,7 @@ public void respond(RequestCycle requestCycle) { byte[] binary = JGitUtils.getByteContent(r, commit.getTree(), blobPath, true); if (binary == null) { logger.error(blobNotFound); - throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound); + throw new AbortWithHttpErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound); } contentType = "application/octet-stream"; response.setContentLength(binary.length); @@ -172,7 +173,7 @@ public void respond(RequestCycle requestCycle) { try { WebRequest request = (WebRequest) requestCycle.getRequest(); - String userAgent = request.getHttpServletRequest().getHeader("User-Agent"); + String userAgent = GitBlitRequestUtils.getServletRequest().getHeader("User-Agent"); if (userAgent != null && userAgent.indexOf("MSIE 5.5") > -1) { response.setHeader("Content-Disposition", "filename=\"" @@ -201,7 +202,7 @@ public void respond(RequestCycle requestCycle) { blobPath, encodings); if (content == null) { logger.error(blobNotFound); - throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound); + throw new AbortWithHttpErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound); } contentType = "text/plain; charset=UTF-8"; response.setContentType(contentType); @@ -218,7 +219,7 @@ public void respond(RequestCycle requestCycle) { encodings); if (content == null) { logger.error(blobNotFound); - throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound); + throw new AbortWithHttpErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound); } contentType = "text/plain; charset=UTF-8"; response.setContentType(contentType); diff --git a/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java index dd8df4a3e..504d83c14 100644 --- a/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java +++ b/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java @@ -168,7 +168,7 @@ public RepositoryPage(PageParameters params) { NavigationPanel navigationPanel = new NavigationPanel("repositoryNavPanel", getRepoNavPageClass(), navLinks); add(navigationPanel); - add(new ExternalLink("syndication", SyndicationServlet.asLink(getRequest() + add(new ExternalLink("syndication", SyndicationServlet.asLink(GitBlitRequestUtils .getRelativePathPrefixToContextRoot(), getRepositoryName(), null, 0))); // add floating search form @@ -246,7 +246,7 @@ private List registerNavLinks() { // per-repository extra navlinks if (JGitUtils.getPagesBranch(r) != null) { ExternalNavLink pagesLink = new ExternalNavLink("gb.pages", PagesServlet.asLink( - getRequest().getRelativePathPrefixToContextRoot(), getRepositoryName(), null), true); + GitBlitRequestUtils.getRelativePathPrefixToContextRoot(), getRepositoryName(), null), true); navLinks.add(pagesLink); } @@ -426,7 +426,7 @@ protected void addToolbarButton(String wicketId, String iconClass, String label, protected void addSyndicationDiscoveryLink() { add(WicketUtils.syndicationDiscoveryLink(SyndicationServlet.getTitle(repositoryName, - objectId), SyndicationServlet.asLink(getRequest() + objectId), SyndicationServlet.asLink(GitBlitRequestUtils .getRelativePathPrefixToContextRoot(), repositoryName, objectId, 0))); } diff --git a/src/main/java/com/gitblit/wicket/pages/TreePage.java b/src/main/java/com/gitblit/wicket/pages/TreePage.java index 73a03f86b..c1adf6e1d 100644 --- a/src/main/java/com/gitblit/wicket/pages/TreePage.java +++ b/src/main/java/com/gitblit/wicket/pages/TreePage.java @@ -39,6 +39,7 @@ import com.gitblit.models.UserModel; import com.gitblit.servlet.RawServlet; import com.gitblit.utils.ByteFormat; +import com.gitblit.utils.GitBlitRequestUtils; import com.gitblit.utils.JGitUtils; import com.gitblit.wicket.CacheControl; import com.gitblit.wicket.GitBlitWebSession; @@ -64,7 +65,7 @@ public TreePage(PageParameters params) { // tree page links add(new BookmarkablePageLink("historyLink", HistoryPage.class, WicketUtils.newPathParameter(repositoryName, objectId, path))); - add(new CompressedDownloadsPanel("compressedLinks", getRequest() + add(new CompressedDownloadsPanel("compressedLinks", GitBlitRequestUtils .getRelativePathPrefixToContextRoot(), repositoryName, objectId, path)); add(new CommitHeaderPanel("commitHeader", repositoryName, commit)); diff --git a/src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java b/src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java index 73b72bbc0..503b3d129 100644 --- a/src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java @@ -31,6 +31,7 @@ import com.gitblit.models.UserModel; import com.gitblit.servlet.SyndicationServlet; import com.gitblit.utils.ArrayUtils; +import com.gitblit.utils.GitBlitRequestUtils; import com.gitblit.utils.StringUtils; import com.gitblit.wicket.GitBlitWebSession; import com.gitblit.wicket.WicketUtils; @@ -158,7 +159,7 @@ public ProjectRepositoryPanel(String wicketId, Localizer localizer, Component pa add(new Label("repositorySize", localizer.getString("gb.empty", parent)).setEscapeModelStrings(false)); } - add(new ExternalLink("syndication", SyndicationServlet.asLink(getRequest() + add(new ExternalLink("syndication", SyndicationServlet.asLink(GitBlitRequestUtils .getRelativePathPrefixToContextRoot(), entry.name, null, 0))); } } From f03cf597771e0efb4bdd6bb1665d83e67f9bbaab Mon Sep 17 00:00:00 2001 From: Martin Spielmann Date: Sat, 30 Jul 2016 11:09:27 +0200 Subject: [PATCH 12/25] more replacements for getRelativePathPrefixToContextRoot --- src/main/java/com/gitblit/wicket/panels/BasePanel.java | 3 ++- src/main/java/com/gitblit/wicket/panels/BranchesPanel.java | 2 +- src/main/java/com/gitblit/wicket/panels/TagsPanel.java | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gitblit/wicket/panels/BasePanel.java b/src/main/java/com/gitblit/wicket/panels/BasePanel.java index 0f136ffd9..f46e10b38 100644 --- a/src/main/java/com/gitblit/wicket/panels/BasePanel.java +++ b/src/main/java/com/gitblit/wicket/panels/BasePanel.java @@ -27,6 +27,7 @@ import com.gitblit.Constants; import com.gitblit.Keys; +import com.gitblit.utils.GitBlitRequestUtils; import com.gitblit.utils.TimeUtils; import com.gitblit.wicket.GitBlitWebApp; import com.gitblit.wicket.GitBlitWebSession; @@ -56,7 +57,7 @@ protected Logger logger() { } protected String getContextUrl() { - return getRequest().getRelativePathPrefixToContextRoot(); + return GitBlitRequestUtils.getRelativePathPrefixToContextRoot(); } protected TimeZone getTimeZone() { diff --git a/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java b/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java index bc5cd8dfe..07cdafd56 100644 --- a/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java @@ -148,7 +148,7 @@ public void populateItem(final Item item) { fragment.add(new ExternalLink("raw", rawUrl)); fragment.add(new BookmarkablePageLink("metrics", MetricsPage.class, shortUniqRef)); fragment.add(new ExternalLink("syndication", SyndicationServlet.asLink( - getRequest().getRelativePathPrefixToContextRoot(), model.name, + GitBlitRequestUtils.getRelativePathPrefixToContextRoot(), model.name, Repository.shortenRefName(entry.getName()), 0))); if (showDelete) { fragment.add(createDeleteBranchLink(model, entry)); diff --git a/src/main/java/com/gitblit/wicket/panels/TagsPanel.java b/src/main/java/com/gitblit/wicket/panels/TagsPanel.java index 363708420..a681e6ce0 100644 --- a/src/main/java/com/gitblit/wicket/panels/TagsPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/TagsPanel.java @@ -32,6 +32,7 @@ import com.gitblit.models.RefModel; import com.gitblit.servlet.RawServlet; +import com.gitblit.utils.GitBlitRequestUtils; import com.gitblit.utils.JGitUtils; import com.gitblit.utils.StringUtils; import com.gitblit.wicket.WicketUtils; @@ -115,7 +116,7 @@ public void populateItem(final Item item) { .newObjectParameter(repositoryName, entry.getReferencedObjectId() .getName()))); - String contextUrl = RequestCycle.get().getRequest().getRelativePathPrefixToContextRoot(); + String contextUrl = GitBlitRequestUtils.getRelativePathPrefixToContextRoot(); String rawUrl = RawServlet.asLink(contextUrl, repositoryName, entry.displayName, entry.getReferencedObjectId().getName()); fragment.add(new ExternalLink("raw", rawUrl)); From 82046303f0f99b28b97cd7173d2fd94724c477d4 Mon Sep 17 00:00:00 2001 From: Martin Spielmann Date: Sat, 30 Jul 2016 11:26:34 +0200 Subject: [PATCH 13/25] replaced WicketURL[En/De]coder with Url[En/De]coder --- .../java/com/gitblit/wicket/MarkupProcessor.java | 3 ++- .../java/com/gitblit/wicket/SessionlessForm.java | 14 +++++++------- .../com/gitblit/wicket/pages/ImageDiffHandler.java | 6 ++++-- .../java/com/gitblit/wicket/pages/RawPage.java | 7 ++++--- .../com/gitblit/wicket/panels/BranchesPanel.java | 1 - .../java/com/gitblit/wicket/panels/TagsPanel.java | 1 - 6 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/gitblit/wicket/MarkupProcessor.java b/src/main/java/com/gitblit/wicket/MarkupProcessor.java index 50d646974..40cf95604 100644 --- a/src/main/java/com/gitblit/wicket/MarkupProcessor.java +++ b/src/main/java/com/gitblit/wicket/MarkupProcessor.java @@ -53,6 +53,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.gitblit.Constants; import com.gitblit.IStoredSettings; import com.gitblit.Keys; import com.gitblit.models.PathModel; @@ -369,7 +370,7 @@ private String getWicketUrl(Class pageClass, final String reposi String fsc = settings.getString(Keys.web.forwardSlashCharacter, "/"); String encodedPath = document.replace(' ', '-'); try { - encodedPath = URLEncoder.encode(encodedPath, "UTF-8"); + encodedPath = URLEncoder.encode(encodedPath, Constants.ENCODING); } catch (UnsupportedEncodingException e) { logger.error(null, e); } diff --git a/src/main/java/com/gitblit/wicket/SessionlessForm.java b/src/main/java/com/gitblit/wicket/SessionlessForm.java index 93a8d0fe6..d3a9c9c3a 100644 --- a/src/main/java/com/gitblit/wicket/SessionlessForm.java +++ b/src/main/java/com/gitblit/wicket/SessionlessForm.java @@ -15,6 +15,7 @@ */ package com.gitblit.wicket; +import java.nio.charset.StandardCharsets; import java.text.MessageFormat; import org.apache.wicket.Component; @@ -22,14 +23,13 @@ import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.MarkupStream; import org.apache.wicket.markup.html.form.StatelessForm; -import org.apache.wicket.protocol.http.RequestUtils; -//import org.apache.wicket.protocol.http.WicketURLDecoder; -//import org.apache.wicket.protocol.http.request.WebRequestCodingStrategy; +import org.apache.wicket.util.encoding.UrlDecoder; import org.apache.wicket.util.string.AppendingStringBuffer; import org.apache.wicket.util.string.Strings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.gitblit.Constants; import com.gitblit.utils.GitBlitRequestUtils; import com.gitblit.wicket.pages.BasePage; @@ -106,7 +106,7 @@ public void onComponentTagBody(final MarkupStream markupStream, final ComponentT // render the hidden bookmarkable page field AppendingStringBuffer buffer = new AppendingStringBuffer(HIDDEN_DIV_START); buffer.append(""); @@ -114,7 +114,7 @@ public void onComponentTagBody(final MarkupStream markupStream, final ComponentT // insert the page parameters, if any, as hidden fields as long as they // do not collide with any child wicket:id of the form. if (pageParameters != null) { - for (String key : pageParameters.keySet()) { + for (String key : pageParameters.getNamedKeys()) { Component c = get(key); if (c != null) { // this form has a field id which matches the @@ -122,7 +122,7 @@ public void onComponentTagBody(final MarkupStream markupStream, final ComponentT log.warn(MessageFormat.format("Skipping page parameter \"{0}\" from sessionless form hidden fields because it collides with a form child wicket:id", key)); continue; } - String value = pageParameters.getString(key); + String value = pageParameters.get(key).toString(); buffer.append(" -1) { response.setHeader("Content-Disposition", "filename=\"" - + URLEncoder.encode(filename, "UTF-8") + "\""); + + URLEncoder.encode(filename, Constants.ENCODING) + "\""); } else if (userAgent != null && userAgent.indexOf("MSIE") > -1) { response.setHeader("Content-Disposition", "attachment; filename=\"" - + URLEncoder.encode(filename, "UTF-8") + "\""); + + URLEncoder.encode(filename, Constants.ENCODING) + "\""); } else { response.setHeader("Content-Disposition", "attachment; filename=\"" - + new String(filename.getBytes("UTF-8"), "latin1") + "\""); + + new String(filename.getBytes(Constants.ENCODING), "latin1") + "\""); } } catch (UnsupportedEncodingException e) { diff --git a/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java b/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java index 07cdafd56..d5dc1a376 100644 --- a/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java @@ -32,7 +32,6 @@ import org.apache.wicket.markup.repeater.data.DataView; import org.apache.wicket.markup.repeater.data.ListDataProvider; import org.apache.wicket.model.StringResourceModel; -import org.apache.wicket.protocol.http.RequestUtils; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; diff --git a/src/main/java/com/gitblit/wicket/panels/TagsPanel.java b/src/main/java/com/gitblit/wicket/panels/TagsPanel.java index a681e6ce0..9926d1132 100644 --- a/src/main/java/com/gitblit/wicket/panels/TagsPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/TagsPanel.java @@ -26,7 +26,6 @@ import org.apache.wicket.markup.repeater.data.DataView; import org.apache.wicket.markup.repeater.data.ListDataProvider; import org.apache.wicket.model.StringResourceModel; -import org.apache.wicket.request.cycle.RequestCycle; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Repository; From d0bfa51c819bae8f96c90f81a0e335ca4fd0a027 Mon Sep 17 00:00:00 2001 From: Martin Spielmann Date: Sat, 30 Jul 2016 13:35:46 +0200 Subject: [PATCH 14/25] fix filter and plugin class resolver --- .classpath | 228 ++++++++++-------- .../gitblit/wicket/GitblitWicketFilter.java | 198 +++++++-------- .../gitblit/wicket/PluginClassResolver.java | 4 + 3 files changed, 232 insertions(+), 198 deletions(-) diff --git a/.classpath b/.classpath index 8b8844362..d531303bd 100644 --- a/.classpath +++ b/.classpath @@ -1,103 +1,131 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/com/gitblit/wicket/GitblitWicketFilter.java b/src/main/java/com/gitblit/wicket/GitblitWicketFilter.java index 8286acfce..2214cbc37 100644 --- a/src/main/java/com/gitblit/wicket/GitblitWicketFilter.java +++ b/src/main/java/com/gitblit/wicket/GitblitWicketFilter.java @@ -89,108 +89,110 @@ public void destroy(WicketFilter filter) { } }; } - + /** * Determines the last-modified date of the requested resource. + * + * TODO: check where to reimplement * * @param servletRequest * @return The last modified time stamp */ - @Override - protected long getLastModified(final HttpServletRequest servletRequest) { - final String pathInfo = getRelativePath(servletRequest); - if (Strings.isEmpty(pathInfo)) { - return -1; - } - long lastModified = super.getLastModified(servletRequest); - if (lastModified > -1) { - return lastModified; - } - - // try to match request against registered CacheControl pages - String [] paths = pathInfo.split("/"); - - String page = paths[0]; - String repo = ""; - String commitId = ""; - if (paths.length >= 2) { - repo = paths[1]; - } - if (paths.length >= 3) { - commitId = paths[2]; - } - - if (!StringUtils.isEmpty(servletRequest.getParameter("r"))) { - repo = servletRequest.getParameter("r"); - } - if (!StringUtils.isEmpty(servletRequest.getParameter("h"))) { - commitId = servletRequest.getParameter("h"); - } - - repo = repo.replace("%2f", "/").replace("%2F", "/").replace(settings.getChar(Keys.web.forwardSlashCharacter, '/'), '/'); - - GitBlitWebApp app = (GitBlitWebApp) getApplication(); - int expires = settings.getInteger(Keys.web.pageCacheExpires, 0); - if (!StringUtils.isEmpty(page) && app.isCacheablePage(page) && expires > 0) { - // page can be cached by the browser - CacheControl cacheControl = app.getCacheControl(page); - Date bootDate = runtimeManager.getBootDate(); - switch (cacheControl.value()) { - case ACTIVITY: - // returns the last activity date of the server - Date activityDate = repositoryManager.getLastActivityDate(); - if (activityDate != null) { - return activityDate.after(bootDate) ? activityDate.getTime() : bootDate.getTime(); - } - return bootDate.getTime(); - case BOOT: - // return the boot date of the server - return bootDate.getTime(); - case PROJECT: - // return the latest change date for the project OR the boot date - ProjectModel project = projectManager.getProjectModel(StringUtils.getRootPath(repo)); - if (project != null) { - return project.lastChange.after(bootDate) ? project.lastChange.getTime() : bootDate.getTime(); - } - break; - case REPOSITORY: - // return the lastest change date for the repository OR the boot - // date, whichever is latest - RepositoryModel repository = repositoryManager.getRepositoryModel(repo); - if (repository != null && repository.lastChange != null) { - return repository.lastChange.after(bootDate) ? repository.lastChange.getTime() : bootDate.getTime(); - } - break; - case COMMIT: - // get the date of the specified commit - if (StringUtils.isEmpty(commitId)) { - // no commit id, use boot date - return bootDate.getTime(); - } else { - // last modified date is the commit date - Repository r = null; - try { - // return the timestamp of the associated commit - r = repositoryManager.getRepository(repo); - if (r != null) { - RevCommit commit = JGitUtils.getCommit(r, commitId); - if (commit != null) { - Date date = JGitUtils.getCommitDate(commit); - return date.after(bootDate) ? date.getTime() : bootDate.getTime(); - } - } - } finally { - if (r != null) { - r.close(); - } - } - } - break; - default: - break; - } - } - - return -1; - } +// @Override +// protected long getLastModified(final HttpServletRequest servletRequest) { +// final String pathInfo = getRelativePath(servletRequest); +// if (Strings.isEmpty(pathInfo)) { +// return -1; +// } +// long lastModified = super.getLastModified(servletRequest); +// if (lastModified > -1) { +// return lastModified; +// } +// +// // try to match request against registered CacheControl pages +// String [] paths = pathInfo.split("/"); +// +// String page = paths[0]; +// String repo = ""; +// String commitId = ""; +// if (paths.length >= 2) { +// repo = paths[1]; +// } +// if (paths.length >= 3) { +// commitId = paths[2]; +// } +// +// if (!StringUtils.isEmpty(servletRequest.getParameter("r"))) { +// repo = servletRequest.getParameter("r"); +// } +// if (!StringUtils.isEmpty(servletRequest.getParameter("h"))) { +// commitId = servletRequest.getParameter("h"); +// } +// +// repo = repo.replace("%2f", "/").replace("%2F", "/").replace(settings.getChar(Keys.web.forwardSlashCharacter, '/'), '/'); +// +// GitBlitWebApp app = (GitBlitWebApp) getApplication(); +// int expires = settings.getInteger(Keys.web.pageCacheExpires, 0); +// if (!StringUtils.isEmpty(page) && app.isCacheablePage(page) && expires > 0) { +// // page can be cached by the browser +// CacheControl cacheControl = app.getCacheControl(page); +// Date bootDate = runtimeManager.getBootDate(); +// switch (cacheControl.value()) { +// case ACTIVITY: +// // returns the last activity date of the server +// Date activityDate = repositoryManager.getLastActivityDate(); +// if (activityDate != null) { +// return activityDate.after(bootDate) ? activityDate.getTime() : bootDate.getTime(); +// } +// return bootDate.getTime(); +// case BOOT: +// // return the boot date of the server +// return bootDate.getTime(); +// case PROJECT: +// // return the latest change date for the project OR the boot date +// ProjectModel project = projectManager.getProjectModel(StringUtils.getRootPath(repo)); +// if (project != null) { +// return project.lastChange.after(bootDate) ? project.lastChange.getTime() : bootDate.getTime(); +// } +// break; +// case REPOSITORY: +// // return the lastest change date for the repository OR the boot +// // date, whichever is latest +// RepositoryModel repository = repositoryManager.getRepositoryModel(repo); +// if (repository != null && repository.lastChange != null) { +// return repository.lastChange.after(bootDate) ? repository.lastChange.getTime() : bootDate.getTime(); +// } +// break; +// case COMMIT: +// // get the date of the specified commit +// if (StringUtils.isEmpty(commitId)) { +// // no commit id, use boot date +// return bootDate.getTime(); +// } else { +// // last modified date is the commit date +// Repository r = null; +// try { +// // return the timestamp of the associated commit +// r = repositoryManager.getRepository(repo); +// if (r != null) { +// RevCommit commit = JGitUtils.getCommit(r, commitId); +// if (commit != null) { +// Date date = JGitUtils.getCommitDate(commit); +// return date.after(bootDate) ? date.getTime() : bootDate.getTime(); +// } +// } +// } finally { +// if (r != null) { +// r.close(); +// } +// } +// } +// break; +// default: +// break; +// } +// } +// +// return -1; +// } } diff --git a/src/main/java/com/gitblit/wicket/PluginClassResolver.java b/src/main/java/com/gitblit/wicket/PluginClassResolver.java index 476f96118..0693891c6 100644 --- a/src/main/java/com/gitblit/wicket/PluginClassResolver.java +++ b/src/main/java/com/gitblit/wicket/PluginClassResolver.java @@ -117,4 +117,8 @@ private void loadResources(Enumeration resources, Set loadedFiles) { } } } + + @Override + public ClassLoader getClassLoader() { + return getClass().getClassLoader(); } } \ No newline at end of file From 393a554be9412bda3c220cf2026097be57378706 Mon Sep 17 00:00:00 2001 From: Martin Spielmann Date: Sat, 30 Jul 2016 13:44:42 +0200 Subject: [PATCH 15/25] fix last broken panel --- .../java/com/gitblit/wicket/panels/ObjectContainer.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gitblit/wicket/panels/ObjectContainer.java b/src/main/java/com/gitblit/wicket/panels/ObjectContainer.java index 63f7b2103..02aada593 100644 --- a/src/main/java/com/gitblit/wicket/panels/ObjectContainer.java +++ b/src/main/java/com/gitblit/wicket/panels/ObjectContainer.java @@ -29,7 +29,7 @@ import org.apache.wicket.protocol.http.WebSession; import org.apache.wicket.protocol.http.request.WebClientInfo; import org.apache.wicket.request.Response; -import org.apache.wicket.request.cycle.RequestCycle; +import org.apache.wicket.request.resource.PackageResourceReference; import org.apache.wicket.util.value.IValueMap; /** @@ -85,8 +85,8 @@ protected String resolveResource(String src) { parent = parent.getParent(); } if (parent != null) { - ResourceReference resRef = new ResourceReference(parent.getClass(), src, false); - return (urlFor(resRef).toString()); + PackageResourceReference resRef = new PackageResourceReference(parent.getClass(), src); + return (urlFor(resRef, getPage().getPageParameters()).toString()); } return (src); From 284a256a44f37c7b7c082baa1d633654c131316f Mon Sep 17 00:00:00 2001 From: Martin Spielmann Date: Sat, 30 Jul 2016 13:56:29 +0200 Subject: [PATCH 16/25] replaced ResourceStreamRequestTarget by ResourceStreamRequestHandler --- .../gitblit/wicket/pages/CommitDiffPage.java | 19 +- .../com/gitblit/wicket/pages/CommitPage.java | 227 +++++++++--------- .../com/gitblit/wicket/pages/TicketsPage.java | 3 +- .../com/gitblit/wicket/pages/TreePage.java | 182 +++++++------- 4 files changed, 222 insertions(+), 209 deletions(-) diff --git a/src/main/java/com/gitblit/wicket/pages/CommitDiffPage.java b/src/main/java/com/gitblit/wicket/pages/CommitDiffPage.java index 6e301d741..2092bba71 100644 --- a/src/main/java/com/gitblit/wicket/pages/CommitDiffPage.java +++ b/src/main/java/com/gitblit/wicket/pages/CommitDiffPage.java @@ -20,6 +20,7 @@ import java.util.Arrays; import java.util.List; +import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; @@ -28,7 +29,6 @@ import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.data.DataView; import org.apache.wicket.markup.repeater.data.ListDataProvider; -import org.apache.wicket.request.target.resource.ResourceStreamRequestTarget; import org.apache.wicket.util.resource.AbstractResourceStreamWriter; import org.apache.wicket.util.resource.IResourceStream; import org.eclipse.jgit.diff.DiffEntry.ChangeType; @@ -61,6 +61,8 @@ @CacheControl(LastModified.BOOT) public class CommitDiffPage extends RepositoryPage { + private static final long serialVersionUID = 1L; + public CommitDiffPage(PageParameters params) { super(params); @@ -191,8 +193,9 @@ public void write(OutputStream output) { } }; - getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path)); - }})); + ResourceStreamRequestHandler resourceStreamRequestHandler = new ResourceStreamRequestHandler( + resourceStream, entry.path); + getRequestCycle().scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler); }})); } else { @@ -240,8 +243,9 @@ public void write(OutputStream output) { }; - getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path)); - }}); + ResourceStreamRequestHandler resourceStreamRequestHandler = new ResourceStreamRequestHandler( + resourceStream, entry.path); + getRequestCycle().scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler); }}); item.add(new Link("raw", null) { @@ -264,8 +268,9 @@ public void write(OutputStream output) { }; - getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path)); - }}); + ResourceStreamRequestHandler resourceStreamRequestHandler = new ResourceStreamRequestHandler( + resourceStream, entry.path); + getRequestCycle().scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler); }}); } else { item.add(new BookmarkablePageLink("view", BlobPage.class, WicketUtils .newPathParameter(repositoryName, entry.commitId, entry.path)) diff --git a/src/main/java/com/gitblit/wicket/pages/CommitPage.java b/src/main/java/com/gitblit/wicket/pages/CommitPage.java index 6795af294..4b01fbdee 100644 --- a/src/main/java/com/gitblit/wicket/pages/CommitPage.java +++ b/src/main/java/com/gitblit/wicket/pages/CommitPage.java @@ -20,6 +20,7 @@ import java.util.Arrays; import java.util.List; +import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; @@ -29,7 +30,6 @@ import org.apache.wicket.markup.repeater.data.DataView; import org.apache.wicket.markup.repeater.data.ListDataProvider; import org.apache.wicket.model.StringResourceModel; -//import org.apache.wicket.request.target.resource.ResourceStreamRequestTarget; import org.apache.wicket.util.resource.AbstractResourceStreamWriter; import org.apache.wicket.util.resource.IResourceStream; import org.eclipse.jgit.diff.DiffEntry.ChangeType; @@ -58,6 +58,8 @@ @CacheControl(LastModified.BOOT) public class CommitPage extends RepositoryPage { + private static final long serialVersionUID = 1L; + public CommitPage(PageParameters params) { super(params); @@ -76,11 +78,10 @@ public CommitPage(PageParameters params) { add(new Label("parentLink", "none")); add(new Label("commitdiffLink", getString("gb.commitdiff"))); } else { - add(new LinkPanel("parentLink", null, getShortObjectId(parents.get(0)), - CommitPage.class, newCommitParameter(parents.get(0)))); - add(new LinkPanel("commitdiffLink", null, new StringResourceModel("gb.commitdiff", - this, null), CommitDiffPage.class, WicketUtils.newObjectParameter( - repositoryName, objectId))); + add(new LinkPanel("parentLink", null, getShortObjectId(parents.get(0)), CommitPage.class, + newCommitParameter(parents.get(0)))); + add(new LinkPanel("commitdiffLink", null, new StringResourceModel("gb.commitdiff", this, null), + CommitDiffPage.class, WicketUtils.newObjectParameter(repositoryName, objectId))); } add(new BookmarkablePageLink("patchLink", PatchPage.class, WicketUtils.newObjectParameter(repositoryName, objectId))); @@ -91,18 +92,17 @@ public CommitPage(PageParameters params) { // author add(createPersonPanel("commitAuthor", c.getAuthorIdent(), Constants.SearchType.AUTHOR)); - add(WicketUtils.createTimestampLabel("commitAuthorDate", c.getAuthorIdent().getWhen(), - getTimeZone(), getTimeUtils())); + add(WicketUtils.createTimestampLabel("commitAuthorDate", c.getAuthorIdent().getWhen(), getTimeZone(), + getTimeUtils())); // committer add(createPersonPanel("commitCommitter", c.getCommitterIdent(), Constants.SearchType.COMMITTER)); - add(WicketUtils.createTimestampLabel("commitCommitterDate", - c.getCommitterIdent().getWhen(), getTimeZone(), getTimeUtils())); + add(WicketUtils.createTimestampLabel("commitCommitterDate", c.getCommitterIdent().getWhen(), getTimeZone(), + getTimeUtils())); add(new Label("commitId", c.getName())); - add(new LinkPanel("commitTree", "list", c.getTree().getName(), TreePage.class, - newCommitParameter())); + add(new LinkPanel("commitTree", "list", c.getTree().getName(), TreePage.class, newCommitParameter())); add(new BookmarkablePageLink("treeLink", TreePage.class, newCommitParameter())); final String baseUrl = WicketUtils.getGitblitURL(getRequest()); @@ -116,12 +116,9 @@ public CommitPage(PageParameters params) { @Override public void populateItem(final Item item) { String entry = item.getModelObject(); - item.add(new LinkPanel("commitParent", "list", entry, CommitPage.class, - newCommitParameter(entry))); - item.add(new BookmarkablePageLink("view", CommitPage.class, - newCommitParameter(entry))); - item.add(new BookmarkablePageLink("diff", CommitDiffPage.class, - newCommitParameter(entry))); + item.add(new LinkPanel("commitParent", "list", entry, CommitPage.class, newCommitParameter(entry))); + item.add(new BookmarkablePageLink("view", CommitPage.class, newCommitParameter(entry))); + item.add(new BookmarkablePageLink("diff", CommitDiffPage.class, newCommitParameter(entry))); } }; add(parentsView); @@ -138,13 +135,13 @@ public void populateItem(final Item item) { public void populateItem(final Item item) { GitNote entry = item.getModelObject(); item.add(new RefsPanel("refName", repositoryName, Arrays.asList(entry.notesRef))); - item.add(createPersonPanel("authorName", entry.notesRef.getAuthorIdent(), - Constants.SearchType.AUTHOR)); + item.add(createPersonPanel("authorName", entry.notesRef.getAuthorIdent(), Constants.SearchType.AUTHOR)); item.add(new AvatarImage("noteAuthorAvatar", entry.notesRef.getAuthorIdent())); - item.add(WicketUtils.createTimestampLabel("authorDate", entry.notesRef - .getAuthorIdent().getWhen(), getTimeZone(), getTimeUtils())); - item.add(new Label("noteContent", bugtraqProcessor().processPlainCommitMessage(getRepository(), repositoryName, - entry.content)).setEscapeModelStrings(false)); + item.add(WicketUtils.createTimestampLabel("authorDate", entry.notesRef.getAuthorIdent().getWhen(), + getTimeZone(), getTimeUtils())); + item.add(new Label("noteContent", + bugtraqProcessor().processPlainCommitMessage(getRepository(), repositoryName, entry.content)) + .setEscapeModelStrings(false)); } }; add(notesView.setVisible(notes.size() > 0)); @@ -170,22 +167,21 @@ public void populateItem(final Item item) { @Override public void populateItem(final Item item) { final PathChangeModel entry = item.getModelObject(); - + Label changeType = new Label("changeType", ""); WicketUtils.setChangeTypeCssClass(changeType, entry.changeType); setChangeTypeTooltip(changeType, entry.changeType); item.add(changeType); item.add(new DiffStatPanel("diffStat", entry.insertions, entry.deletions, true)); item.add(WicketUtils.setHtmlTooltip(new Label("filestore", ""), getString("gb.filestore")) - .setVisible(entry.isFilestoreItem())); + .setVisible(entry.isFilestoreItem())); boolean hasSubmodule = false; String submodulePath = null; if (entry.isTree()) { // tree item.add(new LinkPanel("pathName", null, entry.path, TreePage.class, - WicketUtils - .newPathParameter(repositoryName, entry.commitId, entry.path))); + WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path))); } else if (entry.isSubmodule()) { // submodule String submoduleId = entry.objectId; @@ -193,9 +189,9 @@ public void populateItem(final Item item) { submodulePath = submodule.gitblitPath; hasSubmodule = submodule.hasSubmodule; - item.add(new LinkPanel("pathName", "list", entry.path + " @ " + - getShortObjectId(submoduleId), TreePage.class, - WicketUtils.newPathParameter(submodulePath, submoduleId, "")).setEnabled(hasSubmodule)); + item.add(new LinkPanel("pathName", "list", entry.path + " @ " + getShortObjectId(submoduleId), + TreePage.class, WicketUtils.newPathParameter(submodulePath, submoduleId, "")) + .setEnabled(hasSubmodule)); } else { // blob String displayPath = entry.path; @@ -204,125 +200,132 @@ public void populateItem(final Item item) { path = JGitUtils.getStringContent(getRepository(), getCommit().getTree(), path); displayPath = entry.path + " -> " + path; } - + if (entry.isFilestoreItem()) { item.add(new LinkPanel("pathName", "list", entry.path, new Link("link", null) { - + private static final long serialVersionUID = 1L; @Override - public void onClick() { - - IResourceStream resourceStream = new AbstractResourceStreamWriter() { - + public void onClick() { + + IResourceStream resourceStream = new AbstractResourceStreamWriter() { + private static final long serialVersionUID = 1L; - @Override - public void write(OutputStream output) { - UserModel user = GitBlitWebSession.get().getUser(); - user = user == null ? UserModel.ANONYMOUS : user; - - app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output); - } - }; - - - getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path)); - }})); - - + @Override + public void write(OutputStream output) { + UserModel user = GitBlitWebSession.get().getUser(); + user = user == null ? UserModel.ANONYMOUS : user; + + app().filestore().downloadBlob(entry.getFilestoreOid(), user, + getRepositoryModel(), output); + } + }; + + ResourceStreamRequestHandler resourceStreamRequestHandler = new ResourceStreamRequestHandler( + resourceStream, entry.path); + getRequestCycle().scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler); + } + })); + } else { item.add(new LinkPanel("pathName", "list", displayPath, BlobPage.class, - WicketUtils.newPathParameter(repositoryName, entry.commitId, path))); + WicketUtils.newPathParameter(repositoryName, entry.commitId, path))); } } - // quick links if (entry.isSubmodule()) { item.add(new ExternalLink("raw", "").setEnabled(false)); // submodule - item.add(new BookmarkablePageLink("diff", BlobDiffPage.class, WicketUtils - .newPathParameter(repositoryName, entry.commitId, entry.path)) - .setEnabled(!entry.changeType.equals(ChangeType.ADD))); - item.add(new BookmarkablePageLink("view", CommitPage.class, WicketUtils - .newObjectParameter(submodulePath, entry.objectId)).setEnabled(hasSubmodule)); + item.add(new BookmarkablePageLink("diff", BlobDiffPage.class, + WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path)) + .setEnabled(!entry.changeType.equals(ChangeType.ADD))); + item.add(new BookmarkablePageLink("view", CommitPage.class, + WicketUtils.newObjectParameter(submodulePath, entry.objectId)).setEnabled(hasSubmodule)); item.add(new ExternalLink("blame", "").setEnabled(false)); - item.add(new BookmarkablePageLink("history", HistoryPage.class, WicketUtils - .newPathParameter(repositoryName, entry.commitId, entry.path)) - .setEnabled(!entry.changeType.equals(ChangeType.ADD))); + item.add(new BookmarkablePageLink("history", HistoryPage.class, + WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path)) + .setEnabled(!entry.changeType.equals(ChangeType.ADD))); } else { // tree or blob - item.add(new BookmarkablePageLink("diff", BlobDiffPage.class, WicketUtils - .newPathParameter(repositoryName, entry.commitId, entry.path)) - .setEnabled(!entry.changeType.equals(ChangeType.ADD) - && !entry.changeType.equals(ChangeType.DELETE))); - + item.add(new BookmarkablePageLink("diff", BlobDiffPage.class, + WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path)) + .setEnabled(!entry.changeType.equals(ChangeType.ADD) + && !entry.changeType.equals(ChangeType.DELETE))); + if (entry.isFilestoreItem()) { item.add(new Link("view", null) { - + private static final long serialVersionUID = 1L; @Override - public void onClick() { - - IResourceStream resourceStream = new AbstractResourceStreamWriter() { - + public void onClick() { + + IResourceStream resourceStream = new AbstractResourceStreamWriter() { + private static final long serialVersionUID = 1L; - @Override - public void write(OutputStream output) { - UserModel user = GitBlitWebSession.get().getUser(); - user = user == null ? UserModel.ANONYMOUS : user; - - app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output); - } - }; - - - getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path)); - }}); - + @Override + public void write(OutputStream output) { + UserModel user = GitBlitWebSession.get().getUser(); + user = user == null ? UserModel.ANONYMOUS : user; + + app().filestore().downloadBlob(entry.getFilestoreOid(), user, + getRepositoryModel(), output); + } + }; + + ResourceStreamRequestHandler resourceStreamRequestHandler = new ResourceStreamRequestHandler( + resourceStream, entry.path); + getRequestCycle().scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler); + } + }); + item.add(new Link("raw", null) { - + private static final long serialVersionUID = 1L; @Override - public void onClick() { - - IResourceStream resourceStream = new AbstractResourceStreamWriter() { - + public void onClick() { + + IResourceStream resourceStream = new AbstractResourceStreamWriter() { + private static final long serialVersionUID = 1L; - @Override - public void write(OutputStream output) { - UserModel user = GitBlitWebSession.get().getUser(); - user = user == null ? UserModel.ANONYMOUS : user; - - app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output); - } - }; - - - getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path)); - }}); - + @Override + public void write(OutputStream output) { + UserModel user = GitBlitWebSession.get().getUser(); + user = user == null ? UserModel.ANONYMOUS : user; + + app().filestore().downloadBlob(entry.getFilestoreOid(), user, + getRepositoryModel(), output); + } + }; + + ResourceStreamRequestHandler resourceStreamRequestHandler = new ResourceStreamRequestHandler( + resourceStream, entry.path); + getRequestCycle().scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler); + } + }); + } else { - item.add(new BookmarkablePageLink("view", BlobPage.class, WicketUtils - .newPathParameter(repositoryName, entry.commitId, entry.path)) - .setEnabled(!entry.changeType.equals(ChangeType.DELETE))); + item.add(new BookmarkablePageLink("view", BlobPage.class, + WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path)) + .setEnabled(!entry.changeType.equals(ChangeType.DELETE))); String rawUrl = RawServlet.asLink(getContextUrl(), repositoryName, entry.commitId, entry.path); item.add(new ExternalLink("raw", rawUrl) .setEnabled(!entry.changeType.equals(ChangeType.DELETE))); } - item.add(new BookmarkablePageLink("blame", BlamePage.class, WicketUtils - .newPathParameter(repositoryName, entry.commitId, entry.path)) - .setEnabled(!entry.changeType.equals(ChangeType.ADD) - && !entry.changeType.equals(ChangeType.DELETE))); - item.add(new BookmarkablePageLink("history", HistoryPage.class, WicketUtils - .newPathParameter(repositoryName, entry.commitId, entry.path)) - .setEnabled(!entry.changeType.equals(ChangeType.ADD))); + item.add(new BookmarkablePageLink("blame", BlamePage.class, + WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path)) + .setEnabled(!entry.changeType.equals(ChangeType.ADD) + && !entry.changeType.equals(ChangeType.DELETE))); + item.add(new BookmarkablePageLink("history", HistoryPage.class, + WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path)) + .setEnabled(!entry.changeType.equals(ChangeType.ADD))); } WicketUtils.setAlternatingBackground(item, counter); diff --git a/src/main/java/com/gitblit/wicket/pages/TicketsPage.java b/src/main/java/com/gitblit/wicket/pages/TicketsPage.java index ed0ed63eb..15dfe0e80 100644 --- a/src/main/java/com/gitblit/wicket/pages/TicketsPage.java +++ b/src/main/java/com/gitblit/wicket/pages/TicketsPage.java @@ -27,6 +27,7 @@ import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.util.string.StringValue; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.panel.Fragment; @@ -87,7 +88,7 @@ public TicketsPage(PageParameters params) { UserModel user = GitBlitWebSession.get().getUser(); boolean isAuthenticated = user != null && user.isAuthenticated; - final String [] statiiParam = params.getStringArray(Lucene.status.name()); + final String [] statiiParam = (String[]) params.getValues(Lucene.status.name()).stream().map(StringValue::toString).toArray(); final String assignedToParam = params.get(Lucene.responsible.name()).toString(null); final String milestoneParam = params.get(Lucene.milestone.name()).toString(null); final String queryParam = params.get("q").toString(null); diff --git a/src/main/java/com/gitblit/wicket/pages/TreePage.java b/src/main/java/com/gitblit/wicket/pages/TreePage.java index c1adf6e1d..79b7460ea 100644 --- a/src/main/java/com/gitblit/wicket/pages/TreePage.java +++ b/src/main/java/com/gitblit/wicket/pages/TreePage.java @@ -18,6 +18,7 @@ import java.io.OutputStream; import java.util.List; +import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; @@ -27,7 +28,6 @@ import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.data.DataView; import org.apache.wicket.markup.repeater.data.ListDataProvider; -//import org.apache.wicket.request.target.resource.ResourceStreamRequestTarget; import org.apache.wicket.util.resource.AbstractResourceStreamWriter; import org.apache.wicket.util.resource.IResourceStream; import org.eclipse.jgit.lib.FileMode; @@ -53,6 +53,8 @@ @CacheControl(LastModified.BOOT) public class TreePage extends RepositoryPage { + private static final long serialVersionUID = 1L; + public TreePage(PageParameters params) { super(params); @@ -65,8 +67,8 @@ public TreePage(PageParameters params) { // tree page links add(new BookmarkablePageLink("historyLink", HistoryPage.class, WicketUtils.newPathParameter(repositoryName, objectId, path))); - add(new CompressedDownloadsPanel("compressedLinks", GitBlitRequestUtils - .getRelativePathPrefixToContextRoot(), repositoryName, objectId, path)); + add(new CompressedDownloadsPanel("compressedLinks", GitBlitRequestUtils.getRelativePathPrefixToContextRoot(), + repositoryName, objectId, path)); add(new CommitHeaderPanel("commitHeader", repositoryName, commit)); @@ -84,7 +86,7 @@ public TreePage(PageParameters params) { } final String id = getBestCommitId(commit); - + final ByteFormat byteFormat = new ByteFormat(); final String baseUrl = WicketUtils.getGitblitURL(getRequest()); @@ -97,10 +99,10 @@ public TreePage(PageParameters params) { @Override public void populateItem(final Item item) { final PathModel entry = item.getModelObject(); - + item.add(new Label("pathPermissions", JGitUtils.getPermissionsFromMode(entry.mode))); item.add(WicketUtils.setHtmlTooltip(new Label("filestore", ""), getString("gb.filestore")) - .setVisible(entry.isFilestoreItem())); + .setVisible(entry.isFilestoreItem())); if (entry.isParentPath) { // parent .. path @@ -115,19 +117,16 @@ public void populateItem(final Item item) { item.add(WicketUtils.newImage("pathIcon", "folder_16x16.png")); item.add(new Label("pathSize", "")); item.add(new LinkPanel("pathName", "list", entry.name, TreePage.class, - WicketUtils.newPathParameter(repositoryName, id, - entry.path))); + WicketUtils.newPathParameter(repositoryName, id, entry.path))); // links Fragment links = new Fragment("pathLinks", "treeLinks", this); links.add(new BookmarkablePageLink("tree", TreePage.class, - WicketUtils.newPathParameter(repositoryName, id, - entry.path))); + WicketUtils.newPathParameter(repositoryName, id, entry.path))); links.add(new BookmarkablePageLink("history", HistoryPage.class, - WicketUtils.newPathParameter(repositoryName, id, - entry.path))); - links.add(new CompressedDownloadsPanel("compressedLinks", baseUrl, - repositoryName, objectId, entry.path)); + WicketUtils.newPathParameter(repositoryName, id, entry.path))); + links.add(new CompressedDownloadsPanel("compressedLinks", baseUrl, repositoryName, objectId, + entry.path)); item.add(links); } else if (entry.isSubmodule()) { @@ -141,21 +140,20 @@ public void populateItem(final Item item) { item.add(WicketUtils.newImage("pathIcon", "git-orange-16x16.png")); item.add(new Label("pathSize", "")); - item.add(new LinkPanel("pathName", "list", entry.name + " @ " + - getShortObjectId(submoduleId), TreePage.class, - WicketUtils.newPathParameter(submodulePath, submoduleId, "")).setEnabled(hasSubmodule)); + item.add(new LinkPanel("pathName", "list", entry.name + " @ " + getShortObjectId(submoduleId), + TreePage.class, WicketUtils.newPathParameter(submodulePath, submoduleId, "")) + .setEnabled(hasSubmodule)); Fragment links = new Fragment("pathLinks", "submoduleLinks", this); links.add(new BookmarkablePageLink("view", SummaryPage.class, WicketUtils.newRepositoryParameter(submodulePath)).setEnabled(hasSubmodule)); links.add(new BookmarkablePageLink("tree", TreePage.class, - WicketUtils.newPathParameter(submodulePath, submoduleId, - "")).setEnabled(hasSubmodule)); + WicketUtils.newPathParameter(submodulePath, submoduleId, "")).setEnabled(hasSubmodule)); links.add(new BookmarkablePageLink("history", HistoryPage.class, - WicketUtils.newPathParameter(repositoryName, id, - entry.path))); - links.add(new CompressedDownloadsPanel("compressedLinks", baseUrl, - submodulePath, submoduleId, "").setEnabled(hasSubmodule)); + WicketUtils.newPathParameter(repositoryName, id, entry.path))); + links.add( + new CompressedDownloadsPanel("compressedLinks", baseUrl, submodulePath, submoduleId, "") + .setEnabled(hasSubmodule)); item.add(links); } else { // blob link @@ -167,101 +165,107 @@ public void populateItem(final Item item) { } item.add(WicketUtils.getFileImage("pathIcon", entry.name)); item.add(new Label("pathSize", byteFormat.format(entry.size))); - + // links Fragment links = new Fragment("pathLinks", "blobLinks", this); - + if (entry.isFilestoreItem()) { item.add(new LinkPanel("pathName", "list", displayPath, new Link("link", null) { - + private static final long serialVersionUID = 1L; @Override - public void onClick() { - - IResourceStream resourceStream = new AbstractResourceStreamWriter() { - + public void onClick() { + + IResourceStream resourceStream = new AbstractResourceStreamWriter() { + private static final long serialVersionUID = 1L; - @Override - public void write(OutputStream output) { - UserModel user = GitBlitWebSession.get().getUser(); - user = user == null ? UserModel.ANONYMOUS : user; - - app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output); - } - }; - - - getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path)); - }})); - + @Override + public void write(OutputStream output) { + UserModel user = GitBlitWebSession.get().getUser(); + user = user == null ? UserModel.ANONYMOUS : user; + + app().filestore().downloadBlob(entry.getFilestoreOid(), user, + getRepositoryModel(), output); + } + }; + + ResourceStreamRequestHandler resourceStreamRequestHandler = new ResourceStreamRequestHandler( + resourceStream, entry.path); + getRequestCycle().scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler); + + } + })); + links.add(new Link("view", null) { - + private static final long serialVersionUID = 1L; @Override - public void onClick() { - - IResourceStream resourceStream = new AbstractResourceStreamWriter() { - + public void onClick() { + + IResourceStream resourceStream = new AbstractResourceStreamWriter() { + private static final long serialVersionUID = 1L; - @Override - public void write(OutputStream output) { - UserModel user = GitBlitWebSession.get().getUser(); - user = user == null ? UserModel.ANONYMOUS : user; - - app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output); - } - }; - - - getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path)); - }}); - + @Override + public void write(OutputStream output) { + UserModel user = GitBlitWebSession.get().getUser(); + user = user == null ? UserModel.ANONYMOUS : user; + + app().filestore().downloadBlob(entry.getFilestoreOid(), user, + getRepositoryModel(), output); + } + }; + + ResourceStreamRequestHandler resourceStreamRequestHandler = new ResourceStreamRequestHandler( + resourceStream, entry.path); + getRequestCycle().scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler); + } + }); + links.add(new Link("raw", null) { - + private static final long serialVersionUID = 1L; @Override - public void onClick() { - - IResourceStream resourceStream = new AbstractResourceStreamWriter() { - + public void onClick() { + + IResourceStream resourceStream = new AbstractResourceStreamWriter() { + private static final long serialVersionUID = 1L; - @Override - public void write(OutputStream output) { - UserModel user = GitBlitWebSession.get().getUser(); - user = user == null ? UserModel.ANONYMOUS : user; - - app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output); - } - }; - - - getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path)); - }}); - + @Override + public void write(OutputStream output) { + UserModel user = GitBlitWebSession.get().getUser(); + user = user == null ? UserModel.ANONYMOUS : user; + + app().filestore().downloadBlob(entry.getFilestoreOid(), user, + getRepositoryModel(), output); + } + }; + + ResourceStreamRequestHandler resourceStreamRequestHandler = new ResourceStreamRequestHandler( + resourceStream, entry.path); + getRequestCycle().scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler); + } + }); + } else { item.add(new LinkPanel("pathName", "list", displayPath, BlobPage.class, - WicketUtils.newPathParameter(repositoryName, id, - path))); - + WicketUtils.newPathParameter(repositoryName, id, path))); + links.add(new BookmarkablePageLink("view", BlobPage.class, - WicketUtils.newPathParameter(repositoryName, id, - path))); + WicketUtils.newPathParameter(repositoryName, id, path))); String rawUrl = RawServlet.asLink(getContextUrl(), repositoryName, id, path); links.add(new ExternalLink("raw", rawUrl)); } - + links.add(new BookmarkablePageLink("blame", BlamePage.class, - WicketUtils.newPathParameter(repositoryName, id, - path))); + WicketUtils.newPathParameter(repositoryName, id, path))); links.add(new BookmarkablePageLink("history", HistoryPage.class, - WicketUtils.newPathParameter(repositoryName, id, - path))); + WicketUtils.newPathParameter(repositoryName, id, path))); item.add(links); } } From bc586ef3e273240806f13201f2055333481f01e2 Mon Sep 17 00:00:00 2001 From: Martin Spielmann Date: Sat, 30 Jul 2016 14:24:42 +0200 Subject: [PATCH 17/25] fixed last compile errors in pages --- .../com/gitblit/wicket/GitBlitWebApp.java | 3 +- .../com/gitblit/wicket/pages/BasePage.java | 37 ++++++++++++------- .../com/gitblit/wicket/pages/BlobPage.java | 6 +-- .../wicket/pages/ChangePasswordPage.java | 4 +- .../wicket/pages/EditRepositoryPage.java | 3 +- .../gitblit/wicket/pages/EditTeamPage.java | 1 - .../gitblit/wicket/pages/EditUserPage.java | 1 - .../wicket/pages/EmptyRepositoryPage.java | 2 + .../wicket/pages/ExportTicketPage.java | 23 +++++++----- .../wicket/pages/ImageDiffHandler.java | 9 ++--- .../com/gitblit/wicket/pages/LogoutPage.java | 1 - .../gitblit/wicket/pages/MyTicketsPage.java | 8 ++-- .../wicket/pages/NewRepositoryPage.java | 1 - .../com/gitblit/wicket/pages/RawPage.java | 22 +++++++---- .../com/gitblit/wicket/pages/RootSubPage.java | 3 +- .../com/gitblit/wicket/pages/UserPage.java | 1 - 16 files changed, 72 insertions(+), 53 deletions(-) diff --git a/src/main/java/com/gitblit/wicket/GitBlitWebApp.java b/src/main/java/com/gitblit/wicket/GitBlitWebApp.java index 34024911e..662daa7b8 100644 --- a/src/main/java/com/gitblit/wicket/GitBlitWebApp.java +++ b/src/main/java/com/gitblit/wicket/GitBlitWebApp.java @@ -21,7 +21,6 @@ import java.util.Map; import java.util.TimeZone; -import org.apache.wicket.Application; import org.apache.wicket.RuntimeConfigurationType; import org.apache.wicket.Session; import org.apache.wicket.application.IClassResolver; @@ -284,7 +283,7 @@ public void mount(String location, Class clazz, String... par } //TODO: check if needed with wichet-7 // mount(new GitblitParamUrlCodingStrategy(settings, xssFilter, location, clazz, parameters)); - mount(location, clazz, parameters); + mountPage(location, clazz); // map the mount point to the cache control definition diff --git a/src/main/java/com/gitblit/wicket/pages/BasePage.java b/src/main/java/com/gitblit/wicket/pages/BasePage.java index 06b6a6b83..887edac6f 100644 --- a/src/main/java/com/gitblit/wicket/pages/BasePage.java +++ b/src/main/java/com/gitblit/wicket/pages/BasePage.java @@ -31,8 +31,6 @@ import java.util.TimeZone; import java.util.regex.Pattern; -import javax.servlet.http.HttpServletRequest; - import org.apache.commons.io.IOUtils; import org.apache.wicket.Application; import org.apache.wicket.Page; @@ -40,16 +38,14 @@ import org.apache.wicket.request.http.WebResponse; import org.apache.wicket.request.http.handler.RedirectRequestHandler; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.request.resource.CssPackageResource; +import org.apache.wicket.request.resource.CssResourceReference; import org.apache.wicket.request.resource.JavaScriptResourceReference; -import org.apache.wicket.markup.html.CSSPackageResource; +import org.apache.wicket.markup.head.CssHeaderItem; +import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.ExternalLink; import org.apache.wicket.markup.html.panel.FeedbackPanel; -import org.apache.wicket.markup.html.resources.JavascriptResourceReference; import org.apache.wicket.markup.repeater.RepeatingView; -import org.apache.wicket.protocol.http.RequestUtils; -import org.apache.wicket.protocol.http.servlet.ServletWebRequest; import org.apache.wicket.util.time.Duration; import org.apache.wicket.util.time.Time; import org.slf4j.Logger; @@ -74,18 +70,20 @@ public abstract class BasePage extends SessionPage { + private static final long serialVersionUID = 1L; + private transient Logger logger; private transient TimeUtils timeUtils; public BasePage() { super(); - customizeHeader(); +// customizeHeader(); } public BasePage(PageParameters params) { super(params); - customizeHeader(); +// customizeHeader(); } protected Logger logger() { @@ -95,12 +93,25 @@ protected Logger logger() { return logger; } - private void customizeHeader() { +// private void customizeHeader() { +// if (app().settings().getBoolean(Keys.web.useResponsiveLayout, true)) { +// add(CssPackageResource.getHeaderContribution("bootstrap/css/bootstrap-responsive.css")); +// } +// if (app().settings().getBoolean(Keys.web.hideHeader, false)) { +// add(CssPackageResource.getHeaderContribution("hideheader.css")); +// } +// } + + @Override + public void renderHead(IHeaderResponse response) { + super.renderHead(response); if (app().settings().getBoolean(Keys.web.useResponsiveLayout, true)) { - add(CssPackageResource.getHeaderContribution("bootstrap/css/bootstrap-responsive.css")); +// add(CssPackageResource.getHeaderContribution("bootstrap/css/bootstrap-responsive.css")); + response.render(CssHeaderItem.forReference(new CssResourceReference(Application.class, "bootstrap/css/bootstrap-responsive.css"))); } if (app().settings().getBoolean(Keys.web.hideHeader, false)) { - add(CssPackageResource.getHeaderContribution("hideheader.css")); +// add(CssPackageResource.getHeaderContribution("hideheader.css")); + response.render(CssHeaderItem.forReference(new CssResourceReference(Application.class, "hideheader.css"))); } } @@ -525,7 +536,7 @@ private RepeatingView getBottomScriptContainer() { protected void addBottomScript(String scriptPath) { RepeatingView bottomScripts = getBottomScriptContainer(); Label script = new Label(bottomScripts.newChildId(), "\n"); + + urlFor(new JavaScriptResourceReference(this.getClass(), scriptPath), null) + "'>\n"); bottomScripts.add(script.setEscapeModelStrings(false).setRenderBodyOnly(true)); } diff --git a/src/main/java/com/gitblit/wicket/pages/BlobPage.java b/src/main/java/com/gitblit/wicket/pages/BlobPage.java index a25068db7..0c9bc626d 100644 --- a/src/main/java/com/gitblit/wicket/pages/BlobPage.java +++ b/src/main/java/com/gitblit/wicket/pages/BlobPage.java @@ -127,7 +127,7 @@ public BlobPage(PageParameters params) { case 3: // binary blobs add(new Label("blobText", "Binary File")); - add(new Image("blobImage").setVisible(false)); + add(new Image("blobImage", "blobImage").setVisible(false)); break; default: // plain text @@ -140,7 +140,7 @@ public BlobPage(PageParameters params) { addBottomScriptInline("jQuery(prettyPrint);"); } add(new Label("blobText", table).setEscapeModelStrings(false)); - add(new Image("blobImage").setVisible(false)); + add(new Image("blobImage", "blobImage").setVisible(false)); fileExtension = extension; } } else { @@ -154,7 +154,7 @@ public BlobPage(PageParameters params) { addBottomScriptInline("jQuery(prettyPrint);"); } add(new Label("blobText", table).setEscapeModelStrings(false)); - add(new Image("blobImage").setVisible(false)); + add(new Image("blobImage", "blobImage").setVisible(false)); } } } diff --git a/src/main/java/com/gitblit/wicket/pages/ChangePasswordPage.java b/src/main/java/com/gitblit/wicket/pages/ChangePasswordPage.java index 8c91ac305..95850c638 100644 --- a/src/main/java/com/gitblit/wicket/pages/ChangePasswordPage.java +++ b/src/main/java/com/gitblit/wicket/pages/ChangePasswordPage.java @@ -33,6 +33,8 @@ public class ChangePasswordPage extends RootSubPage { + private static final long serialVersionUID = 1L; + IModel password = new Model(""); IModel confirmPassword = new Model(""); @@ -106,7 +108,6 @@ public void onSubmit() { error(e.getMessage()); return; } - setRedirect(false); info(getString("gb.passwordChanged")); setResponsePage(RepositoriesPage.class); } @@ -125,7 +126,6 @@ public void onSubmit() { @Override public void onSubmit() { - setRedirect(false); error(getString("gb.passwordChangeAborted")); setResponsePage(RepositoriesPage.class); } diff --git a/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java index b7b3d8179..355867b63 100644 --- a/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java +++ b/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java @@ -79,6 +79,8 @@ public class EditRepositoryPage extends RootSubPage { + private static final long serialVersionUID = 1L; + private final boolean isCreate; RepositoryNamePanel namePanel; @@ -388,7 +390,6 @@ protected void onSubmit() { error(e.getMessage()); return; } - setRedirect(false); setResponsePage(SummaryPage.class, WicketUtils.newRepositoryParameter(repositoryModel.name)); } }; diff --git a/src/main/java/com/gitblit/wicket/pages/EditTeamPage.java b/src/main/java/com/gitblit/wicket/pages/EditTeamPage.java index 8c735a5de..2346ce138 100644 --- a/src/main/java/com/gitblit/wicket/pages/EditTeamPage.java +++ b/src/main/java/com/gitblit/wicket/pages/EditTeamPage.java @@ -208,7 +208,6 @@ protected void onSubmit() { error(e.getMessage()); return; } - setRedirect(false); if (isCreate) { // create another team info(MessageFormat.format(getString("gb.teamCreated"), diff --git a/src/main/java/com/gitblit/wicket/pages/EditUserPage.java b/src/main/java/com/gitblit/wicket/pages/EditUserPage.java index af37af7f0..9cdb4c953 100644 --- a/src/main/java/com/gitblit/wicket/pages/EditUserPage.java +++ b/src/main/java/com/gitblit/wicket/pages/EditUserPage.java @@ -203,7 +203,6 @@ protected void onSubmit() { error(e.getMessage()); return; } - setRedirect(false); if (isCreate) { // create another user info(MessageFormat.format(getString("gb.userCreated"), diff --git a/src/main/java/com/gitblit/wicket/pages/EmptyRepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/EmptyRepositoryPage.java index 7c9a46b37..d1d77aa75 100644 --- a/src/main/java/com/gitblit/wicket/pages/EmptyRepositoryPage.java +++ b/src/main/java/com/gitblit/wicket/pages/EmptyRepositoryPage.java @@ -33,6 +33,8 @@ public class EmptyRepositoryPage extends RepositoryPage { + private static final long serialVersionUID = 1L; + public EmptyRepositoryPage(PageParameters params) { super(params); diff --git a/src/main/java/com/gitblit/wicket/pages/ExportTicketPage.java b/src/main/java/com/gitblit/wicket/pages/ExportTicketPage.java index 3d63550b0..c60f83a39 100644 --- a/src/main/java/com/gitblit/wicket/pages/ExportTicketPage.java +++ b/src/main/java/com/gitblit/wicket/pages/ExportTicketPage.java @@ -15,12 +15,10 @@ */ package com.gitblit.wicket.pages; -import org.apache.wicket.request.cycle.RequestCycle; +import org.apache.wicket.request.IRequestCycle; +import org.apache.wicket.request.IRequestHandler; import org.apache.wicket.request.http.WebResponse; -//import org.apache.wicket.IRequestTarget; import org.apache.wicket.request.mapper.parameter.PageParameters; -//import org.apache.wicket.RequestCycle; -//import org.apache.wicket.protocol.http.WebResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,6 +30,8 @@ public class ExportTicketPage extends SessionPage { + private static final long serialVersionUID = 1L; + private final Logger logger = LoggerFactory.getLogger(getClass().getSimpleName()); String contentType; @@ -44,13 +44,10 @@ public ExportTicketPage(final PageParameters params) { redirectToInterceptPage(new RepositoriesPage()); } - getRequestCycle().setRequestTarget(new IRequestTarget() { - @Override - public void detach(RequestCycle requestCycle) { - } - + getRequestCycle().scheduleRequestHandlerAfterCurrent(new IRequestHandler() { + @Override - public void respond(RequestCycle requestCycle) { + public void respond(IRequestCycle requestCycle) { WebResponse response = (WebResponse) requestCycle.getResponse(); final String repositoryName = WicketUtils.getRepositoryName(params); @@ -71,6 +68,12 @@ public void respond(RequestCycle requestCycle) { logger.error("Failed to write text response", e); } } + + @Override + public void detach(IRequestCycle requestCycle) { + // TODO Auto-generated method stub + + } }); } diff --git a/src/main/java/com/gitblit/wicket/pages/ImageDiffHandler.java b/src/main/java/com/gitblit/wicket/pages/ImageDiffHandler.java index bdd33b9c2..29e308d58 100644 --- a/src/main/java/com/gitblit/wicket/pages/ImageDiffHandler.java +++ b/src/main/java/com/gitblit/wicket/pages/ImageDiffHandler.java @@ -15,11 +15,10 @@ */ package com.gitblit.wicket.pages; -import java.nio.charset.StandardCharsets; import java.util.List; -import org.apache.wicket.protocol.http.WebApplication; -import org.apache.wicket.util.encoding.UrlDecoder; +import org.apache.wicket.request.Url; +import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.util.encoding.UrlEncoder; import org.eclipse.jgit.diff.DiffEntry; import org.eclipse.jgit.diff.DiffEntry.Side; @@ -147,8 +146,8 @@ protected String getImageUrl(DiffEntry entry, Side side) { * Returns a URL that will fetch the designated static resource from within GitBlit. */ protected String getStaticResourceUrl(String contextRelativePath) { - return WebApplication.get().getRequestCycleProcessor().getRequestCodingStrategy().rewriteStaticRelativeUrl(contextRelativePath); - } + return RequestCycle.get().getUrlRenderer().renderFullUrl(Url.parse(contextRelativePath)); + } /** * Encode a URL component of a {@link RawServlet} URL in the special way that the servlet expects it. Note that diff --git a/src/main/java/com/gitblit/wicket/pages/LogoutPage.java b/src/main/java/com/gitblit/wicket/pages/LogoutPage.java index 92d3d623b..e9f6bde3b 100644 --- a/src/main/java/com/gitblit/wicket/pages/LogoutPage.java +++ b/src/main/java/com/gitblit/wicket/pages/LogoutPage.java @@ -42,7 +42,6 @@ public LogoutPage() { setupPage(null, getString("gb.logout")); } else { -// setRedirect(true); // setResponsePage(getApplication().getHomePage()); throw new RestartResponseException(getApplication().getHomePage()); } // not via WWW-Auth diff --git a/src/main/java/com/gitblit/wicket/pages/MyTicketsPage.java b/src/main/java/com/gitblit/wicket/pages/MyTicketsPage.java index a8fcb8a61..70ab1d2f3 100644 --- a/src/main/java/com/gitblit/wicket/pages/MyTicketsPage.java +++ b/src/main/java/com/gitblit/wicket/pages/MyTicketsPage.java @@ -23,6 +23,7 @@ import java.util.List; import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.util.string.StringValue; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.repeater.Item; @@ -56,7 +57,9 @@ */ public class MyTicketsPage extends RootPage { - public MyTicketsPage() { + private static final long serialVersionUID = 1L; + + public MyTicketsPage() { this(null); } @@ -66,14 +69,13 @@ public MyTicketsPage(PageParameters params) { UserModel currentUser = GitBlitWebSession.get().getUser(); if (currentUser == null || UserModel.ANONYMOUS.equals(currentUser)) { - setRedirect(true); setResponsePage(getApplication().getHomePage()); return; } final String username = currentUser.getName(); - final String[] statiiParam = (params == null) ? TicketsUI.openStatii : params.getStringArray(Lucene.status.name()); + final String[] statiiParam = (params == null) ? TicketsUI.openStatii : (String[]) params.getValues(Lucene.status.name()).stream().map(StringValue::toString).toArray(); final String assignedToParam = (params == null) ? "" : params.get(Lucene.responsible.name()).toString(); final String milestoneParam = (params == null) ? "" : params.get(Lucene.milestone.name()).toString(); final String queryParam = (params == null) ? null : params.get("q").toString(); diff --git a/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java index b9e9f871e..bf897de36 100644 --- a/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java +++ b/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java @@ -145,7 +145,6 @@ protected void onSubmit() { error(e.getMessage()); return; } - setRedirect(true); setResponsePage(SummaryPage.class, WicketUtils.newRepositoryParameter(repositoryModel.name)); } }; diff --git a/src/main/java/com/gitblit/wicket/pages/RawPage.java b/src/main/java/com/gitblit/wicket/pages/RawPage.java index 10c98fcdd..310d928bd 100644 --- a/src/main/java/com/gitblit/wicket/pages/RawPage.java +++ b/src/main/java/com/gitblit/wicket/pages/RawPage.java @@ -24,8 +24,8 @@ import javax.servlet.http.HttpServletResponse; -import org.apache.wicket.request.cycle.RequestCycle; -import org.apache.wicket.request.http.WebRequest; +import org.apache.wicket.request.IRequestCycle; +import org.apache.wicket.request.IRequestHandler; import org.apache.wicket.request.http.WebResponse; import org.apache.wicket.request.http.flow.AbortWithHttpErrorCodeException; import org.apache.wicket.request.mapper.parameter.PageParameters; @@ -46,6 +46,8 @@ public class RawPage extends SessionPage { + private static final long serialVersionUID = 1L; + private final Logger logger = LoggerFactory.getLogger(getClass().getSimpleName()); String contentType; @@ -58,13 +60,10 @@ public RawPage(final PageParameters params) { redirectToInterceptPage(new RepositoriesPage()); } - getRequestCycle().setRequestTarget(new IRequestTarget() { - @Override - public void detach(RequestCycle requestCycle) { - } + getRequestCycle().scheduleRequestHandlerAfterCurrent(new IRequestHandler() { @Override - public void respond(RequestCycle requestCycle) { + public void respond(IRequestCycle requestCycle) { WebResponse response = (WebResponse) requestCycle.getResponse(); final String repositoryName = WicketUtils.getRepositoryName(params); @@ -173,7 +172,6 @@ public void respond(RequestCycle requestCycle) { response.setContentType(contentType); try { - WebRequest request = (WebRequest) requestCycle.getRequest(); String userAgent = GitBlitRequestUtils.getServletRequest().getHeader("User-Agent"); if (userAgent != null && userAgent.indexOf("MSIE 5.5") > -1) { @@ -233,7 +231,15 @@ public void respond(RequestCycle requestCycle) { } r.close(); } + + @Override + public void detach(IRequestCycle requestCycle) { + // TODO Auto-generated method stub + + } + }); + } @Override diff --git a/src/main/java/com/gitblit/wicket/pages/RootSubPage.java b/src/main/java/com/gitblit/wicket/pages/RootSubPage.java index 40ccfda98..76111dbac 100644 --- a/src/main/java/com/gitblit/wicket/pages/RootSubPage.java +++ b/src/main/java/com/gitblit/wicket/pages/RootSubPage.java @@ -57,7 +57,8 @@ protected void createPageMapIfNeeded() { // Wicket seems to get confused as to when it really should // generate a page map for complex pages. Conditionally ensure we // have a page map for complex AJAX pages like the EditNNN pages. - Session.get().pageMapForName(null, true); + //TODO: check if no longer needed +// Session.get().pageMapForName(null, true); setVersioned(true); } } diff --git a/src/main/java/com/gitblit/wicket/pages/UserPage.java b/src/main/java/com/gitblit/wicket/pages/UserPage.java index 39235acbb..284970ff5 100644 --- a/src/main/java/com/gitblit/wicket/pages/UserPage.java +++ b/src/main/java/com/gitblit/wicket/pages/UserPage.java @@ -291,7 +291,6 @@ protected void onSubmit(AjaxRequestTarget target, Form form) { try { app().gitblit().reviseUser(user.username, user); - setRedirect(true); setResponsePage(UserPage.class, WicketUtils.newUsernameParameter(user.username)); } catch (GitBlitException e) { // logger.error("Failed to update user " + user.username, e); From 384c08e26f6110c3f35db2f21ef73fe1eae23dd7 Mon Sep 17 00:00:00 2001 From: Martin Spielmann Date: Sun, 31 Jul 2016 00:52:10 +0200 Subject: [PATCH 18/25] mount flotr and bootstrap --- .classpath | 2 +- src/main/java/com/gitblit/Constants.java | 3 +- .../com/gitblit/wicket/GitBlitWebApp.java | 165 +- .../gitblit/wicket/charting/Flotr2Charts.java | 15 +- .../wicket/charting}/flotr2.custom.css | 0 .../gitblit/wicket/charting}/flotr2.min.js | 0 .../com/gitblit/wicket/pages/BasePage.html | 5 +- .../com/gitblit/wicket/pages/BasePage.java | 49 +- .../com/gitblit/wicket/pages/RootPage.java | 4 +- .../wicket/resources/bootstrap/Bootstrap.java | 36 + .../bootstrap/css/bootstrap-responsive.css | 810 +++ .../resources/bootstrap/css/bootstrap.css | 4983 +++++++++++++++++ .../wicket/resources/bootstrap/css/iconic.css | 567 ++ .../resources/bootstrap/font/iconic_fill.afm | 170 + .../resources/bootstrap/font/iconic_fill.css | 1 + .../resources/bootstrap/font/iconic_fill.eot | Bin 0 -> 30846 bytes .../resources/bootstrap/font/iconic_fill.otf | Bin 0 -> 44808 bytes .../resources/bootstrap/font/iconic_fill.svg | 539 ++ .../resources/bootstrap/font/iconic_fill.ttf | Bin 0 -> 18080 bytes .../resources/bootstrap/font/iconic_fill.woff | Bin 0 -> 20560 bytes .../bootstrap/font/iconic_stroke.afm | 170 + .../bootstrap/font/iconic_stroke.css | 1 + .../bootstrap/font/iconic_stroke.eot | Bin 0 -> 32026 bytes .../bootstrap/font/iconic_stroke.otf | Bin 0 -> 46916 bytes .../bootstrap/font/iconic_stroke.svg | 553 ++ .../bootstrap/font/iconic_stroke.ttf | Bin 0 -> 18644 bytes .../bootstrap/font/iconic_stroke.woff | Bin 0 -> 21484 bytes .../img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes .../bootstrap/img/glyphicons-halflings.png | Bin 0 -> 13826 bytes .../resources/bootstrap/js/bootstrap.js | 1825 ++++++ src/main/resources/bootstrap/js/jquery.js | 4 - 31 files changed, 9804 insertions(+), 98 deletions(-) rename src/main/{resources/flotr2 => java/com/gitblit/wicket/charting}/flotr2.custom.css (100%) rename src/main/{resources/flotr2 => java/com/gitblit/wicket/charting}/flotr2.min.js (100%) create mode 100644 src/main/java/com/gitblit/wicket/resources/bootstrap/Bootstrap.java create mode 100644 src/main/java/com/gitblit/wicket/resources/bootstrap/css/bootstrap-responsive.css create mode 100644 src/main/java/com/gitblit/wicket/resources/bootstrap/css/bootstrap.css create mode 100644 src/main/java/com/gitblit/wicket/resources/bootstrap/css/iconic.css create mode 100644 src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.afm create mode 100644 src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.css create mode 100644 src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.eot create mode 100644 src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.otf create mode 100644 src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.svg create mode 100644 src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.ttf create mode 100644 src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.woff create mode 100644 src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.afm create mode 100644 src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.css create mode 100644 src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.eot create mode 100644 src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.otf create mode 100644 src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.svg create mode 100644 src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.ttf create mode 100644 src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.woff create mode 100644 src/main/java/com/gitblit/wicket/resources/bootstrap/img/glyphicons-halflings-white.png create mode 100644 src/main/java/com/gitblit/wicket/resources/bootstrap/img/glyphicons-halflings.png create mode 100644 src/main/java/com/gitblit/wicket/resources/bootstrap/js/bootstrap.js delete mode 100644 src/main/resources/bootstrap/js/jquery.js diff --git a/.classpath b/.classpath index d531303bd..3b0082233 100644 --- a/.classpath +++ b/.classpath @@ -112,7 +112,7 @@ - + diff --git a/src/main/java/com/gitblit/Constants.java b/src/main/java/com/gitblit/Constants.java index 6232552e1..9c5291ac1 100644 --- a/src/main/java/com/gitblit/Constants.java +++ b/src/main/java/com/gitblit/Constants.java @@ -19,6 +19,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; import java.util.jar.Attributes; @@ -89,7 +90,7 @@ public class Constants { public static final String PROPOSAL_EXT = ".json"; - public static final String ENCODING = "UTF-8"; + public static final String ENCODING = StandardCharsets.UTF_8.name(); public static final int LEN_SHORTLOG = 78; diff --git a/src/main/java/com/gitblit/wicket/GitBlitWebApp.java b/src/main/java/com/gitblit/wicket/GitBlitWebApp.java index 662daa7b8..23479e916 100644 --- a/src/main/java/com/gitblit/wicket/GitBlitWebApp.java +++ b/src/main/java/com/gitblit/wicket/GitBlitWebApp.java @@ -15,24 +15,45 @@ */ package com.gitblit.wicket; +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.time.Instant; import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.TimeZone; +import java.util.stream.Collectors; +import org.apache.commons.io.IOUtils; +import org.apache.sshd.server.ServerBuilder; import org.apache.wicket.RuntimeConfigurationType; import org.apache.wicket.Session; import org.apache.wicket.application.IClassResolver; +import org.apache.wicket.core.util.file.WebApplicationPath; +import org.apache.wicket.core.util.resource.ClassPathResourceFinder; +import org.apache.wicket.core.util.resource.UrlResourceStream; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.protocol.http.WebApplication; import org.apache.wicket.request.Request; import org.apache.wicket.request.Response; +import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.request.resource.IResource; +import org.apache.wicket.request.resource.ResourceReference; +import org.apache.wicket.request.resource.SharedResourceReference; +import org.apache.wicket.request.resource.IResource.Attributes; +import org.apache.wicket.request.resource.PackageResourceReference; +import org.apache.wicket.util.file.IResourceFinder; +import org.apache.wicket.util.resource.IResourceStream; +import org.apache.wicket.util.string.StringValue; import org.apache.wicket.util.time.Duration; import ro.fortsoft.pf4j.PluginState; import ro.fortsoft.pf4j.PluginWrapper; +import com.gitblit.Constants; import com.gitblit.IStoredSettings; import com.gitblit.Keys; import com.gitblit.extensions.GitblitWicketPlugin; @@ -95,6 +116,7 @@ import com.gitblit.wicket.pages.TreePage; import com.gitblit.wicket.pages.UserPage; import com.gitblit.wicket.pages.UsersPage; +import com.gitblit.wicket.resources.bootstrap.Bootstrap; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; @@ -135,24 +157,18 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp { private final IGitblit gitblit; private final IServicesManager services; - + private final IFilestoreManager filestoreManager; + private static final Instant APPLICATION_STARTUP_TIME = Instant.now(); + @Inject - public GitBlitWebApp( - Provider publicKeyManagerProvider, - Provider ticketServiceProvider, - IRuntimeManager runtimeManager, - IPluginManager pluginManager, - INotificationManager notificationManager, - IUserManager userManager, - IAuthenticationManager authenticationManager, - IRepositoryManager repositoryManager, - IProjectManager projectManager, - IFederationManager federationManager, - IGitblit gitblit, - IServicesManager services, - IFilestoreManager filestoreManager) { + public GitBlitWebApp(Provider publicKeyManagerProvider, + Provider ticketServiceProvider, IRuntimeManager runtimeManager, + IPluginManager pluginManager, INotificationManager notificationManager, IUserManager userManager, + IAuthenticationManager authenticationManager, IRepositoryManager repositoryManager, + IProjectManager projectManager, IFederationManager federationManager, IGitblit gitblit, + IServicesManager services, IFilestoreManager filestoreManager) { super(); this.publicKeyManagerProvider = publicKeyManagerProvider; @@ -247,10 +263,12 @@ public void init() { mount("/user", UserPage.class, "user"); mount("/forks", ForksPage.class, "r"); mount("/fork", ForkPage.class, "r"); - + // filestore URL mount("/filestore", FilestorePage.class); + Bootstrap.install(this); + // allow started Wicket plugins to initialize for (PluginWrapper pluginWrapper : pluginManager.getPlugins()) { if (PluginState.STARTED != pluginWrapper.getPluginState()) { @@ -262,16 +280,19 @@ public void init() { } } - // customize the Wicket class resolver to load from plugins + // customize the Wicket class resolver to load from plugins IClassResolver coreResolver = getApplicationSettings().getClassResolver(); - PluginClassResolver classResolver = new PluginClassResolver(coreResolver, pluginManager); - getApplicationSettings().setClassResolver(classResolver); + PluginClassResolver classResolver = new PluginClassResolver(coreResolver, pluginManager); + getApplicationSettings().setClassResolver(classResolver); - getMarkupSettings().setDefaultMarkupEncoding("UTF-8"); + getMarkupSettings().setDefaultMarkupEncoding(Constants.ENCODING); } - /* (non-Javadoc) - * @see com.gitblit.wicket.Webapp#mount(java.lang.String, java.lang.Class, java.lang.String) + /* + * (non-Javadoc) + * + * @see com.gitblit.wicket.Webapp#mount(java.lang.String, java.lang.Class, + * java.lang.String) */ @Override public void mount(String location, Class clazz, String... parameters) { @@ -281,11 +302,11 @@ public void mount(String location, Class clazz, String... par if (!settings.getBoolean(Keys.web.mountParameters, true)) { parameters = new String[] {}; } - //TODO: check if needed with wichet-7 -// mount(new GitblitParamUrlCodingStrategy(settings, xssFilter, location, clazz, parameters)); + // TODO: check if needed with wichet-7 + // mount(new GitblitParamUrlCodingStrategy(settings, xssFilter, + // location, clazz, parameters)); mountPage(location, clazz); - - + // map the mount point to the cache control definition if (clazz.isAnnotationPresent(CacheControl.class)) { CacheControl cacheControl = clazz.getAnnotation(CacheControl.class); @@ -293,7 +314,9 @@ public void mount(String location, Class clazz, String... par } } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.gitblit.wicket.Webapp#getHomePage() */ @Override @@ -305,7 +328,9 @@ public Class getNewRepositoryPage() { return newRepositoryPageClass; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.gitblit.wicket.Webapp#isCacheablePage(java.lang.String) */ @Override @@ -313,7 +338,9 @@ public boolean isCacheablePage(String mountPoint) { return cacheablePages.containsKey(mountPoint); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.gitblit.wicket.Webapp#getCacheControl(java.lang.String) */ @Override @@ -332,7 +359,9 @@ public final Session newSession(Request request, Response response) { return gitBlitWebSession; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.gitblit.wicket.Webapp#settings() */ @Override @@ -340,7 +369,9 @@ public IStoredSettings settings() { return settings; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.gitblit.wicket.Webapp#xssFilter() */ @Override @@ -348,7 +379,9 @@ public XssFilter xssFilter() { return xssFilter; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.gitblit.wicket.Webapp#isDebugMode() */ @Override @@ -357,10 +390,12 @@ public boolean isDebugMode() { } /* - * These methods look strange... and they are... but they are the first - * step towards modularization across multiple commits. + * These methods look strange... and they are... but they are the first step + * towards modularization across multiple commits. */ - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.gitblit.wicket.Webapp#getBootDate() */ @Override @@ -368,7 +403,9 @@ public Date getBootDate() { return runtimeManager.getBootDate(); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.gitblit.wicket.Webapp#getLastActivityDate() */ @Override @@ -376,7 +413,9 @@ public Date getLastActivityDate() { return repositoryManager.getLastActivityDate(); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.gitblit.wicket.Webapp#runtime() */ @Override @@ -384,7 +423,9 @@ public IRuntimeManager runtime() { return runtimeManager; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.gitblit.wicket.Webapp#plugins() */ @Override @@ -392,7 +433,9 @@ public IPluginManager plugins() { return pluginManager; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.gitblit.wicket.Webapp#notifier() */ @Override @@ -400,7 +443,9 @@ public INotificationManager notifier() { return notificationManager; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.gitblit.wicket.Webapp#users() */ @Override @@ -408,7 +453,9 @@ public IUserManager users() { return userManager; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.gitblit.wicket.Webapp#authentication() */ @Override @@ -416,7 +463,9 @@ public IAuthenticationManager authentication() { return authenticationManager; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.gitblit.wicket.Webapp#keys() */ @Override @@ -424,7 +473,9 @@ public IPublicKeyManager keys() { return publicKeyManagerProvider.get(); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.gitblit.wicket.Webapp#repositories() */ @Override @@ -432,7 +483,9 @@ public IRepositoryManager repositories() { return repositoryManager; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.gitblit.wicket.Webapp#projects() */ @Override @@ -440,7 +493,9 @@ public IProjectManager projects() { return projectManager; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.gitblit.wicket.Webapp#federation() */ @Override @@ -448,7 +503,9 @@ public IFederationManager federation() { return federationManager; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.gitblit.wicket.Webapp#gitblit() */ @Override @@ -456,7 +513,9 @@ public IGitblit gitblit() { return gitblit; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.gitblit.wicket.Webapp#services() */ @Override @@ -464,7 +523,9 @@ public IServicesManager services() { return services; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.gitblit.wicket.Webapp#tickets() */ @Override @@ -472,7 +533,9 @@ public ITicketService tickets() { return ticketServiceProvider.get(); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see com.gitblit.wicket.Webapp#getTimezone() */ @Override @@ -480,6 +543,10 @@ public TimeZone getTimezone() { return runtimeManager.getTimezone(); } + public Instant getApplicationStartupTime() { + return APPLICATION_STARTUP_TIME; + } + @Override public final RuntimeConfigurationType getConfigurationType() { if (runtimeManager.isDebugMode()) { diff --git a/src/main/java/com/gitblit/wicket/charting/Flotr2Charts.java b/src/main/java/com/gitblit/wicket/charting/Flotr2Charts.java index f6b994263..ba31831cd 100644 --- a/src/main/java/com/gitblit/wicket/charting/Flotr2Charts.java +++ b/src/main/java/com/gitblit/wicket/charting/Flotr2Charts.java @@ -18,12 +18,11 @@ import javax.servlet.ServletContext; import org.apache.wicket.Component; +import org.apache.wicket.markup.head.CssHeaderItem; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.head.JavaScriptHeaderItem; import org.apache.wicket.markup.head.OnDomReadyHeaderItem; -import org.apache.wicket.protocol.http.WebApplication; -import org.apache.wicket.request.resource.ContextRelativeResource; -import org.apache.wicket.request.resource.ContextRelativeResourceReference; +import org.apache.wicket.request.resource.PackageResourceReference; /** * Concrete class for Flotr2 charts @@ -39,17 +38,12 @@ public class Flotr2Charts extends Charts { public void renderHead(Component component, IHeaderResponse response) { // add Google Chart JS API reference - ServletContext servletContext = WebApplication.get().getServletContext(); - String contextPath = servletContext.getContextPath(); - - response.render(JavaScriptHeaderItem.forReference(new ContextRelativeResourceReference(contextPath + "/bootstrap/js/jquery.js", false))); - response.render(JavaScriptHeaderItem.forReference(new ContextRelativeResourceReference(contextPath + "/flotr2/flotr2.min.js", false))); - response.render(JavaScriptHeaderItem.forReference(new ContextRelativeResourceReference(contextPath + "/flotr2/flotr2.custom.css", false))); + response.render(JavaScriptHeaderItem.forReference(new PackageResourceReference(Flotr2Charts.class, "flotr2.min.js"))); + response.render(CssHeaderItem.forReference(new PackageResourceReference(Flotr2Charts.class, "flotr2.custom.css"))); // prepare draw chart function StringBuilder sb = new StringBuilder(); -// line(sb, "$( document ).ready(function() {"); line(sb, "try {"); // add charts to header for (Chart chart : charts) { @@ -62,7 +56,6 @@ public void renderHead(Component component, IHeaderResponse response) { line(sb, " }"); line(sb, "}"); // end draw chart function -// line(sb, "});"); response.render(OnDomReadyHeaderItem.forScript(sb.toString())); } diff --git a/src/main/resources/flotr2/flotr2.custom.css b/src/main/java/com/gitblit/wicket/charting/flotr2.custom.css similarity index 100% rename from src/main/resources/flotr2/flotr2.custom.css rename to src/main/java/com/gitblit/wicket/charting/flotr2.custom.css diff --git a/src/main/resources/flotr2/flotr2.min.js b/src/main/java/com/gitblit/wicket/charting/flotr2.min.js similarity index 100% rename from src/main/resources/flotr2/flotr2.min.js rename to src/main/java/com/gitblit/wicket/charting/flotr2.min.js diff --git a/src/main/java/com/gitblit/wicket/pages/BasePage.html b/src/main/java/com/gitblit/wicket/pages/BasePage.html index b998428c5..fe9cc4819 100644 --- a/src/main/java/com/gitblit/wicket/pages/BasePage.html +++ b/src/main/java/com/gitblit/wicket/pages/BasePage.html @@ -7,11 +7,10 @@ - + [page title] - @@ -49,7 +48,7 @@ - + diff --git a/src/main/java/com/gitblit/wicket/pages/BasePage.java b/src/main/java/com/gitblit/wicket/pages/BasePage.java index 887edac6f..0c35bb4b0 100644 --- a/src/main/java/com/gitblit/wicket/pages/BasePage.java +++ b/src/main/java/com/gitblit/wicket/pages/BasePage.java @@ -38,7 +38,7 @@ import org.apache.wicket.request.http.WebResponse; import org.apache.wicket.request.http.handler.RedirectRequestHandler; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.request.resource.CssResourceReference; +import org.apache.wicket.request.resource.ContextRelativeResourceReference; import org.apache.wicket.request.resource.JavaScriptResourceReference; import org.apache.wicket.markup.head.CssHeaderItem; import org.apache.wicket.markup.head.IHeaderResponse; @@ -78,12 +78,12 @@ public abstract class BasePage extends SessionPage { public BasePage() { super(); -// customizeHeader(); + // customizeHeader(); } public BasePage(PageParameters params) { super(params); -// customizeHeader(); + // customizeHeader(); } protected Logger logger() { @@ -93,25 +93,15 @@ protected Logger logger() { return logger; } -// private void customizeHeader() { -// if (app().settings().getBoolean(Keys.web.useResponsiveLayout, true)) { -// add(CssPackageResource.getHeaderContribution("bootstrap/css/bootstrap-responsive.css")); -// } -// if (app().settings().getBoolean(Keys.web.hideHeader, false)) { -// add(CssPackageResource.getHeaderContribution("hideheader.css")); -// } -// } - @Override public void renderHead(IHeaderResponse response) { super.renderHead(response); if (app().settings().getBoolean(Keys.web.useResponsiveLayout, true)) { -// add(CssPackageResource.getHeaderContribution("bootstrap/css/bootstrap-responsive.css")); - response.render(CssHeaderItem.forReference(new CssResourceReference(Application.class, "bootstrap/css/bootstrap-responsive.css"))); + response.render(CssHeaderItem.forReference( + new ContextRelativeResourceReference("/bootstrap/css/bootstrap-responsive.css", false))); } if (app().settings().getBoolean(Keys.web.hideHeader, false)) { -// add(CssPackageResource.getHeaderContribution("hideheader.css")); - response.render(CssHeaderItem.forReference(new CssResourceReference(Application.class, "hideheader.css"))); + response.render(CssHeaderItem.forReference(new ContextRelativeResourceReference("/hideheader.css", false))); } } @@ -148,7 +138,8 @@ protected TimeUtils getTimeUtils() { if (timeUtils == null) { ResourceBundle bundle; try { - bundle = ResourceBundle.getBundle("com.gitblit.wicket.GitBlitWebApp", GitBlitWebSession.get().getLocale()); + bundle = ResourceBundle.getBundle("com.gitblit.wicket.GitBlitWebApp", + GitBlitWebSession.get().getLocale()); } catch (Throwable t) { bundle = ResourceBundle.getBundle("com.gitblit.wicket.GitBlitWebApp"); } @@ -176,7 +167,7 @@ protected void onAfterRender() { } @Override - protected void setHeaders(WebResponse response) { + protected void setHeaders(WebResponse response) { // set canonical link as http header for SEO (issue-304) // https://support.google.com/webmasters/answer/139394?hl=en response.setHeader("Link", MessageFormat.format("<{0}>; rel=\"canonical\"", getCanonicalUrl())); @@ -196,7 +187,7 @@ protected void setHeaders(WebResponse response) { } /** - * Sets the last-modified header date, if appropriate, for this page. The + * Sets the last-modified header date, if appropriate, for this page. The * date used is determined by the CacheControl annotation. * */ @@ -239,7 +230,8 @@ protected final void setLastModified(Date when) { int expires = app().settings().getInteger(Keys.web.pageCacheExpires, 0); WebResponse response = (WebResponse) getResponse(); response.setLastModifiedTime(Time.valueOf(when)); - response.addHeader("Expires", String.valueOf(System.currentTimeMillis() + Duration.minutes(expires).getMilliseconds())); + response.addHeader("Expires", + String.valueOf(System.currentTimeMillis() + Duration.minutes(expires).getMilliseconds())); } protected String getPageTitle(String repositoryName) { @@ -257,7 +249,8 @@ protected String getPageTitle(String repositoryName) { protected void setupPage(String repositoryName, String pageName) { add(new Label("title", getPageTitle(repositoryName))); getBottomScriptContainer(); - String rootLinkUrl = app().settings().getString(Keys.web.rootLink, urlFor(GitBlitWebApp.get().getHomePage(), null).toString()); + String rootLinkUrl = app().settings().getString(Keys.web.rootLink, + urlFor(GitBlitWebApp.get().getHomePage(), null).toString()); ExternalLink rootLink = new ExternalLink("rootLink", rootLinkUrl); WicketUtils.setHtmlTooltip(rootLink, app().settings().getString(Keys.web.siteName, Constants.NAME)); add(rootLink); @@ -359,8 +352,8 @@ protected Map getAuthorizationControls() { } protected TimeZone getTimeZone() { - return app().settings().getBoolean(Keys.web.useClientTimezone, false) ? GitBlitWebSession.get() - .getTimezone() : app().getTimezone(); + return app().settings().getBoolean(Keys.web.useClientTimezone, false) ? GitBlitWebSession.get().getTimezone() + : app().getTimezone(); } protected String getServerName() { @@ -472,9 +465,9 @@ public void error(String message, Throwable t, Class toPage) { public void error(String message, Throwable t, Class toPage, PageParameters params) { if (t == null) { - logger().error(message + " for " + GitBlitWebSession.get().getUsername()); + logger().error(message + " for " + GitBlitWebSession.get().getUsername()); } else { - logger().error(message + " for " + GitBlitWebSession.get().getUsername(), t); + logger().error(message + " for " + GitBlitWebSession.get().getUsername(), t); } if (toPage != null) { GitBlitWebSession.get().cacheErrorMessage(message); @@ -528,10 +521,12 @@ private RepeatingView getBottomScriptContainer() { } /** - * Adds a HTML script element loading the javascript designated by the given path. + * Adds a HTML script element loading the javascript designated by the given + * path. * * @param scriptPath - * page-relative path to the Javascript resource; normally starts with "scripts/" + * page-relative path to the Javascript resource; normally starts + * with "scripts/" */ protected void addBottomScript(String scriptPath) { RepeatingView bottomScripts = getBottomScriptContainer(); diff --git a/src/main/java/com/gitblit/wicket/pages/RootPage.java b/src/main/java/com/gitblit/wicket/pages/RootPage.java index 08c4e30b6..455dd417a 100644 --- a/src/main/java/com/gitblit/wicket/pages/RootPage.java +++ b/src/main/java/com/gitblit/wicket/pages/RootPage.java @@ -81,8 +81,6 @@ import com.gitblit.wicket.panels.LinkPanel; import com.gitblit.wicket.panels.NavigationPanel; -import de.akquinet.devops.GitBlitServer4UITests; - /** * Root page is a topbar, navigable page like Repositories, Users, or * Federation. @@ -92,6 +90,8 @@ */ public abstract class RootPage extends BasePage { + private static final long serialVersionUID = 1L; + boolean showAdmin; IModel username = new Model(""); diff --git a/src/main/java/com/gitblit/wicket/resources/bootstrap/Bootstrap.java b/src/main/java/com/gitblit/wicket/resources/bootstrap/Bootstrap.java new file mode 100644 index 000000000..f675af667 --- /dev/null +++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/Bootstrap.java @@ -0,0 +1,36 @@ +package com.gitblit.wicket.resources.bootstrap; + +import org.apache.wicket.protocol.http.WebApplication; +import org.apache.wicket.request.resource.PackageResourceReference; + + +public class Bootstrap { + + public static void install(WebApplication app) { + app.mountResource("/bootstrap/css/bootstrap.css", new PackageResourceReference(Bootstrap.class, "css/bootstrap.css")); + app.mountResource("/bootstrap/css/bootstrap-responsive.css", new PackageResourceReference(Bootstrap.class, "css/bootstrap-responsive.css")); + app.mountResource("/bootstrap/css/iconic.css", new PackageResourceReference(Bootstrap.class, "css/iconic.css")); + + app.mountResource("/bootstrap/font/iconic_fill.afm", new PackageResourceReference(Bootstrap.class, "font/iconic_fill.afm")); + app.mountResource("/bootstrap/font/iconic_fill.css", new PackageResourceReference(Bootstrap.class, "font/iconic_fill.css")); + app.mountResource("/bootstrap/font/iconic_fill.eot", new PackageResourceReference(Bootstrap.class, "font/iconic_fill.eot")); + app.mountResource("/bootstrap/font/iconic_fill.otf", new PackageResourceReference(Bootstrap.class, "font/iconic_fill.otf")); + app.mountResource("/bootstrap/font/iconic_fill.svg", new PackageResourceReference(Bootstrap.class, "font/iconic_fill.svg")); + app.mountResource("/bootstrap/font/iconic_fill.ttf", new PackageResourceReference(Bootstrap.class, "font/iconic_fill.ttf")); + app.mountResource("/bootstrap/font/iconic_fill.woff", new PackageResourceReference(Bootstrap.class, "font/iconic_fill.woff")); + + app.mountResource("/bootstrap/font/iconic_stroke.afm", new PackageResourceReference(Bootstrap.class, "font/iconic_stroke.afm")); + app.mountResource("/bootstrap/font/iconic_stroke.css", new PackageResourceReference(Bootstrap.class, "font/iconic_stroke.css")); + app.mountResource("/bootstrap/font/iconic_stroke.eot", new PackageResourceReference(Bootstrap.class, "font/iconic_stroke.eot")); + app.mountResource("/bootstrap/font/iconic_stroke.otf", new PackageResourceReference(Bootstrap.class, "font/iconic_stroke.otf")); + app.mountResource("/bootstrap/font/iconic_stroke.svg", new PackageResourceReference(Bootstrap.class, "font/iconic_stroke.svg")); + app.mountResource("/bootstrap/font/iconic_stroke.ttf", new PackageResourceReference(Bootstrap.class, "font/iconic_stroke.ttf")); + app.mountResource("/bootstrap/font/iconic_stroke.woff", new PackageResourceReference(Bootstrap.class, "font/iconic_stroke.woff")); + + app.mountResource("/bootstrap/img/glyphicons-halflings-white.png", new PackageResourceReference(Bootstrap.class, "img/glyphicons-halflings-white.png")); + app.mountResource("/bootstrap/img/glyphicons-halflings.png", new PackageResourceReference(Bootstrap.class, "img/glyphicons-halflings.png")); + + app.mountResource("/bootstrap/js/bootstrap.js", new PackageResourceReference(Bootstrap.class, "js/bootstrap.js")); + } + +} diff --git a/src/main/java/com/gitblit/wicket/resources/bootstrap/css/bootstrap-responsive.css b/src/main/java/com/gitblit/wicket/resources/bootstrap/css/bootstrap-responsive.css new file mode 100644 index 000000000..7e7ec697f --- /dev/null +++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/css/bootstrap-responsive.css @@ -0,0 +1,810 @@ +/*! + * Bootstrap Responsive v2.0.4 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 28px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} + +.hidden { + display: none; + visibility: hidden; +} + +.visible-phone { + display: none !important; +} + +.visible-tablet { + display: none !important; +} + +.hidden-desktop { + display: none !important; +} + +@media (max-width: 767px) { + .visible-phone { + display: inherit !important; + } + .hidden-phone { + display: none !important; + } + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important; + } +} + +@media (min-width: 768px) and (max-width: 979px) { + .visible-tablet { + display: inherit !important; + } + .hidden-tablet { + display: none !important; + } + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important ; + } +} + +@media (max-width: 480px) { + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + .page-header h1 small { + display: block; + line-height: 18px; + } + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + .form-horizontal .control-group > label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + .form-horizontal .controls { + margin-left: 0; + } + .form-horizontal .control-list { + padding-top: 0; + } + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + .modal { + position: absolute; + top: 10px; + right: 10px; + left: 10px; + width: auto; + margin: 0; + } + .modal.fade.in { + top: auto; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + .carousel-caption { + position: static; + } +} + +@media (max-width: 767px) { + body { + padding-right: 20px; + padding-left: 20px; + } + .navbar-fixed-top, + .navbar-fixed-bottom { + margin-right: -20px; + margin-left: -20px; + } + .container-fluid { + padding: 0; + } + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + .dl-horizontal dd { + margin-left: 0; + } + .container { + width: auto; + } + .row-fluid { + width: 100%; + } + .row, + .thumbnails { + margin-left: 0; + } + [class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: auto; + margin-left: 0; + } + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 28px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + } + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } +} + +@media (min-width: 768px) and (max-width: 979px) { + .row { + margin-left: -20px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + margin-left: 20px; + } + .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + .span12 { + width: 724px; + } + .span11 { + width: 662px; + } + .span10 { + width: 600px; + } + .span9 { + width: 538px; + } + .span8 { + width: 476px; + } + .span7 { + width: 414px; + } + .span6 { + width: 352px; + } + .span5 { + width: 290px; + } + .span4 { + width: 228px; + } + .span3 { + width: 166px; + } + .span2 { + width: 104px; + } + .span1 { + width: 42px; + } + .offset12 { + margin-left: 764px; + } + .offset11 { + margin-left: 702px; + } + .offset10 { + margin-left: 640px; + } + .offset9 { + margin-left: 578px; + } + .offset8 { + margin-left: 516px; + } + .offset7 { + margin-left: 454px; + } + .offset6 { + margin-left: 392px; + } + .offset5 { + margin-left: 330px; + } + .offset4 { + margin-left: 268px; + } + .offset3 { + margin-left: 206px; + } + .offset2 { + margin-left: 144px; + } + .offset1 { + margin-left: 82px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 28px; + margin-left: 2.762430939%; + *margin-left: 2.709239449638298%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .span12 { + width: 99.999999993%; + *width: 99.9468085036383%; + } + .row-fluid .span11 { + width: 91.436464082%; + *width: 91.38327259263829%; + } + .row-fluid .span10 { + width: 82.87292817100001%; + *width: 82.8197366816383%; + } + .row-fluid .span9 { + width: 74.30939226%; + *width: 74.25620077063829%; + } + .row-fluid .span8 { + width: 65.74585634900001%; + *width: 65.6926648596383%; + } + .row-fluid .span7 { + width: 57.182320438000005%; + *width: 57.129128948638304%; + } + .row-fluid .span6 { + width: 48.618784527%; + *width: 48.5655930376383%; + } + .row-fluid .span5 { + width: 40.055248616%; + *width: 40.0020571266383%; + } + .row-fluid .span4 { + width: 31.491712705%; + *width: 31.4385212156383%; + } + .row-fluid .span3 { + width: 22.928176794%; + *width: 22.874985304638297%; + } + .row-fluid .span2 { + width: 14.364640883%; + *width: 14.311449393638298%; + } + .row-fluid .span1 { + width: 5.801104972%; + *width: 5.747913482638298%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 714px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 652px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 590px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 528px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 466px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 404px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 342px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 280px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 218px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 156px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 94px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 32px; + } +} + +@media (min-width: 1200px) { + .row { + margin-left: -30px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + margin-left: 30px; + } + .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 1170px; + } + .span12 { + width: 1170px; + } + .span11 { + width: 1070px; + } + .span10 { + width: 970px; + } + .span9 { + width: 870px; + } + .span8 { + width: 770px; + } + .span7 { + width: 670px; + } + .span6 { + width: 570px; + } + .span5 { + width: 470px; + } + .span4 { + width: 370px; + } + .span3 { + width: 270px; + } + .span2 { + width: 170px; + } + .span1 { + width: 70px; + } + .offset12 { + margin-left: 1230px; + } + .offset11 { + margin-left: 1130px; + } + .offset10 { + margin-left: 1030px; + } + .offset9 { + margin-left: 930px; + } + .offset8 { + margin-left: 830px; + } + .offset7 { + margin-left: 730px; + } + .offset6 { + margin-left: 630px; + } + .offset5 { + margin-left: 530px; + } + .offset4 { + margin-left: 430px; + } + .offset3 { + margin-left: 330px; + } + .offset2 { + margin-left: 230px; + } + .offset1 { + margin-left: 130px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 28px; + margin-left: 2.564102564%; + *margin-left: 2.510911074638298%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.45299145300001%; + *width: 91.3997999636383%; + } + .row-fluid .span10 { + width: 82.905982906%; + *width: 82.8527914166383%; + } + .row-fluid .span9 { + width: 74.358974359%; + *width: 74.30578286963829%; + } + .row-fluid .span8 { + width: 65.81196581200001%; + *width: 65.7587743226383%; + } + .row-fluid .span7 { + width: 57.264957265%; + *width: 57.2117657756383%; + } + .row-fluid .span6 { + width: 48.717948718%; + *width: 48.6647572286383%; + } + .row-fluid .span5 { + width: 40.170940171000005%; + *width: 40.117748681638304%; + } + .row-fluid .span4 { + width: 31.623931624%; + *width: 31.5707401346383%; + } + .row-fluid .span3 { + width: 23.076923077%; + *width: 23.0237315876383%; + } + .row-fluid .span2 { + width: 14.529914530000001%; + *width: 14.4767230406383%; + } + .row-fluid .span1 { + width: 5.982905983%; + *width: 5.929714493638298%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 1160px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 1060px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 960px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 860px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 760px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 660px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 560px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 460px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 360px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 260px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 160px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 60px; + } + .thumbnails { + margin-left: -30px; + } + .thumbnails > li { + margin-left: 30px; + } + .row-fluid .thumbnails { + margin-left: 0; + } +} + +@media (max-width: 979px) { + body { + padding-top: 0; + } + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + .navbar-fixed-top { + margin-bottom: 0px; + } + .navbar-fixed-bottom { + margin-top: 18px; + } + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 0px 5px 1px; + } + .navbar .container { + width: auto; + padding: 0; + } + .nav-collapse { + clear: both; + } + .nav-collapse .nav { + float: none; + margin: 0 0 9px; + } + .nav-collapse .nav > li { + float: none; + } + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + .nav-collapse .nav > .divider-vertical { + display: none; + } + .nav-collapse .nav .nav-header { + color: #999999; + text-shadow: none; + } + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 6px 15px; + font-weight: bold; + color: #999999; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + .nav-collapse .nav > li > a:hover, + .nav-collapse .dropdown-menu a:hover { + background-color: #222222; + } + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: block; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + .nav-collapse .dropdown-menu .divider { + display: none; + } + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 9px 15px; + margin: 9px 0; + border-top: 1px solid #222222; + border-bottom: 1px solid #222222; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + .navbar .btn-navbar { + display: block; + } + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} + +@media (min-width: 980px) { + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} diff --git a/src/main/java/com/gitblit/wicket/resources/bootstrap/css/bootstrap.css b/src/main/java/com/gitblit/wicket/resources/bootstrap/css/bootstrap.css new file mode 100644 index 000000000..bb40c85f7 --- /dev/null +++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/css/bootstrap.css @@ -0,0 +1,4983 @@ +/*! + * Bootstrap v2.0.4 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not([controls]) { + display: none; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +a:hover, +a:active { + outline: 0; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} + +#map_canvas img { + max-width: none; +} + +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} + +button, +input { + *overflow: visible; + line-height: normal; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 28px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + line-height: 18px; + color: #333333; + background-color: #ffffff; +} + +a { + color: #0088cc; + text-decoration: none; +} + +a:hover { + color: #005580; + text-decoration: underline; +} + +.row { + margin-left: -20px; + *zoom: 1; +} + +.row:before, +.row:after { + display: table; + content: ""; +} + +.row:after { + clear: both; +} + +[class*="span"] { + float: left; + margin-left: 20px; +} + +.container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.span12 { + width: 940px; +} + +.span11 { + width: 860px; +} + +.span10 { + width: 780px; +} + +.span9 { + width: 700px; +} + +.span8 { + width: 620px; +} + +.span7 { + width: 540px; +} + +.span6 { + width: 460px; +} + +.span5 { + width: 380px; +} + +.span4 { + width: 300px; +} + +.span3 { + width: 220px; +} + +.span2 { + width: 140px; +} + +.span1 { + width: 60px; +} + +.offset12 { + margin-left: 980px; +} + +.offset11 { + margin-left: 900px; +} + +.offset10 { + margin-left: 820px; +} + +.offset9 { + margin-left: 740px; +} + +.offset8 { + margin-left: 660px; +} + +.offset7 { + margin-left: 580px; +} + +.offset6 { + margin-left: 500px; +} + +.offset5 { + margin-left: 420px; +} + +.offset4 { + margin-left: 340px; +} + +.offset3 { + margin-left: 260px; +} + +.offset2 { + margin-left: 180px; +} + +.offset1 { + margin-left: 100px; +} + +.row-fluid { + width: 100%; + *zoom: 1; +} + +.row-fluid:before, +.row-fluid:after { + display: table; + content: ""; +} + +.row-fluid:after { + clear: both; +} + +.row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 28px; + margin-left: 2.127659574%; + *margin-left: 2.0744680846382977%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} + +.row-fluid .span12 { + width: 99.99999998999999%; + *width: 99.94680850063828%; +} + +.row-fluid .span11 { + width: 91.489361693%; + *width: 91.4361702036383%; +} + +.row-fluid .span10 { + width: 82.97872339599999%; + *width: 82.92553190663828%; +} + +.row-fluid .span9 { + width: 74.468085099%; + *width: 74.4148936096383%; +} + +.row-fluid .span8 { + width: 65.95744680199999%; + *width: 65.90425531263828%; +} + +.row-fluid .span7 { + width: 57.446808505%; + *width: 57.3936170156383%; +} + +.row-fluid .span6 { + width: 48.93617020799999%; + *width: 48.88297871863829%; +} + +.row-fluid .span5 { + width: 40.425531911%; + *width: 40.3723404216383%; +} + +.row-fluid .span4 { + width: 31.914893614%; + *width: 31.8617021246383%; +} + +.row-fluid .span3 { + width: 23.404255317%; + *width: 23.3510638276383%; +} + +.row-fluid .span2 { + width: 14.89361702%; + *width: 14.8404255306383%; +} + +.row-fluid .span1 { + width: 6.382978723%; + *width: 6.329787233638298%; +} + +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} + +.container:before, +.container:after { + display: table; + content: ""; +} + +.container:after { + clear: both; +} + +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} + +.container-fluid:before, +.container-fluid:after { + display: table; + content: ""; +} + +.container-fluid:after { + clear: both; +} + +p { + margin: 0 0 9px; +} + +p small { + font-size: 11px; + color: #999999; +} + +.lead { + margin-bottom: 18px; + font-size: 20px; + font-weight: 200; + line-height: 27px; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + font-family: inherit; + font-weight: bold; + color: inherit; + text-rendering: optimizelegibility; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + color: #999999; +} + +h1 { + font-size: 30px; + line-height: 36px; +} + +h1 small { + font-size: 18px; +} + +h2 { + font-size: 24px; + line-height: 36px; +} + +h2 small { + font-size: 18px; +} + +h3 { + font-size: 18px; + line-height: 27px; +} + +h3 small { + font-size: 14px; +} + +h4, +h5, +h6 { + line-height: 18px; +} + +h4 { + font-size: 14px; +} + +h4 small { + font-size: 12px; +} + +h5 { + font-size: 12px; +} + +h6 { + font-size: 11px; + color: #999999; + text-transform: uppercase; +} + +.page-header { + padding-bottom: 17px; + margin: 18px 0; + border-bottom: 1px solid #eeeeee; +} + +.page-header h1 { + line-height: 1; +} + +ul, +ol { + padding: 0; + margin: 0 0 9px 25px; +} + +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} + +ul { + list-style: disc; +} + +ol { + list-style: decimal; +} + +li { + line-height: 18px; +} + +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} + +dl { + margin-bottom: 18px; +} + +dt, +dd { + line-height: 18px; +} + +dt { + font-weight: bold; + line-height: 17px; +} + +dd { + margin-left: 9px; +} + +.dl-horizontal dt { + float: left; + width: 120px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dl-horizontal dd { + margin-left: 130px; +} + +hr { + margin: 18px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +.muted { + color: #999999; +} + +abbr[title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 0 0 0 15px; + margin: 0 0 18px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + margin-bottom: 0; + font-size: 16px; + font-weight: 300; + line-height: 22.5px; +} + +blockquote small { + display: block; + line-height: 18px; + color: #999999; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +address { + display: block; + margin-bottom: 18px; + font-style: normal; + line-height: 18px; +} + +small { + font-size: 100%; +} + +cite { + font-style: normal; +} + +code, +pre { + padding: 0 3px 2px; + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +code { + padding: 2px 4px; + color: #d14; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} + +pre { + display: block; + padding: 8.5px; + margin: 0 0 9px; + font-size: 12.025px; + line-height: 18px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +pre.prettyprint { + margin-bottom: 18px; +} + +pre code { + padding: 0; + color: inherit; + background-color: transparent; + border: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +form { + margin: 0 0 18px; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 27px; + font-size: 19.5px; + line-height: 36px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +legend small { + font-size: 13.5px; + color: #999999; +} + +label, +input, +button, +select, +textarea { + font-size: 13px; + font-weight: normal; + line-height: 18px; +} + +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +label { + display: block; + margin-bottom: 5px; +} + +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 18px; + padding: 4px; + margin-bottom: 9px; + font-size: 13px; + line-height: 18px; + color: #555555; +} + +input, +textarea { + width: 210px; +} + +textarea { + height: auto; +} + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -ms-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +input[type="radio"], +input[type="checkbox"] { + margin: 3px 0; + *margin-top: 0; + /* IE7 */ + + line-height: normal; + cursor: pointer; +} + +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} + +.uneditable-textarea { + width: auto; + height: auto; +} + +select, +input[type="file"] { + height: 28px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 28px; +} + +select { + width: 220px; + border: 1px solid #bbb; +} + +select[multiple], +select[size] { + height: auto; +} + +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.radio, +.checkbox { + min-height: 18px; + padding-left: 18px; +} + +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -18px; +} + +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} + +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} + +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} + +.input-mini { + width: 60px; +} + +.input-small { + width: 90px; +} + +.input-medium { + width: 150px; +} + +.input-large { + width: 210px; +} + +.input-xlarge { + width: 270px; +} + +.input-xxlarge { + width: 530px; +} + +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} + +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} + +input, +textarea, +.uneditable-input { + margin-left: 0; +} + +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 930px; +} + +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 850px; +} + +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 770px; +} + +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 690px; +} + +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 610px; +} + +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 530px; +} + +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 450px; +} + +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 370px; +} + +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 290px; +} + +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 210px; +} + +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 130px; +} + +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 50px; +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eeeeee; + border-color: #ddd; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} + +.control-group.warning > label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} + +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; + border-color: #c09853; +} + +.control-group.warning .checkbox:focus, +.control-group.warning .radio:focus, +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: 0 0 6px #dbc59e; + -moz-box-shadow: 0 0 6px #dbc59e; + box-shadow: 0 0 6px #dbc59e; +} + +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} + +.control-group.error > label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} + +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; + border-color: #b94a48; +} + +.control-group.error .checkbox:focus, +.control-group.error .radio:focus, +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: 0 0 6px #d59392; + -moz-box-shadow: 0 0 6px #d59392; + box-shadow: 0 0 6px #d59392; +} + +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} + +.control-group.success > label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} + +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; + border-color: #468847; +} + +.control-group.success .checkbox:focus, +.control-group.success .radio:focus, +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: 0 0 6px #7aba7b; + -moz-box-shadow: 0 0 6px #7aba7b; + box-shadow: 0 0 6px #7aba7b; +} + +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} + +input:focus:required:invalid, +textarea:focus:required:invalid, +select:focus:required:invalid { + color: #b94a48; + border-color: #ee5f5b; +} + +input:focus:required:invalid:focus, +textarea:focus:required:invalid:focus, +select:focus:required:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} + +.form-actions { + padding: 17px 20px 18px; + margin-top: 18px; + margin-bottom: 18px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} + +.form-actions:before, +.form-actions:after { + display: table; + content: ""; +} + +.form-actions:after { + clear: both; +} + +.uneditable-input { + overflow: hidden; + white-space: nowrap; + cursor: not-allowed; + background-color: #ffffff; + border-color: #eee; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} + +:-moz-placeholder { + color: #999999; +} + +:-ms-input-placeholder { + color: #999999; +} + +::-webkit-input-placeholder { + color: #999999; +} + +.help-block, +.help-inline { + color: #555555; +} + +.help-block { + display: block; + margin-bottom: 9px; +} + +.help-inline { + display: inline-block; + *display: inline; + padding-left: 5px; + vertical-align: middle; + *zoom: 1; +} + +.input-prepend, +.input-append { + margin-bottom: 5px; +} + +.input-prepend input, +.input-append input, +.input-prepend select, +.input-append select, +.input-prepend .uneditable-input, +.input-append .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: middle; + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.input-prepend input:focus, +.input-append input:focus, +.input-prepend select:focus, +.input-append select:focus, +.input-prepend .uneditable-input:focus, +.input-append .uneditable-input:focus { + z-index: 2; +} + +.input-prepend .uneditable-input, +.input-append .uneditable-input { + border-left-color: #ccc; +} + +.input-prepend .add-on, +.input-append .add-on { + display: inline-block; + width: auto; + height: 18px; + min-width: 16px; + padding: 4px 5px; + font-weight: normal; + line-height: 18px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + vertical-align: middle; + background-color: #eeeeee; + border: 1px solid #ccc; +} + +.input-prepend .add-on, +.input-append .add-on, +.input-prepend .btn, +.input-append .btn { + margin-left: -1px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend .active, +.input-append .active { + background-color: #a9dba9; + border-color: #46a546; +} + +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} + +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.input-append .uneditable-input { + border-right-color: #ccc; + border-left-color: #eee; +} + +.input-append .add-on:last-child, +.input-append .btn:last-child { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 14px; + -moz-border-radius: 14px; + border-radius: 14px; +} + +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + margin-bottom: 0; + *zoom: 1; +} + +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} + +.form-search label, +.form-inline label { + display: inline-block; +} + +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} + +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} + +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} + +.control-group { + margin-bottom: 9px; +} + +legend + .control-group { + margin-top: 18px; + -webkit-margin-top-collapse: separate; +} + +.form-horizontal .control-group { + margin-bottom: 18px; + *zoom: 1; +} + +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + content: ""; +} + +.form-horizontal .control-group:after { + clear: both; +} + +.form-horizontal .control-label { + float: left; + width: 140px; + padding-top: 5px; + text-align: right; +} + +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 160px; + *margin-left: 0; +} + +.form-horizontal .controls:first-child { + *padding-left: 160px; +} + +.form-horizontal .help-block { + margin-top: 9px; + margin-bottom: 0; +} + +.form-horizontal .form-actions { + padding-left: 160px; +} + +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} + +.table { + width: 100%; + margin-bottom: 18px; +} + +.table th, +.table td { + padding: 8px; + line-height: 18px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table th { + font-weight: bold; +} + +.table thead th { + vertical-align: bottom; +} + +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} + +.table tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} + +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapsed; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} + +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} + +.table-bordered thead:first-child tr:first-child th:first-child, +.table-bordered tbody:first-child tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered thead:first-child tr:first-child th:last-child, +.table-bordered tbody:first-child tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-bordered thead:last-child tr:last-child th:first-child, +.table-bordered tbody:last-child tr:last-child td:first-child { + -webkit-border-radius: 0 0 0 4px; + -moz-border-radius: 0 0 0 4px; + border-radius: 0 0 0 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.table-bordered thead:last-child tr:last-child th:last-child, +.table-bordered tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} + +.table-striped tbody tr:nth-child(odd) td, +.table-striped tbody tr:nth-child(odd) th { + background-color: #f9f9f9; +} + +.table tbody tr:hover td, +.table tbody tr:hover th { + background-color: #f5f5f5; +} + +table .span1 { + float: none; + width: 44px; + margin-left: 0; +} + +table .span2 { + float: none; + width: 124px; + margin-left: 0; +} + +table .span3 { + float: none; + width: 204px; + margin-left: 0; +} + +table .span4 { + float: none; + width: 284px; + margin-left: 0; +} + +table .span5 { + float: none; + width: 364px; + margin-left: 0; +} + +table .span6 { + float: none; + width: 444px; + margin-left: 0; +} + +table .span7 { + float: none; + width: 524px; + margin-left: 0; +} + +table .span8 { + float: none; + width: 604px; + margin-left: 0; +} + +table .span9 { + float: none; + width: 684px; + margin-left: 0; +} + +table .span10 { + float: none; + width: 764px; + margin-left: 0; +} + +table .span11 { + float: none; + width: 844px; + margin-left: 0; +} + +table .span12 { + float: none; + width: 924px; + margin-left: 0; +} + +table .span13 { + float: none; + width: 1004px; + margin-left: 0; +} + +table .span14 { + float: none; + width: 1084px; + margin-left: 0; +} + +table .span15 { + float: none; + width: 1164px; + margin-left: 0; +} + +table .span16 { + float: none; + width: 1244px; + margin-left: 0; +} + +table .span17 { + float: none; + width: 1324px; + margin-left: 0; +} + +table .span18 { + float: none; + width: 1404px; + margin-left: 0; +} + +table .span19 { + float: none; + width: 1484px; + margin-left: 0; +} + +table .span20 { + float: none; + width: 1564px; + margin-left: 0; +} + +table .span21 { + float: none; + width: 1644px; + margin-left: 0; +} + +table .span22 { + float: none; + width: 1724px; + margin-left: 0; +} + +table .span23 { + float: none; + width: 1804px; + margin-left: 0; +} + +table .span24 { + float: none; + width: 1884px; + margin-left: 0; +} + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; +} + +[class^="icon-"]:last-child, +[class*=" icon-"]:last-child { + *margin-left: 0; +} + +.icon-white { + background-image: url("../img/glyphicons-halflings-white.png"); +} + +.icon-glass { + background-position: 0 0; +} + +.icon-music { + background-position: -24px 0; +} + +.icon-search { + background-position: -48px 0; +} + +.icon-envelope { + background-position: -72px 0; +} + +.icon-heart { + background-position: -96px 0; +} + +.icon-star { + background-position: -120px 0; +} + +.icon-star-empty { + background-position: -144px 0; +} + +.icon-user { + background-position: -168px 0; +} + +.icon-film { + background-position: -192px 0; +} + +.icon-th-large { + background-position: -216px 0; +} + +.icon-th { + background-position: -240px 0; +} + +.icon-th-list { + background-position: -264px 0; +} + +.icon-ok { + background-position: -288px 0; +} + +.icon-remove { + background-position: -312px 0; +} + +.icon-zoom-in { + background-position: -336px 0; +} + +.icon-zoom-out { + background-position: -360px 0; +} + +.icon-off { + background-position: -384px 0; +} + +.icon-signal { + background-position: -408px 0; +} + +.icon-cog { + background-position: -432px 0; +} + +.icon-trash { + background-position: -456px 0; +} + +.icon-home { + background-position: 0 -24px; +} + +.icon-file { + background-position: -24px -24px; +} + +.icon-time { + background-position: -48px -24px; +} + +.icon-road { + background-position: -72px -24px; +} + +.icon-download-alt { + background-position: -96px -24px; +} + +.icon-download { + background-position: -120px -24px; +} + +.icon-upload { + background-position: -144px -24px; +} + +.icon-inbox { + background-position: -168px -24px; +} + +.icon-play-circle { + background-position: -192px -24px; +} + +.icon-repeat { + background-position: -216px -24px; +} + +.icon-refresh { + background-position: -240px -24px; +} + +.icon-list-alt { + background-position: -264px -24px; +} + +.icon-lock { + background-position: -287px -24px; +} + +.icon-flag { + background-position: -312px -24px; +} + +.icon-headphones { + background-position: -336px -24px; +} + +.icon-volume-off { + background-position: -360px -24px; +} + +.icon-volume-down { + background-position: -384px -24px; +} + +.icon-volume-up { + background-position: -408px -24px; +} + +.icon-qrcode { + background-position: -432px -24px; +} + +.icon-barcode { + background-position: -456px -24px; +} + +.icon-tag { + background-position: 0 -48px; +} + +.icon-tags { + background-position: -25px -48px; +} + +.icon-book { + background-position: -48px -48px; +} + +.icon-bookmark { + background-position: -72px -48px; +} + +.icon-print { + background-position: -96px -48px; +} + +.icon-camera { + background-position: -120px -48px; +} + +.icon-font { + background-position: -144px -48px; +} + +.icon-bold { + background-position: -167px -48px; +} + +.icon-italic { + background-position: -192px -48px; +} + +.icon-text-height { + background-position: -216px -48px; +} + +.icon-text-width { + background-position: -240px -48px; +} + +.icon-align-left { + background-position: -264px -48px; +} + +.icon-align-center { + background-position: -288px -48px; +} + +.icon-align-right { + background-position: -312px -48px; +} + +.icon-align-justify { + background-position: -336px -48px; +} + +.icon-list { + background-position: -360px -48px; +} + +.icon-indent-left { + background-position: -384px -48px; +} + +.icon-indent-right { + background-position: -408px -48px; +} + +.icon-facetime-video { + background-position: -432px -48px; +} + +.icon-picture { + background-position: -456px -48px; +} + +.icon-pencil { + background-position: 0 -72px; +} + +.icon-map-marker { + background-position: -24px -72px; +} + +.icon-adjust { + background-position: -48px -72px; +} + +.icon-tint { + background-position: -72px -72px; +} + +.icon-edit { + background-position: -96px -72px; +} + +.icon-share { + background-position: -120px -72px; +} + +.icon-check { + background-position: -144px -72px; +} + +.icon-move { + background-position: -168px -72px; +} + +.icon-step-backward { + background-position: -192px -72px; +} + +.icon-fast-backward { + background-position: -216px -72px; +} + +.icon-backward { + background-position: -240px -72px; +} + +.icon-play { + background-position: -264px -72px; +} + +.icon-pause { + background-position: -288px -72px; +} + +.icon-stop { + background-position: -312px -72px; +} + +.icon-forward { + background-position: -336px -72px; +} + +.icon-fast-forward { + background-position: -360px -72px; +} + +.icon-step-forward { + background-position: -384px -72px; +} + +.icon-eject { + background-position: -408px -72px; +} + +.icon-chevron-left { + background-position: -432px -72px; +} + +.icon-chevron-right { + background-position: -456px -72px; +} + +.icon-plus-sign { + background-position: 0 -96px; +} + +.icon-minus-sign { + background-position: -24px -96px; +} + +.icon-remove-sign { + background-position: -48px -96px; +} + +.icon-ok-sign { + background-position: -72px -96px; +} + +.icon-question-sign { + background-position: -96px -96px; +} + +.icon-info-sign { + background-position: -120px -96px; +} + +.icon-screenshot { + background-position: -144px -96px; +} + +.icon-remove-circle { + background-position: -168px -96px; +} + +.icon-ok-circle { + background-position: -192px -96px; +} + +.icon-ban-circle { + background-position: -216px -96px; +} + +.icon-arrow-left { + background-position: -240px -96px; +} + +.icon-arrow-right { + background-position: -264px -96px; +} + +.icon-arrow-up { + background-position: -289px -96px; +} + +.icon-arrow-down { + background-position: -312px -96px; +} + +.icon-share-alt { + background-position: -336px -96px; +} + +.icon-resize-full { + background-position: -360px -96px; +} + +.icon-resize-small { + background-position: -384px -96px; +} + +.icon-plus { + background-position: -408px -96px; +} + +.icon-minus { + background-position: -433px -96px; +} + +.icon-asterisk { + background-position: -456px -96px; +} + +.icon-exclamation-sign { + background-position: 0 -120px; +} + +.icon-gift { + background-position: -24px -120px; +} + +.icon-leaf { + background-position: -48px -120px; +} + +.icon-fire { + background-position: -72px -120px; +} + +.icon-eye-open { + background-position: -96px -120px; +} + +.icon-eye-close { + background-position: -120px -120px; +} + +.icon-warning-sign { + background-position: -144px -120px; +} + +.icon-plane { + background-position: -168px -120px; +} + +.icon-calendar { + background-position: -192px -120px; +} + +.icon-random { + background-position: -216px -120px; +} + +.icon-comment { + background-position: -240px -120px; +} + +.icon-magnet { + background-position: -264px -120px; +} + +.icon-chevron-up { + background-position: -288px -120px; +} + +.icon-chevron-down { + background-position: -313px -119px; +} + +.icon-retweet { + background-position: -336px -120px; +} + +.icon-shopping-cart { + background-position: -360px -120px; +} + +.icon-folder-close { + background-position: -384px -120px; +} + +.icon-folder-open { + background-position: -408px -120px; +} + +.icon-resize-vertical { + background-position: -432px -119px; +} + +.icon-resize-horizontal { + background-position: -456px -118px; +} + +.icon-hdd { + background-position: 0 -144px; +} + +.icon-bullhorn { + background-position: -24px -144px; +} + +.icon-bell { + background-position: -48px -144px; +} + +.icon-certificate { + background-position: -72px -144px; +} + +.icon-thumbs-up { + background-position: -96px -144px; +} + +.icon-thumbs-down { + background-position: -120px -144px; +} + +.icon-hand-right { + background-position: -144px -144px; +} + +.icon-hand-left { + background-position: -168px -144px; +} + +.icon-hand-up { + background-position: -192px -144px; +} + +.icon-hand-down { + background-position: -216px -144px; +} + +.icon-circle-arrow-right { + background-position: -240px -144px; +} + +.icon-circle-arrow-left { + background-position: -264px -144px; +} + +.icon-circle-arrow-up { + background-position: -288px -144px; +} + +.icon-circle-arrow-down { + background-position: -312px -144px; +} + +.icon-globe { + background-position: -336px -144px; +} + +.icon-wrench { + background-position: -360px -144px; +} + +.icon-tasks { + background-position: -384px -144px; +} + +.icon-filter { + background-position: -408px -144px; +} + +.icon-briefcase { + background-position: -432px -144px; +} + +.icon-fullscreen { + background-position: -456px -144px; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle { + *margin-bottom: -3px; +} + +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; + opacity: 0.3; + filter: alpha(opacity=30); +} + +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} + +.dropdown:hover .caret, +.open .caret { + opacity: 1; + filter: alpha(opacity=100); +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 4px 0; + margin: 1px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 8px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.dropdown-menu a { + display: block; + padding: 3px 15px; + clear: both; + font-weight: normal; + line-height: 18px; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu li > a:hover, +.dropdown-menu .active > a, +.dropdown-menu .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #0088cc; +} + +.open { + *z-index: 1000; +} + +.open > .dropdown-menu { + display: block; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: "\2191"; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +.typeahead { + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #eee; + border: 1px solid rgba(0, 0, 0, 0.05); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -ms-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -ms-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +.collapse.in { + height: auto; +} + +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 18px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.btn { + display: inline-block; + *display: inline; + padding: 4px 10px 4px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 13px; + line-height: 18px; + *line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + *background-color: #e6e6e6; + background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(top, #ffffff, #e6e6e6); + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border: 1px solid #cccccc; + *border: 0; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-bottom-color: #b3b3b3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn:hover, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + background-color: #e6e6e6; + *background-color: #d9d9d9; +} + +.btn:active, +.btn.active { + background-color: #cccccc \9; +} + +.btn:first-child { + *margin-left: 0; +} + +.btn:hover { + color: #333333; + text-decoration: none; + background-color: #e6e6e6; + *background-color: #d9d9d9; + /* Buttons in IE7 don't get borders, so darken on hover */ + + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -ms-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn.active, +.btn:active { + background-color: #e6e6e6; + background-color: #d9d9d9 \9; + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn.disabled, +.btn[disabled] { + cursor: default; + background-color: #e6e6e6; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-large { + padding: 9px 14px; + font-size: 15px; + line-height: normal; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.btn-large [class^="icon-"] { + margin-top: 1px; +} + +.btn-small { + padding: 5px 9px; + font-size: 11px; + line-height: 16px; +} + +.btn-small [class^="icon-"] { + margin-top: -1px; +} + +.btn-mini { + padding: 2px 6px; + font-size: 11px; + line-height: 14px; +} + +.btn-primary, +.btn-primary:hover, +.btn-warning, +.btn-warning:hover, +.btn-danger, +.btn-danger:hover, +.btn-success, +.btn-success:hover, +.btn-info, +.btn-info:hover, +.btn-inverse, +.btn-inverse:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} + +.btn { + border-color: #ccc; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); +} + +.btn-primary { + background-color: #0074cc; + *background-color: #0055cc; + background-image: -ms-linear-gradient(top, #0088cc, #0055cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0055cc); + background-image: -o-linear-gradient(top, #0088cc, #0055cc); + background-image: -moz-linear-gradient(top, #0088cc, #0055cc); + background-image: linear-gradient(top, #0088cc, #0055cc); + background-repeat: repeat-x; + border-color: #0055cc #0055cc #003580; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#0088cc', endColorstr='#0055cc', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + background-color: #0055cc; + *background-color: #004ab3; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #004099 \9; +} + +.btn-warning { + background-color: #faa732; + *background-color: #f89406; + background-image: -ms-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(top, #fbb450, #f89406); + background-repeat: repeat-x; + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + background-color: #f89406; + *background-color: #df8505; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} + +.btn-danger { + background-color: #da4f49; + *background-color: #bd362f; + background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(top, #ee5f5b, #bd362f); + background-repeat: repeat-x; + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + background-color: #bd362f; + *background-color: #a9302a; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} + +.btn-success { + background-color: #5bb75b; + *background-color: #51a351; + background-image: -ms-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(top, #62c462, #51a351); + background-repeat: repeat-x; + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + background-color: #51a351; + *background-color: #499249; +} + +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} + +.btn-info { + background-color: #49afcd; + *background-color: #2f96b4; + background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(top, #5bc0de, #2f96b4); + background-repeat: repeat-x; + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + background-color: #2f96b4; + *background-color: #2a85a0; +} + +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} + +.btn-inverse { + background-color: #414141; + *background-color: #222222; + background-image: -ms-linear-gradient(top, #555555, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222)); + background-image: -webkit-linear-gradient(top, #555555, #222222); + background-image: -o-linear-gradient(top, #555555, #222222); + background-image: -moz-linear-gradient(top, #555555, #222222); + background-image: linear-gradient(top, #555555, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-inverse:hover, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + background-color: #222222; + *background-color: #151515; +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} + +button.btn, +input[type="submit"].btn { + *padding-top: 2px; + *padding-bottom: 2px; +} + +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} + +.btn-group { + position: relative; + *margin-left: .3em; + *zoom: 1; +} + +.btn-group:before, +.btn-group:after { + display: table; + content: ""; +} + +.btn-group:after { + clear: both; +} + +.btn-group:first-child { + *margin-left: 0; +} + +.btn-group + .btn-group { + margin-left: 5px; +} + +.btn-toolbar { + margin-top: 9px; + margin-bottom: 9px; +} + +.btn-toolbar .btn-group { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} + +.btn-group > .btn { + position: relative; + float: left; + margin-left: -1px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .dropdown-toggle { + *padding-top: 4px; + padding-right: 8px; + *padding-bottom: 4px; + padding-left: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group > .btn-mini.dropdown-toggle { + padding-right: 5px; + padding-left: 5px; +} + +.btn-group > .btn-small.dropdown-toggle { + *padding-top: 4px; + *padding-bottom: 4px; +} + +.btn-group > .btn-large.dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} + +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0055cc; +} + +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} + +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} + +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} + +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} + +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} + +.btn .caret { + margin-top: 7px; + margin-left: 0; +} + +.btn:hover .caret, +.open.btn-group .caret { + opacity: 1; + filter: alpha(opacity=100); +} + +.btn-mini .caret { + margin-top: 5px; +} + +.btn-small .caret { + margin-top: 6px; +} + +.btn-large .caret { + margin-top: 6px; + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px; +} + +.dropup .btn-large .caret { + border-top: 0; + border-bottom: 5px solid #000000; +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 0.75; + filter: alpha(opacity=75); +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 18px; + color: #c09853; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.alert-heading { + color: inherit; +} + +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 18px; +} + +.alert-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-danger, +.alert-error { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +.alert-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} + +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} + +.alert-block p + p { + margin-top: 5px; +} + +.nav { + margin-bottom: 18px; + margin-left: 0; + list-style: none; +} + +.nav > li > a { + display: block; +} + +.nav > li > a:hover { + text-decoration: none; + background-color: #eeeeee; +} + +.nav > .pull-right { + float: right; +} + +.nav .nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 18px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} + +.nav li + .nav-header { + margin-top: 9px; +} + +.nav-list { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 0; +} + +.nav-list > li > a, +.nav-list .nav-header { + margin-right: -15px; + margin-left: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.nav-list > li > a { + padding: 3px 15px; +} + +.nav-list > .active > a, +.nav-list > .active > a:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} + +.nav-list [class^="icon-"] { + margin-right: 2px; +} + +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 8px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.nav-tabs, +.nav-pills { + *zoom: 1; +} + +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + content: ""; +} + +.nav-tabs:after, +.nav-pills:after { + clear: both; +} + +.nav-tabs > li, +.nav-pills > li { + float: left; +} + +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} + +.nav-tabs > li { + margin-bottom: -1px; +} + +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 18px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} + +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.nav-pills > .active > a, +.nav-pills > .active > a:hover { + color: #ffffff; + background-color: #0088cc; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li > a { + margin-right: 0; +} + +.nav-tabs.nav-stacked { + border-bottom: 0; +} + +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.nav-tabs.nav-stacked > li > a:hover { + z-index: 2; + border-color: #ddd; +} + +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} + +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} + +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 5px 5px; + -moz-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} + +.nav-pills .dropdown-menu { + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.nav-tabs .dropdown-toggle .caret, +.nav-pills .dropdown-toggle .caret { + margin-top: 6px; + border-top-color: #0088cc; + border-bottom-color: #0088cc; +} + +.nav-tabs .dropdown-toggle:hover .caret, +.nav-pills .dropdown-toggle:hover .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} + +.nav-tabs .active .dropdown-toggle .caret, +.nav-pills .active .dropdown-toggle .caret { + border-top-color: #333333; + border-bottom-color: #333333; +} + +.nav > .dropdown.active > a:hover { + color: #000000; + cursor: pointer; +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} + +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} + +.tabs-stacked .open > a:hover { + border-color: #999999; +} + +.tabbable { + *zoom: 1; +} + +.tabbable:before, +.tabbable:after { + display: table; + content: ""; +} + +.tabbable:after { + clear: both; +} + +.tab-content { + overflow: auto; +} + +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} + +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} + +.tab-content > .active, +.pill-content > .active { + display: block; +} + +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} + +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.tabs-below > .nav-tabs > li > a:hover { + border-top-color: #ddd; + border-bottom-color: transparent; +} + +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover { + border-color: transparent #ddd #ddd #ddd; +} + +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} + +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} + +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.tabs-left > .nav-tabs > li > a:hover { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} + +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} + +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} + +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.tabs-right > .nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} + +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} + +.navbar { + *position: relative; + *z-index: 2; + margin-bottom: 18px; + overflow: visible; +} + +.navbar-inner { + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #2c2c2c; + background-image: -moz-linear-gradient(top, #333333, #222222); + background-image: -ms-linear-gradient(top, #333333, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); + background-image: -webkit-linear-gradient(top, #333333, #222222); + background-image: -o-linear-gradient(top, #333333, #222222); + background-image: linear-gradient(top, #333333, #222222); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); +} + +.navbar .container { + width: auto; +} + +.nav-collapse.collapse { + height: auto; +} + +.navbar { + color: #999999; +} + +.navbar .brand:hover { + text-decoration: none; +} + +.navbar .brand { + display: block; + float: left; + padding: 8px 20px 12px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + line-height: 1; + color: #999999; +} + +.navbar .navbar-text { + margin-bottom: 0; + line-height: 40px; +} + +.navbar .navbar-link { + color: #999999; +} + +.navbar .navbar-link:hover { + color: #ffffff; +} + +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} + +.navbar .btn-group .btn { + margin: 0; +} + +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} + +.navbar-form:before, +.navbar-form:after { + display: table; + content: ""; +} + +.navbar-form:after { + clear: both; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} + +.navbar-form input, +.navbar-form select { + display: inline-block; + margin-bottom: 0; +} + +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} + +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 6px; + white-space: nowrap; +} + +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} + +.navbar-search { + position: relative; + float: left; + margin-top: 6px; + margin-bottom: 0; +} + +.navbar-search .search-query { + padding: 4px 9px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + color: #ffffff; + background-color: #626262; + border: 1px solid #151515; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -ms-transition: none; + -o-transition: none; + transition: none; +} + +.navbar-search .search-query:-moz-placeholder { + color: #cccccc; +} + +.navbar-search .search-query:-ms-input-placeholder { + color: #cccccc; +} + +.navbar-search .search-query::-webkit-input-placeholder { + color: #cccccc; +} + +.navbar-search .search-query:focus, +.navbar-search .search-query.focused { + padding: 5px 10px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + outline: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-right: 0; + padding-left: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.navbar-fixed-top { + top: 0; +} + +.navbar-fixed-bottom { + bottom: 0; +} + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} + +.navbar .nav.pull-right { + float: right; +} + +.navbar .nav > li { + display: block; + float: left; +} + +.navbar .nav > li > a { + float: none; + padding: 9px 10px 11px; + line-height: 19px; + color: #999999; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar .btn { + display: inline-block; + padding: 4px 10px 4px; + margin: 5px 5px 6px; + line-height: 18px; +} + +.navbar .btn-group { + padding: 5px 5px 6px; + margin: 0; +} + +.navbar .nav > li > a:hover { + color: #ffffff; + text-decoration: none; + background-color: transparent; +} + +.navbar .nav .active > a, +.navbar .nav .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #222222; +} + +.navbar .divider-vertical { + width: 1px; + height: 40px; + margin: 0 9px; + overflow: hidden; + background-color: #222222; + border-right: 1px solid #333333; +} + +.navbar .nav.pull-right { + margin-right: 0; + margin-left: 10px; +} + +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-right: 5px; + margin-left: 5px; + background-color: #2c2c2c; + *background-color: #222222; + background-image: -ms-linear-gradient(top, #333333, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); + background-image: -webkit-linear-gradient(top, #333333, #222222); + background-image: -o-linear-gradient(top, #333333, #222222); + background-image: linear-gradient(top, #333333, #222222); + background-image: -moz-linear-gradient(top, #333333, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} + +.navbar .btn-navbar:hover, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + background-color: #222222; + *background-color: #151515; +} + +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #080808 \9; +} + +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} + +.navbar .dropdown-menu:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.navbar .dropdown-menu:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.navbar-fixed-bottom .dropdown-menu:before { + top: auto; + bottom: -7px; + border-top: 7px solid #ccc; + border-bottom: 0; + border-top-color: rgba(0, 0, 0, 0.2); +} + +.navbar-fixed-bottom .dropdown-menu:after { + top: auto; + bottom: -6px; + border-top: 6px solid #ffffff; + border-bottom: 0; +} + +.navbar .nav li.dropdown .dropdown-toggle .caret, +.navbar .nav li.dropdown.open .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar .nav li.dropdown.active .caret { + opacity: 1; + filter: alpha(opacity=100); +} + +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + background-color: transparent; +} + +.navbar .nav li.dropdown.active > .dropdown-toggle:hover { + color: #ffffff; +} + +.navbar .pull-right .dropdown-menu, +.navbar .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar .pull-right .dropdown-menu:before, +.navbar .dropdown-menu.pull-right:before { + right: 12px; + left: auto; +} + +.navbar .pull-right .dropdown-menu:after, +.navbar .dropdown-menu.pull-right:after { + right: 13px; + left: auto; +} + +.breadcrumb { + padding: 7px 14px; + margin: 0 0 18px; + list-style: none; + background-color: #fbfbfb; + background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5)); + background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); + background-image: linear-gradient(top, #ffffff, #f5f5f5); + background-repeat: repeat-x; + border: 1px solid #ddd; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.breadcrumb li { + display: inline-block; + *display: inline; + text-shadow: 0 1px 0 #ffffff; + *zoom: 1; +} + +.breadcrumb .divider { + padding: 0 5px; + color: #999999; +} + +.breadcrumb .active a { + color: #333333; +} + +.pagination { + height: 36px; + margin: 18px 0; +} + +.pagination ul { + display: inline-block; + *display: inline; + margin-bottom: 0; + margin-left: 0; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + *zoom: 1; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.pagination li { + display: inline; +} + +.pagination a { + float: left; + padding: 0 14px; + line-height: 34px; + text-decoration: none; + border: 1px solid #ddd; + border-left-width: 0; +} + +.pagination a:hover, +.pagination .active a { + background-color: #f5f5f5; +} + +.pagination .active a { + color: #999999; + cursor: default; +} + +.pagination .disabled span, +.pagination .disabled a, +.pagination .disabled a:hover { + color: #999999; + cursor: default; + background-color: transparent; +} + +.pagination li:first-child a { + border-left-width: 1px; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.pagination li:last-child a { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.pagination-centered { + text-align: center; +} + +.pagination-right { + text-align: right; +} + +.pager { + margin-bottom: 18px; + margin-left: 0; + text-align: center; + list-style: none; + *zoom: 1; +} + +.pager:before, +.pager:after { + display: table; + content: ""; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager a { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.pager a:hover { + text-decoration: none; + background-color: #f5f5f5; +} + +.pager .next a { + float: right; +} + +.pager .previous a { + float: left; +} + +.pager .disabled a, +.pager .disabled a:hover { + color: #999999; + cursor: default; + background-color: #fff; +} + +.modal-open .dropdown-menu { + z-index: 2050; +} + +.modal-open .dropdown.open { + *z-index: 2050; +} + +.modal-open .popover { + z-index: 2060; +} + +.modal-open .tooltip { + z-index: 2070; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.modal { + position: fixed; + top: 50%; + left: 50%; + z-index: 1050; + width: 560px; + margin: -250px 0 0 -280px; + overflow: auto; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.modal.fade { + top: -25%; + -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; + -moz-transition: opacity 0.3s linear, top 0.3s ease-out; + -ms-transition: opacity 0.3s linear, top 0.3s ease-out; + -o-transition: opacity 0.3s linear, top 0.3s ease-out; + transition: opacity 0.3s linear, top 0.3s ease-out; +} + +.modal.fade.in { + top: 50%; +} + +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} + +.modal-header .close { + margin-top: 2px; +} + +.modal-body { + max-height: 400px; + padding: 15px; + overflow-y: auto; +} + +.modal-form { + margin-bottom: 0; +} + +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + content: ""; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} + +.tooltip { + position: absolute; + z-index: 1020; + display: block; + padding: 5px; + font-size: 11px; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.tooltip.top { + margin-top: -2px; +} + +.tooltip.right { + margin-left: 2px; +} + +.tooltip.bottom { + margin-top: 2px; +} + +.tooltip.left { + margin-left: -2px; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top: 5px solid #000000; + border-right: 5px solid transparent; + border-left: 5px solid transparent; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 5px solid #000000; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-right: 5px solid transparent; + border-bottom: 5px solid #000000; + border-left: 5px solid transparent; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-right: 5px solid #000000; + border-bottom: 5px solid transparent; +} + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + padding: 5px; +} + +.popover.top { + margin-top: -5px; +} + +.popover.right { + margin-left: 5px; +} + +.popover.bottom { + margin-top: 5px; +} + +.popover.left { + margin-left: -5px; +} + +.popover.top .arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top: 5px solid #000000; + border-right: 5px solid transparent; + border-left: 5px solid transparent; +} + +.popover.right .arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-right: 5px solid #000000; + border-bottom: 5px solid transparent; +} + +.popover.bottom .arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-right: 5px solid transparent; + border-bottom: 5px solid #000000; + border-left: 5px solid transparent; +} + +.popover.left .arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 5px solid #000000; +} + +.popover .arrow { + position: absolute; + width: 0; + height: 0; +} + +.popover-inner { + width: 280px; + padding: 3px; + overflow: hidden; + background: #000000; + background: rgba(0, 0, 0, 0.8); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); +} + +.popover-title { + padding: 9px 15px; + line-height: 1; + background-color: #f5f5f5; + border-bottom: 1px solid #eee; + -webkit-border-radius: 3px 3px 0 0; + -moz-border-radius: 3px 3px 0 0; + border-radius: 3px 3px 0 0; +} + +.popover-content { + padding: 14px; + background-color: #ffffff; + -webkit-border-radius: 0 0 3px 3px; + -moz-border-radius: 0 0 3px 3px; + border-radius: 0 0 3px 3px; + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.popover-content p, +.popover-content ul, +.popover-content ol { + margin-bottom: 0; +} + +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} + +.thumbnails:before, +.thumbnails:after { + display: table; + content: ""; +} + +.thumbnails:after { + clear: both; +} + +.row-fluid .thumbnails { + margin-left: 0; +} + +.thumbnails > li { + float: left; + margin-bottom: 18px; + margin-left: 20px; +} + +.thumbnail { + display: block; + padding: 4px; + line-height: 1; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); +} + +a.thumbnail:hover { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} + +.thumbnail > img { + display: block; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} + +.thumbnail .caption { + padding: 9px; +} + +.label, +.badge { + font-size: 10.998px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; +} + +.label { + padding: 1px 4px 2px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.badge { + padding: 1px 9px 2px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} + +a.label:hover, +a.badge:hover { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label-important, +.badge-important { + background-color: #b94a48; +} + +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} + +.label-warning, +.badge-warning { + background-color: #f89406; +} + +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} + +.label-success, +.badge-success { + background-color: #468847; +} + +.label-success[href], +.badge-success[href] { + background-color: #356635; +} + +.label-info, +.badge-info { + background-color: #3a87ad; +} + +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} + +.label-inverse, +.badge-inverse { + background-color: #333333; +} + +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 18px; + margin-bottom: 18px; + overflow: hidden; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(top, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress .bar { + width: 0; + height: 18px; + font-size: 12px; + color: #ffffff; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(top, #149bdf, #0480be); + background-image: -ms-linear-gradient(top, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -ms-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress-striped .bar { + background-color: #149bdf; + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} + +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-danger .bar { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(top, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); +} + +.progress-danger.progress-striped .bar { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-success .bar { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -ms-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(top, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); +} + +.progress-success.progress-striped .bar { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-info .bar { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -ms-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(top, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); +} + +.progress-info.progress-striped .bar { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-warning .bar { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -ms-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(top, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); +} + +.progress-warning.progress-striped .bar { + background-color: #fbb450; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.accordion { + margin-bottom: 18px; +} + +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.accordion-heading { + border-bottom: 0; +} + +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} + +.accordion-toggle { + cursor: pointer; +} + +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} + +.carousel { + position: relative; + margin-bottom: 18px; + line-height: 1; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -ms-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel .item > img { + display: block; + line-height: 1; +} + +.carousel .active, +.carousel .next, +.carousel .prev { + display: block; +} + +.carousel .active { + left: 0; +} + +.carousel .next, +.carousel .prev { + position: absolute; + top: 0; + width: 100%; +} + +.carousel .next { + left: 100%; +} + +.carousel .prev { + left: -100%; +} + +.carousel .next.left, +.carousel .prev.right { + left: 0; +} + +.carousel .active.left { + left: -100%; +} + +.carousel .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.right { + right: 15px; + left: auto; +} + +.carousel-control:hover { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-caption { + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 10px 15px 5px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} + +.carousel-caption h4, +.carousel-caption p { + color: #ffffff; +} + +.hero-unit { + padding: 60px; + margin-bottom: 30px; + background-color: #eeeeee; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; + color: inherit; +} + +.hero-unit p { + font-size: 18px; + font-weight: 200; + line-height: 27px; + color: inherit; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.hide { + display: none; +} + +.show { + display: block; +} + +.invisible { + visibility: hidden; +} diff --git a/src/main/java/com/gitblit/wicket/resources/bootstrap/css/iconic.css b/src/main/java/com/gitblit/wicket/resources/bootstrap/css/iconic.css new file mode 100644 index 000000000..66b9fe296 --- /dev/null +++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/css/iconic.css @@ -0,0 +1,567 @@ +/* + * Iconic CSS by Jansy + * http://jasny.github.io/bootstrap + * + */ + +@font-face { + font-family: IconicStroke; + font-weight: normal; + src: url(../font/iconic_stroke.eot); + src: local('IconicStroke'), url(../font/iconic_stroke.eot?#iefix) format('embedded-opentype'), url(../font/iconic_stroke.woff) format('woff'), url(../font/iconic_stroke.ttf) format('truetype'), url(../font/iconic_stroke.svg#iconic) format('svg'), url(../font/iconic_stroke.otf) format('opentype'); +} + +@font-face { + font-family: IconicFill; + font-weight: normal; + src: url(../font/iconic_fill.eot); + src: local('IconicFill'), url(../font/iconic_fill.eot?#iefix) format('embedded-opentype'), url(../font/iconic_fill.woff) format('woff'), url(../font/iconic_fill.ttf) format('truetype'), url(../font/iconic_fill.svg#iconic) format('svg'), url(../font/iconic_fill.otf) format('opentype'); +} + +@media screen, print { + [class*="iconic-"] { + font-style: inherit; + font-weight: normal; + vertical-align: middle; + } + [class*="iconic-"]:before { + display: inline-block; + width: 1em; + font-family: IconicFill; + text-align: center; + content: ""; + } + .iconic-stroke:before { + font-family: IconicStroke; + } + .iconic-hash:before { + content: '\23'; + } + .iconic-question-mark:before { + content: '\3f'; + } + .iconic-at:before { + content: '\40'; + } + .iconic-pilcrow:before { + content: '\b6'; + } + .iconic-info:before { + content: '\2139'; + } + .iconic-arrow-left:before { + content: '\2190'; + } + .iconic-arrow-up:before { + content: '\2191'; + } + .iconic-arrow-right:before { + content: '\2192'; + } + .iconic-arrow-down:before { + content: '\2193'; + } + .iconic-home:before { + content: '\2302'; + } + .iconic-sun:before { + content: '\2600'; + } + .iconic-cloud:before { + content: '\2601'; + } + .iconic-umbrella:before { + content: '\2602'; + } + .iconic-star:before { + content: '\2605'; + } + .iconic-moon:before { + content: '\263e'; + } + .iconic-heart:before { + content: '\2764'; + } + .iconic-cog:before { + content: '\2699'; + } + .iconic-bolt:before { + content: '\26a1'; + } + .iconic-key:before { + content: '\26bf'; + } + .iconic-rain:before { + content: '\26c6'; + } + .iconic-denied:before { + content: '\26d4'; + } + .iconic-mail:before { + content: '\2709'; + } + .iconic-pen:before { + content: '\270e'; + } + .iconic-x:before { + content: '\2713'; + } + .iconic-o-x:before { + content: '\2714'; + } + .iconic-check:before { + content: '\2717'; + } + .iconic-o-check:before { + content: '\2718'; + } + .iconic-left-quote:before { + content: '\275d'; + } + .iconic-right-quote:before { + content: '\275e'; + } + .iconic-plus:before { + content: '\2795'; + } + .iconic-minus:before { + content: '\2796'; + } + .iconic-curved-arrow:before { + content: '\2935'; + } + .iconic-document-alt:before { + content: '\e000'; + } + .iconic-calendar:before { + content: '\e001'; + } + .iconic-map-pin-alt:before { + content: '\e002'; + } + .iconic-comment-alt1:before { + content: '\e003'; + } + .iconic-comment-alt2:before { + content: '\e004'; + } + .iconic-pen-alt:before { + content: '\e005'; + } + .iconic-pen-alt2:before { + content: '\e006'; + } + .iconic-chat-alt:before { + content: '\e007'; + } + .iconic-o-plus:before { + content: '\e008'; + } + .iconic-o-minus:before { + content: '\e009'; + } + .iconic-bars-alt:before { + content: '\e00a'; + } + .iconic-book-alt:before { + content: '\e00b'; + } + .iconic-aperture-alt:before { + content: '\e00c'; + } + .iconic-beaker-alt:before { + content: '\e010'; + } + .iconic-left-quote-alt:before { + content: '\e011'; + } + .iconic-right-quote-alt:before { + content: '\e012'; + } + .iconic-o-arrow-left:before { + content: '\e013'; + } + .iconic-o-arrow-up:before { + content: '\e014'; + } + .iconic-o-arrow-right:before { + content: '\e015'; + } + .iconic-o-arrow-down:before { + content: '\e016'; + } + .iconic-o-arrow-left-alt:before { + content: '\e017'; + } + .iconic-o-arrow-up-alt:before { + content: '\e018'; + } + .iconic-o-arrow-right-alt:before { + content: '\e019'; + } + .iconic-o-arrow-down-alt:before { + content: '\e01a'; + } + .iconic-brush:before { + content: '\e01b'; + } + .iconic-brush-alt:before { + content: '\e01c'; + } + .iconic-eyedropper:before { + content: '\e01e'; + } + .iconic-layers:before { + content: '\e01f'; + } + .iconic-layers-alt:before { + content: '\e020'; + } + .iconic-compass:before { + content: '\e021'; + } + .iconic-award:before { + content: '\e022'; + } + .iconic-beaker:before { + content: '\e023'; + } + .iconic-steering-wheel:before { + content: '\e024'; + } + .iconic-eye:before { + content: '\e025'; + } + .iconic-aperture:before { + content: '\e026'; + } + .iconic-image:before { + content: '\e027'; + } + .iconic-chart:before { + content: '\e028'; + } + .iconic-chart-alt:before { + content: '\e029'; + } + .iconic-target:before { + content: '\e02a'; + } + .iconic-tag:before { + content: '\e02b'; + } + .iconic-rss:before { + content: '\e02c'; + } + .iconic-rss-alt:before { + content: '\e02d'; + } + .iconic-share:before { + content: '\e02e'; + } + .iconic-undo:before { + content: '\e02f'; + } + .iconic-reload:before { + content: '\e030'; + } + .iconic-reload-alt:before { + content: '\e031'; + } + .iconic-loop:before { + content: '\e032'; + } + .iconic-loop-alt:before { + content: '\e033'; + } + .iconic-back-forth:before { + content: '\e034'; + } + .iconic-back-forth-alt:before { + content: '\e035'; + } + .iconic-spin:before { + content: '\e036'; + } + .iconic-spin-alt:before { + content: '\e037'; + } + .iconic-move-horizontal:before { + content: '\e038'; + } + .iconic-move-horizontal-alt:before { + content: '\e039'; + } + .iconic-o-move-horizontal:before { + content: '\e03a'; + } + .iconic-move-vertical:before { + content: '\e03b'; + } + .iconic-move-vertical-alt:before { + content: '\e03c'; + } + .iconic-o-move-vertical:before { + content: '\e03d'; + } + .iconic-move:before { + content: '\e03e'; + } + .iconic-move-alt:before { + content: '\e03f'; + } + .iconic-o-move:before { + content: '\e040'; + } + .iconic-transfer:before { + content: '\e041'; + } + .iconic-download:before { + content: '\e042'; + } + .iconic-upload:before { + content: '\e043'; + } + .iconic-cloud-download:before { + content: '\e044'; + } + .iconic-cloud-upload:before { + content: '\e045'; + } + .iconic-fork:before { + content: '\e046'; + } + .iconic-play:before { + content: '\e047'; + } + .iconic-o-play:before { + content: '\e048'; + } + .iconic-pause:before { + content: '\e049'; + } + .iconic-stop:before { + content: '\e04a'; + } + .iconic-eject:before { + content: '\e04b'; + } + .iconic-first:before { + content: '\e04c'; + } + .iconic-last:before { + content: '\e04d'; + } + .iconic-fullscreen:before { + content: '\e04e'; + } + .iconic-fullscreen-alt:before { + content: '\e04f'; + } + .iconic-fullscreen-exit:before { + content: '\e050'; + } + .iconic-fullscreen-exit-alt:before { + content: '\e051'; + } + .iconic-equalizer:before { + content: '\e052'; + } + .iconic-article:before { + content: '\e053'; + } + .iconic-read-more:before { + content: '\e054'; + } + .iconic-list:before { + content: '\e055'; + } + .iconic-list-nested:before { + content: '\e056'; + } + .iconic-cursor:before { + content: '\e057'; + } + .iconic-dial:before { + content: '\e058'; + } + .iconic-new-window:before { + content: '\e059'; + } + .iconic-trash:before { + content: '\e05a'; + } + .iconic-battery-half:before { + content: '\e05b'; + } + .iconic-battery-empty:before { + content: '\e05c'; + } + .iconic-battery-charging:before { + content: '\e05d'; + } + .iconic-chat:before { + content: '\e05e'; + } + .iconic-mic:before { + content: '\e05f'; + } + .iconic-movie:before { + content: '\e060'; + } + .iconic-headphones:before { + content: '\e061'; + } + .iconic-user:before { + content: '\e062'; + } + .iconic-lightbulb:before { + content: '\e063'; + } + .iconic-cd:before { + content: '\e064'; + } + .iconic-folder:before { + content: '\e065'; + } + .iconic-document:before { + content: '\e066'; + } + .iconic-pin:before { + content: '\e067'; + } + .iconic-map-pin:before { + content: '\e068'; + } + .iconic-book:before { + content: '\e069'; + } + .iconic-book-alt2:before { + content: '\e06a'; + } + .iconic-box:before { + content: '\e06b'; + } + .iconic-calendar-alt:before { + content: '\e06c'; + } + .iconic-comment:before { + content: '\e06d'; + } + .iconic-iphone:before { + content: '\e06e'; + } + .iconic-bars:before { + content: '\e06f'; + } + .iconic-camera:before { + content: '\e070'; + } + .iconic-volume-mute:before { + content: '\e071'; + } + .iconic-volume:before { + content: '\e072'; + } + .iconic-battery-full:before { + content: '\e073'; + } + .iconic-magnifying-glass:before { + content: '\e074'; + } + .iconic-lock:before { + content: '\e075'; + } + .iconic-unlock:before { + content: '\e076'; + } + .iconic-link:before { + content: '\e077'; + } + .iconic-wrench:before { + content: '\e078'; + } + .iconic-clock:before { + content: '\e079'; + } + .iconic-sun-stroke:before { + font-family: IconicStroke; + content: '\2600'; + } + .iconic-moon-stroke:before { + font-family: IconicStroke; + content: '\263e'; + } + .iconic-star-stroke:before { + font-family: IconicStroke; + content: '\2605'; + } + .iconic-heart-stroke:before { + font-family: IconicStroke; + content: '\2764'; + } + .iconic-key-stroke:before { + font-family: IconicStroke; + content: '\26bf'; + } + .iconic-document-alt-stroke:before { + font-family: IconicStroke; + content: '\e000'; + } + .iconic-comment-alt1-stroke:before { + font-family: IconicStroke; + content: '\e003'; + } + .iconic-comment-alt2-stroke:before { + font-family: IconicStroke; + content: '\e004'; + } + .iconic-pen-alt-stroke:before { + font-family: IconicStroke; + content: '\e005'; + } + .iconic-chat-alt-stroke:before { + font-family: IconicStroke; + content: '\e007'; + } + .iconic-award-stroke:before { + font-family: IconicStroke; + content: '\e022'; + } + .iconic-tag-stroke:before { + font-family: IconicStroke; + content: '\e02b'; + } + .iconic-trash-stroke:before { + font-family: IconicStroke; + content: '\e05a'; + } + .iconic-folder-stroke:before { + font-family: IconicStroke; + content: '\e065'; + } + .iconic-document-stroke:before { + font-family: IconicStroke; + content: '\e066'; + } + .iconic-map-pin-stroke:before { + font-family: IconicStroke; + content: '\e068'; + } + .iconic-calendar-alt-stroke:before { + font-family: IconicStroke; + content: '\e06c'; + } + .iconic-comment-stroke:before { + font-family: IconicStroke; + content: '\e06d'; + } + .iconic-lock-stroke:before { + font-family: IconicStroke; + content: '\e075'; + } + .iconic-unlock-stroke:before { + font-family: IconicStroke; + content: '\e076'; + } +} \ No newline at end of file diff --git a/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.afm b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.afm new file mode 100644 index 000000000..0cca7c40a --- /dev/null +++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.afm @@ -0,0 +1,170 @@ +StartFontMetrics 2.0 +Comment Generated by FontForge 20110222 +Comment Creation Date: Sun Apr 1 19:42:26 2012 +FontName IconicFill +FullName Iconic Fill +FamilyName Iconic +Weight Medium +Notice (Icons by PJ Onori, font creation script by Yann) +ItalicAngle 0 +IsFixedPitch false +UnderlinePosition -100 +UnderlineThickness 50 +Version 001.000 +EncodingScheme ISOLatin1Encoding +FontBBox 14 -14 760 731 +Descender -2147483648 +StartCharMetrics 151 +C 35 ; WX 681 ; N numbersign ; B 15 -14 667 731 ; +C 63 ; WX 402 ; N question ; B 15 -14 388 731 ; +C 64 ; WX 774 ; N at ; B 15 -14 760 731 ; +C 182 ; WX 588 ; N paragraph ; B 15 -14 574 731 ; +C -1 ; WX 495 ; N glyph0 ; B 15 -14 481 731 ; +C -1 ; WX 774 ; N glyph1 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph2 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph3 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph4 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph5 ; B 15 32 760 684 ; +C -1 ; WX 774 ; N glyph6 ; B 15 32 760 684 ; +C -1 ; WX 774 ; N glyph7 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph8 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph9 ; B 15 -14 760 731 ; +C -1 ; WX 728 ; N glyph10 ; B 14 -14 713 731 ; +C -1 ; WX 774 ; N glyph11 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph12 ; B 15 -14 760 731 ; +C -1 ; WX 681 ; N glyph13 ; B 15 -14 667 730 ; +C -1 ; WX 774 ; N glyph14 ; B 15 32 760 684 ; +C -1 ; WX 774 ; N glyph15 ; B 15 79 760 638 ; +C -1 ; WX 774 ; N glyph16 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph17 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph18 ; B 15 172 760 545 ; +C -1 ; WX 588 ; N glyph19 ; B 15 -14 574 731 ; +C -1 ; WX 774 ; N glyph20 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph21 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph22 ; B 15 218 760 498 ; +C -1 ; WX 774 ; N glyph23 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph24 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph25 ; B 15 172 760 545 ; +C -1 ; WX 774 ; N glyph26 ; B 15 32 760 684 ; +C -1 ; WX 402 ; N glyph27 ; B 15 -14 388 731 ; +C -1 ; WX 774 ; N glyph29 ; B 15 32 760 684 ; +C -1 ; WX 588 ; N glyph30 ; B 15 -14 574 731 ; +C -1 ; WX 588 ; N glyph31 ; B 15 32 574 684 ; +C -1 ; WX 774 ; N glyph32 ; B 15 79 760 638 ; +C -1 ; WX 774 ; N glyph33 ; B 15 79 760 638 ; +C -1 ; WX 774 ; N glyph34 ; B 15 32 760 684 ; +C -1 ; WX 774 ; N glyph35 ; B 15 79 760 638 ; +C -1 ; WX 774 ; N glyph36 ; B 15 79 760 638 ; +C -1 ; WX 681 ; N glyph37 ; B 15 32 667 684 ; +C -1 ; WX 774 ; N glyph38 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph39 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph40 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph41 ; B 15 -14 760 731 ; +C -1 ; WX 588 ; N glyph42 ; B 15 -14 574 731 ; +C -1 ; WX 774 ; N glyph43 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph44 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph45 ; B 15 79 760 638 ; +C -1 ; WX 588 ; N glyph46 ; B 15 -14 574 731 ; +C -1 ; WX 774 ; N glyph47 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph48 ; B 15 -12 760 729 ; +C -1 ; WX 774 ; N glyph49 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph50 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph51 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph52 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph53 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph54 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph55 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph56 ; B 15 79 760 638 ; +C -1 ; WX 774 ; N glyph57 ; B 15 79 760 638 ; +C -1 ; WX 774 ; N glyph58 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph59 ; B 15 32 760 684 ; +C -1 ; WX 774 ; N glyph60 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph61 ; B 15 -14 760 731 ; +C -1 ; WX 588 ; N glyph62 ; B 15 -14 574 731 ; +C -1 ; WX 774 ; N glyph63 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph64 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph65 ; B 15 -14 760 731 ; +C -1 ; WX 402 ; N glyph66 ; B 15 -14 388 731 ; +C -1 ; WX 402 ; N glyph67 ; B 15 -14 388 731 ; +C -1 ; WX 774 ; N glyph68 ; B 15 172 760 545 ; +C -1 ; WX 774 ; N glyph69 ; B 15 -14 760 731 ; +C -1 ; WX 588 ; N glyph70 ; B 15 -14 574 731 ; +C -1 ; WX 774 ; N glyph71 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph72 ; B 15 -14 760 731 ; +C -1 ; WX 402 ; N glyph73 ; B 15 -14 388 731 ; +C -1 ; WX 774 ; N glyph74 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph75 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph76 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph77 ; B 14 79 760 638 ; +C -1 ; WX 774 ; N glyph78 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph79 ; B 15 79 760 638 ; +C -1 ; WX 774 ; N glyph80 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph81 ; B 15 125 760 591 ; +C -1 ; WX 774 ; N glyph82 ; B 15 79 760 638 ; +C -1 ; WX 774 ; N glyph83 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph84 ; B 15 79 760 638 ; +C -1 ; WX 774 ; N glyph85 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph86 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph87 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph88 ; B 15 79 760 638 ; +C -1 ; WX 774 ; N glyph89 ; B 15 218 760 498 ; +C -1 ; WX 774 ; N glyph90 ; B 15 -14 760 731 ; +C -1 ; WX 588 ; N glyph91 ; B 15 32 574 684 ; +C -1 ; WX 774 ; N glyph92 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph93 ; B 15 -14 760 731 ; +C -1 ; WX 681 ; N glyph94 ; B 15 -14 667 731 ; +C -1 ; WX 774 ; N glyph95 ; B 15 -14 760 731 ; +C -1 ; WX 495 ; N glyph96 ; B 15 -14 481 731 ; +C -1 ; WX 681 ; N glyph97 ; B 15 -14 667 731 ; +C -1 ; WX 774 ; N glyph98 ; B 15 79 760 638 ; +C -1 ; WX 774 ; N glyph99 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph100 ; B 14 -14 760 731 ; +C -1 ; WX 309 ; N glyph101 ; B 15 -14 295 731 ; +C -1 ; WX 774 ; N glyph102 ; B 15 -14 759 731 ; +C -1 ; WX 681 ; N glyph103 ; B 15 -14 667 731 ; +C -1 ; WX 774 ; N glyph104 ; B 15 -14 760 731 ; +C -1 ; WX 402 ; N glyph105 ; B 15 -14 388 731 ; +C -1 ; WX 774 ; N glyph106 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph107 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph108 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph109 ; B 15 265 760 452 ; +C -1 ; WX 774 ; N glyph110 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph111 ; B 15 32 760 684 ; +C -1 ; WX 774 ; N glyph113 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph114 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph115 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph116 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph117 ; B 15 -14 760 731 ; +C -1 ; WX 681 ; N glyph118 ; B 15 -14 667 731 ; +C -1 ; WX 774 ; N glyph119 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph121 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph122 ; B 15 -14 760 731 ; +C -1 ; WX 309 ; N glyph123 ; B 15 -14 295 731 ; +C -1 ; WX 774 ; N glyph124 ; B 15 58 760 658 ; +C -1 ; WX 588 ; N glyph125 ; B 15 -14 574 731 ; +C -1 ; WX 681 ; N glyph126 ; B 15 -14 667 731 ; +C -1 ; WX 774 ; N glyph127 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph128 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph129 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph130 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph131 ; B 15 -14 760 731 ; +C -1 ; WX 588 ; N glyph132 ; B 15 -14 574 731 ; +C -1 ; WX 774 ; N glyph133 ; B 15 -14 760 731 ; +C -1 ; WX 588 ; N glyph134 ; B 15 -14 574 731 ; +C -1 ; WX 774 ; N glyph135 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph136 ; B 15 32 760 684 ; +C -1 ; WX 774 ; N glyph137 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph138 ; B 15 -14 760 731 ; +C -1 ; WX 588 ; N glyph139 ; B 15 -14 574 731 ; +C -1 ; WX 774 ; N glyph140 ; B 15 172 760 545 ; +C -1 ; WX 774 ; N glyph141 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph142 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph143 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph145 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph146 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph147 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph148 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph149 ; B 15 -14 760 731 ; +C -1 ; WX 774 ; N glyph150 ; B 15 -14 760 731 ; +EndCharMetrics +EndFontMetrics diff --git a/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.css b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.css new file mode 100644 index 000000000..8943a93f0 --- /dev/null +++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.css @@ -0,0 +1 @@ +@font-face { font-family: 'IconicFill'; src: url('iconic_fill.eot'); src: url('iconic_fill.eot?#iefix') format('embedded-opentype'), url('iconic_fill.ttf') format('truetype'), url('iconic_fill.svg#iconic') format('svg'); font-weight: normal; font-style: normal; }.iconic { display:inline-block; font-family: 'IconicFill'; }.lightbulb:before {content:'\e063';}.equalizer:before {content:'\e052';}.brush_alt:before {content:'\e01c';}.move:before {content:'\e03e';}.tag_fill:before {content:'\e02b';}.book_alt2:before {content:'\e06a';}.layers:before {content:'\e01f';}.chat_alt_fill:before {content:'\e007';}.layers_alt:before {content:'\e020';}.cloud_upload:before {content:'\e045';}.chart_alt:before {content:'\e029';}.fullscreen_exit_alt:before {content:'\e051';}.cloud_download:before {content:'\e044';}.paperclip:before {content:'\e08a';}.heart_fill:before {content:'\2764';}.mail:before {content:'\2709';}.pen_alt_fill:before {content:'\e005';}.check_alt:before {content:'\2718';}.battery_charging:before {content:'\e05d';}.lock_fill:before {content:'\e075';}.stop:before {content:'\e04a';}.arrow_up:before {content:'\2191';}.move_horizontal:before {content:'\e038';}.compass:before {content:'\e021';}.minus_alt:before {content:'\e009';}.battery_empty:before {content:'\e05c';}.comment_fill:before {content:'\e06d';}.map_pin_alt:before {content:'\e002';}.question_mark:before {content:'\003f';}.list:before {content:'\e055';}.upload:before {content:'\e043';}.reload:before {content:'\e030';}.loop_alt4:before {content:'\e035';}.loop_alt3:before {content:'\e034';}.loop_alt2:before {content:'\e033';}.loop_alt1:before {content:'\e032';}.left_quote:before {content:'\275d';}.x:before {content:'\2713';}.last:before {content:'\e04d';}.bars:before {content:'\e06f';}.arrow_left:before {content:'\2190';}.arrow_down:before {content:'\2193';}.download:before {content:'\e042';}.home:before {content:'\2302';}.calendar:before {content:'\e001';}.right_quote_alt:before {content:'\e012';}.unlock_fill:before {content:'\e076';}.fullscreen:before {content:'\e04e';}.dial:before {content:'\e058';}.plus_alt:before {content:'\e008';}.clock:before {content:'\e079';}.movie:before {content:'\e060';}.steering_wheel:before {content:'\e024';}.pen:before {content:'\270e';}.pin:before {content:'\e067';}.denied:before {content:'\26d4';}.left_quote_alt:before {content:'\e011';}.volume_mute:before {content:'\e071';}.umbrella:before {content:'\2602';}.list_nested:before {content:'\e056';}.arrow_up_alt1:before {content:'\e014';}.undo:before {content:'\e02f';}.pause:before {content:'\e049';}.bolt:before {content:'\26a1';}.article:before {content:'\e053';}.read_more:before {content:'\e054';}.beaker:before {content:'\e023';}.beaker_alt:before {content:'\e010';}.battery_full:before {content:'\e073';}.arrow_right:before {content:'\2192';}.iphone:before {content:'\e06e';}.arrow_up_alt2:before {content:'\e018';}.cog:before {content:'\2699';}.award_fill:before {content:'\e022';}.first:before {content:'\e04c';}.trash_fill:before {content:'\e05a';}.image:before {content:'\e027';}.comment_alt1_fill:before {content:'\e003';}.cd:before {content:'\e064';}.right_quote:before {content:'\275e';}.brush:before {content:'\e01b';}.cloud:before {content:'\2601';}.eye:before {content:'\e025';}.play_alt:before {content:'\e048';}.transfer:before {content:'\e041';}.pen_alt2:before {content:'\e006';}.camera:before {content:'\e070';}.move_horizontal_alt2:before {content:'\e03a';}.curved_arrow:before {content:'\2935';}.move_horizontal_alt1:before {content:'\e039';}.aperture:before {content:'\e026';}.reload_alt:before {content:'\e031';}.magnifying_glass:before {content:'\e074';}.calendar_alt_fill:before {content:'\e06c';}.fork:before {content:'\e046';}.box:before {content:'\e06b';}.map_pin_fill:before {content:'\e068';}.bars_alt:before {content:'\e00a';}.volume:before {content:'\e072';}.x_alt:before {content:'\2714';}.link:before {content:'\e077';}.move_vertical:before {content:'\e03b';}.eyedropper:before {content:'\e01e';}.spin:before {content:'\e036';}.rss:before {content:'\e02c';}.info:before {content:'\2139';}.target:before {content:'\e02a';}.cursor:before {content:'\e057';}.key_fill:before {content:'\26bf';}.minus:before {content:'\2796';}.book_alt:before {content:'\e00b';}.headphones:before {content:'\e061';}.hash:before {content:'\0023';}.arrow_left_alt1:before {content:'\e013';}.arrow_left_alt2:before {content:'\e017';}.fullscreen_exit:before {content:'\e050';}.share:before {content:'\e02e';}.fullscreen_alt:before {content:'\e04f';}.comment_alt2_fill:before {content:'\e004';}.moon_fill:before {content:'\263e';}.at:before {content:'\0040';}.chat:before {content:'\e05e';}.move_vertical_alt2:before {content:'\e03d';}.move_vertical_alt1:before {content:'\e03c';}.check:before {content:'\2717';}.mic:before {content:'\e05f';}.book:before {content:'\e069';}.move_alt1:before {content:'\e03f';}.move_alt2:before {content:'\e040';}.document_fill:before {content:'\e066';}.plus:before {content:'\2795';}.wrench:before {content:'\e078';}.play:before {content:'\e047';}.star:before {content:'\2605';}.document_alt_fill:before {content:'\e000';}.chart:before {content:'\e028';}.rain:before {content:'\26c6';}.folder_fill:before {content:'\e065';}.new_window:before {content:'\e059';}.user:before {content:'\e062';}.battery_half:before {content:'\e05b';}.aperture_alt:before {content:'\e00c';}.eject:before {content:'\e04b';}.arrow_down_alt1:before {content:'\e016';}.pilcrow:before {content:'\00b6';}.arrow_down_alt2:before {content:'\e01a';}.arrow_right_alt1:before {content:'\e015';}.arrow_right_alt2:before {content:'\e019';}.rss_alt:before {content:'\e02d';}.spin_alt:before {content:'\e037';}.sun_fill:before {content:'\2600';} \ No newline at end of file diff --git a/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.eot b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.eot new file mode 100644 index 0000000000000000000000000000000000000000..f1e8f85cf676845b1c9e5c6ab2756d54a893c03d GIT binary patch literal 30846 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 literal 0 HcmV?d00001 diff --git a/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.otf b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.otf new file mode 100644 index 0000000000000000000000000000000000000000..1b8caffc00aaeda9add1bc27a12bb4ad0cd1b035 GIT binary patch literal 44808 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 D2aD}f literal 0 HcmV?d00001 diff --git a/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.svg b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.svg new file mode 100644 index 000000000..95e13591d --- /dev/null +++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.svg @@ -0,0 +1,539 @@ + + + + +Created by FontForge 20110222 at Sun Apr 1 19:42:26 2012 + By PJ Onori,,, +Icons by PJ Onori, font creation script by Yann + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.ttf b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.ttf new file mode 100644 index 0000000000000000000000000000000000000000..83342540c1e765d6fda361d6f2ca89317799f437 GIT binary patch literal 18080 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 V2Cv_}uZ7E>y59znGX9^I{|hi4Ph0>1 literal 0 HcmV?d00001 diff --git a/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.woff b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.woff new file mode 100644 index 0000000000000000000000000000000000000000..9596d8ecf120a07b5a27627fd1e693fdfd8176d2 GIT binary patch literal 20560 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 literal 0 HcmV?d00001 diff --git a/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.otf b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.otf new file mode 100644 index 0000000000000000000000000000000000000000..0d132a952f0363dc72fc7f4b5e90df75bfb6dede GIT binary patch literal 46916 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 u7(OpQ9gE>49q;b=%=eSx + + + +Created by FontForge 20110222 at Sun Apr 1 19:42:24 2012 + By PJ Onori,,, +Icons by PJ Onori, font creation script by Yann + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.ttf b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f891c8dae7e60be2e4ea3c7b86cfa126f546f67d GIT binary patch literal 18644 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 literal 0 HcmV?d00001 diff --git a/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.woff b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.woff new file mode 100644 index 0000000000000000000000000000000000000000..85f5be59435a0aa88e70cdaefb47eeb0b18fa077 GIT binary patch literal 21484 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 NMhsX004PKOxB%=*Nf7`5 literal 0 HcmV?d00001 diff --git a/src/main/java/com/gitblit/wicket/resources/bootstrap/img/glyphicons-halflings-white.png b/src/main/java/com/gitblit/wicket/resources/bootstrap/img/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf6484a29d8da269f9bc874b25493a45fae3bae GIT binary patch literal 8777 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 B7G?kd literal 0 HcmV?d00001 diff --git a/src/main/java/com/gitblit/wicket/resources/bootstrap/img/glyphicons-halflings.png b/src/main/java/com/gitblit/wicket/resources/bootstrap/img/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..79bc568c21395d5a5ceab62fadb04457094b2ac7 GIT binary patch literal 13826 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 literal 0 HcmV?d00001 diff --git a/src/main/java/com/gitblit/wicket/resources/bootstrap/js/bootstrap.js b/src/main/java/com/gitblit/wicket/resources/bootstrap/js/bootstrap.js new file mode 100644 index 000000000..5d6e65b82 --- /dev/null +++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/js/bootstrap.js @@ -0,0 +1,1825 @@ +/* =================================================== + * bootstrap-transition.js v2.0.4 + * http://twitter.github.com/bootstrap/javascript.html#transitions + * =================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + $(function () { + + "use strict"; // jshint ;_; + + + /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) + * ======================================================= */ + + $.support.transition = (function () { + + var transitionEnd = (function () { + + var el = document.createElement('bootstrap') + , transEndEventNames = { + 'WebkitTransition' : 'webkitTransitionEnd' + , 'MozTransition' : 'transitionend' + , 'OTransition' : 'oTransitionEnd' + , 'msTransition' : 'MSTransitionEnd' + , 'transition' : 'transitionend' + } + , name + + for (name in transEndEventNames){ + if (el.style[name] !== undefined) { + return transEndEventNames[name] + } + } + + }()) + + return transitionEnd && { + end: transitionEnd + } + + })() + + }) + +}(window.jQuery);/* ========================================================== + * bootstrap-alert.js v2.0.4 + * http://twitter.github.com/bootstrap/javascript.html#alerts + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* ALERT CLASS DEFINITION + * ====================== */ + + var dismiss = '[data-dismiss="alert"]' + , Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.prototype.close = function (e) { + var $this = $(this) + , selector = $this.attr('data-target') + , $parent + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = $(selector) + + e && e.preventDefault() + + $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) + + $parent.trigger(e = $.Event('close')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + $parent + .trigger('closed') + .remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent.on($.support.transition.end, removeElement) : + removeElement() + } + + + /* ALERT PLUGIN DEFINITION + * ======================= */ + + $.fn.alert = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('alert') + if (!data) $this.data('alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.alert.Constructor = Alert + + + /* ALERT DATA-API + * ============== */ + + $(function () { + $('body').on('click.alert.data-api', dismiss, Alert.prototype.close) + }) + +}(window.jQuery);/* ============================================================ + * bootstrap-button.js v2.0.4 + * http://twitter.github.com/bootstrap/javascript.html#buttons + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* BUTTON PUBLIC CLASS DEFINITION + * ============================== */ + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.button.defaults, options) + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + , $el = this.$element + , data = $el.data() + , val = $el.is('input') ? 'val' : 'html' + + state = state + 'Text' + data.resetText || $el.data('resetText', $el[val]()) + + $el[val](data[state] || this.options[state]) + + // push to event loop to allow forms to submit + setTimeout(function () { + state == 'loadingText' ? + $el.addClass(d).attr(d, d) : + $el.removeClass(d).removeAttr(d) + }, 0) + } + + Button.prototype.toggle = function () { + var $parent = this.$element.parent('[data-toggle="buttons-radio"]') + + $parent && $parent + .find('.active') + .removeClass('active') + + this.$element.toggleClass('active') + } + + + /* BUTTON PLUGIN DEFINITION + * ======================== */ + + $.fn.button = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('button') + , options = typeof option == 'object' && option + if (!data) $this.data('button', (data = new Button(this, options))) + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + $.fn.button.defaults = { + loadingText: 'loading...' + } + + $.fn.button.Constructor = Button + + + /* BUTTON DATA-API + * =============== */ + + $(function () { + $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + $btn.button('toggle') + }) + }) + +}(window.jQuery);/* ========================================================== + * bootstrap-carousel.js v2.0.4 + * http://twitter.github.com/bootstrap/javascript.html#carousel + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CAROUSEL CLASS DEFINITION + * ========================= */ + + var Carousel = function (element, options) { + this.$element = $(element) + this.options = options + this.options.slide && this.slide(this.options.slide) + this.options.pause == 'hover' && this.$element + .on('mouseenter', $.proxy(this.pause, this)) + .on('mouseleave', $.proxy(this.cycle, this)) + } + + Carousel.prototype = { + + cycle: function (e) { + if (!e) this.paused = false + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + return this + } + + , to: function (pos) { + var $active = this.$element.find('.active') + , children = $active.parent().children() + , activePos = children.index($active) + , that = this + + if (pos > (children.length - 1) || pos < 0) return + + if (this.sliding) { + return this.$element.one('slid', function () { + that.to(pos) + }) + } + + if (activePos == pos) { + return this.pause().cycle() + } + + return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos])) + } + + , pause: function (e) { + if (!e) this.paused = true + clearInterval(this.interval) + this.interval = null + return this + } + + , next: function () { + if (this.sliding) return + return this.slide('next') + } + + , prev: function () { + if (this.sliding) return + return this.slide('prev') + } + + , slide: function (type, next) { + var $active = this.$element.find('.active') + , $next = next || $active[type]() + , isCycling = this.interval + , direction = type == 'next' ? 'left' : 'right' + , fallback = type == 'next' ? 'first' : 'last' + , that = this + , e = $.Event('slide') + + this.sliding = true + + isCycling && this.pause() + + $next = $next.length ? $next : this.$element.find('.item')[fallback]() + + if ($next.hasClass('active')) return + + if ($.support.transition && this.$element.hasClass('slide')) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + this.$element.one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { that.$element.trigger('slid') }, 0) + }) + } else { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid') + } + + isCycling && this.cycle() + + return this + } + + } + + + /* CAROUSEL PLUGIN DEFINITION + * ========================== */ + + $.fn.carousel = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('carousel') + , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) + if (!data) $this.data('carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (typeof option == 'string' || (option = options.slide)) data[option]() + else if (options.interval) data.cycle() + }) + } + + $.fn.carousel.defaults = { + interval: 5000 + , pause: 'hover' + } + + $.fn.carousel.Constructor = Carousel + + + /* CAROUSEL DATA-API + * ================= */ + + $(function () { + $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) { + var $this = $(this), href + , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data()) + $target.carousel(options) + e.preventDefault() + }) + }) + +}(window.jQuery);/* ============================================================= + * bootstrap-collapse.js v2.0.4 + * http://twitter.github.com/bootstrap/javascript.html#collapse + * ============================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* COLLAPSE PUBLIC CLASS DEFINITION + * ================================ */ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.collapse.defaults, options) + + if (this.options.parent) { + this.$parent = $(this.options.parent) + } + + this.options.toggle && this.toggle() + } + + Collapse.prototype = { + + constructor: Collapse + + , dimension: function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + , show: function () { + var dimension + , scroll + , actives + , hasData + + if (this.transitioning) return + + dimension = this.dimension() + scroll = $.camelCase(['scroll', dimension].join('-')) + actives = this.$parent && this.$parent.find('> .accordion-group > .in') + + if (actives && actives.length) { + hasData = actives.data('collapse') + if (hasData && hasData.transitioning) return + actives.collapse('hide') + hasData || actives.data('collapse', null) + } + + this.$element[dimension](0) + this.transition('addClass', $.Event('show'), 'shown') + this.$element[dimension](this.$element[0][scroll]) + } + + , hide: function () { + var dimension + if (this.transitioning) return + dimension = this.dimension() + this.reset(this.$element[dimension]()) + this.transition('removeClass', $.Event('hide'), 'hidden') + this.$element[dimension](0) + } + + , reset: function (size) { + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + [dimension](size || 'auto') + [0].offsetWidth + + this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') + + return this + } + + , transition: function (method, startEvent, completeEvent) { + var that = this + , complete = function () { + if (startEvent.type == 'show') that.reset() + that.transitioning = 0 + that.$element.trigger(completeEvent) + } + + this.$element.trigger(startEvent) + + if (startEvent.isDefaultPrevented()) return + + this.transitioning = 1 + + this.$element[method]('in') + + $.support.transition && this.$element.hasClass('collapse') ? + this.$element.one($.support.transition.end, complete) : + complete() + } + + , toggle: function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + } + + + /* COLLAPSIBLE PLUGIN DEFINITION + * ============================== */ + + $.fn.collapse = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('collapse') + , options = typeof option == 'object' && option + if (!data) $this.data('collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.collapse.defaults = { + toggle: true + } + + $.fn.collapse.Constructor = Collapse + + + /* COLLAPSIBLE DATA-API + * ==================== */ + + $(function () { + $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) { + var $this = $(this), href + , target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + , option = $(target).data('collapse') ? 'toggle' : $this.data() + $(target).collapse(option) + }) + }) + +}(window.jQuery);/* ============================================================ + * bootstrap-dropdown.js v2.0.4 + * http://twitter.github.com/bootstrap/javascript.html#dropdowns + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* DROPDOWN CLASS DEFINITION + * ========================= */ + + var toggle = '[data-toggle="dropdown"]' + , Dropdown = function (element) { + var $el = $(element).on('click.dropdown.data-api', this.toggle) + $('html').on('click.dropdown.data-api', function () { + $el.parent().removeClass('open') + }) + } + + Dropdown.prototype = { + + constructor: Dropdown + + , toggle: function (e) { + var $this = $(this) + , $parent + , selector + , isActive + + if ($this.is('.disabled, :disabled')) return + + selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = $(selector) + $parent.length || ($parent = $this.parent()) + + isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) $parent.toggleClass('open') + + return false + } + + } + + function clearMenus() { + $(toggle).parent().removeClass('open') + } + + + /* DROPDOWN PLUGIN DEFINITION + * ========================== */ + + $.fn.dropdown = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('dropdown') + if (!data) $this.data('dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.dropdown.Constructor = Dropdown + + + /* APPLY TO STANDARD DROPDOWN ELEMENTS + * =================================== */ + + $(function () { + $('html').on('click.dropdown.data-api', clearMenus) + $('body') + .on('click.dropdown', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle) + }) + +}(window.jQuery);/* ========================================================= + * bootstrap-modal.js v2.0.4 + * http://twitter.github.com/bootstrap/javascript.html#modals + * ========================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================= */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* MODAL CLASS DEFINITION + * ====================== */ + + var Modal = function (content, options) { + this.options = options + this.$element = $(content) + .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) + } + + Modal.prototype = { + + constructor: Modal + + , toggle: function () { + return this[!this.isShown ? 'show' : 'hide']() + } + + , show: function () { + var that = this + , e = $.Event('show') + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + $('body').addClass('modal-open') + + this.isShown = true + + escape.call(this) + backdrop.call(this, function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(document.body) //don't move modals dom position + } + + that.$element + .show() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element.addClass('in') + + transition ? + that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) : + that.$element.trigger('shown') + + }) + } + + , hide: function (e) { + e && e.preventDefault() + + var that = this + + e = $.Event('hide') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + $('body').removeClass('modal-open') + + escape.call(this) + + this.$element.removeClass('in') + + $.support.transition && this.$element.hasClass('fade') ? + hideWithTransition.call(this) : + hideModal.call(this) + } + + } + + + /* MODAL PRIVATE METHODS + * ===================== */ + + function hideWithTransition() { + var that = this + , timeout = setTimeout(function () { + that.$element.off($.support.transition.end) + hideModal.call(that) + }, 500) + + this.$element.one($.support.transition.end, function () { + clearTimeout(timeout) + hideModal.call(that) + }) + } + + function hideModal(that) { + this.$element + .hide() + .trigger('hidden') + + backdrop.call(this) + } + + function backdrop(callback) { + var that = this + , animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $('