summaryrefslogtreecommitdiffstats
path: root/src/com/gitblit/wicket
diff options
context:
space:
mode:
authorJames Moger <james.moger@gitblit.com>2011-09-12 15:37:55 -0400
committerJames Moger <james.moger@gitblit.com>2011-09-12 15:37:55 -0400
commit831469ba89ea8bca3bfbd1d662dbdd2c9f233798 (patch)
treeb36d770bcaf0c6a2ab8caf865f04ff60734ed71f /src/com/gitblit/wicket
parentcbf59502795be12dc0015e05523076a9561df807 (diff)
downloadgitblit-831469ba89ea8bca3bfbd1d662dbdd2c9f233798.tar.gz
gitblit-831469ba89ea8bca3bfbd1d662dbdd2c9f233798.zip
Largely completed, uber-cool federation feature.
Diffstat (limited to 'src/com/gitblit/wicket')
-rw-r--r--src/com/gitblit/wicket/GitBlitWebApp.java6
-rw-r--r--src/com/gitblit/wicket/GitBlitWebApp.properties34
-rw-r--r--src/com/gitblit/wicket/WicketUtils.java101
-rw-r--r--src/com/gitblit/wicket/pages/BasePage.java19
-rw-r--r--src/com/gitblit/wicket/pages/EditRepositoryPage.html18
-rw-r--r--src/com/gitblit/wicket/pages/EditRepositoryPage.java52
-rw-r--r--src/com/gitblit/wicket/pages/EditUserPage.html3
-rw-r--r--src/com/gitblit/wicket/pages/EditUserPage.java5
-rw-r--r--src/com/gitblit/wicket/pages/FederationProposalPage.html27
-rw-r--r--src/com/gitblit/wicket/pages/FederationProposalPage.java100
-rw-r--r--src/com/gitblit/wicket/pages/FederationRegistrationPage.html45
-rw-r--r--src/com/gitblit/wicket/pages/FederationRegistrationPage.java105
-rw-r--r--src/com/gitblit/wicket/pages/LoginPage.java5
-rw-r--r--src/com/gitblit/wicket/pages/RepositoriesPage.html6
-rw-r--r--src/com/gitblit/wicket/pages/RepositoriesPage.java35
-rw-r--r--src/com/gitblit/wicket/panels/BasePanel.java19
-rw-r--r--src/com/gitblit/wicket/panels/FederationProposalsPanel.html34
-rw-r--r--src/com/gitblit/wicket/panels/FederationProposalsPanel.java92
-rw-r--r--src/com/gitblit/wicket/panels/FederationRegistrationsPanel.html38
-rw-r--r--src/com/gitblit/wicket/panels/FederationRegistrationsPanel.java83
-rw-r--r--src/com/gitblit/wicket/panels/FederationTokensPanel.html38
-rw-r--r--src/com/gitblit/wicket/panels/FederationTokensPanel.java109
-rw-r--r--src/com/gitblit/wicket/panels/RepositoriesPanel.html2
-rw-r--r--src/com/gitblit/wicket/panels/RepositoriesPanel.java49
24 files changed, 970 insertions, 55 deletions
diff --git a/src/com/gitblit/wicket/GitBlitWebApp.java b/src/com/gitblit/wicket/GitBlitWebApp.java
index 8cbab9c4..3e7c209f 100644
--- a/src/com/gitblit/wicket/GitBlitWebApp.java
+++ b/src/com/gitblit/wicket/GitBlitWebApp.java
@@ -32,6 +32,8 @@ import com.gitblit.wicket.pages.BranchesPage;
import com.gitblit.wicket.pages.CommitDiffPage;
import com.gitblit.wicket.pages.CommitPage;
import com.gitblit.wicket.pages.DocsPage;
+import com.gitblit.wicket.pages.FederationProposalPage;
+import com.gitblit.wicket.pages.FederationRegistrationPage;
import com.gitblit.wicket.pages.HistoryPage;
import com.gitblit.wicket.pages.LogPage;
import com.gitblit.wicket.pages.LoginPage;
@@ -95,6 +97,10 @@ public class GitBlitWebApp extends WebApplication {
mount("/docs", DocsPage.class, "r");
mount("/markdown", MarkdownPage.class, "r", "h", "f");
+ // federation urls
+ mount("/proposal", FederationProposalPage.class, "t");
+ mount("/registration", FederationRegistrationPage.class, "u", "n");
+
// setup login/logout urls, if we are using authentication
if (useAuthentication) {
mount("/login", LoginPage.class);
diff --git a/src/com/gitblit/wicket/GitBlitWebApp.properties b/src/com/gitblit/wicket/GitBlitWebApp.properties
index dab5fa03..ab7ef4bd 100644
--- a/src/com/gitblit/wicket/GitBlitWebApp.properties
+++ b/src/com/gitblit/wicket/GitBlitWebApp.properties
@@ -101,4 +101,36 @@ gb.commitActivityDOW = commit activity by day of week
gb.commitActivityAuthors = primary authors by commit activity
gb.feed = feed
gb.cancel = cancel
-gb.changePassword = change password \ No newline at end of file
+gb.changePassword = change password
+gb.isFederated = is federated
+gb.federateThis = federate this repository
+gb.federateOrigin = federate the origin
+gb.excludeFromFederation = exclude from federation
+gb.excludeFromFederationDescription = block federated Gitblit instances from pulling this object
+gb.tokens = federation tokens
+gb.tokenAllDescription = federate repositories, users, & settings
+gb.tokenUnrDescription = federate repositories & users
+gb.tokenJurDescription = federate repositories
+gb.federatedRepositoryDefinitions = repository definitions
+gb.federatedUserDefinitions = user definitions
+gb.federatedSettingDefinitions = setting definitions
+gb.proposals = federation proposals
+gb.received = received
+gb.type = type
+gb.token = token
+gb.repositories = repositories
+gb.proposal = proposal
+gb.frequency = frequency
+gb.folder = folder
+gb.lastPull = last pull
+gb.nextPull = next pull
+gb.inclusions = inclusions
+gb.exclusions = exclusions
+gb.registration = registration
+gb.registrations = federation registrations
+gb.sendProposal send proposal
+gb.status = status
+gb.origin = origin
+gb.federationStrategy = federation strategy
+gb.federationRegistration = federation registration
+gb.federationResults = federation pull results
diff --git a/src/com/gitblit/wicket/WicketUtils.java b/src/com/gitblit/wicket/WicketUtils.java
index 614cb7d1..a6435d5a 100644
--- a/src/com/gitblit/wicket/WicketUtils.java
+++ b/src/com/gitblit/wicket/WicketUtils.java
@@ -39,9 +39,12 @@ import org.eclipse.jgit.diff.DiffEntry.ChangeType;
import org.wicketstuff.googlecharts.AbstractChartData;
import org.wicketstuff.googlecharts.IChartData;
+import com.gitblit.Constants.FederationPullStatus;
import com.gitblit.GitBlit;
import com.gitblit.Keys;
+import com.gitblit.models.FederationModel;
import com.gitblit.models.Metric;
+import com.gitblit.utils.HttpUtils;
import com.gitblit.utils.JGitUtils.SearchType;
import com.gitblit.utils.StringUtils;
import com.gitblit.utils.TimeUtils;
@@ -109,6 +112,28 @@ public class WicketUtils {
return label;
}
+ public static ContextImage getPullStatusImage(String wicketId, FederationPullStatus status) {
+ String filename = null;
+ switch (status) {
+ case PULLED:
+ filename = "bullet_green.png";
+ break;
+ case SKIPPED:
+ filename = "bullet_yellow.png";
+ break;
+ case FAILED:
+ filename = "bullet_red.png";
+ break;
+ case EXCLUDED:
+ filename = "bullet_white.png";
+ break;
+ case PENDING:
+ default:
+ filename = "bullet_black.png";
+ }
+ return WicketUtils.newImage(wicketId, filename, status.name());
+ }
+
public static ContextImage getFileImage(String wicketId, String filename) {
filename = filename.toLowerCase();
if (filename.endsWith(".java")) {
@@ -155,6 +180,17 @@ public class WicketUtils {
return newImage(wicketId, "file_16x16.png");
}
+ public static ContextImage getRegistrationImage(String wicketId, FederationModel registration,
+ Component c) {
+ if (registration.isResultData()) {
+ return WicketUtils.newImage(wicketId, "information_16x16.png",
+ c.getString("gb.federationResults"));
+ } else {
+ return WicketUtils.newImage(wicketId, "arrow_left.png",
+ c.getString("gb.federationRegistration"));
+ }
+ }
+
public static ContextImage newClearPixel(String wicketId) {
return newImage(wicketId, "pixel.png");
}
@@ -181,19 +217,7 @@ public class WicketUtils {
public static String getHostURL(Request request) {
HttpServletRequest req = ((WebRequest) request).getHttpServletRequest();
- return getHostURL(req);
- }
-
- public static String getHostURL(HttpServletRequest request) {
- StringBuilder sb = new StringBuilder();
- sb.append(request.getScheme());
- sb.append("://");
- sb.append(request.getServerName());
- if ((request.getScheme().equals("http") && request.getServerPort() != 80)
- || (request.getScheme().equals("https") && request.getServerPort() != 443)) {
- sb.append(":" + request.getServerPort());
- }
- return sb.toString();
+ return HttpUtils.getHostURL(req);
}
public static HeaderContributor syndicationDiscoveryLink(final String feedTitle,
@@ -213,6 +237,14 @@ public class WicketUtils {
}
});
}
+
+ public static PageParameters newTokenParameter(String token) {
+ return new PageParameters("t=" + token);
+ }
+
+ public static PageParameters newRegistrationParameter(String url, String name) {
+ return new PageParameters("u=" + url + ",n=" + name);
+ }
public static PageParameters newUsernameParameter(String username) {
return new PageParameters("user=" + username);
@@ -222,6 +254,10 @@ public class WicketUtils {
return new PageParameters("r=" + repositoryName);
}
+ public static PageParameters newObjectParameter(String objectId) {
+ return new PageParameters("h=" + objectId);
+ }
+
public static PageParameters newObjectParameter(String repositoryName, String objectId) {
if (StringUtils.isEmpty(objectId)) {
return newRepositoryParameter(repositoryName);
@@ -324,14 +360,35 @@ public class WicketUtils {
return params.getString("user", "");
}
+ public static String getToken(PageParameters params) {
+ return params.getString("t", "");
+ }
+
+ public static String getUrlParameter(PageParameters params) {
+ return params.getString("u", "");
+ }
+
+ public static String getNameParameter(PageParameters params) {
+ return params.getString("n", "");
+ }
+
public static Label createDateLabel(String wicketId, Date date, TimeZone timeZone) {
String format = GitBlit.getString(Keys.web.datestampShortFormat, "MM/dd/yy");
DateFormat df = new SimpleDateFormat(format);
if (timeZone != null) {
df.setTimeZone(timeZone);
}
- String dateString = df.format(date);
- String title = TimeUtils.timeAgo(date);
+ String dateString;
+ if (date.getTime() == 0) {
+ dateString = "--";
+ } else {
+ dateString = df.format(date);
+ }
+ String title = null;
+ if (date.getTime() <= System.currentTimeMillis()) {
+ // past
+ title = TimeUtils.timeAgo(date);
+ }
if ((System.currentTimeMillis() - date.getTime()) < 10 * 24 * 60 * 60 * 1000L) {
String tmp = dateString;
dateString = title;
@@ -339,7 +396,9 @@ public class WicketUtils {
}
Label label = new Label(wicketId, dateString);
WicketUtils.setCssClass(label, TimeUtils.timeAgoCss(date));
- WicketUtils.setHtmlTooltip(label, title);
+ if (!StringUtils.isEmpty(title)) {
+ WicketUtils.setHtmlTooltip(label, title);
+ }
return label;
}
@@ -356,9 +415,15 @@ public class WicketUtils {
} else {
dateString = df.format(date);
}
- String title = TimeUtils.timeAgo(date);
+ String title = null;
+ if (date.getTime() <= System.currentTimeMillis()) {
+ // past
+ title = TimeUtils.timeAgo(date);
+ }
Label label = new Label(wicketId, dateString);
- WicketUtils.setHtmlTooltip(label, title);
+ if (!StringUtils.isEmpty(title)) {
+ WicketUtils.setHtmlTooltip(label, title);
+ }
return label;
}
diff --git a/src/com/gitblit/wicket/pages/BasePage.java b/src/com/gitblit/wicket/pages/BasePage.java
index acfb3236..0169c8e3 100644
--- a/src/com/gitblit/wicket/pages/BasePage.java
+++ b/src/com/gitblit/wicket/pages/BasePage.java
@@ -39,6 +39,7 @@ import org.slf4j.LoggerFactory;
import com.gitblit.Constants;
import com.gitblit.Constants.AccessRestrictionType;
+import com.gitblit.Constants.FederationStrategy;
import com.gitblit.GitBlit;
import com.gitblit.Keys;
import com.gitblit.models.UserModel;
@@ -140,6 +141,24 @@ public abstract class BasePage extends WebPage {
}
return map;
}
+
+ protected Map<FederationStrategy, String> getFederationTypes() {
+ Map<FederationStrategy, String> map = new LinkedHashMap<FederationStrategy, String>();
+ for (FederationStrategy type : FederationStrategy.values()) {
+ switch (type) {
+ case EXCLUDE:
+ map.put(type, getString("gb.excludeFromFederation"));
+ break;
+ case FEDERATE_THIS:
+ map.put(type, getString("gb.federateThis"));
+ break;
+ case FEDERATE_ORIGIN:
+ map.put(type, getString("gb.federateOrigin"));
+ break;
+ }
+ }
+ return map;
+ }
protected TimeZone getTimeZone() {
return GitBlit.getBoolean(Keys.web.useClientTimezone, false) ? GitBlitWebSession.get()
diff --git a/src/com/gitblit/wicket/pages/EditRepositoryPage.html b/src/com/gitblit/wicket/pages/EditRepositoryPage.html
index 36075737..2dd031be 100644
--- a/src/com/gitblit/wicket/pages/EditRepositoryPage.html
+++ b/src/com/gitblit/wicket/pages/EditRepositoryPage.html
@@ -17,15 +17,17 @@
<tbody>
<tr><th><wicket:message key="gb.name"></wicket:message></th><td class="edit"><input type="text" wicket:id="name" id="name" size="40" tabindex="1" /> &nbsp;<i><wicket:message key="gb.nameDescription"></wicket:message></i></td></tr>
<tr><th><wicket:message key="gb.description"></wicket:message></th><td class="edit"><input type="text" wicket:id="description" size="40" tabindex="2" /></td></tr>
- <tr><th><wicket:message key="gb.owner"></wicket:message></th><td class="edit"><select wicket:id="owner" tabindex="3" /> &nbsp;<i><wicket:message key="gb.ownerDescription"></wicket:message></i></td></tr>
- <tr><th><wicket:message key="gb.enableTickets"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="useTickets" tabindex="4" /> &nbsp;<i><wicket:message key="gb.useTicketsDescription"></wicket:message></i></td></tr>
- <tr><th><wicket:message key="gb.enableDocs"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="useDocs" tabindex="5" /> &nbsp;<i><wicket:message key="gb.useDocsDescription"></wicket:message></i></td></tr>
- <tr><th><wicket:message key="gb.showRemoteBranches"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="showRemoteBranches" tabindex="6" /> &nbsp;<i><wicket:message key="gb.showRemoteBranchesDescription"></wicket:message></i></td></tr>
- <tr><th><wicket:message key="gb.showReadme"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="showReadme" tabindex="7" /> &nbsp;<i><wicket:message key="gb.showReadmeDescription"></wicket:message></i></td></tr>
- <tr><th><wicket:message key="gb.accessRestriction"></wicket:message></th><td class="edit"><select wicket:id="accessRestriction" tabindex="8" /></td></tr>
- <tr><th><wicket:message key="gb.isFrozen"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="isFrozen" tabindex="9" /> &nbsp;<i><wicket:message key="gb.isFrozenDescription"></wicket:message></i></td></tr>
+ <tr><th><wicket:message key="gb.origin"></wicket:message></th><td class="edit"><input type="text" wicket:id="origin" size="80" tabindex="3" /></td></tr>
+ <tr><th><wicket:message key="gb.owner"></wicket:message></th><td class="edit"><select wicket:id="owner" tabindex="4" /> &nbsp;<i><wicket:message key="gb.ownerDescription"></wicket:message></i></td></tr>
+ <tr><th><wicket:message key="gb.enableTickets"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="useTickets" tabindex="5" /> &nbsp;<i><wicket:message key="gb.useTicketsDescription"></wicket:message></i></td></tr>
+ <tr><th><wicket:message key="gb.enableDocs"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="useDocs" tabindex="6" /> &nbsp;<i><wicket:message key="gb.useDocsDescription"></wicket:message></i></td></tr>
+ <tr><th><wicket:message key="gb.showRemoteBranches"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="showRemoteBranches" tabindex="7" /> &nbsp;<i><wicket:message key="gb.showRemoteBranchesDescription"></wicket:message></i></td></tr>
+ <tr><th><wicket:message key="gb.showReadme"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="showReadme" tabindex="8" /> &nbsp;<i><wicket:message key="gb.showReadmeDescription"></wicket:message></i></td></tr>
+ <tr><th><wicket:message key="gb.accessRestriction"></wicket:message></th><td class="edit"><select wicket:id="accessRestriction" tabindex="9" /></td></tr>
+ <tr><th><wicket:message key="gb.isFrozen"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="isFrozen" tabindex="10" /> &nbsp;<i><wicket:message key="gb.isFrozenDescription"></wicket:message></i></td></tr>
+ <tr><th><wicket:message key="gb.federationStrategy"></wicket:message></th><td class="edit"><select wicket:id="federationStrategy" tabindex="11" /></td></tr>
<tr><th style="vertical-align: top;"><wicket:message key="gb.permittedUsers"></wicket:message></th><td style="padding:2px;"><span wicket:id="users"></span></td></tr>
- <tr><th></th><td class="editButton"><input type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" tabindex="10" /> <input type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="11" /></td></tr>
+ <tr><th></th><td class="editButton"><input type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" tabindex="12" /> <input type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="13" /></td></tr>
</tbody>
</table>
</form>
diff --git a/src/com/gitblit/wicket/pages/EditRepositoryPage.java b/src/com/gitblit/wicket/pages/EditRepositoryPage.java
index eea389ea..3b6e6f38 100644
--- a/src/com/gitblit/wicket/pages/EditRepositoryPage.java
+++ b/src/com/gitblit/wicket/pages/EditRepositoryPage.java
@@ -37,6 +37,7 @@ import org.apache.wicket.model.util.CollectionModel;
import org.apache.wicket.model.util.ListModel;
import com.gitblit.Constants.AccessRestrictionType;
+import com.gitblit.Constants.FederationStrategy;
import com.gitblit.GitBlit;
import com.gitblit.GitBlitException;
import com.gitblit.Keys;
@@ -122,19 +123,11 @@ public class EditRepositoryPage extends BasePage {
}
// confirm valid characters in repository name
- char[] validChars = { '/', '.', '_', '-' };
- for (char c : repositoryModel.name.toCharArray()) {
- if (!Character.isLetterOrDigit(c)) {
- boolean ok = false;
- for (char vc : validChars) {
- ok |= c == vc;
- }
- if (!ok) {
- error(MessageFormat.format(
- "Illegal character ''{0}'' in repository name!", c));
- return;
- }
- }
+ Character c = StringUtils.findInvalidCharacter(repositoryModel.name);
+ if (c != null) {
+ error(MessageFormat.format("Illegal character ''{0}'' in repository name!",
+ c));
+ return;
}
// confirm access restriction selection
@@ -177,6 +170,18 @@ public class EditRepositoryPage extends BasePage {
form.add(new DropDownChoice<AccessRestrictionType>("accessRestriction", Arrays
.asList(AccessRestrictionType.values()), new AccessRestrictionRenderer()));
form.add(new CheckBox("isFrozen"));
+ // TODO enable origin definition
+ form.add(new TextField<String>("origin").setEnabled(false/*isCreate*/));
+
+ // federation strategies - remove ORIGIN choice if this repository has
+ // no origin.
+ List<FederationStrategy> federationStrategies = new ArrayList<FederationStrategy>(
+ Arrays.asList(FederationStrategy.values()));
+ if (StringUtils.isEmpty(repositoryModel.origin)) {
+ federationStrategies.remove(FederationStrategy.FEDERATE_ORIGIN);
+ }
+ form.add(new DropDownChoice<FederationStrategy>("federationStrategy", federationStrategies,
+ new FederationTypeRenderer()));
form.add(new CheckBox("useTickets"));
form.add(new CheckBox("useDocs"));
form.add(new CheckBox("showRemoteBranches"));
@@ -264,4 +269,25 @@ public class EditRepositoryPage extends BasePage {
return Integer.toString(index);
}
}
+
+ private class FederationTypeRenderer implements IChoiceRenderer<FederationStrategy> {
+
+ private static final long serialVersionUID = 1L;
+
+ private final Map<FederationStrategy, String> map;
+
+ public FederationTypeRenderer() {
+ map = getFederationTypes();
+ }
+
+ @Override
+ public String getDisplayValue(FederationStrategy type) {
+ return map.get(type);
+ }
+
+ @Override
+ public String getIdValue(FederationStrategy type, int index) {
+ return Integer.toString(index);
+ }
+ }
}
diff --git a/src/com/gitblit/wicket/pages/EditUserPage.html b/src/com/gitblit/wicket/pages/EditUserPage.html
index 9aef9a34..d36bf5a6 100644
--- a/src/com/gitblit/wicket/pages/EditUserPage.html
+++ b/src/com/gitblit/wicket/pages/EditUserPage.html
@@ -19,8 +19,9 @@
<tr><th><wicket:message key="gb.password"></wicket:message></th><td class="edit"><input type="password" wicket:id="password" size="30" tabindex="2" /></td></tr>
<tr><th><wicket:message key="gb.confirmPassword"></wicket:message></th><td class="edit"><input type="password" wicket:id="confirmPassword" size="30" tabindex="3" /></td></tr>
<tr><th><wicket:message key="gb.canAdmin"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="canAdmin" tabindex="6" /> &nbsp;<i><wicket:message key="gb.canAdminDescription"></wicket:message></i></td></tr>
+ <tr><th><wicket:message key="gb.excludeFromFederation"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="excludeFromFederation" tabindex="7" /> &nbsp;<i><wicket:message key="gb.excludeFromFederationDescription"></wicket:message></i></td></tr>
<tr><th style="vertical-align: top;"><wicket:message key="gb.restrictedRepositories"></wicket:message></th><td style="padding:2px;"><span wicket:id="repositories"></span></td></tr>
- <tr><th></th><td class="editButton"><input type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" tabindex="7" /> <input type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="8" /></td></tr>
+ <tr><th></th><td class="editButton"><input type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" tabindex="8" /> <input type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="9" /></td></tr>
</tbody>
</table>
</form>
diff --git a/src/com/gitblit/wicket/pages/EditUserPage.java b/src/com/gitblit/wicket/pages/EditUserPage.java
index dd50d56d..a3589117 100644
--- a/src/com/gitblit/wicket/pages/EditUserPage.java
+++ b/src/com/gitblit/wicket/pages/EditUserPage.java
@@ -83,8 +83,8 @@ public class EditUserPage extends BasePage {
}
final String oldName = userModel.username;
final Palette<String> repositories = new Palette<String>("repositories",
- new ListModel<String>(userModel.repositories), new CollectionModel<String>(repos),
- new ChoiceRenderer<String>("", ""), 10, false);
+ new ListModel<String>(new ArrayList<String>(userModel.repositories)),
+ new CollectionModel<String>(repos), new ChoiceRenderer<String>("", ""), 10, false);
Form<UserModel> form = new Form<UserModel>("editForm", model) {
private static final long serialVersionUID = 1L;
@@ -172,6 +172,7 @@ public class EditUserPage extends BasePage {
confirmPasswordField.setResetPassword(false);
form.add(confirmPasswordField);
form.add(new CheckBox("canAdmin"));
+ form.add(new CheckBox("excludeFromFederation"));
form.add(repositories);
form.add(new Button("save"));
diff --git a/src/com/gitblit/wicket/pages/FederationProposalPage.html b/src/com/gitblit/wicket/pages/FederationProposalPage.html
new file mode 100644
index 00000000..160ca3fa
--- /dev/null
+++ b/src/com/gitblit/wicket/pages/FederationProposalPage.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"
+ xml:lang="en"
+ lang="en">
+
+<body>
+<wicket:extend>
+
+ <div style="padding-top:20px"></div>
+
+ <div style="text-align:center;" wicket:id="feedback">[Feedback Panel]</div>
+
+ <!-- proposal info -->
+ <table class="plain">
+ <tr><th><wicket:message key="gb.url">url</wicket:message></th><td><span wicket:id="url">[url]</span></td></tr>
+ <tr><th><wicket:message key="gb.token">token</wicket:message></th><td><span class="sha1" wicket:id="token">[token]</span></td></tr>
+ <tr><th><wicket:message key="gb.type">type</wicket:message></th><td><span wicket:id="tokenType">[token type]</span></td></tr>
+ <tr><th><wicket:message key="gb.received">received</wicket:message></th><td><span wicket:id="received">[received]</span></td></tr>
+ <tr><th valign="top"><wicket:message key="gb.proposal">proposal</wicket:message></th><td><span class="sha1" wicket:id="definition">[definition]</span></td></tr>
+ </table>
+
+ <div wicket:id="repositories"></div>
+
+</wicket:extend>
+</body>
+</html> \ No newline at end of file
diff --git a/src/com/gitblit/wicket/pages/FederationProposalPage.java b/src/com/gitblit/wicket/pages/FederationProposalPage.java
new file mode 100644
index 00000000..4685d2fe
--- /dev/null
+++ b/src/com/gitblit/wicket/pages/FederationProposalPage.java
@@ -0,0 +1,100 @@
+/*
+ * 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.pages;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.markup.html.basic.Label;
+
+import com.gitblit.Constants.FederationToken;
+import com.gitblit.GitBlit;
+import com.gitblit.Keys;
+import com.gitblit.models.FederationProposal;
+import com.gitblit.models.RepositoryModel;
+import com.gitblit.utils.StringUtils;
+import com.gitblit.wicket.RequiresAdminRole;
+import com.gitblit.wicket.WicketUtils;
+import com.gitblit.wicket.panels.RepositoriesPanel;
+
+@RequiresAdminRole
+public class FederationProposalPage extends BasePage {
+
+ private final String PROPS_PATTERN = "{0} = {1}\n";
+
+ private final String WEBXML_PATTERN = "\n<context-param>\n\t<param-name>{0}</param-name>\n\t<param-value>{1}</param-value>\n</context-param>\n";
+
+ public FederationProposalPage(PageParameters params) {
+ super(params);
+
+ setupPage("", getString("gb.proposals"));
+ setStatelessHint(true);
+
+ final String token = WicketUtils.getToken(params);
+
+ FederationProposal proposal = GitBlit.self().getPendingFederationProposal(token);
+ if (proposal == null) {
+ error("Could not find federation proposal!", true);
+ }
+
+ add(new Label("url", proposal.url));
+ add(WicketUtils.createTimestampLabel("received", proposal.received, getTimeZone()));
+ add(new Label("tokenType", proposal.tokenType.name()));
+ add(new Label("token", proposal.token));
+
+ boolean go = true;
+ String p;
+ if (GitBlit.isGO()) {
+ // gitblit.properties definition
+ p = PROPS_PATTERN;
+ } else {
+ // web.xml definition
+ p = WEBXML_PATTERN;
+ }
+
+ // build proposed definition
+ StringBuilder sb = new StringBuilder();
+ sb.append(asParam(p, proposal.name, "url", proposal.url));
+ sb.append(asParam(p, proposal.name, "token", proposal.token));
+
+ if (FederationToken.USERS_AND_REPOSITORIES.equals(proposal.tokenType)
+ || FederationToken.ALL.equals(proposal.tokenType)) {
+ sb.append(asParam(p, proposal.name, "mergeAccounts", "false"));
+ }
+ sb.append(asParam(p, proposal.name, "frequency",
+ GitBlit.getString(Keys.federation.defaultFrequency, "60 mins")));
+ sb.append(asParam(p, proposal.name, "folder", proposal.name));
+ sb.append(asParam(p, proposal.name, "sendStatus", "true"));
+ sb.append(asParam(p, proposal.name, "notifyOnError", "true"));
+ sb.append(asParam(p, proposal.name, "exclude", ""));
+ sb.append(asParam(p, proposal.name, "include", ""));
+
+ add(new Label("definition", StringUtils.breakLinesForHtml(StringUtils.escapeForHtml(sb
+ .toString().trim(), true))).setEscapeModelStrings(false));
+
+ List<RepositoryModel> repositories = new ArrayList<RepositoryModel>(
+ proposal.repositories.values());
+ RepositoriesPanel repositoriesPanel = new RepositoriesPanel("repositories", false,
+ repositories, getAccessRestrictions());
+ add(repositoriesPanel);
+ }
+
+ private String asParam(String pattern, String name, String key, String value) {
+ return MessageFormat.format(pattern, Keys.federation._ROOT + "." + name + "." + key, value);
+ }
+}
diff --git a/src/com/gitblit/wicket/pages/FederationRegistrationPage.html b/src/com/gitblit/wicket/pages/FederationRegistrationPage.html
new file mode 100644
index 00000000..fe8f7f2d
--- /dev/null
+++ b/src/com/gitblit/wicket/pages/FederationRegistrationPage.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"
+ xml:lang="en"
+ lang="en">
+
+<body>
+<wicket:extend>
+
+ <div style="padding-top:20px"></div>
+
+ <div style="text-align:center;" wicket:id="feedback">[Feedback Panel]</div>
+
+ <!-- registration info -->
+ <table class="plain">
+ <tr><th><wicket:message key="gb.url">url</wicket:message></th><td><span wicket:id="url">[url]</span></td></tr>
+ <tr><th></th><td><img style="border:0px;vertical-align:middle;" wicket:id="typeIcon" /> <span wicket:id="typeName">[url]</span></td></tr>
+ <tr><th><wicket:message key="gb.token">token</wicket:message></th><td><span class="sha1" wicket:id="token">[token]</span></td></tr>
+ <tr><th><wicket:message key="gb.folder">folder</wicket:message></th><td><span wicket:id="folder">[folder]</span></td></tr>
+ <tr><th><wicket:message key="gb.frequency">frequency</wicket:message></th><td><span wicket:id="frequency">[frequency]</span></td></tr>
+ <tr><th><wicket:message key="gb.lastPull">lastPull</wicket:message></th><td><span wicket:id="lastPull">[lastPull]</span></td></tr>
+ <tr><th><wicket:message key="gb.nextPull">nextPull</wicket:message></th><td><span wicket:id="nextPull">[nextPull]</span></td></tr>
+ <tr><th valign="top"><wicket:message key="gb.exclusions">exclusions</wicket:message></th><td><span class="sha1" wicket:id="exclusions">[exclusions]</span></td></tr>
+ <tr><th valign="top"><wicket:message key="gb.inclusions">inclusions</wicket:message></th><td><span class="sha1" wicket:id="inclusions">[inclusions]</span></td></tr>
+ </table>
+
+ <table class="repositories">
+ <tr>
+ <th class="left">
+ <img style="vertical-align: top; border: 1px solid #888; background-color: white;" src="gitweb-favicon.png"/>
+ <wicket:message key="gb.repositories">[repositories]</wicket:message>
+ </th>
+ <th class="right"><wicket:message key="gb.status">[status]</wicket:message></th>
+ </tr>
+ <tbody>
+ <tr wicket:id="row">
+ <td class="left"><img style="border:0px;vertical-align:middle;" wicket:id="statusIcon" /><span wicket:id="name">[name]</span></td>
+ <td class="right"><span wicket:id="status">[status]</span></td>
+ </tr>
+ </tbody>
+ </table>
+
+</wicket:extend>
+</body>
+</html> \ No newline at end of file
diff --git a/src/com/gitblit/wicket/pages/FederationRegistrationPage.java b/src/com/gitblit/wicket/pages/FederationRegistrationPage.java
new file mode 100644
index 00000000..65c4d01d
--- /dev/null
+++ b/src/com/gitblit/wicket/pages/FederationRegistrationPage.java
@@ -0,0 +1,105 @@
+/*
+ * 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.pages;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.repeater.Item;
+import org.apache.wicket.markup.repeater.data.DataView;
+import org.apache.wicket.markup.repeater.data.ListDataProvider;
+
+import com.gitblit.GitBlit;
+import com.gitblit.Keys;
+import com.gitblit.models.FederationModel;
+import com.gitblit.models.FederationModel.RepositoryStatus;
+import com.gitblit.wicket.GitBlitWebSession;
+import com.gitblit.wicket.WicketUtils;
+
+public class FederationRegistrationPage extends BasePage {
+
+ public FederationRegistrationPage(PageParameters params) {
+ super(params);
+
+ setupPage("", getString("gb.registrations"));
+
+ final boolean showAdmin;
+ if (GitBlit.getBoolean(Keys.web.authenticateAdminPages, true)) {
+ boolean allowAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);
+ showAdmin = allowAdmin && GitBlitWebSession.get().canAdmin();
+ } else {
+ showAdmin = false;
+ }
+ setStatelessHint(true);
+
+ String url = WicketUtils.getUrlParameter(params);
+ String name = WicketUtils.getNameParameter(params);
+
+ FederationModel registration = GitBlit.self().getFederationRegistration(url, name);
+ if (registration == null) {
+ error("Could not find federation registration!", true);
+ }
+
+ add(new Label("url", registration.url));
+ add(WicketUtils.getRegistrationImage("typeIcon", registration, this));
+ add(new Label("typeName", registration.isResultData() ? getString("gb.federationResults")
+ : getString("gb.federationRegistration")));
+ add(new Label("frequency", registration.frequency));
+ add(new Label("folder", registration.folder));
+ add(new Label("token", showAdmin ? registration.token : "--"));
+ add(WicketUtils.createTimestampLabel("lastPull", registration.lastPull, getTimeZone()));
+ add(WicketUtils.createTimestampLabel("nextPull", registration.nextPull, getTimeZone()));
+
+ StringBuilder inclusions = new StringBuilder();
+ for (String inc : registration.inclusions) {
+ inclusions.append(inc).append("<br/>");
+ }
+ StringBuilder exclusions = new StringBuilder();
+ for (String ex : registration.exclusions) {
+ exclusions.append(ex).append("<br/>");
+ }
+
+ add(new Label("inclusions", inclusions.toString()).setEscapeModelStrings(false));
+
+ add(new Label("exclusions", exclusions.toString()).setEscapeModelStrings(false));
+
+ List<RepositoryStatus> list = registration.getStatusList();
+ Collections.sort(list);
+ DataView<RepositoryStatus> dataView = new DataView<RepositoryStatus>("row",
+ new ListDataProvider<RepositoryStatus>(list)) {
+ private static final long serialVersionUID = 1L;
+ private int counter;
+
+ @Override
+ protected void onBeforeRender() {
+ super.onBeforeRender();
+ counter = 0;
+ }
+
+ public void populateItem(final Item<RepositoryStatus> item) {
+ final RepositoryStatus entry = item.getModelObject();
+ item.add(WicketUtils.getPullStatusImage("statusIcon", entry.status));
+ item.add(new Label("name", entry.name));
+ item.add(new Label("status", entry.status.name()));
+ WicketUtils.setAlternatingBackground(item, counter);
+ counter++;
+ }
+ };
+ add(dataView);
+ }
+}
diff --git a/src/com/gitblit/wicket/pages/LoginPage.java b/src/com/gitblit/wicket/pages/LoginPage.java
index b13a1c8d..45e1e2dc 100644
--- a/src/com/gitblit/wicket/pages/LoginPage.java
+++ b/src/com/gitblit/wicket/pages/LoginPage.java
@@ -69,6 +69,11 @@ public class LoginPage extends WebPage {
UserModel user = GitBlit.self().authenticate(username, password);
if (user == null) {
error("Invalid username or password!");
+ } else if (user.username.equals(Constants.FEDERATION_USER)) {
+ // disallow the federation user from logging in via the
+ // web ui
+ error("Invalid username or password!");
+ user = null;
} else {
loginUser(user);
}
diff --git a/src/com/gitblit/wicket/pages/RepositoriesPage.html b/src/com/gitblit/wicket/pages/RepositoriesPage.html
index c8ab5978..a0c58c9e 100644
--- a/src/com/gitblit/wicket/pages/RepositoriesPage.html
+++ b/src/com/gitblit/wicket/pages/RepositoriesPage.html
@@ -19,6 +19,12 @@
<div wicket:id="repositoriesPanel">[repositories panel]</div>
<div style="padding-top: 10px;"wicket:id="usersPanel">[users panel]</div>
+
+ <div style="padding-top: 10px;"wicket:id="federationTokensPanel">[federation tokens panel]</div>
+
+ <div style="padding-top: 10px;"wicket:id="federationProposalsPanel">[federation proposals panel]</div>
+
+ <div style="padding-top: 10px;"wicket:id="federationRegistrationsPanel">[federation registrations panel]</div>
</wicket:extend>
</body>
diff --git a/src/com/gitblit/wicket/pages/RepositoriesPage.java b/src/com/gitblit/wicket/pages/RepositoriesPage.java
index 053bee09..619d42ed 100644
--- a/src/com/gitblit/wicket/pages/RepositoriesPage.java
+++ b/src/com/gitblit/wicket/pages/RepositoriesPage.java
@@ -19,6 +19,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.text.MessageFormat;
import org.apache.wicket.Component;
import org.apache.wicket.markup.html.basic.Label;
@@ -30,6 +31,9 @@ import com.gitblit.utils.MarkdownUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.WicketUtils;
+import com.gitblit.wicket.panels.FederationProposalsPanel;
+import com.gitblit.wicket.panels.FederationRegistrationsPanel;
+import com.gitblit.wicket.panels.FederationTokensPanel;
import com.gitblit.wicket.panels.RepositoriesPanel;
import com.gitblit.wicket.panels.UsersPanel;
@@ -60,6 +64,14 @@ public class RepositoriesPage extends BasePage {
String cachedMessage = GitBlitWebSession.get().clearErrorMessage();
if (!StringUtils.isEmpty(cachedMessage)) {
error(cachedMessage);
+ } else if (showAdmin) {
+ int pendingProposals = GitBlit.self().getPendingFederationProposals().size();
+ if (pendingProposals == 1) {
+ info("There is 1 federation proposal awaiting review.");
+ } else if (pendingProposals > 1) {
+ info(MessageFormat.format("There are {0} federation proposals awaiting review.",
+ pendingProposals));
+ }
}
// Load the markdown welcome message
@@ -97,7 +109,28 @@ public class RepositoriesPage extends BasePage {
Component repositoriesMessage = new Label("repositoriesMessage", message)
.setEscapeModelStrings(false);
add(repositoriesMessage);
- add(new RepositoriesPanel("repositoriesPanel", showAdmin, getAccessRestrictions()));
+ add(new RepositoriesPanel("repositoriesPanel", showAdmin, null, getAccessRestrictions()));
add(new UsersPanel("usersPanel", showAdmin).setVisible(showAdmin));
+ boolean showFederation = showAdmin && GitBlit.canFederate();
+ add(new FederationTokensPanel("federationTokensPanel", showFederation)
+ .setVisible(showFederation));
+ FederationProposalsPanel proposalsPanel = new FederationProposalsPanel(
+ "federationProposalsPanel");
+ if (showFederation) {
+ proposalsPanel.hideIfEmpty();
+ } else {
+ proposalsPanel.setVisible(false);
+ }
+
+ boolean showRegistrations = GitBlit.getBoolean(Keys.web.showFederationRegistrations, false);
+ FederationRegistrationsPanel registrationsPanel = new FederationRegistrationsPanel(
+ "federationRegistrationsPanel");
+ if (showAdmin || showRegistrations) {
+ registrationsPanel.hideIfEmpty();
+ } else {
+ registrationsPanel.setVisible(false);
+ }
+ add(proposalsPanel);
+ add(registrationsPanel);
}
}
diff --git a/src/com/gitblit/wicket/panels/BasePanel.java b/src/com/gitblit/wicket/panels/BasePanel.java
index 02789fb4..9dda03c2 100644
--- a/src/com/gitblit/wicket/panels/BasePanel.java
+++ b/src/com/gitblit/wicket/panels/BasePanel.java
@@ -67,4 +67,23 @@ public abstract class BasePanel extends Panel {
return result;
}
}
+
+ public static class JavascriptTextPrompt extends AttributeModifier {
+
+ private static final long serialVersionUID = 1L;
+
+ public JavascriptTextPrompt(String event, String msg) {
+ super(event, true, new Model<String>(msg));
+ }
+
+ protected String newValue(final String currentValue, final String message) {
+ String result = "var userText = prompt('" + message + "','"
+ + (currentValue == null ? "" : currentValue) + "'); " + "return userText; ";
+ // String result = prefix;
+ // if (currentValue != null) {
+ // result = prefix + currentValue;
+ // }
+ return result;
+ }
+ }
}
diff --git a/src/com/gitblit/wicket/panels/FederationProposalsPanel.html b/src/com/gitblit/wicket/panels/FederationProposalsPanel.html
new file mode 100644
index 00000000..e451b7c5
--- /dev/null
+++ b/src/com/gitblit/wicket/panels/FederationProposalsPanel.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"
+ xml:lang="en"
+ lang="en">
+
+<body>
+<wicket:panel>
+
+ <table class="repositories">
+ <tr>
+ <th class="left">
+ <img style="vertical-align: top; border: 1px solid #888; background-color: white;" src="federated_16x16.png"/>
+ <wicket:message key="gb.proposals">[proposals]</wicket:message>
+ </th>
+ <th><wicket:message key="gb.received">[received]</wicket:message></th>
+ <th><wicket:message key="gb.type">[type]</wicket:message></th>
+ <th><wicket:message key="gb.token">[token]</wicket:message></th>
+ <th class="right"></th>
+ </tr>
+ <tbody>
+ <tr wicket:id="row">
+ <td class="left"><span class="list" wicket:id="url">[field]</span></td>
+ <td><span class="date"" wicket:id="received">[received]</span></td>
+ <td><span wicket:id="tokenType">[token type]</span></td>
+ <td><span class="sha1"" wicket:id="token">[token]</span></td>
+ <td class="rightAlign"><span class="link"><a wicket:id="deleteProposal"><wicket:message key="gb.delete">[delete]</wicket:message></a></span></td>
+ </tr>
+ </tbody>
+ </table>
+
+</wicket:panel>
+</body>
+</html> \ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/FederationProposalsPanel.java b/src/com/gitblit/wicket/panels/FederationProposalsPanel.java
new file mode 100644
index 00000000..f83f9262
--- /dev/null
+++ b/src/com/gitblit/wicket/panels/FederationProposalsPanel.java
@@ -0,0 +1,92 @@
+/*
+ * 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.panels;
+
+import java.text.MessageFormat;
+import java.util.List;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.link.Link;
+import org.apache.wicket.markup.repeater.Item;
+import org.apache.wicket.markup.repeater.data.DataView;
+import org.apache.wicket.markup.repeater.data.ListDataProvider;
+
+import com.gitblit.GitBlit;
+import com.gitblit.models.FederationProposal;
+import com.gitblit.wicket.WicketUtils;
+import com.gitblit.wicket.pages.FederationProposalPage;
+
+public class FederationProposalsPanel extends BasePanel {
+
+ private static final long serialVersionUID = 1L;
+
+ private final boolean hasProposals;
+
+ public FederationProposalsPanel(String wicketId) {
+ super(wicketId);
+
+ final List<FederationProposal> list = GitBlit.self().getPendingFederationProposals();
+ hasProposals = list.size() > 0;
+ DataView<FederationProposal> dataView = new DataView<FederationProposal>("row",
+ new ListDataProvider<FederationProposal>(list)) {
+ private static final long serialVersionUID = 1L;
+ private int counter;
+
+ @Override
+ protected void onBeforeRender() {
+ super.onBeforeRender();
+ counter = 0;
+ }
+
+ public void populateItem(final Item<FederationProposal> item) {
+ final FederationProposal entry = item.getModelObject();
+ item.add(new LinkPanel("url", "list", entry.url, FederationProposalPage.class,
+ WicketUtils.newTokenParameter(entry.token)));
+ item.add(WicketUtils.createDateLabel("received", entry.received, getTimeZone()));
+ item.add(new Label("tokenType", entry.tokenType.name()));
+ item.add(new LinkPanel("token", "list", entry.token, FederationProposalPage.class,
+ WicketUtils.newTokenParameter(entry.token)));
+
+ Link<Void> deleteLink = new Link<Void>("deleteProposal") {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void onClick() {
+ if (GitBlit.self().deletePendingFederationProposal(entry)) {
+ list.remove(entry);
+ info(MessageFormat.format("Proposal ''{0}'' deleted.", entry.name));
+ } else {
+ error(MessageFormat.format("Failed to delete proposal ''{0}''!",
+ entry.name));
+ }
+ }
+ };
+ deleteLink.add(new JavascriptEventConfirmation("onclick", MessageFormat.format(
+ "Delete proposal \"{0}\"?", entry.name)));
+ item.add(deleteLink);
+ WicketUtils.setAlternatingBackground(item, counter);
+ counter++;
+ }
+ };
+ add(dataView);
+ }
+
+ public Component hideIfEmpty() {
+ return super.setVisible(hasProposals);
+ }
+}
diff --git a/src/com/gitblit/wicket/panels/FederationRegistrationsPanel.html b/src/com/gitblit/wicket/panels/FederationRegistrationsPanel.html
new file mode 100644
index 00000000..6fab778f
--- /dev/null
+++ b/src/com/gitblit/wicket/panels/FederationRegistrationsPanel.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"
+ xml:lang="en"
+ lang="en">
+
+<body>
+<wicket:panel>
+
+ <table class="repositories">
+ <tr>
+ <th class="left">
+ <img style="vertical-align: top; border: 1px solid #888; background-color: white;" src="federated_16x16.png"/>
+ <wicket:message key="gb.registrations">[registrations]</wicket:message>
+ </th>
+ <th><wicket:message key="gb.name">[name]</wicket:message></th>
+ <th><wicket:message key="gb.frequency">[frequency]</wicket:message></th>
+ <th></th>
+ <th><wicket:message key="gb.lastPull">[lastPull]</wicket:message></th>
+ <th><wicket:message key="gb.nextPull">[nextPull]</wicket:message></th>
+ <th class="right"></th>
+ </tr>
+ <tbody>
+ <tr wicket:id="row">
+ <td class="left"><img style="border:0px;vertical-align:middle;" wicket:id="statusIcon" /><span class="list" wicket:id="url">[url]</span></td>
+ <td><span class="list" wicket:id="name">[name]</span></td>
+ <td><span wicket:id="frequency">[frequency]</span></td>
+ <td><img style="border:0px;vertical-align:middle;" wicket:id="typeIcon" /></td>
+ <td><span class="date"" wicket:id="lastPull">[lastPull]</span></td>
+ <td><span class="date"" wicket:id="nextPull">[nextPull]</span></td>
+ <td class="rightAlign"><span class="link"></span></td>
+ </tr>
+ </tbody>
+ </table>
+
+</wicket:panel>
+</body>
+</html> \ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/FederationRegistrationsPanel.java b/src/com/gitblit/wicket/panels/FederationRegistrationsPanel.java
new file mode 100644
index 00000000..a2bfd8cf
--- /dev/null
+++ b/src/com/gitblit/wicket/panels/FederationRegistrationsPanel.java
@@ -0,0 +1,83 @@
+/*
+ * 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.panels;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.repeater.Item;
+import org.apache.wicket.markup.repeater.data.DataView;
+import org.apache.wicket.markup.repeater.data.ListDataProvider;
+
+import com.gitblit.GitBlit;
+import com.gitblit.models.FederationModel;
+import com.gitblit.wicket.WicketUtils;
+import com.gitblit.wicket.pages.FederationRegistrationPage;
+
+public class FederationRegistrationsPanel extends BasePanel {
+
+ private static final long serialVersionUID = 1L;
+
+ private final boolean hasRegistrations;
+
+ public FederationRegistrationsPanel(String wicketId) {
+ super(wicketId);
+
+ final List<FederationModel> list = new ArrayList<FederationModel>(GitBlit.self()
+ .getFederationRegistrations());
+ list.addAll(GitBlit.self().getFederationResultRegistrations());
+ Collections.sort(list);
+ hasRegistrations = list.size() > 0;
+ DataView<FederationModel> dataView = new DataView<FederationModel>("row",
+ new ListDataProvider<FederationModel>(list)) {
+ private static final long serialVersionUID = 1L;
+ private int counter;
+
+ @Override
+ protected void onBeforeRender() {
+ super.onBeforeRender();
+ counter = 0;
+ }
+
+ public void populateItem(final Item<FederationModel> item) {
+ final FederationModel entry = item.getModelObject();
+ item.add(new LinkPanel("url", "list", entry.url, FederationRegistrationPage.class,
+ WicketUtils.newRegistrationParameter(entry.url, entry.name)));
+ item.add(WicketUtils.getPullStatusImage("statusIcon", entry.getLowestStatus()));
+ item.add(new LinkPanel("name", "list", entry.name,
+ FederationRegistrationPage.class, WicketUtils.newRegistrationParameter(
+ entry.url, entry.name)));
+
+ item.add(WicketUtils.getRegistrationImage("typeIcon", entry, this));
+
+ item.add(WicketUtils.createDateLabel("lastPull", entry.lastPull, getTimeZone()));
+ item.add(WicketUtils
+ .createTimestampLabel("nextPull", entry.nextPull, getTimeZone()));
+ item.add(new Label("frequency", entry.frequency));
+ WicketUtils.setAlternatingBackground(item, counter);
+ counter++;
+ }
+ };
+ add(dataView);
+ }
+
+ public Component hideIfEmpty() {
+ return super.setVisible(hasRegistrations);
+ }
+}
diff --git a/src/com/gitblit/wicket/panels/FederationTokensPanel.html b/src/com/gitblit/wicket/panels/FederationTokensPanel.html
new file mode 100644
index 00000000..6749e40e
--- /dev/null
+++ b/src/com/gitblit/wicket/panels/FederationTokensPanel.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"
+ xml:lang="en"
+ lang="en">
+
+<body>
+<wicket:panel>
+
+ <div class="admin_nav">
+ <a wicket:id="federatedRepositories"><wicket:message key="gb.federatedRepositoryDefinitions">[repositories]</wicket:message></a>
+ | <a wicket:id="federatedUsers"><wicket:message key="gb.federatedUserDefinitions">[users]</wicket:message></a>
+ | <a wicket:id="federatedSettings"><wicket:message key="gb.federatedSettingDefinitions">[settings]</wicket:message></a>
+ </div>
+
+ <table class="repositories">
+ <tr>
+ <th class="left">
+ <img style="vertical-align: top; border: 1px solid #888; background-color: white;" src="federated_16x16.png"/>
+ <wicket:message key="gb.tokens">[tokens]</wicket:message>
+ </th>
+ <th></th>
+ <th></th>
+ <th class="right"></th>
+ </tr>
+ <tbody>
+ <tr wicket:id="row">
+ <td class="left"><span class="list" wicket:id="field">[field]</span></td>
+ <td><span class="sha1"" wicket:id="value">[value]</span></td>
+ <td><span wicket:id="description"></span></td>
+ <td class="rightAlign"><span class="link"><a wicket:id="send"><wicket:message key="gb.sendProposal">[send proposal]</wicket:message></a></span></td>
+ </tr>
+ </tbody>
+ </table>
+
+</wicket:panel>
+</body>
+</html> \ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/FederationTokensPanel.java b/src/com/gitblit/wicket/panels/FederationTokensPanel.java
new file mode 100644
index 00000000..166f1bd0
--- /dev/null
+++ b/src/com/gitblit/wicket/panels/FederationTokensPanel.java
@@ -0,0 +1,109 @@
+/*
+ * 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.panels;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.link.ExternalLink;
+import org.apache.wicket.markup.html.link.Link;
+import org.apache.wicket.markup.repeater.Item;
+import org.apache.wicket.markup.repeater.data.DataView;
+import org.apache.wicket.markup.repeater.data.ListDataProvider;
+
+import com.gitblit.Constants.FederationRequest;
+import com.gitblit.Constants.FederationToken;
+import com.gitblit.FederationServlet;
+import com.gitblit.GitBlit;
+import com.gitblit.wicket.WicketUtils;
+
+public class FederationTokensPanel extends BasePanel {
+
+ private static final long serialVersionUID = 1L;
+
+ public FederationTokensPanel(String wicketId, final boolean showFederation) {
+ super(wicketId);
+
+ String baseUrl = getRequest().getRelativePathPrefixToContextRoot();
+ add(new ExternalLink("federatedRepositories", FederationServlet.asPullLink(baseUrl, GitBlit
+ .self().getFederationToken(FederationToken.REPOSITORIES),
+ FederationRequest.PULL_REPOSITORIES)));
+
+ add(new ExternalLink("federatedUsers", FederationServlet.asPullLink(baseUrl, GitBlit.self()
+ .getFederationToken(FederationToken.USERS_AND_REPOSITORIES),
+ FederationRequest.PULL_USERS)));
+
+ add(new ExternalLink("federatedSettings", FederationServlet.asPullLink(baseUrl, GitBlit
+ .self().getFederationToken(FederationToken.ALL), FederationRequest.PULL_SETTINGS)));
+
+ final List<String[]> data = new ArrayList<String[]>();
+ for (FederationToken token : FederationToken.values()) {
+ data.add(new String[] { token.name(), GitBlit.self().getFederationToken(token) });
+ }
+
+ DataView<String[]> dataView = new DataView<String[]>("row", new ListDataProvider<String[]>(
+ data)) {
+ private static final long serialVersionUID = 1L;
+ private int counter;
+
+ @Override
+ protected void onBeforeRender() {
+ super.onBeforeRender();
+ counter = 0;
+ }
+
+ public void populateItem(final Item<String[]> item) {
+ final String[] entry = item.getModelObject();
+ final FederationToken token = FederationToken.fromName(entry[0]);
+
+ item.add(new Label("field", entry[0]));
+ item.add(new Label("value", entry[1]));
+
+ // TODO make this work
+ Link<Void> sendProposal = new Link<Void>("send") {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void onClick() {
+ error("Sorry, this does not work yet. :(");
+ }
+ };
+ sendProposal.add(new JavascriptTextPrompt("onclick",
+ "Please enter URL for remote Gitblit instance:"));
+ item.add(sendProposal);
+
+ item.add(new Label("description", describeToken(token)));
+ WicketUtils.setAlternatingBackground(item, counter);
+ counter++;
+ }
+ };
+ add(dataView.setVisible(showFederation));
+ }
+
+ private String describeToken(FederationToken token) {
+ switch (token) {
+ case ALL:
+ return getString("gb.tokenAllDescription");
+ case USERS_AND_REPOSITORIES:
+ return getString("gb.tokenUnrDescription");
+ case REPOSITORIES:
+ default:
+ return getString("gb.tokenJurDescription");
+ }
+ }
+}
diff --git a/src/com/gitblit/wicket/panels/RepositoriesPanel.html b/src/com/gitblit/wicket/panels/RepositoriesPanel.html
index 48d337c6..8d64f54b 100644
--- a/src/com/gitblit/wicket/panels/RepositoriesPanel.html
+++ b/src/com/gitblit/wicket/panels/RepositoriesPanel.html
@@ -74,7 +74,7 @@
<td class="left"><div class="list" wicket:id="repositoryName">[repository name]</div></td>
<td><div class="list" wicket:id="repositoryDescription">[repository description]</div></td>
<td class="author"><span wicket:id="repositoryOwner">[repository owner]</span></td>
- <td style="text-align: right;padding-right:10px;"><img class="inlineIcon" wicket:id="ticketsIcon" /><img class="inlineIcon" wicket:id="docsIcon" /><img class="inlineIcon" wicket:id="frozenIcon" /><img class="inlineIcon" wicket:id="accessRestrictionIcon" /></td>
+ <td style="text-align: right;padding-right:10px;"><img class="inlineIcon" wicket:id="ticketsIcon" /><img class="inlineIcon" wicket:id="docsIcon" /><img class="inlineIcon" wicket:id="frozenIcon" /><img class="inlineIcon" wicket:id="federatedIcon" /><img class="inlineIcon" wicket:id="accessRestrictionIcon" /></td>
<td><span wicket:id="repositoryLastChange">[last change]</span></td>
<td style="text-align: right;padding-right:15px;"><span style="font-size:0.8em;" wicket:id="repositorySize">[repository size]</span></td>
<td class="rightAlign">
diff --git a/src/com/gitblit/wicket/panels/RepositoriesPanel.java b/src/com/gitblit/wicket/panels/RepositoriesPanel.java
index 2527f4fd..f644546b 100644
--- a/src/com/gitblit/wicket/panels/RepositoriesPanel.java
+++ b/src/com/gitblit/wicket/panels/RepositoriesPanel.java
@@ -60,11 +60,29 @@ public class RepositoriesPanel extends BasePanel {
private static final long serialVersionUID = 1L;
public RepositoriesPanel(String wicketId, final boolean showAdmin,
+ List<RepositoryModel> models,
final Map<AccessRestrictionType, String> accessRestrictionTranslations) {
super(wicketId);
+ final boolean linksActive;
+ final boolean showSize = GitBlit.getBoolean(Keys.web.showRepositorySizes, true);
+
final UserModel user = GitBlitWebSession.get().getUser();
- List<RepositoryModel> models = GitBlit.self().getRepositoryModels(user);
+ if (models == null) {
+ linksActive = true;
+ models = GitBlit.self().getRepositoryModels(user);
+ final ByteFormat byteFormat = new ByteFormat();
+ if (showSize) {
+ for (RepositoryModel model : models) {
+ model.size = byteFormat.format(GitBlit.self().calculateSize(model));
+ }
+ }
+ } else {
+ // disable links if the repositories are already provided
+ // the repositories are most likely from a proposal
+ linksActive = false;
+ }
+
final IDataProvider<RepositoryModel> dp;
Fragment adminLinks = new Fragment("adminPanel", "adminLinks", this);
@@ -100,6 +118,7 @@ public class RepositoriesPanel extends BasePanel {
for (String root : roots) {
List<RepositoryModel> subModels = groups.get(root);
groupedModels.add(new GroupRepositoryModel(root, subModels.size()));
+ Collections.sort(subModels);
groupedModels.addAll(subModels);
}
dp = new RepositoriesProvider(groupedModels);
@@ -107,8 +126,6 @@ public class RepositoriesPanel extends BasePanel {
dp = new SortableRepositoriesProvider(models);
}
- final boolean showSize = GitBlit.getBoolean(Keys.web.showRepositorySizes, true);
- final ByteFormat byteFormat = new ByteFormat();
DataView<RepositoryModel> dataView = new DataView<RepositoryModel>("row", dp) {
private static final long serialVersionUID = 1L;
int counter;
@@ -130,23 +147,27 @@ public class RepositoriesPanel extends BasePanel {
}
Fragment row = new Fragment("rowContent", "repositoryRow", this);
item.add(row);
- if (entry.hasCommits) {
- // Existing repository
+ if (entry.hasCommits && linksActive) {
PageParameters pp = WicketUtils.newRepositoryParameter(entry.name);
row.add(new LinkPanel("repositoryName", "list", entry.name, SummaryPage.class,
pp));
row.add(new LinkPanel("repositoryDescription", "list", entry.description,
SummaryPage.class, pp));
+ } else {
+ // new/empty repository OR proposed repository
+ row.add(new Label("repositoryName", entry.name));
+ row.add(new Label("repositoryDescription", entry.description));
+ }
+
+ if (entry.hasCommits) {
+ // Existing repository
if (showSize) {
- row.add(new Label("repositorySize", byteFormat.format(GitBlit.self()
- .calculateSize(entry))));
+ row.add(new Label("repositorySize", entry.size));
} else {
row.add(new Label("repositorySize").setVisible(false));
}
} else {
// New repository
- row.add(new Label("repositoryName", entry.name));
- row.add(new Label("repositoryDescription", entry.description));
row.add(new Label("repositorySize", "<span class='empty'>(empty)</span>")
.setEscapeModelStrings(false));
}
@@ -171,6 +192,13 @@ public class RepositoriesPanel extends BasePanel {
} else {
row.add(WicketUtils.newClearPixel("frozenIcon").setVisible(false));
}
+
+ if (entry.isFederated) {
+ row.add(WicketUtils.newImage("federatedIcon", "federated_16x16.png",
+ getString("gb.isFederated")));
+ } else {
+ row.add(WicketUtils.newClearPixel("federatedIcon").setVisible(false));
+ }
switch (entry.accessRestriction) {
case NONE:
row.add(WicketUtils.newBlankImage("accessRestrictionIcon"));
@@ -244,7 +272,8 @@ public class RepositoriesPanel extends BasePanel {
row.add(new Label("repositoryLinks"));
}
row.add(new ExternalLink("syndication", SyndicationServlet.asLink(getRequest()
- .getRelativePathPrefixToContextRoot(), entry.name, null, 0)));
+ .getRelativePathPrefixToContextRoot(), entry.name, null, 0))
+ .setVisible(linksActive));
WicketUtils.setAlternatingBackground(item, counter);
counter++;
}