diff options
author | Jonathan Bauer | 2017-09-08 16:54:59 +0200 |
---|---|---|
committer | Jonathan Bauer | 2017-09-08 16:54:59 +0200 |
commit | c0cbc1b3cb20b6c86d917394bdffe9c15a74a54d (patch) | |
tree | 8343a06ad4c8f3d08c03d685b6c2456dcabf8d5b | |
parent | [netshare] minor layout optimizations (diff) | |
download | tutor-module-c0cbc1b3cb20b6c86d917394bdffe9c15a74a54d.tar.gz tutor-module-c0cbc1b3cb20b6c86d917394bdffe9c15a74a54d.tar.xz tutor-module-c0cbc1b3cb20b6c86d917394bdffe9c15a74a54d.zip |
[client/server] support for mountpoint/displayname
3 files changed, 128 insertions, 64 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/NetshareConfigurator.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/NetshareConfigurator.java index 54aacdeb..5ae805db 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/NetshareConfigurator.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/NetshareConfigurator.java @@ -38,7 +38,7 @@ import org.openslx.dozmod.gui.helper.GridManager; import org.openslx.dozmod.util.FormatHelper; /** - * Widget for netrules configuration of lectures + * Widget for network share configuration of lectures */ public class NetshareConfigurator extends NetshareConfiguratorLayout { @@ -46,8 +46,13 @@ public class NetshareConfigurator extends NetshareConfiguratorLayout { private final static Logger LOGGER = Logger.getLogger(NetshareConfigurator.class); private List<NetShare> tblNetshareData = null; + // mount points / win drive letters - ideally, we would check whether the image is linux or windows based + // and either show a drive selection list like this one, or a textfield for a user-defined mount point... + private Character[] mountPoints = { 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; public NetshareConfigurator() { + super(); + tblNetshare.getModel().addTableModelListener(new TableModelListener() { @Override public void tableChanged(TableModelEvent e) { @@ -55,6 +60,38 @@ public class NetshareConfigurator extends NetshareConfiguratorLayout { } }); + tblNetshare.getSelectionModel().addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + NetShare item = tblNetshare.getSelectedItem(); + // ugly block-wise sets, but only one test needed compared to + // doing lots of item != null ? ... : ... + if (item != null) { + // share from the list is selected: fill bottom form and change "Add" to "Apply" + btnDel.setEnabled(true); + tfSharePath.setText(item.path); + tfShareName.setText(item.displayname); + tfUsername.setText(item.username); + tfPassword.setText(item.password); + cboNetshareAuth.setSelectedItem(item.auth); + cboNetshareMountPoint.setSelectedItem(Character.valueOf(item.mountpoint.charAt(0))); + btnAdd.setText("Ändern"); + } else { + btnDel.setEnabled(false); + tfSharePath.setText(null); + tfShareName.setText(null); + tfUsername.setText(null); + tfPassword.setText(null); + cboNetshareAuth.setSelectedItem(null); + cboNetshareMountPoint.setSelectedItem(null); + btnAdd.setText("Hinzufügen"); + } + } + }); + + cboNetshareMountPoint.setModel(new DefaultComboBoxModel<Character>(mountPoints)); + cboNetshareMountPoint.setSelectedItem(null); + // combobox for share authentication types cboNetshareAuth.setModel(new DefaultComboBoxModel<NetShareAuth>(NetShareAuth.values())); cboNetshareAuth.addActionListener(new ActionListener() { @@ -72,17 +109,22 @@ public class NetshareConfigurator extends NetshareConfiguratorLayout { chkShowPass.setEnabled(activate); } }); - tfUsername.setEnabled(false); - lblUsername.setEnabled(false); - tfPassword.setEnabled(false); - lblPassword.setEnabled(false); - chkShowPass.setEnabled(false); + cboNetshareAuth.setSelectedItem(null); + btnAdd.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // check if we are editing an existing share entry or // creating a new one, check for input either way NetShare input = new NetShare(); + + String inputShareName = tfShareName.getText(); + if (inputShareName.isEmpty()) { + lblError.setText("Kein Anzeigename angegeben!"); + return; + } + input.displayname = inputShareName; + NetShareAuth inputNetShareAuth = cboNetshareAuth.getItemAt(cboNetshareAuth.getSelectedIndex()); if (inputNetShareAuth == null) { lblError.setText("Kein Authentifizierungstyp angegeben!"); @@ -120,7 +162,11 @@ public class NetshareConfigurator extends NetshareConfiguratorLayout { LOGGER.debug("Bad input, aborting."); return; } - + // now check for optional mount path + Character inputMountPoint = cboNetshareMountPoint.getItemAt(cboNetshareMountPoint.getSelectedIndex()); + if (inputMountPoint != null) { + input.mountpoint = inputMountPoint.toString() + ":"; + } // now decide whether to create a new entry or update existing one NetShare oldEntry = tblNetshare.getSelectedItem(); if (oldEntry != null) { @@ -179,31 +225,11 @@ public class NetshareConfigurator extends NetshareConfiguratorLayout { } } }); - - tblNetshare.getSelectionModel().addListSelectionListener(new ListSelectionListener() { - @Override - public void valueChanged(ListSelectionEvent e) { - NetShare item = tblNetshare.getSelectedItem(); - // ugly block-wise sets, but only one test needed compared to - // doing lots of item != null ? ... : ... - if (item != null) { - // share from the list is selected: fill bottom form and change "Add" to "Apply" - btnDel.setEnabled(true); - tfSharePath.setText(item.path); - tfUsername.setText(item.username); - tfPassword.setText(item.password); - cboNetshareAuth.setSelectedItem(item.auth); - btnAdd.setText("Ändern"); - } else { - btnDel.setEnabled(false); - tfSharePath.setText(null); - tfUsername.setText(null); - tfPassword.setText(null); - cboNetshareAuth.setSelectedItem(null); - btnAdd.setText("Hinzufügen"); - } - } - }); + chkShowPass.setEnabled(false); + tfUsername.setEnabled(false); + lblUsername.setEnabled(false); + tfPassword.setEnabled(false); + lblPassword.setEnabled(false); } public List<NetShare> getState() { @@ -263,10 +289,10 @@ class NetshareConfiguratorLayout extends JPanel { private final static String txtNetshareDesc = "Hier können Sie Netzlaufwerke angeben," + " die automatisch beim Start der Veranstaltung eingebunden werden sollen."; - protected QLabel lblShareAuth, lblSharePath, lblUsername, lblPassword, lblError; - + + protected QLabel lblShareAuth, lblSharePath, lblShareName, lblMountPoint, lblUsername, lblPassword, lblError; protected NetshareTable tblNetshare = new NetshareTable(); - protected JTextField tfSharePath, tfUsername; + protected JTextField tfSharePath, tfShareName, tfUsername; protected JPasswordField tfPassword; protected JButton btnAdd, btnDel; protected JCheckBox chkShowPass; @@ -278,8 +304,14 @@ class NetshareConfiguratorLayout extends JPanel { return FormatHelper.netShareAuthName(item); } }); - - + protected ComboBox<Character> cboNetshareMountPoint = new ComboBox<>(new ComboBoxRenderer<Character>() { + @Override + public String renderItem(Character letter) { + if (letter == null) + return null; + return letter.toString() + ":"; + } + }); public NetshareConfiguratorLayout() { GridManager grid = new GridManager(this, 5, true, new Insets(3, 3, 3, 3)); @@ -293,31 +325,40 @@ class NetshareConfiguratorLayout extends JPanel { JPanel pnlNewShare = new JPanel(); GridManager gridNewShare = new GridManager(pnlNewShare, 5, true); pnlNewShare.setBorder(BorderFactory.createTitledBorder("Details")); + lblSharePath = new QLabel("Pfad"); + gridNewShare.add(lblSharePath); + tfSharePath = new JTextField(); + gridNewShare.add(tfSharePath, 4).fill(true, false).expand(true, false); + gridNewShare.nextRow(); // bottom form to add a new share + lblShareName = new QLabel("Anzeigename"); + lblMountPoint = new QLabel("Ziel"); + tfShareName = new JTextField(); + + gridNewShare.add(lblShareName); + gridNewShare.add(tfShareName, 2).fill(true, false).expand(true, false); + gridNewShare.add(lblMountPoint); + gridNewShare.add(cboNetshareMountPoint); + gridNewShare.nextRow(); lblShareAuth = new QLabel("Authentifizierung"); gridNewShare.add(lblShareAuth); gridNewShare.add(cboNetshareAuth, 4).fill(true, false).expand(true, false); gridNewShare.nextRow(); - lblSharePath = new QLabel("URI"); - gridNewShare.add(lblSharePath); - tfSharePath = new JTextField(); - gridNewShare.add(tfSharePath, 4).fill(true, false).expand(true, false); - gridNewShare.nextRow(); lblUsername = new QLabel("Username"); gridNewShare.add(lblUsername); tfUsername = new JTextField(20); gridNewShare.add(tfUsername, 1).fill(true, false).expand(true, false); - lblPassword = new QLabel("Passwort:"); + lblPassword = new QLabel("Passwort"); gridNewShare.add(lblPassword); tfPassword = new JPasswordField(20); gridNewShare.add(tfPassword, 2).fill(true, false).expand(true, false); gridNewShare.nextRow(); chkShowPass = new JCheckBox("Passwort anzeigen"); - JPanel pnlHidePass = new JPanel(); - pnlHidePass.setLayout(new BoxLayout(pnlHidePass, BoxLayout.LINE_AXIS)); - pnlHidePass.add(Box.createGlue()); - pnlHidePass.add(chkShowPass, BorderLayout.LINE_END); - gridNewShare.add(pnlHidePass, 5).fill(true, false).expand(true, false); + JPanel pnlShowPass = new JPanel(); + pnlShowPass.setLayout(new BoxLayout(pnlShowPass, BoxLayout.LINE_AXIS)); + pnlShowPass.add(Box.createGlue()); + pnlShowPass.add(chkShowPass, BorderLayout.LINE_END); + gridNewShare.add(pnlShowPass, 5).fill(true, false).expand(true, false); gridNewShare.nextRow(); grid.add(pnlNewShare, 5).fill(true, false).expand(true, false); grid.nextRow(); diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/NetshareTable.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/NetshareTable.java index 7ebde4eb..f8e4d138 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/NetshareTable.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/NetshareTable.java @@ -1,41 +1,52 @@ package org.openslx.dozmod.gui.control.table; import org.openslx.bwlp.thrift.iface.NetShare; +import org.openslx.bwlp.thrift.iface.NetShareAuth; import org.openslx.dozmod.thrift.Sorters; import org.openslx.dozmod.util.FormatHelper; @SuppressWarnings("serial") public class NetshareTable extends ListTable<NetShare> { + public static final ListTableColumn COL_NAME = new ListTableColumn("Name"); + public static final ListTableColumn COL_MOUNT = new ListTableColumn("Ziel"); public static final ListTableColumn COL_PATH = new ListTableColumn("Pfad"); - public static final ListTableColumn COL_TYPE = new ListTableColumn("Typ", Sorters.netShareAuth); + public static final ListTableColumn COL_AUTH = new ListTableColumn("Authentifizierung", Sorters.netShareAuth); public static final ListTableColumn COL_USER = new ListTableColumn("Username"); public static final ListTableColumn COL_PASSWORD = new ListTableColumn("Passwort"); public NetshareTable() { - super(COL_PATH, COL_TYPE, COL_USER, COL_PASSWORD); + super(COL_NAME, COL_PATH, COL_MOUNT, COL_AUTH, COL_USER, COL_PASSWORD); } @Override protected Object getValueAtInternal(NetShare item, ListTableColumn columnIndex) { + if (columnIndex == COL_NAME) + return item.displayname; + if (columnIndex == COL_MOUNT) + return item.mountpoint; if (columnIndex == COL_PATH) return item.path; - if (columnIndex == COL_TYPE) - return FormatHelper.netShareAuthName(item.auth); + if (columnIndex == COL_AUTH) + return item.auth; if (columnIndex == COL_USER) return item.username; if (columnIndex == COL_PASSWORD) return item.password; - //TODO others! throw new IndexOutOfBoundsException(); } @Override public Object modelValueToDisplayFormat(Object object, ListTableColumn column) { + if (column == COL_NAME) + return (String) object; + if (column == COL_MOUNT) + return (String) object; if (column == COL_PATH) return (String) object; - if (column == COL_TYPE) - return object.toString(); + if (column == COL_AUTH) { + return FormatHelper.netShareAuthName((NetShareAuth) object); + } if (column == COL_USER) return (String) object; if (column == COL_PASSWORD) { diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/web/WebServer.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/web/WebServer.java index 0975a443..4e7a2508 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/web/WebServer.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/web/WebServer.java @@ -202,22 +202,34 @@ public class WebServer extends NanoHTTPD { } catch (SQLException e) { return internalServerError(); } - // TODO format expected from the client-side to - // handle different types of login. Currently: - // * no username, no password => use credentials of logged in user - // * username and optional password => user-specified credentials + // openslx.exe expects shares in the following format + // <path> <letter> <shortcut> <username> <password> + // letter is either a drive letter for Windows VMs, + // or a mount point for Linux VMs. StringBuilder sb = new StringBuilder(); if (!list.isEmpty()) { for (NetShare share : list) { sb.append(share.path); + sb.append('\t'); + if (share.isSetMountpoint()) { + sb.append(share.mountpoint); + } else { + // mark missing mount point, run-virt + // should assign a random one + sb.append("#NO_MOUNT#"); + } + sb.append('\t'); + sb.append(share.displayname); if (share.auth == NetShareAuth.LOGIN_USER) { - // nothing to do + // TODO how to mark that it should use the logged in user's credentials } - if (share.auth == NetShareAuth.OTHER_USER) { - sb.append(' '); + if (share.auth == NetShareAuth.OTHER_USER && share.isSetUsername()) { + sb.append('\t'); sb.append(share.username); - sb.append(' '); - sb.append(share.password); // TODO fixme + if (share.isSetPassword()) { + sb.append('\t'); + sb.append(share.password); // TODO fixme + } } sb.append("\n"); } |