summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2019-02-27 16:18:49 +0100
committerSimon Rettberg2019-02-27 16:18:49 +0100
commitce52e7c1a31763a4302afd4f0d7a8c1fc66bb915 (patch)
treeb8b4070a68603553f03d3ff5185f338d84330a45
parent[server] Support loading/saving preset network rules (diff)
downloadtutor-module-ce52e7c1a31763a4302afd4f0d7a8c1fc66bb915.tar.gz
tutor-module-ce52e7c1a31763a4302afd4f0d7a8c1fc66bb915.tar.xz
tutor-module-ce52e7c1a31763a4302afd4f0d7a8c1fc66bb915.zip
[client] Implement assigning prefefined netrules to lecture
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/NetrulesConfigurator.java152
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LectureDetailsWindow.java10
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/thrift/cache/MetaDataCache.java12
3 files changed, 158 insertions, 16 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/NetrulesConfigurator.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/NetrulesConfigurator.java
index 5d14f3fc..a424acc9 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/NetrulesConfigurator.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/NetrulesConfigurator.java
@@ -1,17 +1,27 @@
package org.openslx.dozmod.gui.configurator;
import java.awt.Color;
+import java.awt.Dialog.ModalityType;
+import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.atomic.AtomicReference;
import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.ButtonModel;
import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
@@ -27,27 +37,63 @@ import javax.swing.text.TabSet;
import javax.swing.text.TabStop;
import org.apache.log4j.Logger;
+import org.openslx.bwlp.thrift.iface.LectureRead;
import org.openslx.bwlp.thrift.iface.NetDirection;
import org.openslx.bwlp.thrift.iface.NetRule;
+import org.openslx.bwlp.thrift.iface.PresetNetRule;
import org.openslx.dozmod.gui.Gui;
import org.openslx.dozmod.gui.changemonitor.GenericControlWindow;
+import org.openslx.dozmod.gui.configurator.NetrulesConfigurator.StateWrapper;
import org.openslx.dozmod.gui.control.WordWrapLabel;
import org.openslx.dozmod.gui.helper.GridManager;
import org.openslx.dozmod.gui.helper.MessageType;
import org.openslx.dozmod.gui.helper.TextChangeListener;
+import org.openslx.dozmod.thrift.cache.MetaDataCache;
+import org.openslx.util.QuickTimer;
+import org.openslx.util.QuickTimer.Task;
import org.openslx.util.Util;
/**
* Widget for netrules configuration of lectures
*/
-public class NetrulesConfigurator extends NetrulesConfiguratorLayout implements GenericControlWindow<List<NetRule>> {
+public class NetrulesConfigurator extends NetrulesConfiguratorLayout implements GenericControlWindow<StateWrapper> {
+
+ public static class StateWrapper {
+ public List<NetRule> customRules;
+ public List<Integer> selectedPresets;
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof StateWrapper))
+ return false;
+ StateWrapper o = (StateWrapper) obj;
+ if (selectedPresets != null && !selectedPresets.equals(o.selectedPresets))
+ return false;
+ if (customRules == o.customRules)
+ return true;
+ return customRules != null && customRules.equals(o.customRules);
+ }
+ @Override
+ protected StateWrapper clone()
+ {
+ StateWrapper r = new StateWrapper();
+ if (this.customRules != null) {
+ r.customRules = new ArrayList<>(this.customRules);
+ }
+ if (this.selectedPresets != null) {
+ r.selectedPresets = new ArrayList<>(this.selectedPresets);
+ }
+ return r;
+ }
+ }
private static final long serialVersionUID = -3497629601818983994L;
private final static Logger LOGGER = Logger.getLogger(NetrulesConfigurator.class);
private boolean checkChange = false;
- private List<NetRule> currentState;
+ private StateWrapper currentState = new StateWrapper();
+ private LectureRead lecture;
private List<ChangeListener> listeners;
+ private List<PresetNetRule> predefinedRules;
/**
* Character defining how the rules are parsed, e.g. for whitespace \\s
@@ -121,6 +167,87 @@ public class NetrulesConfigurator extends NetrulesConfiguratorLayout implements
getState(false);
}
});
+ QuickTimer.scheduleOnce(new Task() {
+ @Override
+ public void fire() {
+ predefinedRules = MetaDataCache.getPredefinedNetRules();
+ if (predefinedRules.isEmpty()) {
+ Gui.asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ btnShowPresets.setVisible(false);
+ }
+ });
+ }
+ }
+ });
+ btnShowPresets.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ showPresetSelector();
+ }
+ });
+ }
+
+ private void showPresetSelector() {
+ if (predefinedRules == null) {
+ Gui.showMessageBox("Wah wah wah! Null preset list", MessageType.ERROR, null, null);
+ return;
+ }
+ final JDialog dialog = new JDialog(SwingUtilities.getWindowAncestor(this),
+ "Regelsets auswählen", ModalityType.APPLICATION_MODAL);
+ JPanel pane = new JPanel();
+ dialog.setContentPane(pane);
+ dialog.setMinimumSize(Gui.getScaledDimension(200, 300));
+ GridManager grid = new GridManager(pane, 2, true, new Insets(2, 2, 2, 2));
+ final Map<ButtonModel, Integer> mapper = new HashMap<>();
+ for (PresetNetRule ruleSet : predefinedRules) {
+ JCheckBox button = new JCheckBox(ruleSet.displayName);
+ grid.add(button, 2);
+ grid.nextRow();
+ mapper.put(button.getModel(), ruleSet.ruleId);
+ if (lecture != null && lecture.presetNetworkExceptionIds != null && lecture.presetNetworkExceptionIds.contains(ruleSet.ruleId)) {
+ button.setSelected(true);
+ }
+ }
+ grid.add(Box.createVerticalGlue(), 2);
+ grid.nextRow();
+ JButton btnCancel = new JButton("Abbrechen");
+ JButton btnOk = new JButton("SPASCHAN");
+ grid.add(btnCancel).anchor(GridBagConstraints.LINE_START);
+ grid.add(btnOk).anchor(GridBagConstraints.LINE_END);
+ grid.finish(false);
+ btnCancel.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ dialog.dispose();
+ }
+ });
+ final AtomicReference<List<Integer>> selectedRules = new AtomicReference<>();
+ btnOk.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ List<Integer> selected = new ArrayList<>();
+ for (Entry<ButtonModel, Integer> button : mapper.entrySet()) {
+ if (button.getKey().isSelected()) {
+ selected.add(button.getValue());
+ }
+ }
+ selectedRules.set(selected);
+ dialog.dispose();
+ }
+ });
+ dialog.pack();
+ Gui.centerShellOverShell(SwingUtilities.getWindowAncestor(this), dialog);
+ dialog.setVisible(true);
+ // Call blocks as it's a modal window
+ if (selectedRules.get() != null) {
+ // User clicked OK
+ lecture.presetNetworkExceptionIds = currentState.selectedPresets = selectedRules.get();
+ // TODO: Make it work
+ checkChange = true;
+ fireChangeEvent();
+ }
}
/**
@@ -130,15 +257,15 @@ public class NetrulesConfigurator extends NetrulesConfiguratorLayout implements
* @return the list of rules as parsed by parseNetRules()
*/
@Override
- public List<NetRule> getState() {
+ public StateWrapper getState() {
return getState(true);
}
- public List<NetRule> getState(boolean silent) {
+ public StateWrapper getState(boolean silent) {
if (checkChange || !silent) {
- currentState = parseNetRules(silent);
+ currentState.customRules = parseNetRules(silent);
}
- return currentState;
+ return currentState.clone();
}
@Override
@@ -161,13 +288,13 @@ public class NetrulesConfigurator extends NetrulesConfiguratorLayout implements
* Sets the state of this widget to the given list of netrules. This will
* internally transform the list to its string representation
*
- * @param netrules
+ * @param lecture
* as a list of NetRule to set the state to
*/
- public void setState(final List<NetRule> netrules) {
+ public void setState(final LectureRead lecture) {
checkChange = true;
- currentState = netrules;
- this.tpNetworkRules.setText(decodeNetRulesToText(netrules));
+ this.lecture = lecture;
+ this.tpNetworkRules.setText(decodeNetRulesToText(lecture.networkExceptions));
fireChangeEvent();
}
@@ -437,6 +564,7 @@ class NetrulesConfiguratorLayout extends JPanel {
protected final JTextPane tpNetworkRules;
protected final JButton btnCheckRules;
+ protected final JButton btnShowPresets;
public NetrulesConfiguratorLayout() {
@@ -465,6 +593,10 @@ class NetrulesConfiguratorLayout extends JPanel {
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), 2)
.fill(true, true).expand(true, true);
grid.nextRow();
+
+ btnShowPresets = new JButton("Vordefinierte Regelsets...");
+ grid.add(btnShowPresets, 2).anchor(GridBagConstraints.LINE_END);
+ grid.nextRow();
grid.finish(false);
}
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 fc1c375e..a88bef22 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
@@ -30,7 +30,6 @@ import org.openslx.bwlp.thrift.iface.ImageVersionDetails;
import org.openslx.bwlp.thrift.iface.LecturePermissions;
import org.openslx.bwlp.thrift.iface.LectureRead;
import org.openslx.bwlp.thrift.iface.LectureWrite;
-import org.openslx.bwlp.thrift.iface.NetRule;
import org.openslx.bwlp.thrift.iface.UserInfo;
import org.openslx.dozmod.gui.Gui;
import org.openslx.dozmod.gui.MainWindow;
@@ -39,6 +38,7 @@ import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor;
import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor.NotNullConstraint;
import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor.TextNotEmptyConstraint;
import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor.ValidationConstraint;
+import org.openslx.dozmod.gui.configurator.NetrulesConfigurator.StateWrapper;
import org.openslx.dozmod.gui.configurator.StartupConfigurator.StartupSettings;
import org.openslx.dozmod.gui.helper.DateTimeHelper;
import org.openslx.dozmod.gui.helper.MessageType;
@@ -181,7 +181,7 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements
changeMonitor.add(dtpStartDate).addConstraint(dateRangeValidator);
changeMonitor.add(spnEndTime).addConstraint(dateRangeValidator);
changeMonitor.add(spnStartTime).addConstraint(dateRangeValidator);
- changeMonitor.add(ctlNetrulesConfigurator).addConstraint(new NotNullConstraint<List<NetRule>>("Fehlerhafte Netzwerkregeln"));
+ changeMonitor.add(ctlNetrulesConfigurator).addConstraint(new NotNullConstraint<StateWrapper>("Fehlerhafte Netzwerkregeln"));
changeListenerPermissions = changeMonitor.add(ctlPermissionManager);
ctlLocationSelector.addToChangeMonitor(changeMonitor);
ctlRunscriptConfigurator.addToChangeMonitor(changeMonitor);
@@ -347,7 +347,7 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements
ctlRunscriptConfigurator.setState(lecture);
ctlNetshareConfigurator.setState(lecture.networkShares, lecture.presetNetworkShares);
ctlLdapFilterConfigurator.setState(lecture.ldapFilters, lecture.presetLdapFilters);
- ctlNetrulesConfigurator.setState(lecture.networkExceptions);
+ ctlNetrulesConfigurator.setState(lecture);
txtTitle.setText(lecture.getLectureName());
lblTitleInfo.setText(lecture.getLectureName());
@@ -537,7 +537,9 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout implements
ctlLocationSelector.getOnlyInSelection(),
// TODO limitOnlyToAllowedUsers, default to false for now
false, chkHasUsbAccess.isSelected());
- metadata.setNetworkExceptions(ctlNetrulesConfigurator.getState());
+ StateWrapper netrules = ctlNetrulesConfigurator.getState();
+ metadata.setNetworkExceptions(netrules.customRules);
+ metadata.setPresetNetworkExceptionIds(netrules.selectedPresets);
metadata.setNetworkShares(ctlNetshareConfigurator.getState());
metadata.setLdapFilters(ctlLdapFilterConfigurator.getState());
metadata.setPresetScriptIds(startupSettings.selectedScripts);
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/thrift/cache/MetaDataCache.java b/dozentenmodul/src/main/java/org/openslx/dozmod/thrift/cache/MetaDataCache.java
index 8b6e4890..7b6cbe25 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/thrift/cache/MetaDataCache.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/thrift/cache/MetaDataCache.java
@@ -11,6 +11,7 @@ import org.openslx.bwlp.thrift.iface.Location;
import org.openslx.bwlp.thrift.iface.NetShare;
import org.openslx.bwlp.thrift.iface.OperatingSystem;
import org.openslx.bwlp.thrift.iface.PredefinedData;
+import org.openslx.bwlp.thrift.iface.PresetNetRule;
import org.openslx.bwlp.thrift.iface.PresetRunScript;
import org.openslx.bwlp.thrift.iface.Virtualizer;
import org.openslx.dozmod.thrift.Session;
@@ -214,17 +215,24 @@ public class MetaDataCache {
public static List<NetShare> getPredefinedNetshares() {
PredefinedData pd = predefinedData.get();
- if (pd == null || pd.ldapFilter == null)
+ if (pd == null || pd.netShares == null)
return new ArrayList<NetShare>(0);
return pd.netShares;
}
public static List<PresetRunScript> getPredefinedRunScripts() {
PredefinedData pd = predefinedData.get();
- if (pd == null || pd.ldapFilter == null)
+ if (pd == null || pd.runScripts == null)
return new ArrayList<PresetRunScript>(0);
return pd.runScripts;
}
+
+ public static List<PresetNetRule> getPredefinedNetRules() {
+ PredefinedData pd = predefinedData.get();
+ if (pd == null || pd.networkExceptions == null)
+ return new ArrayList<PresetNetRule>(0);
+ return pd.networkExceptions;
+ }