summaryrefslogtreecommitdiffstats
path: root/dozentenmodul/src/main/java
diff options
context:
space:
mode:
authorJonathan Bauer2015-09-11 18:25:38 +0200
committerJonathan Bauer2015-09-11 18:25:38 +0200
commitdb0cd92c5dd0b87c160f6b48370ce1f26896a5f6 (patch)
tree05604920e5026c255cb3fdbea93a48ad0222ae6f /dozentenmodul/src/main/java
parent[client] return a bool for success in UpdatePermissions for Images (diff)
downloadtutor-module-db0cd92c5dd0b87c160f6b48370ce1f26896a5f6.tar.gz
tutor-module-db0cd92c5dd0b87c160f6b48370ce1f26896a5f6.tar.xz
tutor-module-db0cd92c5dd0b87c160f6b48370ce1f26896a5f6.zip
[client] Image/Lectures: only push metadata/permissions if they were changed
Diffstat (limited to 'dozentenmodul/src/main/java')
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/ImageCustomPermissionManager.java4
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/LectureCustomPermissionManager.java12
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageDetailsWindow.java126
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImagePermissionWindow.java24
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LectureDetailsWindow.java172
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LecturePermissionWindow.java58
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LecturePermissionWindowLayout.java4
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageCustomPermissionPage.java2
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/LectureCustomPermissionPage.java2
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/permissions/PermsHelper.java39
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/util/MapHelper.java41
11 files changed, 275 insertions, 209 deletions
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<String, ImagePermissions> permissionMap, final ImagePermissions defaultPermissions, String ownerId){
this.ownerId = ownerId;
this.newPermissionMap = permissionMap == null ? new HashMap<String, ImagePermissions>() : permissionMap;
- permissionList.clear();
this.defaultPermissions = defaultPermissions;
+ permissionList.clear();
for (Entry<String, ImagePermissions> 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<String, ImagePermissions> getMap(){
+ public Map<String, ImagePermissions> 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<String, LecturePermissions> permissionMap, final LecturePermissions defaultPermissions, String ownerId){
this.ownerId = ownerId;
this.newPermissionMap = permissionMap == null ? new HashMap<String, LecturePermissions>() : permissionMap;
- permissionList.clear();
this.defaultPermissions = defaultPermissions;
+
+ permissionList.clear();
for (Entry<String, LecturePermissions> 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<String, LecturePermissions> getMap(){
+ public Map<String, LecturePermissions> 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<ImagePermissions> 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<OperatingSystem> 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<ImagePermissions> runAndReturn() {
+ private void run() {
setVisible(true);
- if (okUsed) {
- return new DefaultCustomPerms<ImagePermissions>(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<ImagePermissions> open(Window modalParent,
- Map<String, ImagePermissions> permissionMap, ImagePermissions defaultPermissions,
- String ownerId) {
- return new ImagePermissionWindow(modalParent, permissionMap, defaultPermissions, ownerId)
- .runAndReturn();
+ public static void open(Window modalParent, Map<String, ImagePermissions> 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<String, LecturePermissions> permissionMap;
+ private Map<String, LecturePermissions> customPermissions;
/**
- * Image, that the lecture is linked to.
+ * The original custom permissions as fetched from the server
*/
- private ImageDetailsRead image = null;
+ private Map<String, LecturePermissions> 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<LecturePermissions> 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<String, LecturePermissions>();
+ else
+ originalCustomPermissions.clear();
+ // fill it
+ for (Entry<String, LecturePermissions> 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<String, LecturePermissions> permissionMap, final LecturePermissions defaultPermissions, String ownerId) {
+ protected LecturePermissionWindow(final Window modalParent,
+ final Map<String, LecturePermissions> 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<LecturePermissions> runAndReturn(){
+ private void run() {
setVisible(true);
- if (okUsed){
- return new DefaultCustomPerms<LecturePermissions>(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<LecturePermissions> open(
- Window modalParent, Map<String, LecturePermissions> permissionMap, LecturePermissions defaultPermissions, String ownerId) {
- return new LecturePermissionWindow(modalParent, permissionMap, defaultPermissions, ownerId).runAndReturn();
+ public static void open(Window modalParent,
+ Map<String, LecturePermissions> 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<String, ImagePermissions> newPermissionMap= imageCustomPermissionManager.getMap();
+ Map<String, ImagePermissions> 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<String, LecturePermissions> newPermissionMap = lectureCustomPermissionManager.getMap();
+ Map<String, LecturePermissions> 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<String, ImagePermissions> oldMap, final Map<String, ImagePermissions> newMap) {
- // build list of users that were added, if any return true
- Set<String> addedUsers = new HashSet<String>(newMap.keySet());
- addedUsers.removeAll(oldMap.keySet());
- if (!addedUsers.isEmpty())
- return true;
- // build list of users that were removed, if any return true
- Set<String> removedUsers = new HashSet<String>(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<String, ImagePermissions> 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 <T> boolean hasChanged(final Map<String, T> oldMap, final Map<String, T> 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<String, T> 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 <T> Set<String> getAddedUsers(final Map<String, T> oldMap, final Map<String, T> newMap) {
+ Set<String> addedUsers = new HashSet<String>(newMap.keySet());
+ addedUsers.removeAll(oldMap.keySet());
+ return addedUsers;
+ }
+ private static <T> Set<String> getRemovedUsers(final Map<String, T> oldMap, final Map<String, T> newMap) {
+ Set<String> removedUsers = new HashSet<String>(oldMap.keySet());
+ removedUsers.removeAll(newMap.keySet());
+ return removedUsers;
+ }
+}