From db0cd92c5dd0b87c160f6b48370ce1f26896a5f6 Mon Sep 17 00:00:00 2001 From: Jonathan Bauer Date: Fri, 11 Sep 2015 18:25:38 +0200 Subject: [client] Image/Lectures: only push metadata/permissions if they were changed --- .../gui/control/ImageCustomPermissionManager.java | 4 +- .../control/LectureCustomPermissionManager.java | 12 +- .../dozmod/gui/window/ImageDetailsWindow.java | 126 +++++++++------ .../dozmod/gui/window/ImagePermissionWindow.java | 24 +-- .../dozmod/gui/window/LectureDetailsWindow.java | 172 +++++++++++++-------- .../dozmod/gui/window/LecturePermissionWindow.java | 58 +++---- .../layout/LecturePermissionWindowLayout.java | 4 +- .../gui/wizard/page/ImageCustomPermissionPage.java | 2 +- .../wizard/page/LectureCustomPermissionPage.java | 2 +- .../openslx/dozmod/permissions/PermsHelper.java | 39 ----- .../java/org/openslx/dozmod/util/MapHelper.java | 41 +++++ 11 files changed, 275 insertions(+), 209 deletions(-) delete mode 100644 dozentenmodul/src/main/java/org/openslx/dozmod/permissions/PermsHelper.java create mode 100644 dozentenmodul/src/main/java/org/openslx/dozmod/util/MapHelper.java (limited to 'dozentenmodul/src/main/java') diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/ImageCustomPermissionManager.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/ImageCustomPermissionManager.java index a0b170e5..070a2bad 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/ImageCustomPermissionManager.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/ImageCustomPermissionManager.java @@ -125,9 +125,9 @@ public class ImageCustomPermissionManager extends JPanel { public void initPanel(Map permissionMap, final ImagePermissions defaultPermissions, String ownerId){ this.ownerId = ownerId; this.newPermissionMap = permissionMap == null ? new HashMap() : permissionMap; - permissionList.clear(); this.defaultPermissions = defaultPermissions; + permissionList.clear(); for (Entry e : newPermissionMap.entrySet()) { permissionList.add(new UserImagePermissions(e.getKey(), e.getValue())); } @@ -151,7 +151,7 @@ public class ImageCustomPermissionManager extends JPanel { * Get map with the permissions set in the table of the manager. * @return Map with new custom permissions, null if something went wrong */ - public Map getMap(){ + public Map updatePermissionReferences(){ if (permissionList == null) return null; diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/LectureCustomPermissionManager.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/LectureCustomPermissionManager.java index 4925728e..870db6ad 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/LectureCustomPermissionManager.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/LectureCustomPermissionManager.java @@ -87,10 +87,8 @@ public class LectureCustomPermissionManager extends JPanel{ @Override public void actionPerformed(ActionEvent e) { UserListWindow.open(SwingUtilities.getWindowAncestor(me), new UserAddedCallback() { - @Override public void userAdded(final UserInfo newUser, UserListWindow window) { - // check if we have this user already for (UserLecturePermissions current : permissionList) { if (current.userId.equals(newUser.userId)) { @@ -100,7 +98,6 @@ public class LectureCustomPermissionManager extends JPanel{ } // add it to the list with default permissions permissionList.add(new UserLecturePermissions(newUser.userId, new LecturePermissions(defaultPermissions))); - LOGGER.debug("User added: " + newUser); permissionTable.setData(permissionList, false); } }, "Hinzufügen", ownerId); @@ -109,12 +106,10 @@ public class LectureCustomPermissionManager extends JPanel{ // delete user button listener btnRemoveUser.addActionListener(new ActionListener() { - @Override public void actionPerformed(ActionEvent e) { final UserLecturePermissions selected = permissionTable.getSelectedItem(); - LOGGER.debug("Removing: " + selected); - if (!permissionList.remove(selected)) { + if (selected != null && !permissionList.remove(selected)) { LOGGER.debug("Could not remove: " + selected); } permissionTable.setData(permissionList, false); @@ -131,8 +126,9 @@ public class LectureCustomPermissionManager extends JPanel{ public void initPanel(Map permissionMap, final LecturePermissions defaultPermissions, String ownerId){ this.ownerId = ownerId; this.newPermissionMap = permissionMap == null ? new HashMap() : permissionMap; - permissionList.clear(); this.defaultPermissions = defaultPermissions; + + permissionList.clear(); for (Entry e : newPermissionMap.entrySet()) { permissionList.add(new UserLecturePermissions(e.getKey(), e.getValue())); } @@ -144,7 +140,7 @@ public class LectureCustomPermissionManager extends JPanel{ * Get map with the permissions set in the table of the manager. * @return Map with new custom permissions, null if something went wrong */ - public Map getMap(){ + public Map updatePermissionReferences(){ if (permissionList == null) return null; diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageDetailsWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageDetailsWindow.java index 254b8767..a3255c57 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageDetailsWindow.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageDetailsWindow.java @@ -23,7 +23,6 @@ import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.apache.log4j.Logger; -import org.apache.thrift.TException; import org.openslx.bwlp.thrift.iface.ImageBaseWrite; import org.openslx.bwlp.thrift.iface.ImageDetailsRead; import org.openslx.bwlp.thrift.iface.ImagePermissions; @@ -42,9 +41,7 @@ import org.openslx.dozmod.gui.window.UserListWindow.UserAddedCallback; import org.openslx.dozmod.gui.window.layout.ImageDetailsWindowLayout; import org.openslx.dozmod.gui.wizard.ImageUpdateWizard; import org.openslx.dozmod.gui.wizard.LectureWizard; -import org.openslx.dozmod.permissions.DefaultCustomPerms; import org.openslx.dozmod.permissions.ImagePerms; -import org.openslx.dozmod.permissions.PermsHelper; import org.openslx.dozmod.thrift.Session; import org.openslx.dozmod.thrift.ThriftActions; import org.openslx.dozmod.thrift.ThriftActions.DeleteCallback; @@ -52,7 +49,7 @@ import org.openslx.dozmod.thrift.ThriftActions.ImageMetaCallback; import org.openslx.dozmod.thrift.cache.MetaDataCache; import org.openslx.dozmod.thrift.cache.UserCache; import org.openslx.dozmod.util.FormatHelper; -import org.openslx.thrifthelper.ThriftManager; +import org.openslx.dozmod.util.MapHelper; /** * Window for displaying and editing the details of an image. @@ -106,6 +103,9 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe private JMenuItem popupItemDownload = new JMenuItem("Download"); private JMenuItem popupItemDelete = new JMenuItem("Löschen"); + private boolean metadataChanged = false; + private boolean permissionsChanged = false; + /** * Constructor * @@ -166,11 +166,10 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe @Override public void actionPerformed(ActionEvent arg0) { // open the custom permission window and save returned default/custom permissions - DefaultCustomPerms combined = ImagePermissionWindow.open(me, - customPermissions, image.defaultPermissions, image.ownerId); - // since the window above gets references of the default/custom permission object - // there is no need to further save the return value ... - // THAT or we do work with copies in ImagePermissionWindow ... + ImagePermissionWindow.open(me, customPermissions, image.defaultPermissions, image.ownerId); + // since the window above gets references of the default/custom permission object + // there is no need to further save the return value ... + // THAT or we do work with copies in ImagePermissionWindow ... // for now let's stay with refs and just reactToChange() where we check if // the permissions stuff changed since the last call of fill() @@ -241,17 +240,7 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe versionTableScrollPane.addMouseListener(ma); versionTable.addMouseListener(ma); - /** - * Initial state of GUI elements - */ - setFocusable(true); - btnSaveChanges.setEnabled(false); - txtVersion.setEditable(false); - txtId.setEditable(false); - chkIsTemplate.setEnabled(Session.isSuperUser()); - makeEditable(false); - // TODO finish ShareMode in server - cboShareMode.setEnabled(false); + // listen to changes final DocumentListener docListener = new DocumentListener() { @@ -290,6 +279,18 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe cboOperatingSystem.addItemListener(comboItemListener); cboShareMode.addItemListener(comboItemListener); chkIsTemplate.addActionListener(checkBoxListener); + + /** + * Initial state of GUI elements + */ + setFocusable(true); + btnSaveChanges.setEnabled(false); + txtVersion.setEditable(false); + txtId.setEditable(false); + chkIsTemplate.setEnabled(Session.isSuperUser()); + makeEditable(false); + // TODO finish ShareMode in server + cboShareMode.setEnabled(false); } /******************************************************************************** @@ -325,7 +326,7 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe customPermissions = permissions; } - fill(); + fillDetails(); } }; ThriftActions.getImageFullDetails(JOptionPane.getFrameForComponent(me), imageBaseId, callback); @@ -348,9 +349,28 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe } /** - * Pushes the changes of the image details to the satellite + * Called by the "Save" button, tries to save the changes internally and + * then react based depending on the outcome of the save */ private void saveChanges() { + boolean saved = saveChangesInternal(); + // if there was nothing to save, saved would be true from the above call + // however we wouldn't even get to saving if nothing was changed, so its fine + if (saved) { + callback.updated(); + dispose(); + } else { + btnSaveChanges.setEnabled(true); + } + + } + + /** + * Helper to only save the changes, nothing else. Updating GUI elements is done by saveChanges() + * + * @return false if any try to save changes failed, true otherwise + */ + private boolean saveChangesInternal() { // first build the ImageBaseWrite from the GUI fields final ImageBaseWrite ibw = new ImageBaseWrite(txtTitle.getText(), txtDescription.getText(), cboOperatingSystem.getItemAt(cboOperatingSystem.getSelectedIndex()).osId, image.virtId, @@ -359,21 +379,25 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe image.defaultPermissions.edit, image.defaultPermissions.admin), cboShareMode.getItemAt(cboShareMode.getSelectedIndex())); // now trigger the actual action - if (!ThriftActions.updateImageBase(JOptionPane.getFrameForComponent(me), image.getImageBaseId(), ibw)) - return; - if (PermsHelper.hasChanged(originalCustomPermissions, customPermissions)) { - try { - ThriftManager.getSatClient().writeImagePermissions(Session.getSatelliteToken(), - image.imageBaseId, customPermissions); - } catch (TException e) { - LOGGER.error("Fehler beim Übertragen der benutzerspezifischen Berechtigungen: ", e); + if (metadataChanged) { + if (ThriftActions.updateImageBase(JOptionPane.getFrameForComponent(me), image.getImageBaseId(), + ibw)) { + LOGGER.info("Successfully saved new metadata"); + metadataChanged = false; + } else { + return false; } } - // success - LOGGER.info("Successfully saved changes to satellite."); - btnSaveChanges.setEnabled(false); - callback.updated(); - dispose(); + if (permissionsChanged) { + if (ThriftActions.writeImagePermissions(JOptionPane.getFrameForComponent(me), + image.getImageBaseId(), customPermissions)) { + LOGGER.info("Successfully saved new permissions"); + permissionsChanged = false; + } else { + return false; + } + } + return true; } /** @@ -426,7 +450,7 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe /** * callback function when we received the image's details from the server */ - private void fill() { + private void fillDetails() { if (image == null) return; // remember default permissions @@ -453,8 +477,9 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe lblUpdateTime.setText(FormatHelper.longDate(image.getUpdateTime())); txtVersion.setText(image.getLatestVersionId()); txtId.setText(image.getImageBaseId()); + chkIsTemplate.setSelected(image.isTemplate); setTitle(image.getImageName()); - + // fill os combo, but only once :) if (cboOperatingSystem.getItemCount() == 0) { List osList = MetaDataCache.getOperatingSystems(); @@ -487,7 +512,6 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe tagsString = tagsString + ", " + tag; } txtTags.setText(tagsString); - chkIsTemplate.setSelected(image.isTemplate); // set the versions of the image to the table versionTable.setData(image.getVersions(), true); @@ -502,9 +526,15 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe * enables the save button if so * TODO TAGS */ - private boolean reactToChange() { - // disable save by default here, we will enable it at the end if all checks passed - btnSaveChanges.setEnabled(false); + private void reactToChange() { + metadataChanged = reactToChangeInternal(); + permissionsChanged = MapHelper.hasChanged(originalCustomPermissions, customPermissions); + btnSaveChanges.setEnabled(metadataChanged || permissionsChanged); + } + + private boolean reactToChangeInternal() { + if (image == null) + return false; boolean changed = false; // Image name if (txtTitle.getText().isEmpty()) { @@ -530,17 +560,17 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe lblError.setText("Kein Share-Modus ausgewählt!"); return false; } + // mandatory checks done, remove error message + lblError.setText(null); + // Template, default permissions and custom permissions: // no sanity checks here only check if they changed changed = !txtTitle.getText().equals(image.getImageName()) || !txtDescription.getText().equals(image.getDescription()) || newOs.getOsId() != image.getOsId() || !newShareMode.equals(image.shareMode) || chkIsTemplate.isSelected() != image.isTemplate - || !image.defaultPermissions.equals(originalDefaultPermissions) - || PermsHelper.hasChanged(originalCustomPermissions, customPermissions); + || !image.defaultPermissions.equals(originalDefaultPermissions); - lblError.setText(null); - btnSaveChanges.setEnabled(changed); return changed; } @@ -596,7 +626,7 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe ********************************************************************************/ @Override public boolean wantConfirmQuit() { - return reactToChange() && btnSaveChanges.isEnabled(); + return metadataChanged || permissionsChanged ; } @Override @@ -609,9 +639,9 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe * confirmation if so */ private void safeClose() { - if (reactToChange() + if ((metadataChanged || permissionsChanged) && !Gui.showMessageBox(me, "Änderungen werden verworfen, wollen Sie wirklich abbrechen?", - MessageType.QUESTION_YESNO, LOGGER, null)) + MessageType.QUESTION_YESNO, null, null)) return; dispose(); } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImagePermissionWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImagePermissionWindow.java index e2c0565b..9147ef83 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImagePermissionWindow.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImagePermissionWindow.java @@ -69,20 +69,14 @@ public class ImagePermissionWindow extends ImagePermissionWindowLayout implement * @return PermissionDefaultToCustomLink with default- and customPermissions * when using OK button, null otherwise */ - private DefaultCustomPerms runAndReturn() { + private void run() { setVisible(true); - if (okUsed) { - return new DefaultCustomPerms(imagePermissionManager.getMap(), - new ImagePermissions(chkCustomPermLink.isSelected(), chkCustomPermDownload.isSelected(), - chkCustomPermEdit.isSelected(), chkCustomPermAdmin.isSelected())); - } else { - return null; - } + if (okUsed) + imagePermissionManager.updatePermissionReferences(); } /** - * Creates a new ImageCustomPermissionWindow dialog and returns the - * resulting Permissions + * Creates a new ImageCustomPermissionWindow dialog * * @param modalParent * parent window of this dialog @@ -93,14 +87,10 @@ public class ImagePermissionWindow extends ImagePermissionWindowLayout implement * The current default permissions, should not be null! * @param ownerId * The id of the user to exclude when adding users. Can be null. - * @return PermissionDefaultToCustomLink with resulting permissions or null, - * if abort has been used to exit the dialog */ - public static DefaultCustomPerms open(Window modalParent, - Map permissionMap, ImagePermissions defaultPermissions, - String ownerId) { - return new ImagePermissionWindow(modalParent, permissionMap, defaultPermissions, ownerId) - .runAndReturn(); + public static void open(Window modalParent, Map permissionMap, + ImagePermissions defaultPermissions, String ownerId) { + new ImagePermissionWindow(modalParent, permissionMap, defaultPermissions, ownerId).run(); } @Override diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LectureDetailsWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LectureDetailsWindow.java index 0fc05ee8..17316387 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LectureDetailsWindow.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LectureDetailsWindow.java @@ -13,9 +13,11 @@ import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.Date; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import javax.swing.DefaultComboBoxModel; import javax.swing.JFrame; @@ -41,7 +43,6 @@ import org.openslx.dozmod.gui.helper.MessageType; import org.openslx.dozmod.gui.helper.UiFeedback; import org.openslx.dozmod.gui.window.UserListWindow.UserAddedCallback; import org.openslx.dozmod.gui.window.layout.LectureDetailsWindowLayout; -import org.openslx.dozmod.permissions.DefaultCustomPerms; import org.openslx.dozmod.permissions.ImagePerms; import org.openslx.dozmod.permissions.LecturePerms; import org.openslx.dozmod.thrift.Session; @@ -51,6 +52,7 @@ import org.openslx.dozmod.thrift.ThriftActions.LectureMetaCallback; import org.openslx.dozmod.thrift.ThriftError; import org.openslx.dozmod.thrift.cache.UserCache; import org.openslx.dozmod.util.FormatHelper; +import org.openslx.dozmod.util.MapHelper; import org.openslx.thrifthelper.ThriftManager; /** @@ -86,20 +88,28 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements /** * The custom permissions of the lecture */ - private Map permissionMap; + private Map customPermissions; /** - * Image, that the lecture is linked to. + * The original custom permissions as fetched from the server */ - private ImageDetailsRead image = null; + private Map originalCustomPermissions; /** - * Whether the custom permission window has been used. + * The original default permissions as fetched from the server + */ + private LecturePermissions originalDefaultPermissions; + /** + * Image, that the lecture is linked to. */ - private boolean permissionsChanged = false; + private ImageDetailsRead image = null; private boolean imageLinkChanged = false; + private boolean metadataChanged = false; + + private boolean permissionsChanged; + /** * Constructor * @@ -144,7 +154,7 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements btnClose.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - if (reactToChange() && !Gui.showMessageBox(me, + if (metadataChanged && !Gui.showMessageBox(me, "Änderungen werden verworfen, wollen Sie wirklich abbrechen?", MessageType.QUESTION_YESNO, LOGGER, null)) return; @@ -182,15 +192,11 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements btnPermissions.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { - LOGGER.info(permissionMap); - LOGGER.info(lecture.defaultPermissions); - DefaultCustomPerms pl = LecturePermissionWindow.open(me, permissionMap, - lecture.defaultPermissions, lecture.ownerId); - if (pl != null && pl.defaultPermissions != null && pl.customPermissions != null) { - lecture.defaultPermissions = pl.defaultPermissions; - permissionMap = pl.customPermissions; - permissionsChanged = true; - } + // NOTE once the following window is closed, customPermissions and lecture.defaultPermissions + // objects will contain the changes the user did. We will later only compare these with + // the original values as saved in originalCustomPermissions and originalDefaultPermissions + LecturePermissionWindow.open(me, customPermissions, lecture.defaultPermissions, + lecture.ownerId); reactToChange(); } }); @@ -263,8 +269,10 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements } /** - * Sets the lecture to show the details of by setting the 'lecture' and 'image' - * members to its metadata. This method will fetch the information from the sat + * Sets the lecture to show the details of by setting the 'lecture' and + * 'image' + * members to its metadata. This method will fetch the information from the + * sat * * @param lectureId the id of the lecture to be displayed */ @@ -278,11 +286,11 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements lecture = lectureDetails; image = imageDetails; if (lecture != null) { - permissionMap = ThriftActions.getLecturePermissions( + customPermissions = ThriftActions.getLecturePermissions( JOptionPane.getFrameForComponent(me), lecture.lectureId); } } - fill(); + fillDetails(); } }); } @@ -290,7 +298,7 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements /** * callback function when we received the lecture's details from the server */ - private void fill() { + private void fillDetails() { if (lecture == null) { txtTitle.setText("-"); makeEditable(false); @@ -301,6 +309,22 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements } else { txtImageName.setText(image.getImageName()); } + // remember default permissions + if (lecture.defaultPermissions != null) { + originalDefaultPermissions = new LecturePermissions(lecture.defaultPermissions); + } + // remember custom permissions + if (customPermissions != null) { + // need a deep copy of the permission map to be able to check for changes after ImageCustomPermissionWindow + if (originalCustomPermissions == null) + originalCustomPermissions = new HashMap(); + else + originalCustomPermissions.clear(); + // fill it + for (Entry entry : customPermissions.entrySet()) { + originalCustomPermissions.put(entry.getKey(), new LecturePermissions(entry.getValue())); + } + } txtTitle.setText(lecture.getLectureName()); txtDescription.setText(lecture.getDescription()); lblOwner.setUser(UserCache.find(lecture.getOwnerId())); @@ -436,47 +460,56 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements * Push the changes of the image details to the satellite */ private void saveChanges() { + boolean saved = saveChangesInternal(); + callback.updated(saved); + if (saved) + dispose(); + else + btnSaveChanges.setEnabled(true); + } + + private boolean saveChangesInternal() { // check, whether autoupdate is selected and choose version accordingly if (image != null) { lecture.imageVersionId = chkAutoUpdate.isSelected() ? image.latestVersionId : cboVersions.getItemAt(cboVersions.getSelectedIndex()).versionId; } - - // date valid TODO sat max time - if (!isPeriodValid(DateTimeHelper.getDateFrom(startDate, startTime), - DateTimeHelper.getDateFrom(endDate, endTime), true)) { - return; - } - // first build the ImageBaseWrite from the GUI fields - final LectureWrite lectureWrite = new LectureWrite(txtTitle.getText(), txtDescription.getText(), - lecture.getImageVersionId(), chkAutoUpdate.isSelected(), chkIsActive.isSelected(), - DateTimeHelper.getDateFrom(startDate, startTime).getTime() / 1000L, - DateTimeHelper.getDateFrom(endDate, endTime).getTime() / 1000L, null, null, - chkIsExam.isSelected(), chkHasInternetAccess.isSelected(), lecture.getDefaultPermissions()); - // now trigger the actual action - btnSaveChanges.setEnabled(false); - try { - ThriftManager.getSatClient().updateLecture(Session.getSatelliteToken(), lecture.getLectureId(), - lectureWrite); - } catch (TException e) { - ThriftError.showMessage(JOptionPane.getFrameForComponent(this), LOGGER, e, - "Fehler beim Updaten der Veranstaltung"); - callback.updated(true); - return; + // now check if we need to push a new LectureWrite + if (metadataChanged) { + // first build the LectureWrite from the GUI fields + final LectureWrite metadata = new LectureWrite(txtTitle.getText(), txtDescription.getText(), + lecture.getImageVersionId(), chkAutoUpdate.isSelected(), chkIsActive.isSelected(), + DateTimeHelper.getDateFrom(startDate, startTime).getTime() / 1000L, + DateTimeHelper.getDateFrom(endDate, endTime).getTime() / 1000L, null, null, + chkIsExam.isSelected(), chkHasInternetAccess.isSelected(), + lecture.getDefaultPermissions()); + // now trigger the actual action + try { + ThriftManager.getSatClient().updateLecture(Session.getSatelliteToken(), + lecture.getLectureId(), metadata); + metadataChanged = false; + LOGGER.info("Successfully save new metadata"); + } catch (TException e) { + ThriftError.showMessage(JOptionPane.getFrameForComponent(this), LOGGER, e, + "Fehler beim Updaten der Veranstaltung!"); + callback.updated(false); + return false; + } } if (permissionsChanged) { try { ThriftManager.getSatClient().writeLecturePermissions(Session.getSatelliteToken(), - lecture.lectureId, permissionMap); + lecture.lectureId, customPermissions); permissionsChanged = false; + LOGGER.info("Successfully save new permissions"); } catch (TException e) { - LOGGER.error("Fehler beim Übertragen der Berechtigungen: ", e); + ThriftError.showMessage(JOptionPane.getFrameForComponent(this), LOGGER, e, + "Fehler beim Übertragen der Berechtigungen!"); + callback.updated(true); + return false; } } - btnSaveChanges.setEnabled(true); - callback.updated(true); - dispose(); - // success + return true; } /** @@ -518,12 +551,22 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements * Checks whether the user changed any fields of the image details and * enables the save button if so. */ - private boolean reactToChange() { + private void reactToChange() { + // check details fields + metadataChanged = reactToChangeInternal(); + permissionsChanged = MapHelper.hasChanged(originalCustomPermissions, customPermissions); + btnSaveChanges.setEnabled(metadataChanged || permissionsChanged); + } + + /** + * Checks whether the user changed any fields of the image details and + * enables the save button if so. + */ + private boolean reactToChangeInternal() { if (lecture == null) return false; - + boolean changed = false; - btnSaveChanges.setEnabled(false); // mandatory fields checks if (txtTitle.getText().isEmpty()) { lblError.setText("Kein Imagename!"); @@ -531,7 +574,7 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements } if (txtDescription.getText().isEmpty()) { lblError.setText("Keine Beschreibung!"); - return false; + return false; } // version checkbox changed? ImageVersionDetails currentVersion = cboVersions.getItemAt(cboVersions.getSelectedIndex()); @@ -544,24 +587,25 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements Date end = DateTimeHelper.getDateFrom(endDate, endTime); if (!isPeriodValid(start, end, false)) { lblError.setText("Ungültiger Zeitraum!"); - return false; + return false; } - // done with mandatory checks, now only check for changes - // there first remove error message + + // done with mandatory checks, remove error message lblError.setText(null); + + // check for changes in all fields changed = !txtTitle.getText().equals(lecture.getLectureName()) || !txtDescription.getText().equals(lecture.getDescription()) || !currentVersion.getVersionId().equals(lecture.getImageVersionId()) - || (start.getTime() / 1000L) != lecture.getStartTime() - || (end.getTime() / 1000L) != lecture.getEndTime() + || (DateTimeHelper.getDateFrom(startDate, startTime).getTime() / 1000L) != lecture + .getStartTime() + || (DateTimeHelper.getDateFrom(endDate, endTime).getTime() / 1000L) != lecture.getEndTime() || chkAutoUpdate.isSelected() != lecture.autoUpdate || chkIsExam.isSelected() != lecture.isExam || chkHasInternetAccess.isSelected() != lecture.hasInternetAccess || chkIsActive.isSelected() != lecture.isEnabled - || permissionsChanged - || imageLinkChanged; - - btnSaveChanges.setEnabled(changed); + || !lecture.defaultPermissions.equals(originalDefaultPermissions) || imageLinkChanged; + return changed; } @@ -619,7 +663,7 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements ********************************************************************************/ @Override public boolean wantConfirmQuit() { - return reactToChange(); + return metadataChanged || permissionsChanged; } @Override @@ -633,7 +677,7 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements * confirmation if so */ private void safeClose() { - if (reactToChange() + if ((metadataChanged || permissionsChanged) && !Gui.showMessageBox(me, "Änderungen werden verworfen, wollen Sie wirklich abbrechen?", MessageType.QUESTION_YESNO, null, null)) return; diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LecturePermissionWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LecturePermissionWindow.java index 693e2907..d91a75e6 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LecturePermissionWindow.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LecturePermissionWindow.java @@ -9,43 +9,45 @@ import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.LecturePermissions; import org.openslx.dozmod.gui.helper.UiFeedback; import org.openslx.dozmod.gui.window.layout.LecturePermissionWindowLayout; -import org.openslx.dozmod.permissions.DefaultCustomPerms; /** - * Window for modifying the custom permissions of an lecture. + * Window for modifying the custom permissions of an lecture. */ @SuppressWarnings("serial") public class LecturePermissionWindow extends LecturePermissionWindowLayout implements UiFeedback { private static final Logger LOGGER = Logger.getLogger(LecturePermissionWindow.class); - + private boolean okUsed = false; /** - * Don't use this constructor, use static function LectureCustomPermissionWindow.open instead. + * Don't use this constructor, use static function + * LectureCustomPermissionWindow.open instead. */ - protected LecturePermissionWindow(final Window modalParent, final Map permissionMap, final LecturePermissions defaultPermissions, String ownerId) { + protected LecturePermissionWindow(final Window modalParent, + final Map permissionMap, final LecturePermissions defaultPermissions, + String ownerId) { super(modalParent); /** - * initialise the lecturePermissionManager + * initialise the lecturePermissionManager */ lecturePermissionManager.initPanel(permissionMap, defaultPermissions, ownerId); - + chkCustomPermAdmin.setSelected(defaultPermissions.admin); chkCustomPermEdit.setSelected(defaultPermissions.edit); - - ActionListener updateDefaultPermissionListener = new ActionListener() { + ActionListener updateDefaultPermissionListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - lecturePermissionManager.updateDefaultPermissions(chkCustomPermAdmin.isSelected(), chkCustomPermEdit.isSelected()); + lecturePermissionManager.updateDefaultPermissions(chkCustomPermAdmin.isSelected(), + chkCustomPermEdit.isSelected()); } }; - + chkCustomPermAdmin.addActionListener(updateDefaultPermissionListener); chkCustomPermEdit.addActionListener(updateDefaultPermissionListener); - + /** * ActionListeners for the buttons. */ @@ -59,39 +61,41 @@ public class LecturePermissionWindow extends LecturePermissionWindowLayout imple btnClose.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { - dispose(); + dispose(); } }); } /** - * Set a created ImageCustomPermissionWindow visible and return resulting permissions + * Set a created ImageCustomPermissionWindow visible and return resulting + * permissions * - * @return PermissionDefaultToCustomLink with default- and customPermissions when using OK button, null otherwise + * @return PermissionDefaultToCustomLink with default- and customPermissions + * when using OK button, null otherwise */ - private DefaultCustomPerms runAndReturn(){ + private void run() { setVisible(true); - if (okUsed){ - return new DefaultCustomPerms(lecturePermissionManager.getMap(), new LecturePermissions(chkCustomPermEdit.isSelected(), chkCustomPermAdmin.isSelected())); - } else { - return null; - } + if (okUsed) + lecturePermissionManager.updatePermissionReferences(); } - /** * Create new LecturePermissionWindow dialog * * @param modalParent parentwindow of the popup window * @param permissionMap the permissions of the lecture * @param defaultPermissions default permissions of the lecture - * @param ownerId Id not to be shown in the list to add new users. Can be null. - * @return PermissionDefaultToCustomLink with new permissions of null, if abort button has been used + * @param ownerId Id not to be shown in the list to add new users. Can be + * null. + * @return PermissionDefaultToCustomLink with new permissions of null, if + * abort button has been used */ - public static DefaultCustomPerms open( - Window modalParent, Map permissionMap, LecturePermissions defaultPermissions, String ownerId) { - return new LecturePermissionWindow(modalParent, permissionMap, defaultPermissions, ownerId).runAndReturn(); + public static void open(Window modalParent, + Map permissionMap, LecturePermissions defaultPermissions, + String ownerId) { + new LecturePermissionWindow(modalParent, permissionMap, defaultPermissions, ownerId).run(); + } @Override diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LecturePermissionWindowLayout.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LecturePermissionWindowLayout.java index 83112be4..fe36e321 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LecturePermissionWindowLayout.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LecturePermissionWindowLayout.java @@ -59,10 +59,10 @@ public class LecturePermissionWindowLayout extends JDialog { // Panel with the default permissions JPanel defaultPermissionPane = new JPanel(); defaultPermissionPane.setBorder(BorderFactory.createTitledBorder( "Andere Nutzer")); - chkCustomPermAdmin = new JCheckBox("Admin"); chkCustomPermEdit = new JCheckBox("Bearbeiten"); - defaultPermissionPane.add(chkCustomPermAdmin); + chkCustomPermAdmin = new JCheckBox("Admin"); defaultPermissionPane.add(chkCustomPermEdit); + defaultPermissionPane.add(chkCustomPermAdmin); // Panel for the buttons at the bottom JPanel buttonPane = new JPanel(); diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageCustomPermissionPage.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageCustomPermissionPage.java index aa30746c..d3a165c6 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageCustomPermissionPage.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageCustomPermissionPage.java @@ -41,7 +41,7 @@ public class ImageCustomPermissionPage extends ImageCustomPermissionPageLayout { protected void onPageLeave() { LOGGER.debug("Saving permissions to state ..."); // save the table stuff to our upload wizard state - Map newPermissionMap= imageCustomPermissionManager.getMap(); + Map newPermissionMap= imageCustomPermissionManager.updatePermissionReferences(); if (newPermissionMap == null || newPermissionMap.isEmpty()) return; state.permissionMap = newPermissionMap; diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/LectureCustomPermissionPage.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/LectureCustomPermissionPage.java index 3683b44d..268baae7 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/LectureCustomPermissionPage.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/LectureCustomPermissionPage.java @@ -42,7 +42,7 @@ public class LectureCustomPermissionPage extends LectureCustomPermissionPageLayo protected boolean wantNextOrFinish() { LOGGER.debug("Saving permissions to state ..."); // save the table stuff to our upload wizard state - Map newPermissionMap = lectureCustomPermissionManager.getMap(); + Map newPermissionMap = lectureCustomPermissionManager.updatePermissionReferences(); if (newPermissionMap == null || newPermissionMap.isEmpty()){ return true; } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/permissions/PermsHelper.java b/dozentenmodul/src/main/java/org/openslx/dozmod/permissions/PermsHelper.java deleted file mode 100644 index d4a864dd..00000000 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/permissions/PermsHelper.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.openslx.dozmod.permissions; - -import java.util.HashSet; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import org.apache.log4j.Logger; -import org.openslx.bwlp.thrift.iface.ImagePermissions; - -public class PermsHelper { - - private static final Logger LOGGER = Logger.getLogger(PermsHelper.class); - - private PermsHelper() {} - - public static boolean hasChanged(final Map oldMap, final Map newMap) { - // build list of users that were added, if any return true - Set addedUsers = new HashSet(newMap.keySet()); - addedUsers.removeAll(oldMap.keySet()); - if (!addedUsers.isEmpty()) - return true; - // build list of users that were removed, if any return true - Set removedUsers = new HashSet(oldMap.keySet()); - removedUsers.removeAll(newMap.keySet()); - if (!removedUsers.isEmpty()) - return true; - // no changes in the users, lets check for changes in each users permissions - for (Entry entry : oldMap.entrySet()) { - ImagePermissions current = entry.getValue(); - ImagePermissions toCheck = newMap.get(entry.getKey()); - if (!current.equals(toCheck)) - return true; - } - // everything was the same if we are still here - return false; - } - -} diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/util/MapHelper.java b/dozentenmodul/src/main/java/org/openslx/dozmod/util/MapHelper.java new file mode 100644 index 00000000..e99b1aa6 --- /dev/null +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/util/MapHelper.java @@ -0,0 +1,41 @@ +package org.openslx.dozmod.util; + +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.apache.log4j.Logger; + +public class MapHelper { + + private static final Logger LOGGER = Logger.getLogger(MapHelper.class); + + private MapHelper() {} + + public static boolean hasChanged(final Map oldMap, final Map newMap) { + // build list of users that were added, if any return true + if (oldMap.size() != newMap.size()) + return true; + + // no changes in the users, lets check for changes in each users permissions + for (Entry entry : oldMap.entrySet()) { + T current = entry.getValue(); + T other = newMap.get(entry.getKey()); + if (!current.equals(other)) + return true; + } + // everything was the same if we are still here + return false; + } + private static Set getAddedUsers(final Map oldMap, final Map newMap) { + Set addedUsers = new HashSet(newMap.keySet()); + addedUsers.removeAll(oldMap.keySet()); + return addedUsers; + } + private static Set getRemovedUsers(final Map oldMap, final Map newMap) { + Set removedUsers = new HashSet(oldMap.keySet()); + removedUsers.removeAll(newMap.keySet()); + return removedUsers; + } +} -- cgit v1.2.3-55-g7522