changed StringListEditorComposite to use Iterable instead of List; major refactoring for UserDetailsView

This commit is contained in:
Axel Uhl committed 2014-10-15 14:41:30 +02:00
1 parent 340f722d80
commit 381539e91a
41 files changed
+309 -309

No files matched your search

+2 -1
View File
@@ -56,5 +56,6 @@ bin.includes = META-INF/,\
AdminConsoleProgressBar.css,\ AdminConsoleProgressBar.css,\
Home.css,\ Home.css,\
Home.html,\ Home.html,\
base.css base.css,\
com.sap.sailing.gwt.ui.Search/
output.. = WEB-INF/classes/ output.. = WEB-INF/classes/
@@ -11,7 +11,7 @@ interface AdminConsoleResources extends ClientBundle {
@Source("com/sap/sailing/gwt/ui/client/images/settingsActionIcon.png") @Source("com/sap/sailing/gwt/ui/client/images/settingsActionIcon.png")
ImageResource settingsActionIcon(); ImageResource settingsActionIcon();
@Source("com/sap/sailing/gwt/ui/client/images/remove.png") @Source("com/sap/sse/gwt/client/images/remove.png")
ImageResource removeIcon(); ImageResource removeIcon();
@Source("com/sap/sailing/gwt/ui/client/images/edit.png") @Source("com/sap/sailing/gwt/ui/client/images/edit.png")
@@ -26,11 +26,11 @@ import com.google.gwt.user.client.ui.VerticalPanel;
import com.sap.sailing.gwt.ui.client.ErrorReporter; import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.controls.listedit.ListEditorComposite;
import com.sap.sailing.gwt.ui.client.shared.controls.listedit.StringListEditorComposite;
import com.sap.sailing.gwt.ui.shared.DeviceConfigurationDTO; import com.sap.sailing.gwt.ui.shared.DeviceConfigurationDTO;
import com.sap.sailing.gwt.ui.shared.DeviceConfigurationDTO.RegattaConfigurationDTO; import com.sap.sailing.gwt.ui.shared.DeviceConfigurationDTO.RegattaConfigurationDTO;
import com.sap.sailing.gwt.ui.shared.DeviceConfigurationMatcherDTO; import com.sap.sailing.gwt.ui.shared.DeviceConfigurationMatcherDTO;
import com.sap.sse.gwt.client.controls.listedit.ListEditorComposite;
import com.sap.sse.gwt.client.controls.listedit.StringListEditorComposite;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback; import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback;
public class DeviceConfigurationDetailComposite extends Composite { public class DeviceConfigurationDetailComposite extends Composite {
@@ -300,9 +300,9 @@ public class DeviceConfigurationDetailComposite extends Composite {
} }
}; };
private ValueChangeHandler<List<String>> dirtyValueMarker = new ValueChangeHandler<List<String>>() { private ValueChangeHandler<Iterable<String>> dirtyValueMarker = new ValueChangeHandler<Iterable<String>>() {
@Override @Override
public void onValueChange(ValueChangeEvent<List<String>> event) { public void onValueChange(ValueChangeEvent<Iterable<String>> event) {
markAsDirty(true); markAsDirty(true);
} }
}; };
@@ -20,12 +20,12 @@ import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.client.DataEntryDialogWithBootstrap; import com.sap.sailing.gwt.ui.client.DataEntryDialogWithBootstrap;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.controls.listedit.StringListInlineEditorComposite;
import com.sap.sailing.gwt.ui.shared.BetterDateTimeBox; import com.sap.sailing.gwt.ui.shared.BetterDateTimeBox;
import com.sap.sailing.gwt.ui.shared.CourseAreaDTO; import com.sap.sailing.gwt.ui.shared.CourseAreaDTO;
import com.sap.sailing.gwt.ui.shared.EventDTO; import com.sap.sailing.gwt.ui.shared.EventDTO;
import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
import com.sap.sailing.gwt.ui.shared.VenueDTO; import com.sap.sailing.gwt.ui.shared.VenueDTO;
import com.sap.sse.gwt.client.controls.listedit.StringListInlineEditorComposite;
public abstract class EventDialog extends DataEntryDialogWithBootstrap<EventDTO> { public abstract class EventDialog extends DataEntryDialogWithBootstrap<EventDTO> {
private final AdminConsoleResources resources = GWT.create(AdminConsoleResources.class); private final AdminConsoleResources resources = GWT.create(AdminConsoleResources.class);
@@ -122,9 +122,9 @@ public abstract class EventDialog extends DataEntryDialogWithBootstrap<EventDTO>
callback); callback);
this.leaderboardGroups = leaderboardGroups; this.leaderboardGroups = leaderboardGroups;
this.stringMessages = stringMessages; this.stringMessages = stringMessages;
final ValueChangeHandler<List<String>> valueChangeHandler = new ValueChangeHandler<List<String>>() { final ValueChangeHandler<Iterable<String>> valueChangeHandler = new ValueChangeHandler<Iterable<String>>() {
@Override @Override
public void onValueChange(ValueChangeEvent<List<String>> event) { public void onValueChange(ValueChangeEvent<Iterable<String>> event) {
validate(); validate();
} }
}; };
@@ -1,7 +1,5 @@
package com.sap.sailing.gwt.ui.adminconsole; package com.sap.sailing.gwt.ui.adminconsole;
import java.util.List;
import com.google.gwt.dom.client.Style.FontWeight; import com.google.gwt.dom.client.Style.FontWeight;
import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.ChangeHandler;
@@ -19,11 +17,11 @@ import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.Color;
import com.sap.sailing.domain.common.dto.FleetDTO; import com.sap.sailing.domain.common.dto.FleetDTO;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.controls.listedit.ExpandedListEditorUi; import com.sap.sse.gwt.client.controls.listedit.ExpandedListEditorUi;
import com.sap.sailing.gwt.ui.client.shared.controls.listedit.ListEditorComposite; import com.sap.sse.gwt.client.controls.listedit.ListEditorComposite;
public class FleetListEditorComposite extends ListEditorComposite<FleetDTO> { public class FleetListEditorComposite extends ListEditorComposite<FleetDTO> {
public FleetListEditorComposite(List<FleetDTO> initialValues, StringMessages stringMessages, ImageResource removeImage) { public FleetListEditorComposite(Iterable<FleetDTO> initialValues, StringMessages stringMessages, ImageResource removeImage) {
super(initialValues, new ExpandedUi(stringMessages, removeImage)); super(initialValues, new ExpandedUi(stringMessages, removeImage));
} }
@@ -33,6 +31,12 @@ public class FleetListEditorComposite extends ListEditorComposite<FleetDTO> {
super(stringMessages, removeImage, /*canRemoveItems*/true); super(stringMessages, removeImage, /*canRemoveItems*/true);
} }
@Override
protected StringMessages getStringMessages() {
return (StringMessages) super.getStringMessages();
}
@Override @Override
protected Widget createAddWidget() { protected Widget createAddWidget() {
HorizontalPanel hPanel = new HorizontalPanel(); HorizontalPanel hPanel = new HorizontalPanel();
@@ -48,7 +52,7 @@ public class FleetListEditorComposite extends ListEditorComposite<FleetDTO> {
final ListBox colorListBox = createColorListBox(nameBox, orderNoBox); final ListBox colorListBox = createColorListBox(nameBox, orderNoBox);
colorListBox.ensureDebugId("ColorListBox"); colorListBox.ensureDebugId("ColorListBox");
final Button addButton = new Button(stringMessages.add()); final Button addButton = new Button(getStringMessages().add());
addButton.ensureDebugId("AddButton"); addButton.ensureDebugId("AddButton");
addButton.addClickHandler(new ClickHandler() { addButton.addClickHandler(new ClickHandler() {
@Override @Override
@@ -57,11 +61,11 @@ public class FleetListEditorComposite extends ListEditorComposite<FleetDTO> {
} }
}); });
hPanel.add(new Label(stringMessages.color() + ":")); hPanel.add(new Label(getStringMessages().color() + ":"));
hPanel.add(colorListBox); hPanel.add(colorListBox);
hPanel.add(new Label(stringMessages.name() + ":")); hPanel.add(new Label(getStringMessages().name() + ":"));
hPanel.add(nameBox); hPanel.add(nameBox);
hPanel.add(new Label(stringMessages.rank() + ":")); hPanel.add(new Label(getStringMessages().rank() + ":"));
hPanel.add(orderNoBox); hPanel.add(orderNoBox);
hPanel.add(addButton); hPanel.add(addButton);
return hPanel; return hPanel;
@@ -71,17 +75,17 @@ public class FleetListEditorComposite extends ListEditorComposite<FleetDTO> {
protected Widget createValueWidget(int rowIndex, FleetDTO fleet) { protected Widget createValueWidget(int rowIndex, FleetDTO fleet) {
HorizontalPanel hPanel = new HorizontalPanel(); HorizontalPanel hPanel = new HorizontalPanel();
hPanel.setSpacing(4); hPanel.setSpacing(4);
Label fleetLabel = new Label(stringMessages.fleet() + " '" + fleet.getName() + "' :"); Label fleetLabel = new Label(getStringMessages().fleet() + " '" + fleet.getName() + "' :");
fleetLabel.getElement().getStyle().setFontWeight(FontWeight.BOLD); fleetLabel.getElement().getStyle().setFontWeight(FontWeight.BOLD);
hPanel.add(fleetLabel); hPanel.add(fleetLabel);
String valueText = ""; String valueText = "";
if(fleet.getColor() != null) { if(fleet.getColor() != null) {
valueText += stringMessages.color() + " '" + fleet.getColor().toString() + "'"; valueText += getStringMessages().color() + " '" + fleet.getColor().toString() + "'";
} else { } else {
valueText += stringMessages.noColor(); valueText += getStringMessages().noColor();
} }
valueText += ", " + stringMessages.rank() + " " + fleet.getOrderNo(); valueText += ", " + getStringMessages().rank() + " " + fleet.getOrderNo();
hPanel.add(new Label(valueText)); hPanel.add(new Label(valueText));
@@ -121,7 +125,7 @@ public class FleetListEditorComposite extends ListEditorComposite<FleetDTO> {
} }
} }
}); });
colorListBox.addItem(stringMessages.noColor()); colorListBox.addItem(getStringMessages().noColor());
for (FleetColors value : FleetColors.values()) { for (FleetColors value : FleetColors.values()) {
colorListBox.addItem(value.name()); colorListBox.addItem(value.name());
} }
@@ -147,7 +151,7 @@ public class FleetListEditorComposite extends ListEditorComposite<FleetDTO> {
private String getColorText(FleetColors color) { private String getColorText(FleetColors color) {
if (color == null) { if (color == null) {
return stringMessages.noColor(); return getStringMessages().noColor();
} }
return color.name().charAt(0) + color.name().toLowerCase().substring(1); return color.name().charAt(0) + color.name().toLowerCase().substring(1);
} }
@@ -10,10 +10,10 @@ import com.google.gwt.core.shared.GWT;
import com.google.gwt.user.client.ui.TabPanel; import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.VerticalPanel;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.controls.listedit.ListEditorComposite;
import com.sap.sailing.gwt.ui.shared.EventDTO; import com.sap.sailing.gwt.ui.shared.EventDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO; import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.SeriesDTO; import com.sap.sailing.gwt.ui.shared.SeriesDTO;
import com.sap.sse.gwt.client.controls.listedit.ListEditorComposite;
public class RegattaWithSeriesAndFleetsCreateDialog extends RegattaWithSeriesAndFleetsDialog { public class RegattaWithSeriesAndFleetsCreateDialog extends RegattaWithSeriesAndFleetsDialog {
@@ -14,12 +14,12 @@ import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.TabPanel; import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.VerticalPanel;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.controls.listedit.ListEditorComposite;
import com.sap.sailing.gwt.ui.shared.DeviceConfigurationDTO; import com.sap.sailing.gwt.ui.shared.DeviceConfigurationDTO;
import com.sap.sailing.gwt.ui.shared.DeviceConfigurationDTO.RegattaConfigurationDTO; import com.sap.sailing.gwt.ui.shared.DeviceConfigurationDTO.RegattaConfigurationDTO;
import com.sap.sailing.gwt.ui.shared.EventDTO; import com.sap.sailing.gwt.ui.shared.EventDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO; import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.SeriesDTO; import com.sap.sailing.gwt.ui.shared.SeriesDTO;
import com.sap.sse.gwt.client.controls.listedit.ListEditorComposite;
public class RegattaWithSeriesAndFleetsEditDialog extends RegattaWithSeriesAndFleetsDialog { public class RegattaWithSeriesAndFleetsEditDialog extends RegattaWithSeriesAndFleetsDialog {
@@ -29,10 +29,10 @@ import com.sap.sailing.domain.common.LeaderboardNameConstants;
import com.sap.sailing.domain.common.dto.RaceColumnDTO; import com.sap.sailing.domain.common.dto.RaceColumnDTO;
import com.sap.sailing.domain.common.dto.RaceColumnInSeriesDTO; import com.sap.sailing.domain.common.dto.RaceColumnInSeriesDTO;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.controls.listedit.StringListEditorComposite;
import com.sap.sailing.gwt.ui.client.shared.controls.listedit.StringListInlineEditorComposite;
import com.sap.sailing.gwt.ui.shared.RegattaDTO; import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.SeriesDTO; import com.sap.sailing.gwt.ui.shared.SeriesDTO;
import com.sap.sse.gwt.client.controls.listedit.StringListEditorComposite;
import com.sap.sse.gwt.client.controls.listedit.StringListInlineEditorComposite;
import com.sap.sse.gwt.client.dialog.DataEntryDialog; import com.sap.sse.gwt.client.dialog.DataEntryDialog;
public class SeriesEditDialog extends DataEntryDialog<SeriesDescriptor> { public class SeriesEditDialog extends DataEntryDialog<SeriesDescriptor> {
@@ -206,9 +206,9 @@ public class SeriesEditDialog extends DataEntryDialog<SeriesDescriptor> {
raceNamesEditor = new StringListInlineEditorComposite(getExistingRacesOfSeries(), new RaceNamesEditorUi(regatta, stringMessages, resources.removeIcon(), seriesName)); raceNamesEditor = new StringListInlineEditorComposite(getExistingRacesOfSeries(), new RaceNamesEditorUi(regatta, stringMessages, resources.removeIcon(), seriesName));
raceNamesEditor.ensureDebugId("RaceNamesStringListEditorComposite"); raceNamesEditor.ensureDebugId("RaceNamesStringListEditorComposite");
raceNamesEditor.addValueChangeHandler(new ValueChangeHandler<List<String>>() { raceNamesEditor.addValueChangeHandler(new ValueChangeHandler<Iterable<String>>() {
@Override @Override
public void onValueChange(ValueChangeEvent<List<String>> event) { public void onValueChange(ValueChangeEvent<Iterable<String>> event) {
validate(); validate();
} }
}); });
@@ -269,6 +269,11 @@ public class SeriesEditDialog extends DataEntryDialog<SeriesDescriptor> {
this.addRacesHintLabel = new Label(""); this.addRacesHintLabel = new Label("");
} }
@Override
protected StringMessages getStringMessages() {
return (StringMessages) super.getStringMessages();
}
private List<String> resolveRaceNamesToAdd() { private List<String> resolveRaceNamesToAdd() {
List<String> result = new ArrayList<String>(); List<String> result = new ArrayList<String>();
String racePrefix = raceNamePrefixTextBox.getText(); String racePrefix = raceNamePrefixTextBox.getText();
@@ -346,7 +351,7 @@ public class SeriesEditDialog extends DataEntryDialog<SeriesDescriptor> {
HorizontalPanel addRacesPanel = new HorizontalPanel(); HorizontalPanel addRacesPanel = new HorizontalPanel();
addRacesPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE); addRacesPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
addRacesPanel.setSpacing(5); addRacesPanel.setSpacing(5);
addRacesPanel.add(new Label(stringMessages.addRaces())); addRacesPanel.add(new Label(getStringMessages().addRaces()));
for(int i = 1; i <= 50; i++) { for(int i = 1; i <= 50; i++) {
addRacesFromListBox.addItem("" + i); addRacesFromListBox.addItem("" + i);
@@ -368,9 +373,9 @@ public class SeriesEditDialog extends DataEntryDialog<SeriesDescriptor> {
}); });
addRacesPanel.add(addRacesFromListBox); addRacesPanel.add(addRacesFromListBox);
addRacesPanel.add(new Label(stringMessages.to())); addRacesPanel.add(new Label(getStringMessages().to()));
addRacesPanel.add(addRacesToListBox); addRacesPanel.add(addRacesToListBox);
addRacesPanel.add(new Label(stringMessages.withNamePrefix())); addRacesPanel.add(new Label(getStringMessages().withNamePrefix()));
raceNamePrefixTextBox.setWidth("20px"); raceNamePrefixTextBox.setWidth("20px");
if (LeaderboardNameConstants.DEFAULT_SERIES_NAME.equals(seriesName)) { if (LeaderboardNameConstants.DEFAULT_SERIES_NAME.equals(seriesName)) {
@@ -399,7 +404,7 @@ public class SeriesEditDialog extends DataEntryDialog<SeriesDescriptor> {
} }
validate(); validate();
} else { } else {
Window.alert(stringMessages.pleaseSelectASeriesFirst()); Window.alert(getStringMessages().pleaseSelectASeriesFirst());
} }
} }
}); });
@@ -19,8 +19,8 @@ import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.LeaderboardNameConstants; import com.sap.sailing.domain.common.LeaderboardNameConstants;
import com.sap.sailing.domain.common.dto.FleetDTO; import com.sap.sailing.domain.common.dto.FleetDTO;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.controls.listedit.ListEditorComposite;
import com.sap.sailing.gwt.ui.shared.SeriesDTO; import com.sap.sailing.gwt.ui.shared.SeriesDTO;
import com.sap.sse.gwt.client.controls.listedit.ListEditorComposite;
import com.sap.sse.gwt.client.dialog.DataEntryDialog; import com.sap.sse.gwt.client.dialog.DataEntryDialog;
public class SeriesWithFleetsCreateDialog extends DataEntryDialog<SeriesDTO> { public class SeriesWithFleetsCreateDialog extends DataEntryDialog<SeriesDTO> {
@@ -136,10 +136,9 @@ public class SeriesWithFleetsCreateDialog extends DataEntryDialog<SeriesDTO> {
fleetListComposite = new FleetListEditorComposite(Arrays.asList(new FleetDTO(LeaderboardNameConstants.DEFAULT_FLEET_NAME, 0, null)), stringMessages, resources.removeIcon()); fleetListComposite = new FleetListEditorComposite(Arrays.asList(new FleetDTO(LeaderboardNameConstants.DEFAULT_FLEET_NAME, 0, null)), stringMessages, resources.removeIcon());
fleetListComposite.ensureDebugId("FleetListEditorComposite"); fleetListComposite.ensureDebugId("FleetListEditorComposite");
fleetListComposite.addValueChangeHandler(new ValueChangeHandler<List<FleetDTO>>() { fleetListComposite.addValueChangeHandler(new ValueChangeHandler<Iterable<FleetDTO>>() {
@Override @Override
public void onValueChange(ValueChangeEvent<List<FleetDTO>> event) { public void onValueChange(ValueChangeEvent<Iterable<FleetDTO>> event) {
validate(); validate();
} }
}); });
@@ -1,7 +1,6 @@
package com.sap.sailing.gwt.ui.adminconsole; package com.sap.sailing.gwt.ui.adminconsole;
import java.util.Collections; import java.util.Collections;
import java.util.List;
import com.google.gwt.dom.client.Style.FontWeight; import com.google.gwt.dom.client.Style.FontWeight;
import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickEvent;
@@ -12,14 +11,14 @@ import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.controls.listedit.ExpandedListEditorUi;
import com.sap.sailing.gwt.ui.client.shared.controls.listedit.ListEditorComposite;
import com.sap.sailing.gwt.ui.shared.SeriesDTO; import com.sap.sailing.gwt.ui.shared.SeriesDTO;
import com.sap.sse.gwt.client.controls.listedit.ExpandedListEditorUi;
import com.sap.sse.gwt.client.controls.listedit.ListEditorComposite;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback; import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback;
public class SeriesWithFleetsListEditor extends ListEditorComposite<SeriesDTO> { public class SeriesWithFleetsListEditor extends ListEditorComposite<SeriesDTO> {
public SeriesWithFleetsListEditor(List<SeriesDTO> initialValues, StringMessages stringMessages, ImageResource removeImage, boolean enableFleetRemoval) { public SeriesWithFleetsListEditor(Iterable<SeriesDTO> initialValues, StringMessages stringMessages, ImageResource removeImage, boolean enableFleetRemoval) {
super(initialValues, new ExpandedUi(stringMessages, removeImage, enableFleetRemoval)); super(initialValues, new ExpandedUi(stringMessages, removeImage, enableFleetRemoval));
} }
@@ -28,15 +27,20 @@ public class SeriesWithFleetsListEditor extends ListEditorComposite<SeriesDTO> {
super(stringMessages, removeImage, canRemoveItems); super(stringMessages, removeImage, canRemoveItems);
} }
@Override
protected StringMessages getStringMessages() {
return (StringMessages) super.getStringMessages();
}
@Override @Override
protected Widget createAddWidget() { protected Widget createAddWidget() {
Button addSeriesButton = new Button(stringMessages.addSeries()); Button addSeriesButton = new Button(getStringMessages().addSeries());
addSeriesButton.ensureDebugId("AddSeriesButton"); addSeriesButton.ensureDebugId("AddSeriesButton");
addSeriesButton.addClickHandler(new ClickHandler() { addSeriesButton.addClickHandler(new ClickHandler() {
@Override @Override
public void onClick(ClickEvent event) { public void onClick(ClickEvent event) {
SeriesWithFleetsCreateDialog dialog = new SeriesWithFleetsCreateDialog(Collections SeriesWithFleetsCreateDialog dialog = new SeriesWithFleetsCreateDialog(Collections
.unmodifiableCollection(context.getValue()), stringMessages, new DialogCallback<SeriesDTO>() { .unmodifiableCollection(context.getValue()), getStringMessages(), new DialogCallback<SeriesDTO>() {
@Override @Override
public void cancel() { public void cancel() {
} }
@@ -57,7 +61,7 @@ public class SeriesWithFleetsListEditor extends ListEditorComposite<SeriesDTO> {
protected Widget createValueWidget(int rowIndex, SeriesDTO seriesDTO) { protected Widget createValueWidget(int rowIndex, SeriesDTO seriesDTO) {
HorizontalPanel hPanel = new HorizontalPanel(); HorizontalPanel hPanel = new HorizontalPanel();
hPanel.setSpacing(5); hPanel.setSpacing(5);
Label seriesLabel = new Label(stringMessages.series() + " '" + seriesDTO.getName() + "' :"); Label seriesLabel = new Label(getStringMessages().series() + " '" + seriesDTO.getName() + "' :");
seriesLabel.setWordWrap(false); seriesLabel.setWordWrap(false);
seriesLabel.getElement().getStyle().setFontWeight(FontWeight.BOLD); seriesLabel.getElement().getStyle().setFontWeight(FontWeight.BOLD);
hPanel.add(seriesLabel); hPanel.add(seriesLabel);
@@ -66,9 +70,9 @@ public class SeriesWithFleetsListEditor extends ListEditorComposite<SeriesDTO> {
if (seriesDTO.getFleets() != null && seriesDTO.getFleets().size() > 0) { if (seriesDTO.getFleets() != null && seriesDTO.getFleets().size() > 0) {
if(seriesDTO.getFleets().size() == 1) { if(seriesDTO.getFleets().size() == 1) {
fleetText = "1 " + stringMessages.fleet(); fleetText = "1 " + getStringMessages().fleet();
} else { } else {
fleetText = seriesDTO.getFleets().size() + " " + stringMessages.fleets(); fleetText = seriesDTO.getFleets().size() + " " + getStringMessages().fleets();
} }
fleetText += ": " + seriesDTO.getFleets().toString(); fleetText += ": " + seriesDTO.getFleets().toString();
} else { } else {
@@ -1,14 +1,10 @@
package com.sap.sailing.gwt.ui.client; package com.sap.sailing.gwt.ui.client;
import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.Messages;
public interface StringMessages extends Messages { public interface StringMessages extends com.sap.sse.gwt.client.StringMessages {
public static final StringMessages INSTANCE = GWT.create(StringMessages.class); public static final StringMessages INSTANCE = GWT.create(StringMessages.class);
String helloWorld();
String kielWeel2011();
String stgAccount();
String tracTracEvents(); String tracTracEvents();
String swissTimingEvents(); String swissTimingEvents();
String trackedBefore(); String trackedBefore();
@@ -1,6 +1,3 @@
helloWorld=Hello World
kielWeel2011=Kiel Week 2011
stgAccount=STG Account
tracTracEvents=TracTrac Events tracTracEvents=TracTrac Events
swissTimingEvents=SwissTiming Events swissTimingEvents=SwissTiming Events
trackedBefore=History of tracked events trackedBefore=History of tracked events
@@ -1,6 +1,3 @@
helloWorld=Hello World
kielWeel2011=Kiel Week 2011
stgAccount=STG Account
tracTracEvents=TracTrac Events tracTracEvents=TracTrac Events
swissTimingEvents=SwissTiming Events swissTimingEvents=SwissTiming Events
trackedBefore=Historie verfolgter Events trackedBefore=Historie verfolgter Events
@@ -1,7 +1,4 @@
# If you want new properties translated then sent this over GMR (Mark Angell <mangell@gmr.com>) # If you want new properties translated then sent this over GMR (Mark Angell <mangell@gmr.com>)
helloWorld=Привет Мир
kielWeel2011=Кильская Неделя 2011
stgAccount=Счет STG
tracTracEvents=События Трак Трак tracTracEvents=События Трак Трак
swissTimingEvents=События Swiss Timing swissTimingEvents=События Swiss Timing
trackedBefore=Ранее Отслеженные trackedBefore=Ранее Отслеженные
+1
View File
@@ -4,5 +4,6 @@
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry excluding="com/sap/sse/gwt/jre/" kind="src" path="src"/> <classpathentry excluding="com/sap/sse/gwt/jre/" kind="src" path="src"/>
<classpathentry kind="src" path="resources"/>
<classpathentry kind="output" path="bin"/> <classpathentry kind="output" path="bin"/>
</classpath> </classpath>
@@ -19,6 +19,7 @@ Export-Package: com.sap.sse.gwt.client,
com.sap.sse.gwt.client.async, com.sap.sse.gwt.client.async,
com.sap.sse.gwt.client.controls, com.sap.sse.gwt.client.controls,
com.sap.sse.gwt.client.controls.busyindicator, com.sap.sse.gwt.client.controls.busyindicator,
com.sap.sse.gwt.client.controls.listedit,
com.sap.sse.gwt.client.controls.slider, com.sap.sse.gwt.client.controls.slider,
com.sap.sse.gwt.client.dialog, com.sap.sse.gwt.client.dialog,
com.sap.sse.gwt.client.mvp, com.sap.sse.gwt.client.mvp,
+1
View File
@@ -2,3 +2,4 @@ source.. = src/
output.. = bin/ output.. = bin/
bin.includes = META-INF/,\ bin.includes = META-INF/,\
. .
File renamed without changes.

Before

Width:  |  Height:  |  Size: 691 B

After

Width:  |  Height:  |  Size: 691 B

@@ -0,0 +1,21 @@
package com.sap.sse.gwt.client;
import com.google.gwt.i18n.client.Messages;
/**
* Defines the text strings for i18n that are used by the SSE GWT bundle. This bundle
* @author Axel Uhl (D043530)
*
*/
public interface StringMessages extends Messages {
String save();
String remove();
String cancel();
String add();
String edit();
}
@@ -1,4 +1,4 @@
package com.sap.sailing.gwt.ui.client.shared.controls.listedit; package com.sap.sse.gwt.client.controls.listedit;
import java.util.List; import java.util.List;
@@ -8,7 +8,7 @@ import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.gwt.client.StringMessages;
import com.sap.sse.gwt.client.dialog.DataEntryDialog; import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback; import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback;
@@ -49,7 +49,7 @@ public abstract class CollapsedListEditorUi<ValueType> extends ListEditorUi<Valu
protected abstract String getCollapsedValueText(List<ValueType> value); protected abstract String getCollapsedValueText(List<ValueType> value);
protected abstract ListEditorComposite<ValueType> createExpandedUi(List<ValueType> initialValues, protected abstract ListEditorComposite<ValueType> createExpandedUi(Iterable<ValueType> initialValues,
ExpandedListEditorUi<ValueType> ui); ExpandedListEditorUi<ValueType> ui);
@Override @Override
@@ -63,13 +63,12 @@ public abstract class CollapsedListEditorUi<ValueType> extends ListEditorUi<Valu
collapsedValuesBox = new TextBox(); collapsedValuesBox = new TextBox();
collapsedValuesBox.setReadOnly(true); collapsedValuesBox.setReadOnly(true);
collapsedEditButton = new Button(stringMessages.edit()); collapsedEditButton = new Button(getStringMessages().edit());
collapsedEditButton.addClickHandler(new ClickHandler() { collapsedEditButton.addClickHandler(new ClickHandler() {
@Override @Override
public void onClick(ClickEvent event) { public void onClick(ClickEvent event) {
new PopupEditDialog(context.getValue(), expandedUi, popupDialogTitle, new PopupEditDialog(context.getValue(), expandedUi, popupDialogTitle,
new DialogCallback<List<ValueType>>() { new DialogCallback<List<ValueType>>() {
@Override @Override
public void ok(List<ValueType> editedObject) { public void ok(List<ValueType> editedObject) {
context.setValue(editedObject); context.setValue(editedObject);
@@ -104,7 +103,7 @@ public abstract class CollapsedListEditorUi<ValueType> extends ListEditorUi<Valu
public PopupEditDialog(List<ValueType> initialValues, ExpandedListEditorUi<ValueType> ui, String dialogTitle, public PopupEditDialog(List<ValueType> initialValues, ExpandedListEditorUi<ValueType> ui, String dialogTitle,
DataEntryDialog.DialogCallback<List<ValueType>> callback) { DataEntryDialog.DialogCallback<List<ValueType>> callback) {
super(dialogTitle, "", stringMessages.save(), stringMessages.cancel(), null, callback); super(dialogTitle, "", getStringMessages().save(), getStringMessages().cancel(), null, callback);
expandedComposite = createExpandedUi(initialValues, ui); expandedComposite = createExpandedUi(initialValues, ui);
} }
@@ -1,4 +1,4 @@
package com.sap.sailing.gwt.ui.client.shared.controls.listedit; package com.sap.sse.gwt.client.controls.listedit;
import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.ClickHandler;
@@ -9,7 +9,7 @@ import com.google.gwt.user.client.ui.PushButton;
import com.google.gwt.user.client.ui.ValueBoxBase; import com.google.gwt.user.client.ui.ValueBoxBase;
import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.gwt.client.StringMessages;
/** /**
* A base class for an editing UI strategy for a list of objects of type <code>ValueType</code> for use in a * A base class for an editing UI strategy for a list of objects of type <code>ValueType</code> for use in a
@@ -25,7 +25,9 @@ import com.sap.sailing.gwt.ui.client.StringMessages;
* <p> * <p>
* *
* Implementing subclasses may choose to override the {@link #onRowAdded()} and/or the {@link #onRowRemoved()} method(s) * Implementing subclasses may choose to override the {@link #onRowAdded()} and/or the {@link #onRowRemoved()} method(s)
* to be notified of changes to the list. * to be notified of changes to the list. Alternatively or in addition, clients can
* {@link ListEditorComposite#addValueChangeHandler(com.google.gwt.event.logical.shared.ValueChangeHandler) add a value
* change handler} to the enclosing {@link ListEditorComposite}.
* *
* @author Lukas Niemeier * @author Lukas Niemeier
* @author Axel Uhl (D043530) * @author Axel Uhl (D043530)
@@ -80,7 +82,7 @@ public abstract class ExpandedListEditorUi<ValueType> extends ListEditorUi<Value
if (canRemoveItems) { if (canRemoveItems) {
PushButton removeButton = new PushButton(new Image(removeImage)); PushButton removeButton = new PushButton(new Image(removeImage));
removeButton.ensureDebugId("RemoveButton"); removeButton.ensureDebugId("RemoveButton");
removeButton.setTitle(stringMessages.remove()); removeButton.setTitle(getStringMessages().remove());
removeButton.addClickHandler(new ClickHandler() { removeButton.addClickHandler(new ClickHandler() {
@Override @Override
public void onClick(ClickEvent event) { public void onClick(ClickEvent event) {
@@ -1,4 +1,4 @@
package com.sap.sailing.gwt.ui.client.shared.controls.listedit; package com.sap.sse.gwt.client.controls.listedit;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -9,6 +9,7 @@ import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HasValue; import com.google.gwt.user.client.ui.HasValue;
import com.sap.sse.common.Util;
/** /**
* A widget that lets users edit a list of <code>ValueType</code> objects. How the values are displayed and made * A widget that lets users edit a list of <code>ValueType</code> objects. How the values are displayed and made
@@ -32,15 +33,16 @@ import com.google.gwt.user.client.ui.HasValue;
* *
* @param <ValueType> * @param <ValueType>
*/ */
public class ListEditorComposite<ValueType> extends Composite implements HasValue<List<ValueType>>, public class ListEditorComposite<ValueType> extends Composite implements HasValue<Iterable<ValueType>>,
HasValueChangeHandlers<List<ValueType>> { HasValueChangeHandlers<Iterable<ValueType>> {
private final ListEditorUiStrategy<ValueType> activeUi; private final ListEditorUiStrategy<ValueType> activeUi;
private List<ValueType> values; private List<ValueType> values;
public ListEditorComposite(List<ValueType> initialValues, ListEditorUiStrategy<ValueType> activeUi) { public ListEditorComposite(Iterable<ValueType> initialValues, ListEditorUiStrategy<ValueType> activeUi) {
this.values = new ArrayList<ValueType>(initialValues); this.values = new ArrayList<ValueType>();
Util.addAll(initialValues, this.values);
this.activeUi = activeUi; this.activeUi = activeUi;
this.activeUi.setContext(this); this.activeUi.setContext(this);
@@ -54,13 +56,14 @@ public class ListEditorComposite<ValueType> extends Composite implements HasValu
} }
@Override @Override
public void setValue(List<ValueType> newValues) { public void setValue(Iterable<ValueType> newValues) {
setValue(newValues, true); setValue(newValues, true);
} }
@Override @Override
public void setValue(List<ValueType> newValues, boolean fireEvents) { public void setValue(Iterable<ValueType> newValues, boolean fireEvents) {
this.values = newValues; this.values = new ArrayList<>();
Util.addAll(newValues, this.values);
activeUi.refresh(); activeUi.refresh();
if (fireEvents) { if (fireEvents) {
onChange(); onChange();
@@ -68,7 +71,7 @@ public class ListEditorComposite<ValueType> extends Composite implements HasValu
} }
@Override @Override
public HandlerRegistration addValueChangeHandler(ValueChangeHandler<List<ValueType>> handler) { public HandlerRegistration addValueChangeHandler(ValueChangeHandler<Iterable<ValueType>> handler) {
return addHandler(handler, ValueChangeEvent.getType()); return addHandler(handler, ValueChangeEvent.getType());
} }
@@ -1,9 +1,9 @@
package com.sap.sailing.gwt.ui.client.shared.controls.listedit; package com.sap.sse.gwt.client.controls.listedit;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.gwt.client.StringMessages;
public abstract class ListEditorUi<ValueType> implements ListEditorUiStrategy<ValueType> { public abstract class ListEditorUi<ValueType> implements ListEditorUiStrategy<ValueType> {
protected final StringMessages stringMessages; private final StringMessages stringMessages;
protected ListEditorComposite<ValueType> context; protected ListEditorComposite<ValueType> context;
public ListEditorUi(StringMessages stringMessages) { public ListEditorUi(StringMessages stringMessages) {
@@ -14,4 +14,8 @@ public abstract class ListEditorUi<ValueType> implements ListEditorUiStrategy<Va
public void setContext(ListEditorComposite<ValueType> context) { public void setContext(ListEditorComposite<ValueType> context) {
this.context = context; this.context = context;
} }
protected StringMessages getStringMessages() {
return stringMessages;
}
} }
@@ -1,4 +1,4 @@
package com.sap.sailing.gwt.ui.client.shared.controls.listedit; package com.sap.sse.gwt.client.controls.listedit;
import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.Widget;
@@ -1,4 +1,4 @@
package com.sap.sailing.gwt.ui.client.shared.controls.listedit; package com.sap.sse.gwt.client.controls.listedit;
import java.util.List; import java.util.List;
@@ -13,21 +13,21 @@ import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.MultiWordSuggestOracle; import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
import com.google.gwt.user.client.ui.SuggestBox; import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.gwt.client.StringMessages;
public class StringListEditorComposite extends ListEditorComposite<String> { public class StringListEditorComposite extends ListEditorComposite<String> {
public StringListEditorComposite(List<String> initialValues, StringMessages stringMessages, public StringListEditorComposite(Iterable<String> initialValues, StringMessages stringMessages,
String popupDialogTitle, ImageResource removeImage, List<String> suggestValues) { String popupDialogTitle, ImageResource removeImage, Iterable<String> suggestValues) {
super(initialValues, new CollapsedUi(stringMessages, popupDialogTitle, super(initialValues, new CollapsedUi(stringMessages, popupDialogTitle,
new ExpandedUi(stringMessages, removeImage, suggestValues))); new ExpandedUi(stringMessages, removeImage, suggestValues)));
} }
public StringListEditorComposite(List<String> initialValues, StringMessages stringMessages, public StringListEditorComposite(Iterable<String> initialValues, StringMessages stringMessages,
ImageResource removeImage, List<String> suggestValues) { ImageResource removeImage, Iterable<String> suggestValues) {
super(initialValues, new ExpandedUi(stringMessages, removeImage, suggestValues)); super(initialValues, new ExpandedUi(stringMessages, removeImage, suggestValues));
} }
public StringListEditorComposite(List<String> initialValues, ListEditorUiStrategy<String> activeUi) { public StringListEditorComposite(Iterable<String> initialValues, ListEditorUiStrategy<String> activeUi) {
super(initialValues, activeUi); super(initialValues, activeUi);
} }
@@ -51,7 +51,7 @@ public class StringListEditorComposite extends ListEditorComposite<String> {
} }
@Override @Override
protected ListEditorComposite<String> createExpandedUi(List<String> initialValues, ExpandedListEditorUi<String> ui) { protected ListEditorComposite<String> createExpandedUi(Iterable<String> initialValues, ExpandedListEditorUi<String> ui) {
return new StringListEditorComposite(initialValues, ui); return new StringListEditorComposite(initialValues, ui);
} }
} }
@@ -60,10 +60,12 @@ public class StringListEditorComposite extends ListEditorComposite<String> {
protected final MultiWordSuggestOracle inputOracle; protected final MultiWordSuggestOracle inputOracle;
public ExpandedUi(StringMessages stringMessages, ImageResource removeImage, List<String> suggestValues) { public ExpandedUi(StringMessages stringMessages, ImageResource removeImage, Iterable<String> suggestValues) {
super(stringMessages, removeImage, /*canRemoveItems*/true); super(stringMessages, removeImage, /*canRemoveItems*/true);
this.inputOracle = new MultiWordSuggestOracle(); this.inputOracle = new MultiWordSuggestOracle();
inputOracle.addAll(suggestValues); for (String suggestValue : suggestValues) {
inputOracle.add(suggestValue);
}
} }
@Override @Override
@@ -76,7 +78,7 @@ public class StringListEditorComposite extends ListEditorComposite<String> {
protected Widget createAddWidget() { protected Widget createAddWidget() {
final SuggestBox inputBox = new SuggestBox(inputOracle); final SuggestBox inputBox = new SuggestBox(inputOracle);
inputBox.ensureDebugId("InputSuggestBox"); inputBox.ensureDebugId("InputSuggestBox");
final Button addButton = new Button(stringMessages.add()); final Button addButton = new Button(getStringMessages().add());
addButton.ensureDebugId("AddButton"); addButton.ensureDebugId("AddButton");
addButton.setEnabled(false); addButton.setEnabled(false);
addButton.addClickHandler(new ClickHandler() { addButton.addClickHandler(new ClickHandler() {
@@ -1,4 +1,4 @@
package com.sap.sailing.gwt.ui.client.shared.controls.listedit; package com.sap.sse.gwt.client.controls.listedit;
import java.util.List; import java.util.List;
@@ -16,7 +16,7 @@ import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
import com.google.gwt.user.client.ui.SuggestBox; import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.gwt.client.StringMessages;
public class StringListInlineEditorComposite extends StringListEditorComposite { public class StringListInlineEditorComposite extends StringListEditorComposite {
public StringListInlineEditorComposite(List<String> initialValues, StringMessages stringMessages, public StringListInlineEditorComposite(List<String> initialValues, StringMessages stringMessages,
@@ -25,42 +25,27 @@ public class StringListInlineEditorComposite extends StringListEditorComposite {
new ExpandedUi(stringMessages, removeImage, suggestValues, textBoxSize))); new ExpandedUi(stringMessages, removeImage, suggestValues, textBoxSize)));
} }
public StringListInlineEditorComposite(List<String> initialValues, StringMessages stringMessages, public StringListInlineEditorComposite(Iterable<String> initialValues, StringMessages stringMessages,
ImageResource removeImage, List<String> suggestValues, int textBoxSize) { ImageResource removeImage, List<String> suggestValues, int textBoxSize) {
super(initialValues, new ExpandedUi(stringMessages, removeImage, suggestValues, textBoxSize)); super(initialValues, new ExpandedUi(stringMessages, removeImage, suggestValues, textBoxSize));
} }
public StringListInlineEditorComposite(List<String> initialValues, ListEditorUiStrategy<String> activeUi) { public StringListInlineEditorComposite(Iterable<String> initialValues, ListEditorUiStrategy<String> activeUi) {
super(initialValues, activeUi); super(initialValues, activeUi);
} }
public static class CollapsedUi extends CollapsedListEditorUi<String> { public static class CollapsedUi extends StringListEditorComposite.CollapsedUi {
public CollapsedUi(StringMessages stringMessages, String dialogTitle, ExpandedListEditorUi<String> expandedUi) { public CollapsedUi(StringMessages stringMessages, String dialogTitle, ExpandedListEditorUi<String> expandedUi) {
super(stringMessages, dialogTitle, expandedUi); super(stringMessages, dialogTitle, expandedUi);
} }
@Override @Override
protected String getCollapsedValueText(List<String> value) { protected ListEditorComposite<String> createExpandedUi(Iterable<String> initialValues, ExpandedListEditorUi<String> ui) {
StringBuilder valuesText = new StringBuilder();
for (int i = 0; i < value.size(); i++) {
if (i > 0) {
valuesText.append(',');
}
valuesText.append(value.get(i));
}
String condensedValue = valuesText.toString();
return condensedValue;
}
@Override
protected ListEditorComposite<String> createExpandedUi(List<String> initialValues, ExpandedListEditorUi<String> ui) {
return new StringListInlineEditorComposite(initialValues, ui); return new StringListInlineEditorComposite(initialValues, ui);
} }
} }
public static class ExpandedUi extends ExpandedListEditorUi<String> { public static class ExpandedUi extends ExpandedListEditorUi<String> {
private final MultiWordSuggestOracle inputOracle; private final MultiWordSuggestOracle inputOracle;
private final int textBoxSize; private final int textBoxSize;
@@ -68,7 +53,6 @@ public class StringListInlineEditorComposite extends StringListEditorComposite {
super(stringMessages, removeImage, /*canRemoveItems*/true); super(stringMessages, removeImage, /*canRemoveItems*/true);
this.inputOracle = new MultiWordSuggestOracle(); this.inputOracle = new MultiWordSuggestOracle();
this.textBoxSize = textBoxSize; this.textBoxSize = textBoxSize;
inputOracle.addAll(suggestValues); inputOracle.addAll(suggestValues);
} }
@@ -85,7 +69,7 @@ public class StringListInlineEditorComposite extends StringListEditorComposite {
InputElement inputElement = inputBox.getElement().cast(); InputElement inputElement = inputBox.getElement().cast();
inputElement.setSize(textBoxSize); inputElement.setSize(textBoxSize);
final Button addButton = new Button(stringMessages.add()); final Button addButton = new Button(getStringMessages().add());
addButton.setEnabled(false); addButton.setEnabled(false);
addButton.addClickHandler(new ClickHandler() { addButton.addClickHandler(new ClickHandler() {
@@ -17,7 +17,8 @@ Require-Bundle: javax.servlet;bundle-version="2.5.0",
com.sap.sse.security;bundle-version="1.0.0", com.sap.sse.security;bundle-version="1.0.0",
org.json.simple, org.json.simple,
com.sap.sailing.domain.common, com.sap.sailing.domain.common,
com.sap.sse.common com.sap.sse.common,
com.sap.sse.gwt
Web-ContextPath: /security/ui Web-ContextPath: /security/ui
Export-Package: com.sap.sse.security.ui.client, Export-Package: com.sap.sse.security.ui.client,
com.sap.sse.security.ui.loginpanel, com.sap.sse.security.ui.loginpanel,
@@ -1,9 +1,8 @@
package com.sap.sse.security.ui.client; package com.sap.sse.security.ui.client;
import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.Messages;
public interface StringMessages extends Messages { public interface StringMessages extends com.sap.sse.gwt.client.StringMessages {
public static final StringMessages INSTANCE = GWT.create(StringMessages.class); public static final StringMessages INSTANCE = GWT.create(StringMessages.class);
String name(); String name();
@@ -74,4 +73,16 @@ public interface StringMessages extends Messages {
String errorDeletingUser(); String errorDeletingUser();
String account(String accountType);
String save();
String remove();
String add();
String edit();
String errorUpdatingRoles(String username, String message);
} }
@@ -32,3 +32,9 @@ deleteUser=Delete user
deleteUserQuestion=Delete user? deleteUserQuestion=Delete user?
doYouReallyWantToDeleteUser=Do you really want to delete user {0}? doYouReallyWantToDeleteUser=Do you really want to delete user {0}?
errorDeletingUser=An error happened while deleting the user errorDeletingUser=An error happened while deleting the user
account={0}-Account
save=Save
remove=Remove
add=Add
edit=Edit
errorUpdatingRoles=Error updating roles for user {0}: {1}
@@ -32,3 +32,9 @@ deleteUser=Benutzer l
deleteUserQuestion=Benutzer löschen? deleteUserQuestion=Benutzer löschen?
doYouReallyWantToDeleteUser=Wollen Sie Benutzer {0} wirklich löschen? doYouReallyWantToDeleteUser=Wollen Sie Benutzer {0} wirklich löschen?
errorDeletingUser=Fehler beim Löschen des Benutzers errorDeletingUser=Fehler beim Löschen des Benutzers
account={0}-Konto
save=Sichern
remove=Löschen
add=Hinzufügen
edit=Bearbeiten
errorUpdatingRoles=Fehler beim Aktualisieren der Rollen des Benutzers {0}: {1}
@@ -97,7 +97,7 @@ public class UserService {
* @param notifyOtherInstances * @param notifyOtherInstances
* if <code>true</code>, other instances of this class will be notified about the result of the call * if <code>true</code>, other instances of this class will be notified about the result of the call
*/ */
private void updateUser(final boolean notifyOtherInstances) { public void updateUser(final boolean notifyOtherInstances) {
userManagementService.getCurrentUser(new MarkedAsyncCallback<UserDTO>( userManagementService.getCurrentUser(new MarkedAsyncCallback<UserDTO>(
new AsyncCallback<UserDTO>() { new AsyncCallback<UserDTO>() {
@Override @Override
@@ -1,104 +0,0 @@
package com.sap.sse.security.ui.client.component;
import java.util.ArrayList;
import java.util.List;
import com.google.gwt.cell.client.TextCell;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.cellview.client.CellList;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DecoratorPanel;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.ProvidesKey;
import com.google.gwt.view.client.SingleSelectionModel;
import com.sap.sse.security.ui.client.UserChangeEventHandler;
import com.sap.sse.security.ui.shared.SuccessInfo;
import com.sap.sse.security.ui.shared.UserDTO;
import com.sap.sse.security.ui.shared.UserManagementServiceAsync;
public class RolesList extends DecoratorPanel {
private UserManagementServiceAsync userManagementService;
private UserDTO userDTO;
private List<UserChangeEventHandler> handlers = new ArrayList<>();
ProvidesKey<String> keyProvider = new ProvidesKey<String>() {
public Object getKey(String item) {
// Always do a null check.
return (item == null) ? null : item;
}
};
private ListDataProvider<String> rolesDataProvider;
SingleSelectionModel<String> singleSelectionModel = new SingleSelectionModel<>(keyProvider);
private CellList<String> roleList;
private TextBox roleBox;
public RolesList(UserManagementServiceAsync userManagementService, UserDTO userDTO) {
super();
this.userManagementService = userManagementService;
this.userDTO = userDTO;
FlowPanel fp = new FlowPanel();
fp.add(new Label("Roles:"));
HorizontalPanel hp = new HorizontalPanel();
roleBox = new TextBox();
roleBox.getElement().setPropertyString("placeholder", "Add role...");
hp.add(roleBox);
Button addRole = new Button("Add role", new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
RolesList.this.userManagementService.addRoleForUser(RolesList.this.userDTO.getName(), roleBox.getText(), new AsyncCallback<SuccessInfo>() {
@Override
public void onSuccess(SuccessInfo result) {
if (result.isSuccessful()){
Window.alert("Success: "+result.getMessage());
for (UserChangeEventHandler handler : handlers){
handler.onUserChange(RolesList.this.userDTO);
}
}
else {
Window.alert("Failed: "+result.getMessage());
}
}
@Override
public void onFailure(Throwable caught) {
Window.alert("An error occured while adding the role: " + caught);
}
});
}
});
hp.add(addRole);
fp.add(hp);
rolesDataProvider = new ListDataProvider<String>();
for (String role : userDTO.getRoles()) {
rolesDataProvider.getList().add(role);
}
roleList = new CellList<>(new TextCell(), keyProvider);
rolesDataProvider.addDataDisplay(roleList);
fp.add(roleList);
this.setWidget(fp);
}
public void addUserChangeEventHandler(UserChangeEventHandler handler){
this.handlers.add(handler);
}
public void removeUserChangeEventHandler(UserChangeEventHandler handler){
this.handlers.remove(handler);
}
}
@@ -1,6 +1,7 @@
package com.sap.sse.security.ui.client.component; package com.sap.sse.security.ui.client.component;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map.Entry; import java.util.Map.Entry;
@@ -8,6 +9,8 @@ import com.google.gwt.core.client.Scheduler;
import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.resources.client.ImageResource; import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.user.client.Window; import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.rpc.AsyncCallback;
@@ -21,9 +24,14 @@ import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.ImageResourceRenderer; import com.google.gwt.user.client.ui.ImageResourceRenderer;
import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.VerticalPanel;
import com.sap.sse.gwt.client.async.MarkedAsyncCallback;
import com.sap.sse.gwt.client.controls.listedit.StringListEditorComposite;
import com.sap.sse.security.DefaultRoles;
import com.sap.sse.security.ui.client.Resources; import com.sap.sse.security.ui.client.Resources;
import com.sap.sse.security.ui.client.StringMessages; import com.sap.sse.security.ui.client.StringMessages;
import com.sap.sse.security.ui.client.UserChangeEventHandler; import com.sap.sse.security.ui.client.UserChangeEventHandler;
import com.sap.sse.security.ui.client.UserService;
import com.sap.sse.security.ui.client.resources.IconResources;
import com.sap.sse.security.ui.oauth.client.SocialUserDTO; import com.sap.sse.security.ui.oauth.client.SocialUserDTO;
import com.sap.sse.security.ui.shared.AccountDTO; import com.sap.sse.security.ui.shared.AccountDTO;
import com.sap.sse.security.ui.shared.SuccessInfo; import com.sap.sse.security.ui.shared.SuccessInfo;
@@ -32,93 +40,128 @@ import com.sap.sse.security.ui.shared.UserManagementServiceAsync;
import com.sap.sse.security.ui.shared.UsernamePasswordAccountDTO; import com.sap.sse.security.ui.shared.UsernamePasswordAccountDTO;
public class UserDetailsView extends FlowPanel { public class UserDetailsView extends FlowPanel {
private UserManagementServiceAsync userManagementService;
private List<UserChangeEventHandler> handlers = new ArrayList<>(); private List<UserChangeEventHandler> handlers = new ArrayList<>();
private final StringMessages stringMessages; private final StringMessages stringMessages;
public UserDetailsView(UserManagementServiceAsync userManagementService, UserDTO user, StringMessages stringMessages) { private final Label usernameLabel;
this.stringMessages = stringMessages; private final Label emailLabel;
this.userManagementService = userManagementService; private final StringListEditorComposite rolesEditor;
addStyleName("userDetailsView"); private final VerticalPanel accountPanels;
updateUser(user); private final Button deleteButton;
}
public void updateUser(final UserDTO user) { private UserDTO user;
this.clear();
Label title = new Label(stringMessages.userDetails()); public UserDetailsView(final UserService userService, UserDTO user, final StringMessages stringMessages) {
if (user == null) { final UserManagementServiceAsync userManagementService = userService.getUserManagementService();
return; this.stringMessages = stringMessages;
this.user = user;
addStyleName("userDetailsView");
List<String> defaultRoleNames = new ArrayList<>();
for (DefaultRoles defaultRole : DefaultRoles.values()) {
defaultRoleNames.add(defaultRole.name());
} }
rolesEditor = new StringListEditorComposite(user==null?Collections.<String>emptySet():user.getRoles(), stringMessages, IconResources.INSTANCE.remove(), defaultRoleNames);
rolesEditor.addValueChangeHandler(new ValueChangeHandler<Iterable<String>>() {
@Override
public void onValueChange(ValueChangeEvent<Iterable<String>> event) {
Iterable<String> newRoleList = event.getValue();
userManagementService.setRolesForUser(UserDetailsView.this.user.getName(), newRoleList, new MarkedAsyncCallback<SuccessInfo>(
new AsyncCallback<SuccessInfo>() {
@Override
public void onFailure(Throwable caught) {
Window.alert(stringMessages.errorUpdatingRoles(UserDetailsView.this.user.getName(), caught.getMessage()));
}
@Override
public void onSuccess(SuccessInfo result) {
if (!result.isSuccessful()) {
Window.alert(stringMessages.errorUpdatingRoles(UserDetailsView.this.user.getName(), result.getMessage()));
} else {
userService.updateUser(/* notify other instances */ true);
}
}
}));
}
});
usernameLabel = new Label();
emailLabel = new Label();
Label title = new Label(stringMessages.userDetails());
title.getElement().getStyle().setFontSize(25, Unit.PX); title.getElement().getStyle().setFontSize(25, Unit.PX);
this.add(title); this.add(title);
DecoratorPanel decoratorPanel = new DecoratorPanel(); DecoratorPanel decoratorPanel = new DecoratorPanel();
FlowPanel fp = new FlowPanel(); FlowPanel fp = new FlowPanel();
fp.setWidth("100%"); fp.setWidth("100%");
ImageResourceRenderer renderer = new ImageResourceRenderer(); ImageResourceRenderer renderer = new ImageResourceRenderer();
final ImageResource userImageResource = Resources.INSTANCE.userSmall(); final ImageResource userImageResource = Resources.INSTANCE.userSmall();
fp.add(new HTML(renderer.render(userImageResource))); fp.add(new HTML(renderer.render(userImageResource)));
Label name = new Label(stringMessages.name() + ": " + user.getName()); HorizontalPanel namePanel = new HorizontalPanel();
fp.add(name); fp.add(namePanel);
Label email = new Label(stringMessages.email() + ": " + user.getEmail()); namePanel.add(new Label(stringMessages.name()+": "));
fp.add(email); namePanel.add(usernameLabel);
HorizontalPanel emailPanel = new HorizontalPanel();
for (AccountDTO a : user.getAccounts()){ fp.add(emailPanel);
DecoratorPanel accountPanelDecorator = new DecoratorPanel(); emailPanel.add(new Label(stringMessages.email() + ": "));
FlowPanel accountPanelContent = new FlowPanel(); emailPanel.add(emailLabel);
accountPanelDecorator.setWidget(accountPanelContent); accountPanels = new VerticalPanel();
accountPanelContent.add(new Label(a.getAccountType() + "-Account")); fp.add(accountPanels);
if (a instanceof UsernamePasswordAccountDTO){
accountPanelContent.add(new Label(stringMessages.changePassword()));
}
else if (a instanceof SocialUserDTO){
SocialUserDTO sua = (SocialUserDTO) a;
FlexTable table = new FlexTable();
int i = 0;
for (Entry<String, String> e : sua.getProperties().entrySet()){
if (e.getValue() != null){
table.setText(i, 0, e.getKey().toLowerCase().replace('_', ' '));
table.setText(i, 1, e.getValue());
i++;
}
}
accountPanelContent.add(table);
}
fp.add(accountPanelDecorator);
}
decoratorPanel.setWidget(fp); decoratorPanel.setWidget(fp);
this.add(decoratorPanel); this.add(decoratorPanel);
this.add(rolesEditor);
RolesList rolesList = new RolesList(userManagementService, user); deleteButton = new Button(stringMessages.deleteUser(), new ClickHandler() {
rolesList.addUserChangeEventHandler(new UserChangeEventHandler() {
@Override
public void onUserChange(UserDTO user) {
for (UserChangeEventHandler handler : handlers){
handler.onUserChange(user);
}
}
});
this.add(rolesList);
Button delete = new Button(stringMessages.deleteUser(), new ClickHandler() {
@Override @Override
public void onClick(ClickEvent event) { public void onClick(ClickEvent event) {
final DeleteUserConfimDialog deleteUserConfimDialog = new DeleteUserConfimDialog(userManagementService, final DeleteUserConfimDialog deleteUserConfimDialog = new DeleteUserConfimDialog(
user.getName(), stringMessages); userManagementService, UserDetailsView.this.user.getName(), stringMessages);
Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
public void execute() { public void execute() {
deleteUserConfimDialog.center(); deleteUserConfimDialog.center();
} }
}); });
deleteUserConfimDialog.show(); deleteUserConfimDialog.show();
for (UserChangeEventHandler handler : handlers){ for (UserChangeEventHandler handler : handlers) {
handler.onUserChange(user); handler.onUserChange(UserDetailsView.this.user);
} }
} }
}); });
this.add(delete); this.add(deleteButton);
updateUser(user);
}
public void updateUser(final UserDTO user) {
this.user = user;
deleteButton.setEnabled(user != null);
accountPanels.clear();
if (user == null) {
usernameLabel.setText("");
emailLabel.setText("");
} else {
usernameLabel.setText(user.getName());
emailLabel.setText(user.getEmail());
for (AccountDTO a : user.getAccounts()) {
DecoratorPanel accountPanelDecorator = new DecoratorPanel();
FlowPanel accountPanelContent = new FlowPanel();
accountPanelDecorator.setWidget(accountPanelContent);
accountPanelContent.add(new Label(stringMessages.account(a.getAccountType())));
if (a instanceof UsernamePasswordAccountDTO) {
accountPanelContent.add(new Label(stringMessages.changePassword()));
} else if (a instanceof SocialUserDTO) {
SocialUserDTO sua = (SocialUserDTO) a;
FlexTable table = new FlexTable();
int i = 0;
for (Entry<String, String> e : sua.getProperties().entrySet()) {
if (e.getValue() != null) {
table.setText(i, 0, e.getKey().toLowerCase().replace('_', ' '));
table.setText(i, 1, e.getValue());
i++;
}
}
accountPanelContent.add(table);
}
accountPanels.add(accountPanelDecorator);
}
rolesEditor.setValue(user.getRoles());
}
} }
private static class DeleteUserConfimDialog extends DialogBox { private static class DeleteUserConfimDialog extends DialogBox {
@@ -22,6 +22,7 @@ import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.google.gwt.view.client.SingleSelectionModel; import com.google.gwt.view.client.SingleSelectionModel;
import com.sap.sse.security.ui.client.StringMessages; import com.sap.sse.security.ui.client.StringMessages;
import com.sap.sse.security.ui.client.UserChangeEventHandler; import com.sap.sse.security.ui.client.UserChangeEventHandler;
import com.sap.sse.security.ui.client.UserService;
import com.sap.sse.security.ui.shared.UserDTO; import com.sap.sse.security.ui.shared.UserDTO;
import com.sap.sse.security.ui.shared.UserManagementServiceAsync; import com.sap.sse.security.ui.shared.UserManagementServiceAsync;
@@ -33,7 +34,8 @@ public class UserManagementPanel extends DockPanel {
private UserListDataProvider userListDataProvider; private UserListDataProvider userListDataProvider;
public UserManagementPanel(final UserManagementServiceAsync userManagementService, final StringMessages stringMessages) { public UserManagementPanel(final UserService userService, final StringMessages stringMessages) {
final UserManagementServiceAsync userManagementService = userService.getUserManagementService();
VerticalPanel west = new VerticalPanel(); VerticalPanel west = new VerticalPanel();
singleSelectionModel = new SingleSelectionModel<>(); singleSelectionModel = new SingleSelectionModel<>();
Button createButton = new Button(stringMessages.createUser(), new ClickHandler() { Button createButton = new Button(stringMessages.createUser(), new ClickHandler() {
@@ -45,7 +47,7 @@ public class UserManagementPanel extends DockPanel {
west.add(createButton); west.add(createButton);
final UserList userList = new UserList(); final UserList userList = new UserList();
userList.setSelectionModel(singleSelectionModel); userList.setSelectionModel(singleSelectionModel);
final UserDetailsView userDetailsView = new UserDetailsView(userManagementService, singleSelectionModel.getSelectedObject(), stringMessages); final UserDetailsView userDetailsView = new UserDetailsView(userService, singleSelectionModel.getSelectedObject(), stringMessages);
add(userDetailsView, DockPanel.CENTER); add(userDetailsView, DockPanel.CENTER);
userDetailsView.addUserChangeEventHandler(new UserChangeEventHandler() { userDetailsView.addUserChangeEventHandler(new UserChangeEventHandler() {
@Override @Override
@@ -25,4 +25,7 @@ public interface IconResources extends ClientBundle {
@Source("../../images/delete.png") @Source("../../images/delete.png")
public ImageResource delete(); public ImageResource delete();
@Source("com/sap/sse/gwt/client/images/remove.png")
public ImageResource remove();
} }
@@ -4,9 +4,11 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap; import java.util.TreeMap;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
@@ -24,6 +26,7 @@ import org.osgi.util.tracker.ServiceTracker;
import com.google.gwt.user.server.rpc.RemoteServiceServlet; import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.sap.sailing.domain.common.impl.NaturalComparator; import com.sap.sailing.domain.common.impl.NaturalComparator;
import com.sap.sse.common.Util;
import com.sap.sse.security.Credential; import com.sap.sse.security.Credential;
import com.sap.sse.security.DefaultRoles; import com.sap.sse.security.DefaultRoles;
import com.sap.sse.security.SecurityService; import com.sap.sse.security.SecurityService;
@@ -157,7 +160,7 @@ public class UserManagementServiceImpl extends RemoteServiceServlet implements U
} }
@Override @Override
public SuccessInfo addRoleForUser(String username, String role) { public SuccessInfo setRolesForUser(String username, Iterable<String> roles) {
Subject currentSubject = SecurityUtils.getSubject(); Subject currentSubject = SecurityUtils.getSubject();
if (currentSubject.hasRole(DefaultRoles.ADMIN.getRolename())) { if (currentSubject.hasRole(DefaultRoles.ADMIN.getRolename())) {
User u = getSecurityService().getUserByName(username); User u = getSecurityService().getUserByName(username);
@@ -165,8 +168,19 @@ public class UserManagementServiceImpl extends RemoteServiceServlet implements U
return new SuccessInfo(false, "User does not exist.", /* redirectURL */ null, null); return new SuccessInfo(false, "User does not exist.", /* redirectURL */ null, null);
} }
try { try {
getSecurityService().addRoleForUser(username, role); Set<String> rolesToRemove = new HashSet<>();
return new SuccessInfo(true, "Added role: " + role + ".", /* redirectURL */ null, createUserDTOFromUser(u)); Util.addAll(u.getRoles(), rolesToRemove);
Util.removeAll(roles, rolesToRemove);
for (String roleToRemove : rolesToRemove) {
getSecurityService().removeRoleFromUser(username, roleToRemove);
}
Set<String> rolesToAdd = new HashSet<>();
Util.addAll(roles, rolesToAdd);
Util.removeAll(u.getRoles(), rolesToAdd);
for (String roleToAdd : rolesToAdd) {
getSecurityService().addRoleForUser(username, roleToAdd);
}
return new SuccessInfo(true, "Added role: " + roles + ".", /* redirectURL */ null, createUserDTOFromUser(u));
} catch (UserManagementException e) { } catch (UserManagementException e) {
return new SuccessInfo(false, e.getMessage(), /* redirectURL */ null, null); return new SuccessInfo(false, e.getMessage(), /* redirectURL */ null, null);
} }
@@ -22,7 +22,7 @@ public interface UserManagementService extends RemoteService {
SuccessInfo logout(); SuccessInfo logout();
SuccessInfo addRoleForUser(String username, String role); SuccessInfo setRolesForUser(String username, Iterable<String> roles);
Map<String, String> getSettings(); Map<String, String> getSettings();
@@ -19,7 +19,7 @@ public interface UserManagementServiceAsync {
void getFilteredSortedUserList(String filter, AsyncCallback<Collection<UserDTO>> callback); void getFilteredSortedUserList(String filter, AsyncCallback<Collection<UserDTO>> callback);
void addRoleForUser(String username, String role, AsyncCallback<SuccessInfo> callback); void setRolesForUser(String username, Iterable<String> roles, AsyncCallback<SuccessInfo> callback);
void deleteUser(String username, AsyncCallback<SuccessInfo> callback); void deleteUser(String username, AsyncCallback<SuccessInfo> callback);
@@ -49,7 +49,7 @@ public class UserManagementEntryPoint implements EntryPoint {
UserManagementEntryPoint.this.user = user; UserManagementEntryPoint.this.user = user;
} }
}); });
UserManagementPanel userManagementPanel = new UserManagementPanel(userManagementService, stringMessages); UserManagementPanel userManagementPanel = new UserManagementPanel(userService, stringMessages);
center.add(new ScrollPanel(userManagementPanel), stringMessages.users()); center.add(new ScrollPanel(userManagementPanel), stringMessages.users());
final SettingsPanel settingsPanel = new SettingsPanel(userManagementService, stringMessages); final SettingsPanel settingsPanel = new SettingsPanel(userManagementService, stringMessages);
center.add(new ScrollPanel(settingsPanel), stringMessages.settings()); center.add(new ScrollPanel(settingsPanel), stringMessages.settings());
@@ -71,7 +71,7 @@ public class UserStoreImpl implements UserStore {
throw new UserManagementException(UserManagementException.USER_ALREADY_EXISTS); throw new UserManagementException(UserManagementException.USER_ALREADY_EXISTS);
} }
User user = new User(name, email, accounts); User user = new User(name, email, accounts);
logger.info("Creating user: " + user.toString()); logger.info("Creating user: " + user);
mongoObjectFactory.storeUser(user); mongoObjectFactory.storeUser(user);
users.put(name, user); users.put(name, user);
return user; return user;
@@ -39,7 +39,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
dbUser.put(FieldNames.User.ACCOUNTS.name(), createAccountMapObject(user.getAllAccounts())); dbUser.put(FieldNames.User.ACCOUNTS.name(), createAccountMapObject(user.getAllAccounts()));
dbUser.put(FieldNames.User.ROLES.name(), user.getRoles()); dbUser.put(FieldNames.User.ROLES.name(), user.getRoles());
usersCollection.update(query, dbUser, /* upsrt */ true, /* multi */ false, WriteConcern.SAFE); usersCollection.update(query, dbUser, /* upsrt */true, /* multi */false, WriteConcern.SAFE);
} }
@Override @Override
@@ -51,25 +51,25 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
usersCollection.remove(dbUser); usersCollection.remove(dbUser);
} }
private DBObject createAccountMapObject(Map<AccountType, Account> accounts){ private DBObject createAccountMapObject(Map<AccountType, Account> accounts) {
DBObject dbAccounts = new BasicDBObject(); DBObject dbAccounts = new BasicDBObject();
for (Entry<AccountType, Account> e : accounts.entrySet()){ for (Entry<AccountType, Account> e : accounts.entrySet()) {
dbAccounts.put(e.getKey().name(), createAccountObject(e.getValue())); dbAccounts.put(e.getKey().name(), createAccountObject(e.getValue()));
} }
return dbAccounts; return dbAccounts;
} }
private DBObject createAccountObject(Account a){ private DBObject createAccountObject(Account a) {
DBObject dbAccount = new BasicDBObject(); DBObject dbAccount = new BasicDBObject();
if (a instanceof UsernamePasswordAccount){ if (a instanceof UsernamePasswordAccount) {
UsernamePasswordAccount upa = (UsernamePasswordAccount) a; UsernamePasswordAccount upa = (UsernamePasswordAccount) a;
dbAccount.put(FieldNames.UsernamePassword.NAME.name(), upa.getName()); dbAccount.put(FieldNames.UsernamePassword.NAME.name(), upa.getName());
dbAccount.put(FieldNames.UsernamePassword.SALTED_PW.name(), upa.getSaltedPassword()); dbAccount.put(FieldNames.UsernamePassword.SALTED_PW.name(), upa.getSaltedPassword());
dbAccount.put(FieldNames.UsernamePassword.SALT.name(),((SimpleByteSource) upa.getSalt()).getBytes()); dbAccount.put(FieldNames.UsernamePassword.SALT.name(), ((SimpleByteSource) upa.getSalt()).getBytes());
} }
if (a instanceof SocialUserAccount){ if (a instanceof SocialUserAccount) {
SocialUserAccount account = (SocialUserAccount) a; SocialUserAccount account = (SocialUserAccount) a;
for (Social s : FieldNames.Social.values()){ for (Social s : FieldNames.Social.values()) {
dbAccount.put(s.name(), account.getProperty(s.name())); dbAccount.put(s.name(), account.getProperty(s.name()));
} }
} }
@@ -85,7 +85,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
dbSettings.put(FieldNames.Settings.NAME.name(), FieldNames.Settings.VALUES.name()); dbSettings.put(FieldNames.Settings.NAME.name(), FieldNames.Settings.VALUES.name());
dbSettings.put(FieldNames.Settings.MAP.name(), createSettingsMapObject(settings)); dbSettings.put(FieldNames.Settings.MAP.name(), createSettingsMapObject(settings));
settingCollection.update(query, dbSettings, /* upsrt */ true, /* multi */ false, WriteConcern.SAFE); settingCollection.update(query, dbSettings, /* upsrt */true, /* multi */false, WriteConcern.SAFE);
} }
@Override @Override
@@ -97,20 +97,20 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
dbSettingTypes.put(FieldNames.Settings.NAME.name(), FieldNames.Settings.TYPES.name()); dbSettingTypes.put(FieldNames.Settings.NAME.name(), FieldNames.Settings.TYPES.name());
dbSettingTypes.put(FieldNames.Settings.MAP.name(), createSettingTypesMapObject(settingTypes)); dbSettingTypes.put(FieldNames.Settings.MAP.name(), createSettingTypesMapObject(settingTypes));
settingCollection.update(query, dbSettingTypes, /* upsrt */ true, /* multi */ false, WriteConcern.SAFE); settingCollection.update(query, dbSettingTypes, /* upsrt */true, /* multi */false, WriteConcern.SAFE);
} }
private DBObject createSettingsMapObject(Map<String, Object> settings){ private DBObject createSettingsMapObject(Map<String, Object> settings) {
DBObject dbSettings = new BasicDBObject(); DBObject dbSettings = new BasicDBObject();
for (Entry<String, Object> e : settings.entrySet()){ for (Entry<String, Object> e : settings.entrySet()) {
dbSettings.put(e.getKey(), e.getValue()); dbSettings.put(e.getKey(), e.getValue());
} }
return dbSettings; return dbSettings;
} }
private DBObject createSettingTypesMapObject(Map<String, Class<?>> settingTypes){ private DBObject createSettingTypesMapObject(Map<String, Class<?>> settingTypes) {
DBObject dbSettingTypes = new BasicDBObject(); DBObject dbSettingTypes = new BasicDBObject();
for (Entry<String, Class<?>> e : settingTypes.entrySet()){ for (Entry<String, Class<?>> e : settingTypes.entrySet()) {
dbSettingTypes.put(e.getKey(), e.getValue().getName()); dbSettingTypes.put(e.getKey(), e.getValue().getName());
} }
return dbSettingTypes; return dbSettingTypes;