From ce52e7c1a31763a4302afd4f0d7a8c1fc66bb915 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Wed, 27 Feb 2019 16:18:49 +0100 Subject: [client] Implement assigning prefefined netrules to lecture --- .../gui/configurator/NetrulesConfigurator.java | 152 +++++++++++++++++++-- .../dozmod/gui/window/LectureDetailsWindow.java | 10 +- .../openslx/dozmod/thrift/cache/MetaDataCache.java | 12 +- 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> { +public class NetrulesConfigurator extends NetrulesConfiguratorLayout implements GenericControlWindow { + + public static class StateWrapper { + public List customRules; + public List 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 currentState; + private StateWrapper currentState = new StateWrapper(); + private LectureRead lecture; private List listeners; + private List 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 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> selectedRules = new AtomicReference<>(); + btnOk.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + List selected = new ArrayList<>(); + for (Entry 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 getState() { + public StateWrapper getState() { return getState(true); } - public List 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 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>("Fehlerhafte Netzwerkregeln")); + changeMonitor.add(ctlNetrulesConfigurator).addConstraint(new NotNullConstraint("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 getPredefinedNetshares() { PredefinedData pd = predefinedData.get(); - if (pd == null || pd.ldapFilter == null) + if (pd == null || pd.netShares == null) return new ArrayList(0); return pd.netShares; } public static List getPredefinedRunScripts() { PredefinedData pd = predefinedData.get(); - if (pd == null || pd.ldapFilter == null) + if (pd == null || pd.runScripts == null) return new ArrayList(0); return pd.runScripts; } + + public static List getPredefinedNetRules() { + PredefinedData pd = predefinedData.get(); + if (pd == null || pd.networkExceptions == null) + return new ArrayList(0); + return pd.networkExceptions; + } -- cgit v1.2.3-55-g7522