refactored UserService and LoginPanel so instances of UserService are injected

This commit is contained in:
Axel Uhl committed 2014-10-10 17:42:19 +02:00
1 parent e42bcf8cee
commit d3f03d26c3
28 files changed
+177 -137

No files matched your search

@@ -17,6 +17,7 @@ Require-Bundle: javax.servlet;bundle-version="2.5.0",
com.sap.sse.security;bundle-version="1.0.0",
org.json.simple
Web-ContextPath: /security/ui
Export-Package: com.sap.sse.security.ui.loginpanel,
Export-Package: com.sap.sse.security.ui.client,
com.sap.sse.security.ui.loginpanel,
com.sap.sse.security.ui.server,
com.sap.sse.security.ui.shared
+2 -1
View File
@@ -49,7 +49,7 @@
<url-pattern>/redirect</url-pattern>
</servlet-mapping>
<!-- remote logging -->
<!-- enabling remote logging -->
<servlet>
<servlet-name>remoteLogging</servlet-name>
<servlet-class>com.google.gwt.logging.server.RemoteLoggingServiceImpl</servlet-class>
@@ -57,5 +57,6 @@
<servlet-mapping>
<servlet-name>remoteLogging</servlet-name>
<url-pattern>/com.sap.sse.security.ui.OAuthLogin/remote_logging</url-pattern>
<url-pattern>/com.sap.sse.security.ui.Login/remote_logging</url-pattern>
</servlet-mapping>
</web-app>
@@ -2,6 +2,7 @@ package com.sap.sse.security.ui.client;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import java.util.logging.Logger;
import com.google.gwt.core.client.GWT;
@@ -9,11 +10,10 @@ import com.google.gwt.storage.client.Storage;
import com.google.gwt.storage.client.StorageEvent;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sse.security.ui.loginpanel.LoginPanel;
import com.sap.sse.gwt.client.async.MarkedAsyncCallback;
import com.sap.sse.security.ui.oauth.client.util.ClientUtils;
import com.sap.sse.security.ui.shared.SuccessInfo;
import com.sap.sse.security.ui.shared.UserDTO;
import com.sap.sse.security.ui.shared.UserManagementService;
import com.sap.sse.security.ui.shared.UserManagementServiceAsync;
/**
@@ -44,7 +44,7 @@ public class UserService {
*/
private static final String LOCAL_STORAGE_UPDATE_KEY = "current-user-has-changed";
private static final UserManagementServiceAsync userManagementService = GWT.create(UserManagementService.class);
private final UserManagementServiceAsync userManagementService;
private final Storage localStorage;
@@ -52,13 +52,28 @@ public class UserService {
private UserDTO currentUser;
public UserService() {
private final UUID id;
public UserService(UserManagementServiceAsync userManagementService) {
this.id = UUID.randomUUID();
this.userManagementService = userManagementService;
localStorage = Storage.getLocalStorageIfSupported();
handlers = new HashSet<>();
registerStorageListener();
updateUser(/* notifyOtherInstances */ false);
}
/**
* Used to synchronize changes in the user status between all {@link UserService} instances across all browser
* tabs/windows.
*/
public void fireUserUpdateEvent() {
if (localStorage != null) {
localStorage.setItem(LOCAL_STORAGE_UPDATE_KEY, id.toString());
localStorage.setItem(LOCAL_STORAGE_UPDATE_KEY, "");
}
}
/**
* Lets this user service get notified if other tabs or browser windows update the logged-in user
*/
@@ -67,7 +82,9 @@ public class UserService {
Storage.addStorageEventHandler(new StorageEvent.Handler() {
@Override
public void onStorageChange(StorageEvent event) {
if (LOCAL_STORAGE_UPDATE_KEY.equals(event.getKey()) && Boolean.TRUE.toString().equals(event.getNewValue())) {
// ignore update events coming from this object itself
if (LOCAL_STORAGE_UPDATE_KEY.equals(event.getKey()) && event.getNewValue() != null
&& !event.getNewValue().isEmpty() && !event.getNewValue().equals(id.toString())) {
updateUser(/* Don't play endless ping-ping between instances! */ false);
}
}
@@ -86,7 +103,8 @@ public class UserService {
* if <code>true</code>, other instances of this class will be notified about the result of the call
*/
private void updateUser(final boolean notifyOtherInstances) {
userManagementService.getCurrentUser(new AsyncCallback<UserDTO>() {
userManagementService.getCurrentUser(new MarkedAsyncCallback<UserDTO>(
new AsyncCallback<UserDTO>() {
@Override
public void onSuccess(UserDTO result) {
setCurrentUser(result, notifyOtherInstances);
@@ -96,7 +114,7 @@ public class UserService {
public void onFailure(Throwable caught) {
Window.alert(caught.getMessage());
}
});
}));
}
/**
@@ -105,7 +123,8 @@ public class UserService {
* signed-in user will remain to be signed in.
*/
public void login(String username, String password, final AsyncCallback<SuccessInfo> callback) {
userManagementService.login(username, password, new AsyncCallback<SuccessInfo>() {
userManagementService.login(username, password,
new MarkedAsyncCallback<SuccessInfo>(new AsyncCallback<SuccessInfo>() {
@Override
public void onFailure(Throwable caught) {
callback.onFailure(caught);
@@ -118,13 +137,14 @@ public class UserService {
}
callback.onSuccess(result);
}
});
}));
}
public void verifySocialUser(final AsyncCallback<UserDTO> callback) throws Exception {
final String authProviderName = ClientUtils.getAuthProviderNameFromCookie();
logger.info("Verifying " + authProviderName + " user ...");
userManagementService.verifySocialUser(ClientUtils.getCredential(), new AsyncCallback<UserDTO>() {
userManagementService.verifySocialUser(ClientUtils.getCredential(),
new MarkedAsyncCallback<UserDTO>(new AsyncCallback<UserDTO>() {
@Override
public void onFailure(Throwable caught) {
callback.onFailure(caught);
@@ -136,11 +156,11 @@ public class UserService {
logger.info(authProviderName + " user '" + result.getName() + "' is verified!\n");
callback.onSuccess(result);
}
});
}));
}
public void logout() {
LoginPanel.userManagementService.logout(new AsyncCallback<SuccessInfo>() {
userManagementService.logout(new AsyncCallback<SuccessInfo>() {
@Override
public void onFailure(Throwable caught) {
Window.alert(stringMessages.couldNotSignOut(caught.getMessage()));
@@ -165,8 +185,8 @@ public class UserService {
private void setCurrentUser(UserDTO result, final boolean notifyOtherInstances) {
currentUser = result;
logger.info("User changed to " + (result == null ? "No User" : result.getName()) + "roles: "
+ result.getRoles());
logger.info("User changed to " + (result == null ? "No User" : (result.getName() + " roles: "
+ result.getRoles())));
notifyUserStatusEventHandlers();
if (notifyOtherInstances) {
fireUserUpdateEvent();
@@ -187,15 +207,7 @@ public class UserService {
}
}
/**
* Used to synchronize changes in the user status between all {@link UserService} instances across all browser
* tabs/windows.
*/
public void fireUserUpdateEvent() {
if (localStorage != null) {
localStorage.setItem(LOCAL_STORAGE_UPDATE_KEY, Boolean.TRUE.toString());
localStorage.setItem(LOCAL_STORAGE_UPDATE_KEY, Boolean.FALSE.toString());
}
public UserManagementServiceAsync getUserManagementService() {
return userManagementService;
}
}
@@ -28,24 +28,22 @@ import com.sap.sse.security.ui.shared.UserManagementService;
import com.sap.sse.security.ui.shared.UserManagementServiceAsync;
public class LoginEntryPoint implements EntryPoint {
private final UserManagementServiceAsync userManagementService = GWT.create(UserManagementService.class);
private final StringMessages stringMessages = GWT.create(StringMessages.class);
private final UserService userService = new UserService();
private UserManagementServiceAsync userManagementService;
private UserService userService;
@Override
public void onModuleLoad() {
userManagementService = GWT.create(UserManagementService.class);
EntryPointHelper.registerASyncService((ServiceDefTarget) userManagementService,
RemoteServiceMappingConstants.userManagementServiceRemotePath);
userService = new UserService(userManagementService);
RootLayoutPanel rootPanel = RootLayoutPanel.get();
DockLayoutPanel dockPanel = new DockLayoutPanel(Unit.PX);
rootPanel.add(dockPanel);
FlowPanel fp = new FlowPanel();
RootPanel.get().add(new LoginPanel(Resources.INSTANCE.css()));
RootPanel.get().add(new LoginPanel(Resources.INSTANCE.css(), userService));
Label nameLabel = new Label(stringMessages.name()+": ");
fp.add(nameLabel);
@@ -8,7 +8,6 @@ import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.FocusPanel;
@@ -22,8 +21,6 @@ import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.SubmitButton;
import com.google.gwt.user.client.ui.TextBox;
import com.sap.sse.gwt.client.EntryPointHelper;
import com.sap.sse.security.ui.client.RemoteServiceMappingConstants;
import com.sap.sse.security.ui.client.Resources;
import com.sap.sse.security.ui.client.StringMessages;
import com.sap.sse.security.ui.client.UserService;
@@ -31,19 +28,13 @@ import com.sap.sse.security.ui.client.UserStatusEventHandler;
import com.sap.sse.security.ui.oauth.client.component.OAuthLoginPanel;
import com.sap.sse.security.ui.shared.SuccessInfo;
import com.sap.sse.security.ui.shared.UserDTO;
import com.sap.sse.security.ui.shared.UserManagementService;
import com.sap.sse.security.ui.shared.UserManagementServiceAsync;
public class LoginPanel extends FlowPanel implements UserStatusEventHandler {
public static final UserManagementServiceAsync userManagementService = GWT.create(UserManagementService.class);
public final UserManagementServiceAsync userManagementService;
public static final StringMessages stringMessages = GWT.create(StringMessages.class);
static {
EntryPointHelper.registerASyncService((ServiceDefTarget) userManagementService,
RemoteServiceMappingConstants.userManagementServiceRemotePath);
}
private FormPanel loginPanel;
private FlowPanel userPanel;
private SimplePanel infoPanel;
@@ -51,7 +42,7 @@ public class LoginPanel extends FlowPanel implements UserStatusEventHandler {
private static int counter = 0;
private boolean expanded = false;
private static UserService userService = new UserService();
private UserService userService;
private Label loginTitle;
private Anchor loginLink;
@@ -66,7 +57,9 @@ public class LoginPanel extends FlowPanel implements UserStatusEventHandler {
private final Css css;
public LoginPanel(final Css css) {
public LoginPanel(final Css css, UserService userService) {
this.userManagementService = userService.getUserManagementService();
this.userService = userService;
this.css = css;
id = counter++;
css.ensureInjected();
@@ -106,7 +99,8 @@ public class LoginPanel extends FlowPanel implements UserStatusEventHandler {
loginPanel.addSubmitHandler(new SubmitHandler() {
@Override
public void onSubmit(SubmitEvent event) {
userService.login(name.getText(), password.getText(), new AsyncCallback<SuccessInfo>() {
userService.login(name.getText(), password.getText(),
new AsyncCallback<SuccessInfo>() {
@Override
public void onFailure(Throwable caught) {
Window.alert(caught.getMessage());
@@ -118,7 +112,6 @@ public class LoginPanel extends FlowPanel implements UserStatusEventHandler {
Window.alert(result.getMessage());
}
}
});
}
});
@@ -198,15 +191,15 @@ public class LoginPanel extends FlowPanel implements UserStatusEventHandler {
}
}
public static UserDTO getCurrentUser() {
public UserDTO getCurrentUser() {
return userService.getCurrentUser();
}
public static void addUserStatusEventHandler(UserStatusEventHandler handler) {
public void addUserStatusEventHandler(UserStatusEventHandler handler) {
userService.addUserStatusEventHandler(handler);
}
public static void removeUserStatusEventHandler(UserStatusEventHandler handler) {
public void removeUserStatusEventHandler(UserStatusEventHandler handler) {
userService.removeUserStatusEventHandler(handler);
}
@@ -26,7 +26,7 @@ import com.sap.sse.security.ui.shared.UserManagementServiceAsync;
public class OAuthLoginEntryPoint implements EntryPoint, UserChangeEventHandler {
private final UserManagementServiceAsync userManagementService = GWT.create(UserManagementService.class);
private final StringMessages stringMessages = GWT.create(StringMessages.class);
private final UserService userService = new UserService();
private final UserService userService = new UserService(userManagementService);
private OAuthLoginPanel loginScreen = new OAuthLoginPanel(userManagementService);
private FlowPanel content = new FlowPanel();
@@ -17,12 +17,14 @@ import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.sap.sse.security.ui.client.StringMessages;
import com.sap.sse.security.ui.oauth.client.CredentialDTO;
import com.sap.sse.security.ui.oauth.client.resources.ImageResources;
import com.sap.sse.security.ui.oauth.client.util.ClientUtils;
import com.sap.sse.security.ui.shared.UserManagementServiceAsync;
public class OAuthLoginPanel extends Composite {
private static final StringMessages stringMessages = GWT.create(StringMessages.class);
private static final String SAP_SAILING_OAUTH_WINDOW = "sap_sailing_oauth_verification_window";
private VerticalPanel verticalPanel;
private FlexTable flexTableLeft;
@@ -64,7 +66,7 @@ public class OAuthLoginPanel extends Composite {
dp.add(flexTableLeft);
verticalPanel.add(dp);
Label loginWithLabel = new Label("Login With");
Label loginWithLabel = new Label("Login With"); // TODO i18n
loginWithLabel.setWordWrap(false);
// loginWithLabel.setStyleName(labelStyle);
flexTableLeft.setWidget(0, 0, loginWithLabel);
@@ -77,7 +79,7 @@ public class OAuthLoginPanel extends Composite {
facebookImage = new Image(images.facebookIconImageData().getSafeUri());
image = facebookImage;
// image.setStyleName(imageStyle);
image.setTitle("Login with Facebook");
image.setTitle("Login with Facebook"); // TODO i18n
flexTableLeft.setWidget(r, c, image);
r = 1;
@@ -85,7 +87,7 @@ public class OAuthLoginPanel extends Composite {
googleImage = new Image(images.googleIconImageData().getSafeUri());
image = googleImage;
// image.setStyleName(imageStyle);
image.setTitle("Login with Google");
image.setTitle("Login with Google"); // TODO i18n
// flexTableLeft.setWidget(r, c, image);
flexTableLeft.getCellFormatter().setHorizontalAlignment(r, c, har);
@@ -94,7 +96,7 @@ public class OAuthLoginPanel extends Composite {
twitterImage = new Image(images.twitterIconImageData().getSafeUri());
image = twitterImage;
// image.setStyleName(imageStyle);
image.setTitle("Login with Twitter");
image.setTitle("Login with Twitter"); // TODO i18n
// flexTableLeft.setWidget(r, c, image);
flexTableLeft.getCellFormatter().setHorizontalAlignment(r, c, har);
@@ -103,7 +105,7 @@ public class OAuthLoginPanel extends Composite {
yahooImage = new Image(images.yahooIconImageData().getSafeUri());
image = yahooImage;
// image.setStyleName(imageStyle);
image.setTitle("Login with Yahoo!");
image.setTitle("Login with Yahoo!"); // TODO i18n
// flexTableLeft.setWidget(r, c, image);
flexTableLeft.getCellFormatter().setHorizontalAlignment(r, c, har);
@@ -113,7 +115,7 @@ public class OAuthLoginPanel extends Composite {
linkedinImage = new Image(images.linkedinIconImageData().getSafeUri());
image = linkedinImage;
// image.setStyleName(imageStyle);
image.setTitle("Login with LinkedIn");
image.setTitle("Login with LinkedIn"); // TODO i18n
// flexTableLeft.setWidget(r, c, image);
flexTableLeft.getCellFormatter().setHorizontalAlignment(r, c, har);
@@ -122,7 +124,7 @@ public class OAuthLoginPanel extends Composite {
instagramImage = new Image(images.instagramIconImageData().getSafeUri());
image = instagramImage;
// image.setStyleName(imageStyle);
image.setTitle("Login with Instagram");
image.setTitle("Login with Instagram"); // TODO i18n
// flexTableLeft.setWidget(r, c, image);
flexTableLeft.getCellFormatter().setHorizontalAlignment(r, c, har);
@@ -131,7 +133,7 @@ public class OAuthLoginPanel extends Composite {
vimeoImage = new Image(images.vimeoIconImageData().getSafeUri());
image = vimeoImage;
// image.setStyleName(imageStyle);
image.setTitle("Login with Vimeo");
image.setTitle("Login with Vimeo"); // TODO i18n
// flexTableLeft.setWidget(r, c, image);
flexTableLeft.getCellFormatter().setHorizontalAlignment(r, c, har);
@@ -140,7 +142,7 @@ public class OAuthLoginPanel extends Composite {
githubImage = new Image(images.githubIconImageData().getSafeUri());
image = githubImage;
// image.setStyleName(imageStyle);
image.setTitle("Login with github");
image.setTitle("Login with github"); // TODO i18n
// flexTableLeft.setWidget(r, c, image);
flexTableLeft.getCellFormatter().setHorizontalAlignment(r, c, har);
@@ -150,7 +152,7 @@ public class OAuthLoginPanel extends Composite {
flickrImage = new Image(images.flickrIconImageData().getSafeUri());
image = flickrImage;
// image.setStyleName(imageStyle);
image.setTitle("Login with flickr");
image.setTitle("Login with flickr"); // TODO i18n
// flexTableLeft.setWidget(r, c, image);
flexTableLeft.getCellFormatter().setHorizontalAlignment(r, c, har);
@@ -159,7 +161,7 @@ public class OAuthLoginPanel extends Composite {
liveImage = new Image(images.liveIconImageData().getSafeUri());
image = liveImage;
// image.setStyleName(imageStyle);
image.setTitle("Login with Microsoft Live Connect");
image.setTitle("Login with Microsoft Live Connect"); // TODO i18n
// flexTableLeft.setWidget(r, c, image);
flexTableLeft.getCellFormatter().setHorizontalAlignment(r, c, har);
flexTableLeft.getCellFormatter().setHorizontalAlignment(1, 0, HasHorizontalAlignment.ALIGN_RIGHT);
@@ -171,7 +173,7 @@ public class OAuthLoginPanel extends Composite {
tumblrImage = new Image(images.tumblrIconImageData().getSafeUri());
image = tumblrImage;
// image.setStyleName(imageStyle);
image.setTitle("Login with tumblr.");
image.setTitle("Login with tumblr."); // TODO i18n
// flexTableLeft.setWidget(r, c, image);
flexTableLeft.getCellFormatter().setHorizontalAlignment(r, c, har);
flexTableLeft.getCellFormatter().setHorizontalAlignment(1, 0, HasHorizontalAlignment.ALIGN_RIGHT);
@@ -183,7 +185,7 @@ public class OAuthLoginPanel extends Composite {
foursquareImage = new Image(images.foursquareIconImageData().getSafeUri());
image = foursquareImage;
// image.setStyleName(imageStyle);
image.setTitle("Login with foursquare");
image.setTitle("Login with foursquare"); // TODO i18n
// flexTableLeft.setWidget(r, c, image);
flexTableLeft.getCellFormatter().setHorizontalAlignment(r, c, har);
flexTableLeft.getCellFormatter().setHorizontalAlignment(1, 0, HasHorizontalAlignment.ALIGN_RIGHT);
@@ -198,8 +200,7 @@ public class OAuthLoginPanel extends Composite {
popupFrame.setHeight("300px");
popupFrame.getElement().getStyle().setBorderWidth(0, Unit.PX);
popupContent.add(popupFrame);
Button close = new Button("Close", new ClickHandler() {
Button close = new Button(stringMessages.close(), new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
popupPanel.hide();
@@ -214,13 +215,10 @@ public class OAuthLoginPanel extends Composite {
// String authProviderName = ClientUtils.getAuthProviderName(authProvider);
final String callbackUrl = ClientUtils.getCallbackUrl();
GWT.log("Getting authorization url");
final CredentialDTO credential = new CredentialDTO();
credential.setRedirectUrl(callbackUrl);
credential.setAuthProvider(authProvider);
userManagementService.getAuthorizationUrl(credential, new AsyncCallback<String>() {
@Override
public void onFailure(Throwable caught) {
ClientUtils.handleException(caught);
@@ -256,7 +254,6 @@ public class OAuthLoginPanel extends Composite {
}-*/;
private void setupLoginScreenHandlers() {
facebookImage.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
@@ -32,6 +32,7 @@ import com.sap.sse.security.ui.client.RemoteServiceMappingConstants;
import com.sap.sse.security.ui.client.Resources;
import com.sap.sse.security.ui.client.StringMessages;
import com.sap.sse.security.ui.client.UserChangeEventHandler;
import com.sap.sse.security.ui.client.UserService;
import com.sap.sse.security.ui.client.UserStatusEventHandler;
import com.sap.sse.security.ui.client.component.CreateUserPanel;
import com.sap.sse.security.ui.client.component.CreateUserPanel.UserCreationEventHandler;
@@ -71,12 +72,13 @@ public class UserManagementEntryPoint implements EntryPoint {
public void onModuleLoad() {
EntryPointHelper.registerASyncService((ServiceDefTarget) userManagementService,
RemoteServiceMappingConstants.userManagementServiceRemotePath);
UserService userService = new UserService(userManagementService);
center = new SimpleLayoutPanel();
RootLayoutPanel rootPanel = RootLayoutPanel.get();
DockLayoutPanel dockPanel = new DockLayoutPanel(Unit.PX);
rootPanel.add(dockPanel);
HorizontalPanel hp = new HorizontalPanel();
LoginPanel.addUserStatusEventHandler(new UserStatusEventHandler() {
userService.addUserStatusEventHandler(new UserStatusEventHandler() {
@Override
public void onUserStatusChange(UserDTO user) {
if (user == null){
@@ -98,11 +100,10 @@ public class UserManagementEntryPoint implements EntryPoint {
public void onClick(ClickEvent event) {
CreateUserPanel createUserPanel = new CreateUserPanel(userManagementService);
createUserPanel.addUserCreationEventHandler(new UserCreationEventHandler() {
@Override
public void onUserCreation(UserDTO user) {
userListDataProvider.updateDisplays();
if (user != null){
if (user != null) {
singleSelectionModel.setSelected(user, true);
}
}
@@ -165,6 +166,6 @@ public class UserManagementEntryPoint implements EntryPoint {
}
});
center.setWidget(createUserPanel);
RootPanel.get().add(new LoginPanel(Resources.INSTANCE.css()));
RootPanel.get().add(new LoginPanel(Resources.INSTANCE.css(), userService));
}
}