From ff019542f8d2a49470ca6134ccfd22d94c18b3f4 Mon Sep 17 00:00:00 2001 From: Branislav Stojkovic Date: Sat, 22 Oct 2016 19:12:34 +0200 Subject: [PATCH] cloud user management --- .../diylc/plugins/cloud/model/ServiceAPI.java | 16 +- .../cloud/presenter/CloudPresenter.java | 33 ++++ .../org/diylc/swing/gui/DialogFactory.java | 6 + .../swing/plugins/cloud/CloudPlugIn.java | 125 ++++++++---- .../cloud/view/ChangePasswordDialog.java | 182 ++++++++++++++++++ .../plugins/cloud/view/UploadDialog.java | 25 +-- .../plugins/cloud/view/UserEditDialog.java | 15 +- 7 files changed, 343 insertions(+), 59 deletions(-) create mode 100644 diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/cloud/view/ChangePasswordDialog.java diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/plugins/cloud/model/ServiceAPI.java b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/plugins/cloud/model/ServiceAPI.java index 026bba30..a82f085b 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/plugins/cloud/model/ServiceAPI.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/plugins/cloud/model/ServiceAPI.java @@ -43,7 +43,7 @@ public interface ServiceAPI { * @return "Success" if the operation is successful or error message if it * failed. */ - String updateUser(@ParamName("username") String username, + String updateUserDetails(@ParamName("username") String username, @ParamName("token") String token, @ParamName("machineId") String machineId, @ParamName("email") String email, @@ -89,6 +89,20 @@ public interface ServiceAPI { @ParamName("token") String token, @ParamName("machineId") String machineId); + /*** + * Updates password of the current user using token to authenticate. + * + * @param username + * @param token + * @param machineId + * @param password + * @return "Success" if the login is successful or error message if it + * failed. + */ + String updatePassword(@ParamName("username") String username, + @ParamName("oldPassword") String oldPassword, + @ParamName("newPassword") String newPassword); + /*** * Searches for projects that meet the specified search criteria. Supports * pagination. diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/plugins/cloud/presenter/CloudPresenter.java b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/plugins/cloud/presenter/CloudPresenter.java index 88b880d6..bbb78cbe 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/plugins/cloud/presenter/CloudPresenter.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/plugins/cloud/presenter/CloudPresenter.java @@ -179,6 +179,39 @@ public class CloudPresenter { + res.getClass().getName()); } + public void updatePassword(String oldPassword, String newPassword) + throws CloudException { + String username = ConfigurationManager.getInstance().readString( + USERNAME_KEY, null); + + String res; + try { + res = service.updatePassword(username, oldPassword, newPassword); + } catch (Exception e) { + throw new CloudException(e); + } + if (!res.equals(SUCCESS)) + throw new CloudException(res); + } + + public void updateUserDetails(String email, String website, String bio) + throws CloudException { + String username = ConfigurationManager.getInstance().readString( + USERNAME_KEY, null); + String token = ConfigurationManager.getInstance().readString(TOKEN_KEY, + null); + + String res; + try { + res = service.updateUserDetails(username, token, getMachineId(), + email, website, bio); + } catch (Exception e) { + throw new CloudException(e); + } + if (!res.equals(SUCCESS)) + throw new CloudException(res); + } + private String getMachineId() { if (machineId == null) { try { diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/gui/DialogFactory.java b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/gui/DialogFactory.java index 1a0d608d..ae2b4370 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/gui/DialogFactory.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/gui/DialogFactory.java @@ -15,6 +15,7 @@ import org.diylc.plugins.cloud.model.UserEntity; import org.diylc.plugins.cloud.presenter.CloudPresenter; import org.diylc.swing.gui.components.OverwritePromptFileChooser; import org.diylc.swing.gui.editor.PropertyEditorDialog; +import org.diylc.swing.plugins.cloud.view.ChangePasswordDialog; import org.diylc.swing.plugins.cloud.view.LoginDialog; import org.diylc.swing.plugins.cloud.view.UserEditDialog; import org.diylc.swing.plugins.cloud.view.UploadDialog; @@ -155,6 +156,11 @@ public class DialogFactory { UploadDialog dialog = new UploadDialog(mainFrame, plugInPort, cloudPresenter); return dialog; } + + public ChangePasswordDialog createChangePasswordDialog() { + ChangePasswordDialog dialog = new ChangePasswordDialog(mainFrame); + return dialog; + } public ProgressDialog createProgressDialog(String title, String[] buttonCaptions, String description, boolean useProgress) { diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/cloud/CloudPlugIn.java b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/cloud/CloudPlugIn.java index a9720d4d..738ae37f 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/cloud/CloudPlugIn.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/cloud/CloudPlugIn.java @@ -22,6 +22,7 @@ import org.diylc.presenter.Presenter; import org.diylc.swing.ISwingUI; import org.diylc.swing.gui.DialogFactory; import org.diylc.swing.gui.DummyView; +import org.diylc.swing.plugins.cloud.view.ChangePasswordDialog; import org.diylc.swing.plugins.cloud.view.LoginDialog; import org.diylc.swing.plugins.cloud.view.UserEditDialog; import org.diylc.swing.plugins.cloud.view.UploadDialog; @@ -149,10 +150,9 @@ public class CloudPlugIn implements IPlugIn, CloudListener { } return uploadAction; } - + public ChangePasswordAction getChangePasswordAction() { - if (changePasswordAction == null) - { + if (changePasswordAction == null) { changePasswordAction = new ChangePasswordAction(); } return changePasswordAction; @@ -261,6 +261,31 @@ public class CloudPlugIn implements IPlugIn, CloudListener { UserEditDialog dialog = DialogFactory.getInstance() .createUserEditDialog(null); dialog.setVisible(true); + if (ButtonDialog.OK.equals(dialog.getSelectedButtonCaption())) { + swingUI.executeBackgroundTask(new ITask() { + + @Override + public Void doInBackground() throws Exception { + + return null; + } + + @Override + public void failed(Exception e) { + swingUI.showMessage( + "Failed to create the account. Error: " + + e.getMessage(), "Cloud Error", + IView.ERROR_MESSAGE); + } + + @Override + public void complete(Void result) { + swingUI.showMessage( + "Cloud account created successfully.", "Cloud", + IView.ERROR_MESSAGE); + } + }); + } } } @@ -276,30 +301,45 @@ public class CloudPlugIn implements IPlugIn, CloudListener { @Override public void actionPerformed(ActionEvent e) { - swingUI.executeBackgroundTask(new ITask() { + try { + final UserEditDialog dialog = DialogFactory.getInstance() + .createUserEditDialog(cloudPresenter.getUserDetails()); + dialog.setVisible(true); + if (ButtonDialog.OK.equals(dialog.getSelectedButtonCaption())) { + swingUI.executeBackgroundTask(new ITask() { - @Override - public UserEntity doInBackground() throws Exception { - return cloudPresenter.getUserDetails(); - } + @Override + public Void doInBackground() throws Exception { + cloudPresenter.updateUserDetails(dialog.getEmail(), + dialog.getWebsite(), dialog.getBio()); + return null; + } - @Override - public void failed(Exception e) { - swingUI.showMessage( - "Failed to retreive user details from the server.", - "Cloud Error", IView.ERROR_MESSAGE); - } + @Override + public void failed(Exception e) { + swingUI.showMessage( + "Failed to update the account. Error: " + + e.getMessage(), "Cloud Error", + IView.ERROR_MESSAGE); + } - @Override - public void complete(UserEntity result) { - UserEditDialog dialog = DialogFactory.getInstance() - .createUserEditDialog(result); - dialog.setVisible(true); + @Override + public void complete(Void result) { + swingUI.showMessage( + "Cloud account updated successfully.", + "Cloud", IView.INFORMATION_MESSAGE); + } + }); } - }); + } catch (CloudException e1) { + swingUI.showMessage( + "Failed to retreive user details from the server. Error: " + + e1.getMessage(), "Cloud Error", + IView.ERROR_MESSAGE); + } } } - + class ChangePasswordAction extends AbstractAction { private static final long serialVersionUID = 1L; @@ -312,27 +352,34 @@ public class CloudPlugIn implements IPlugIn, CloudListener { @Override public void actionPerformed(ActionEvent e) { - swingUI.executeBackgroundTask(new ITask() { + final ChangePasswordDialog dialog = DialogFactory.getInstance() + .createChangePasswordDialog(); + dialog.setVisible(true); + if (ButtonDialog.OK.equals(dialog.getSelectedButtonCaption())) { + swingUI.executeBackgroundTask(new ITask() { - @Override - public UserEntity doInBackground() throws Exception { - return cloudPresenter.getUserDetails(); - } + @Override + public Void doInBackground() throws Exception { + cloudPresenter.updatePassword(dialog.getOldPassword(), + dialog.getNewPassword()); + return null; + } - @Override - public void failed(Exception e) { - swingUI.showMessage( - "Failed to retreive user details from the server.", - "Cloud Error", IView.ERROR_MESSAGE); - } + @Override + public void failed(Exception e) { + swingUI.showMessage( + "Failed to update the password. Error: " + + e.getMessage(), "Cloud Error", + IView.ERROR_MESSAGE); + } - @Override - public void complete(UserEntity result) { - UserEditDialog dialog = DialogFactory.getInstance() - .createUserEditDialog(result); - dialog.setVisible(true); - } - }); + @Override + public void complete(Void result) { + swingUI.showMessage("Password updated.", "Cloud", + IView.INFORMATION_MESSAGE); + } + }); + } } } diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/cloud/view/ChangePasswordDialog.java b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/cloud/view/ChangePasswordDialog.java new file mode 100644 index 00000000..c62064bc --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/cloud/view/ChangePasswordDialog.java @@ -0,0 +1,182 @@ +package org.diylc.swing.plugins.cloud.view; + +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; + +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +import org.diylc.swingframework.ButtonDialog; + +public class ChangePasswordDialog extends ButtonDialog { + + private static final long serialVersionUID = 1L; + + private JPanel mainPanel; + + private JPasswordField oldPasswordField; + private JPasswordField newPasswordField; + private JPasswordField confirmPasswordField; + + private String oldPassword; + private String newPassword; + + public ChangePasswordDialog(JFrame owner) { + super(owner, "Change Password", new String[] { OK, CANCEL }); + + setMinimumSize(new Dimension(240, 32)); + layoutGui(); + refreshState(); + } + + public String getNewPassword() { + return newPassword; + } + + public String getOldPassword() { + return oldPassword; + } + + @Override + protected JComponent getMainComponent() { + if (mainPanel == null) { + mainPanel = new JPanel(new GridBagLayout()); + mainPanel.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8)); + + GridBagConstraints gbc = new GridBagConstraints(); + gbc.anchor = GridBagConstraints.NORTHWEST; + gbc.fill = GridBagConstraints.NONE; + gbc.insets = new Insets(4, 2, 2, 2); + + gbc.gridx = 0; + + gbc.gridy = 0; + mainPanel.add(new JLabel("Old Password:"), gbc); + + gbc.gridy = 1; + mainPanel.add(new JLabel("New Password:"), gbc); + + gbc.gridy = 2; + mainPanel.add(new JLabel("Confirm Password:"), gbc); + + gbc.gridx = 1; + gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.insets = new Insets(2, 2, 2, 2); + gbc.weightx = 1; + + gbc.gridy = 0; + mainPanel.add(getOldPasswordField(), gbc); + + gbc.gridy = 1; + mainPanel.add(getNewPasswordField(), gbc); + + gbc.gridy = 2; + mainPanel.add(getConfirmPasswordField(), gbc); + + } + return mainPanel; + } + + private void refreshState() { + this.oldPassword = new String(getOldPasswordField().getPassword()); + + String newPassword = new String(getNewPasswordField().getPassword()); + String confirmPassword = new String(getConfirmPasswordField() + .getPassword()); + if (newPassword.equals(confirmPassword)) { + this.newPassword = newPassword; + } else { + this.newPassword = null; + } + + JButton okButton = getButton(OK); + okButton.setEnabled((this.newPassword != null) + && (this.newPassword.length() > 0) + && (this.oldPassword != null) + && (this.oldPassword.length() > 0)); + } + + private JPasswordField getOldPasswordField() { + if (oldPasswordField == null) { + oldPasswordField = new JPasswordField(); + oldPasswordField.getDocument().addDocumentListener( + new DocumentListener() { + + @Override + public void removeUpdate(DocumentEvent e) { + refreshState(); + } + + @Override + public void insertUpdate(DocumentEvent e) { + refreshState(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + refreshState(); + } + }); + } + return oldPasswordField; + } + + private JPasswordField getNewPasswordField() { + if (newPasswordField == null) { + newPasswordField = new JPasswordField(); + newPasswordField.getDocument().addDocumentListener( + new DocumentListener() { + + @Override + public void removeUpdate(DocumentEvent e) { + refreshState(); + } + + @Override + public void insertUpdate(DocumentEvent e) { + refreshState(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + refreshState(); + } + }); + } + return newPasswordField; + } + + private JPasswordField getConfirmPasswordField() { + if (confirmPasswordField == null) { + confirmPasswordField = new JPasswordField(); + confirmPasswordField.getDocument().addDocumentListener( + new DocumentListener() { + + @Override + public void removeUpdate(DocumentEvent e) { + refreshState(); + } + + @Override + public void insertUpdate(DocumentEvent e) { + refreshState(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + refreshState(); + } + }); + } + return confirmPasswordField; + } +} diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java index 958ff6a5..c69db156 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java @@ -58,7 +58,7 @@ public class UploadDialog extends ButtonDialog { private JTextField keywordsField; private IPlugInPort plugInPort; - private CloudPresenter cloudPresenter; + private CloudPresenter cloudPresenter; public UploadDialog(JFrame owner, IPlugInPort plugInPort, CloudPresenter cloudPresenter) { @@ -90,13 +90,13 @@ public class UploadDialog extends ButtonDialog { gbc.insets = new Insets(4, 2, 2, 2); gbc.fill = GridBagConstraints.HORIZONTAL; mainPanel.add(new JLabel("Project Name: "), gbc); - + gbc.gridy = 1; mainPanel.add(new JLabel("Category:"), gbc); - + gbc.gridy = 2; mainPanel.add(new JLabel("Description: "), gbc); - + gbc.gridy = 3; mainPanel.add(new JLabel("Keywords: "), gbc); @@ -114,11 +114,11 @@ public class UploadDialog extends ButtonDialog { gbc.weighty = 1; gbc.fill = GridBagConstraints.BOTH; mainPanel.add(getDescriptionArea(), gbc); - + gbc.gridy = 3; - gbc.weighty = 0; + gbc.weighty = 0; gbc.weightx = 1; - gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.fill = GridBagConstraints.HORIZONTAL; mainPanel.add(getKeywordsField(), gbc); gbc.gridx = 0; @@ -268,14 +268,15 @@ public class UploadDialog extends ButtonDialog { .getWidth(), getThumbnailPanel().getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D cg = thumbnailImage.createGraphics(); - paintThumbnail(cg, new Rectangle(thumbnailImage.getWidth(), thumbnailImage.getHeight())); + + paintThumbnail(cg, new Rectangle(thumbnailImage.getWidth(), + thumbnailImage.getHeight())); return thumbnailImage; } - + private void paintThumbnail(Graphics g, Rectangle rect) { Graphics2D g2d = (Graphics2D) g; - Dimension d = UploadDialog.this.plugInPort - .getCanvasDimensions(false); + Dimension d = UploadDialog.this.plugInPort.getCanvasDimensions(false); g2d.setColor(Color.white); g2d.fill(rect); @@ -291,7 +292,7 @@ public class UploadDialog extends ButtonDialog { g2d.scale(zoomRatio, zoomRatio); UploadDialog.this.plugInPort.draw(g2d, - EnumSet.noneOf(DrawOption.class), null); + EnumSet.of(DrawOption.ANTIALIASING), null); } public String getKeywords() { diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UserEditDialog.java b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UserEditDialog.java index a7293f9e..159574d3 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UserEditDialog.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UserEditDialog.java @@ -22,7 +22,7 @@ import org.diylc.swingframework.ButtonDialog; public class UserEditDialog extends ButtonDialog { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; private JPanel mainPanel; @@ -44,12 +44,12 @@ public class UserEditDialog extends ButtonDialog { public UserEditDialog(JFrame owner, UserEntity existingEntity) { super(owner, existingEntity == null ? "New Account" : "Manage Account", new String[] { OK, CANCEL }); - + this.existingEntity = existingEntity; - + setMinimumSize(new Dimension(240, 32)); layoutGui(); - refreshState(); + refreshState(); } public String getUserName() { @@ -69,7 +69,7 @@ public class UserEditDialog extends ButtonDialog { } public String getBio() { - return bio; + return bio.replace("\n", "
"); } @Override @@ -148,7 +148,8 @@ public class UserEditDialog extends ButtonDialog { this.bio = getBioArea().getText(); JButton okButton = getButton(OK); okButton.setEnabled((this.userName.length() > 0) - && (this.password != null) && (this.password.length() > 0)); + && (this.existingEntity != null || ((this.password != null) && (this.password + .length() > 0)))); } private JTextField getUserNameField() { @@ -288,7 +289,7 @@ public class UserEditDialog extends ButtonDialog { if (bioArea == null) { bioArea = new JTextArea(); if (existingEntity != null) - bioArea.setText(existingEntity.getBio()); + bioArea.setText(existingEntity.getBio().replace("
", "\n")); bioArea.setFont(getUserNameField().getFont()); bioArea.setBorder(getUserNameField().getBorder()); bioArea.setPreferredSize(new Dimension(192, 69));