summaryrefslogtreecommitdiffstats
path: root/dozentenmodul/src/main/java
diff options
context:
space:
mode:
authorJonathan Bauer2015-08-20 17:19:54 +0200
committerJonathan Bauer2015-08-20 17:19:54 +0200
commit0833b2e8c5310092ab1cea100582d4d2092818f8 (patch)
treed7e2e560330feeabd5983aeab0d554ab458c3035 /dozentenmodul/src/main/java
parent[client] fix image name / uuid not beeing read from the existing image (diff)
parent[client] Make AsyncHashGenerator faster by using two threads (I/O, Hashing) (diff)
downloadtutor-module-0833b2e8c5310092ab1cea100582d4d2092818f8.tar.gz
tutor-module-0833b2e8c5310092ab1cea100582d4d2092818f8.tar.xz
tutor-module-0833b2e8c5310092ab1cea100582d4d2092818f8.zip
Merge branch 'v1.1' of git.openslx.org:openslx-ng/tutor-module into v1.1
Diffstat (limited to 'dozentenmodul/src/main/java')
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/AsyncHashGenerator.java152
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/ImageCustomPermissionManager.java124
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/ImageCustomPermissionManagerLayout.java36
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/CustomImagePermissionWindow.java123
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageCustomPermissionWindow.java67
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageDetailsWindow.java2
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/ImageCustomPermissionWindowLayout.java (renamed from dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/CustomImagePermissionWindowLayout.java)30
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/ImageWizard.java4
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageCustomPermissionPageLayout.java30
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageCustomPermissionPage.java81
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/state/UploadWizardState.java2
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/thrift/ThriftActions.java14
12 files changed, 379 insertions, 286 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/AsyncHashGenerator.java b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/AsyncHashGenerator.java
index 0361631c..f53d5d0b 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/AsyncHashGenerator.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/AsyncHashGenerator.java
@@ -9,6 +9,8 @@ import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
import org.apache.log4j.Logger;
import org.apache.thrift.TException;
@@ -17,73 +19,80 @@ import org.openslx.filetransfer.util.FileChunk;
import org.openslx.thrifthelper.ThriftManager;
import org.openslx.util.Util;
-public class AsyncHashGenerator implements Runnable {
+public class AsyncHashGenerator extends Thread {
private static final Logger LOGGER = Logger.getLogger(AsyncHashGenerator.class);
- private final File uploadFile;
-
private final String uploadToken;
+ private final RandomAccessFile file;
+ private final List<ByteBuffer> blockHashes;
+ private final MessageDigest digester;
+ private final List<FileChunk> list;
+ private final AsyncHashGenerator thisGenerator = this;
private volatile boolean isCanceled = false;
- public AsyncHashGenerator(String uploadToken, File uploadFile) {
+ public AsyncHashGenerator(String uploadToken, File uploadFile) throws FileNotFoundException,
+ NoSuchAlgorithmException {
this.uploadToken = uploadToken;
- this.uploadFile = uploadFile;
- }
-
- @Override
- public void run() {
- MessageDigest digester;
try {
digester = MessageDigest.getInstance("SHA-1");
} catch (NoSuchAlgorithmException e1) {
LOGGER.warn("No SHA-1 MD available. Cannot hash file", e1);
- return;
+ throw e1;
}
- final RandomAccessFile file;
try {
file = new RandomAccessFile(uploadFile, "r");
} catch (FileNotFoundException e) {
LOGGER.warn("Could not open file for hash-checking. Will not send checksums to satellite", e);
- return;
+ throw e;
}
+ list = new ArrayList<>();
+ FileChunk.createChunkList(list, uploadFile.length(), null);
+ blockHashes = new ArrayList<>(list.size());
+ setDaemon(true);
+ setName("HashGenerator");
+ }
+
+ @Override
+ public void run() {
+ Checker checker = new Checker();
+ checker.start();
try {
- List<FileChunk> list = new ArrayList<>();
- FileChunk.createChunkList(list, uploadFile.length(), null);
- byte[] buffer = new byte[(int) TransferTask.CHUNK_SIZE];
- List<ByteBuffer> blockHashes = new ArrayList<>(list.size());
- for (int i = 0; i < list.size(); i++) {
+ for (FileChunk chunk : list) {
if (isCanceled)
break;
- FileChunk chunk = list.get(i);
+ Block block;
try {
+ byte[] buffer = new byte[chunk.range.getLength()];
file.seek(chunk.range.startOffset);
- file.readFully(buffer, 0, chunk.range.getLength());
+ file.readFully(buffer);
+ block = new Block(chunk, buffer);
} catch (IOException e) {
LOGGER.warn("Could not read file chunk " + chunk.getChunkIndex() + ", skipping", e);
- continue;
+ block = new Block(chunk, null);
}
if (isCanceled)
break;
- digester.update(buffer, 0, chunk.range.getLength());
- byte[] hash = digester.digest();
- blockHashes.add(ByteBuffer.wrap(hash));
- if (i <= 5 || i % 20 == 0 || i + 1 == list.size()) {
- if (isCanceled)
- break;
- try {
- ThriftManager.getSatClient().updateBlockHashes(uploadToken, blockHashes);
- } catch (TInvalidTokenException e) {
- LOGGER.warn("Cannot send hashList to satellite: Sat claims uploadToken is invalid!");
- break;
- } catch (TException e) {
- LOGGER.warn("Unknown exception when submitting hashList to sat", e);
- }
+ try {
+ checker.put(block);
+ } catch (InterruptedException e) {
+ LOGGER.info("Reader thread for hash checking got interrupted", e);
+ interrupt();
+ break;
}
}
+ try {
+ if (interrupted() || isCanceled) {
+ checker.interrupt();
+ }
+ checker.join();
+ } catch (InterruptedException e) {
+ //
+ }
} finally {
Util.safeClose(file);
+ LOGGER.debug("AsyncHashGenerator done");
}
}
@@ -91,4 +100,77 @@ public class AsyncHashGenerator implements Runnable {
isCanceled = true;
}
+ private static class Block {
+ public final FileChunk chunk;
+ public final byte[] buffer;
+
+ public Block(FileChunk chunk, byte[] buffer) {
+ this.chunk = chunk;
+ this.buffer = buffer;
+ }
+ }
+
+ private class Checker extends Thread {
+
+ private final BlockingQueue<Block> queue = new LinkedBlockingQueue<>(5);;
+
+ public Checker() {
+ setName("Hasher");
+ setDaemon(true);
+ }
+
+ public void put(Block block) throws InterruptedException {
+ if (!isAlive()) {
+ Thread.currentThread().interrupt();
+ return;
+ }
+ queue.put(block);
+ }
+
+ @Override
+ public void run() {
+ try {
+ while (!interrupted() && !isCanceled) {
+ Block block = queue.take();
+ if (isCanceled)
+ break;
+ final byte[] hash;
+ if (block.buffer == null) {
+ hash = new byte[0];
+ } else {
+ digester.update(block.buffer, 0, block.chunk.range.getLength());
+ hash = digester.digest();
+ }
+ int blockIndex = block.chunk.getChunkIndex();
+ if (blockHashes.size() != blockIndex) {
+ LOGGER.warn("Inconsistent state: blockHashes.size() != currentBlockIndex");
+ isCanceled = true;
+ break;
+ }
+ blockHashes.add(ByteBuffer.wrap(hash));
+ LOGGER.debug("blockIndex=" + blockIndex + ", list.size()=" + list.size());
+ if (blockIndex <= 5 || blockIndex % 20 == 0 || blockIndex + 1 == list.size()) {
+ try {
+ ThriftManager.getSatClient().updateBlockHashes(uploadToken, blockHashes);
+ } catch (TInvalidTokenException e) {
+ LOGGER.warn("Cannot send hashList to satellite: Sat claims uploadToken is invalid!");
+ isCanceled = true;
+ break;
+ } catch (TException e) {
+ LOGGER.warn("Unknown exception when submitting hashList to sat", e);
+ }
+ if (blockIndex + 1 == list.size())
+ break;
+ }
+ }
+ } catch (InterruptedException e) {
+ LOGGER.debug("Hash checker thread got interrupted.");
+ interrupt();
+ } finally {
+ thisGenerator.interrupt();
+ LOGGER.debug("Hasher done");
+ }
+ }
+ }
+
}
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
new file mode 100644
index 00000000..27a28f21
--- /dev/null
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/ImageCustomPermissionManager.java
@@ -0,0 +1,124 @@
+package org.openslx.dozmod.gui.control;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.swing.JOptionPane;
+
+import org.apache.log4j.Logger;
+import org.openslx.bwlp.thrift.iface.ImagePermissions;
+import org.openslx.bwlp.thrift.iface.UserInfo;
+import org.openslx.dozmod.gui.control.table.ImagePermissionTable.UserImagePermissions;
+import org.openslx.dozmod.gui.window.UserListWindow;
+import org.openslx.dozmod.gui.window.UserListWindow.UserAddedCallback;
+
+
+/**
+ * Panel including ImagePermissionTable and add/remove buttons for setting customImagePermissions.
+ */
+public class ImageCustomPermissionManager extends ImageCustomPermissionManagerLayout {
+
+ private ImageCustomPermissionManager me;
+
+ private ArrayList<UserImagePermissions> permissionList;
+ private Map<String, ImagePermissions> newPermissionMap;
+
+ private ActionListener addButtonListener = null;
+ private ActionListener removeButtonListener = null;
+
+ private static final Logger LOGGER = Logger.getLogger(ImageCustomPermissionManager.class);
+
+
+ public ImageCustomPermissionManager(){
+ super();
+ me = this;
+ }
+
+ /**
+ * Initialise the PermissionManager
+ * @param permissionMap the old permission, to initialise the table with, null creates empty table.
+ * @param defaultPermissions the permissions for a newly added user
+ */
+ public void initPanel(Map<String, ImagePermissions> permissionMap, final ImagePermissions defaultPermissions){
+ this.newPermissionMap = permissionMap == null ? new HashMap<String, ImagePermissions>() : permissionMap;
+ permissionList = new ArrayList<UserImagePermissions>();
+
+ for (Entry<String, ImagePermissions> e : newPermissionMap.entrySet()) {
+ permissionList.add(new UserImagePermissions(e.getKey(), e.getValue()));
+ }
+
+ permissionTable.setData(permissionList, false);
+
+ // clear listeners (multiple calls to init)
+ if(addButtonListener != null)
+ btnAddUser.removeActionListener(addButtonListener);
+ if(removeButtonListener != null)
+ btnRemoveUser.removeActionListener(removeButtonListener);
+
+ // add user button listener
+ addButtonListener = new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ // TODO again: which frame to give? JOptionPane.getFrameForComponent(me) sounds cool at least :)
+ UserListWindow.open(JOptionPane.getFrameForComponent(me), new UserAddedCallback() {
+
+ @Override
+ public void userAdded(final UserInfo newUser, UserListWindow window) {
+
+ // check if we have this user already
+ for (UserImagePermissions current : permissionList) {
+ if (current.userId.equals(newUser.userId)) {
+ LOGGER.debug("User already present in the list, skipping!");
+ return;
+ }
+ }
+ // add it to the list with default permissions
+ permissionList.add(new UserImagePermissions(newUser.userId, new ImagePermissions(defaultPermissions)));
+ LOGGER.debug("User added: " + newUser);
+ permissionTable.setData(permissionList, false);
+ }
+ }, "Hinzufügen");
+ }
+ };
+ btnAddUser.addActionListener(addButtonListener);
+
+ // delete user button listener
+ removeButtonListener = new ActionListener() {
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ final UserImagePermissions selected = permissionTable.getSelectedItem();
+ LOGGER.debug("Removing: " + selected);
+ if (!permissionList.remove(selected)) {
+ LOGGER.debug("Could not remove: " + selected);
+ }
+ permissionTable.setData(permissionList, false);
+ }
+ };
+ btnRemoveUser.addActionListener(removeButtonListener);
+ }
+
+
+ /**
+ * 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(){
+ // save the table stuff to our upload wizard state
+ if (permissionList == null)
+ return null;
+
+ newPermissionMap.clear();
+
+ // put permissions of the list into the map
+ for (UserImagePermissions perm : permissionList) {
+ newPermissionMap.put(perm.userId, perm.permissions);
+ }
+ return newPermissionMap;
+ }
+
+}
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/ImageCustomPermissionManagerLayout.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/ImageCustomPermissionManagerLayout.java
new file mode 100644
index 00000000..5f07bd7b
--- /dev/null
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/ImageCustomPermissionManagerLayout.java
@@ -0,0 +1,36 @@
+package org.openslx.dozmod.gui.control;
+
+import java.awt.BorderLayout;
+
+import javax.swing.BorderFactory;
+import javax.swing.JButton;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+
+import org.openslx.dozmod.gui.control.table.ImagePermissionTable;
+
+
+/**
+ * Layout for the ImageCustomPermissionManager
+ */
+public class ImageCustomPermissionManagerLayout extends JPanel {
+
+ protected ImagePermissionTable permissionTable;
+
+ protected JButton btnAddUser;
+ protected JButton btnRemoveUser;
+
+ public ImageCustomPermissionManagerLayout(){
+ super();
+ setLayout(new BorderLayout());
+ setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
+ permissionTable = new ImagePermissionTable();
+ add(new JScrollPane(permissionTable), BorderLayout.CENTER);
+ JPanel userButtonPane = new JPanel();
+ btnAddUser = new JButton("Benutzer hinzufügern");
+ userButtonPane.add(btnAddUser);
+ btnRemoveUser = new JButton("Benutzer entfernen");
+ userButtonPane.add(btnRemoveUser);
+ add(userButtonPane, BorderLayout.SOUTH);
+ }
+}
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/CustomImagePermissionWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/CustomImagePermissionWindow.java
deleted file mode 100644
index f096163f..00000000
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/CustomImagePermissionWindow.java
+++ /dev/null
@@ -1,123 +0,0 @@
-package org.openslx.dozmod.gui.window;
-
-import java.awt.Frame;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.ArrayList;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import javax.swing.JOptionPane;
-
-import org.apache.log4j.Logger;
-import org.apache.thrift.TException;
-import org.openslx.bwlp.thrift.iface.ImagePermissions;
-import org.openslx.bwlp.thrift.iface.UserInfo;
-import org.openslx.dozmod.gui.Gui;
-import org.openslx.dozmod.gui.control.table.ImagePermissionTable.UserImagePermissions;
-import org.openslx.dozmod.gui.helper.MessageType;
-import org.openslx.dozmod.gui.window.UserListWindow.UserAddedCallback;
-import org.openslx.dozmod.gui.window.layout.CustomImagePermissionWindowLayout;
-import org.openslx.dozmod.thrift.Session;
-import org.openslx.thrifthelper.ThriftManager;
-
-
-@SuppressWarnings("serial")
-public class CustomImagePermissionWindow extends CustomImagePermissionWindowLayout {
-
- private static final Logger LOGGER = Logger.getLogger(CustomImagePermissionWindow.class);
-
-
- private final CustomImagePermissionWindow me;
- private ArrayList<UserImagePermissions> permissionList = new ArrayList<>();
-
- protected CustomImagePermissionWindow(final Frame modalParent, final Map<String, ImagePermissions> permissionMap, final ImagePermissions defaultPermissions, final String imageBaseId) {
- super(modalParent);
- me = this;
-
-
- for (Entry<String, ImagePermissions> e : permissionMap.entrySet()) {
- permissionList.add(new UserImagePermissions(e.getKey(), e.getValue()));
- }
-
- permissionTable.setData(permissionList, false);
-
- // add user button adapter
- btnAddUser.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- // TODO again: which frame to giev? JOptionPane.getFrameForComponent(me) sounds cool at least :)
- UserListWindow.open(JOptionPane.getFrameForComponent(me), new UserAddedCallback() {
- @Override
- public void userAdded(final UserInfo newUser, UserListWindow window) {
-
- // check if we have this user already
- for (UserImagePermissions current : permissionList) {
- if (current.userId.equals(newUser.userId)) {
- LOGGER.debug("User already present in the list, skipping!");
- return;
- }
- }
- // add it to the list with default permissions
- permissionList.add(new UserImagePermissions(newUser.userId, new ImagePermissions(defaultPermissions)));
- LOGGER.debug("User added: " + newUser);
- permissionTable.setData(permissionList, false);
- }
- }, "Hinzufügen");
- }
- });
- // delete user button adapter
- btnRemoveUser.addActionListener(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- final UserImagePermissions selected = permissionTable.getSelectedItem();
- LOGGER.debug("Removing: " + selected);
- if (!permissionList.remove(selected)) {
- LOGGER.debug("Could not remove: " + selected);
- }
- permissionTable.setData(permissionList, false);
- }
- });
-
- btnClose.addActionListener(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent arg0) {
- dispose();
- }
- });
-
- btnSave.addActionListener(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- // save the table stuff to our upload wizard state
- if (permissionList == null || permissionList.isEmpty())
- return;
-
- permissionMap.clear();
-
- // put permissions of the list into the map to upload
- for (UserImagePermissions perm : permissionList) {
- permissionMap.put(perm.userId, perm.permissions);
- }
-
- // TODO allow admin permission changes?
- // push permissions to satellite server
- try {
- ThriftManager.getSatClient().writeImagePermissions(Session.getSatelliteToken(),
- imageBaseId, permissionMap);
- } catch (TException er) {
- Gui.showMessageBox(me, "Konnte Berechtigungen nicht an den Satelliten übertragen: ", MessageType.ERROR, LOGGER, er);
- }
- dispose();
- }
- });
-
- }
-
- public static void open(Frame modalParent, Map<String, ImagePermissions> permissionMap, ImagePermissions defaultPermissions, String imageBaseId) {
- new CustomImagePermissionWindow(modalParent, permissionMap, defaultPermissions, imageBaseId).setVisible(true);
- }
-}
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageCustomPermissionWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageCustomPermissionWindow.java
new file mode 100644
index 00000000..5302bdba
--- /dev/null
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageCustomPermissionWindow.java
@@ -0,0 +1,67 @@
+package org.openslx.dozmod.gui.window;
+
+import java.awt.Frame;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.swing.JOptionPane;
+
+import org.apache.log4j.Logger;
+import org.apache.thrift.TException;
+import org.openslx.bwlp.thrift.iface.ImagePermissions;
+import org.openslx.bwlp.thrift.iface.UserInfo;
+import org.openslx.dozmod.gui.Gui;
+import org.openslx.dozmod.gui.control.table.ImagePermissionTable.UserImagePermissions;
+import org.openslx.dozmod.gui.helper.MessageType;
+import org.openslx.dozmod.gui.window.UserListWindow.UserAddedCallback;
+import org.openslx.dozmod.gui.window.layout.ImageCustomPermissionWindowLayout;
+import org.openslx.dozmod.thrift.Session;
+import org.openslx.thrifthelper.ThriftManager;
+
+
+@SuppressWarnings("serial")
+public class ImageCustomPermissionWindow extends ImageCustomPermissionWindowLayout {
+
+ private static final Logger LOGGER = Logger.getLogger(ImageCustomPermissionWindow.class);
+
+
+ private final ImageCustomPermissionWindow me;
+
+ protected ImageCustomPermissionWindow(final Frame modalParent, final Map<String, ImagePermissions> permissionMap, final ImagePermissions defaultPermissions, final String imageBaseId) {
+ super(modalParent);
+ me = this;
+
+ imagePermissionManager.initPanel(permissionMap, defaultPermissions);
+
+
+ btnSave.addActionListener(new ActionListener() {
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ // push permissions to satellite server
+ try {
+ ThriftManager.getSatClient().writeImagePermissions(Session.getSatelliteToken(),
+ imageBaseId, imagePermissionManager.getMap());
+ } catch (TException er) {
+ Gui.showMessageBox(me, "Konnte Berechtigungen nicht an den Satelliten übertragen: ", MessageType.ERROR, LOGGER, er);
+ }
+ dispose();
+ }
+ });
+
+ btnClose.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent arg0) {
+ dispose();
+ }
+ });
+
+ }
+
+ public static void open(Frame modalParent, Map<String, ImagePermissions> permissionMap, ImagePermissions defaultPermissions, String imageBaseId) {
+ new ImageCustomPermissionWindow(modalParent, permissionMap, defaultPermissions, imageBaseId).setVisible(true);
+ }
+}
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 8a765daf..0f9e89cd 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
@@ -134,7 +134,7 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe
@Override
public void actionPerformed(ActionEvent arg0) {
- CustomImagePermissionWindow.open(JOptionPane.getFrameForComponent(me), permissionMap, image.defaultPermissions, image.imageBaseId);
+ ImageCustomPermissionWindow.open(JOptionPane.getFrameForComponent(me), permissionMap, image.defaultPermissions, image.imageBaseId);
}
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/CustomImagePermissionWindowLayout.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/ImageCustomPermissionWindowLayout.java
index 8c48a8f1..a2c660be 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/CustomImagePermissionWindowLayout.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/ImageCustomPermissionWindowLayout.java
@@ -11,45 +11,31 @@ import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
-import javax.swing.JScrollPane;
import org.apache.log4j.Logger;
-import org.openslx.dozmod.gui.control.table.ImagePermissionTable;
+import org.openslx.dozmod.gui.control.ImageCustomPermissionManager;
@SuppressWarnings("serial")
-public class CustomImagePermissionWindowLayout extends JDialog {
+public class ImageCustomPermissionWindowLayout extends JDialog {
- private static final Logger LOGGER = Logger.getLogger(CustomImagePermissionWindowLayout.class);
+ private static final Logger LOGGER = Logger.getLogger(ImageCustomPermissionWindowLayout.class);
- protected final ImagePermissionTable permissionTable;
protected final JButton btnSave;
protected final JButton btnClose;
- protected final JButton btnAddUser;
- protected final JButton btnRemoveUser;
+ protected final ImageCustomPermissionManager imagePermissionManager;
- protected boolean imagePermPage;
private static String title = "Benutzerdefinierte Berechtigungen";
- protected CustomImagePermissionWindowLayout(Frame modalParent) {
+ protected ImageCustomPermissionWindowLayout(Frame modalParent) {
super(modalParent, title, modalParent != null ? ModalityType.APPLICATION_MODAL
: ModalityType.MODELESS);
- JPanel tablePane = new JPanel();
- tablePane.setLayout(new BorderLayout());
- tablePane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
- permissionTable = new ImagePermissionTable();
- tablePane.add(new JScrollPane(permissionTable), BorderLayout.CENTER);
- JPanel userButtonPane = new JPanel();
- btnAddUser = new JButton("Benutzer hinzufügern");
- userButtonPane.add(btnAddUser);
- btnRemoveUser = new JButton("Benutzer entfernen");
- userButtonPane.add(btnRemoveUser);
- tablePane.add(userButtonPane, BorderLayout.SOUTH);
-
+ imagePermissionManager = new ImageCustomPermissionManager();
+
// spaced buttons
JPanel buttonPane = new JPanel();
buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS));
@@ -62,7 +48,7 @@ public class CustomImagePermissionWindowLayout extends JDialog {
// pack it all
Container contentPane = getContentPane();
- contentPane.add(tablePane, BorderLayout.CENTER);
+ contentPane.add(imagePermissionManager, BorderLayout.CENTER);
contentPane.add(buttonPane, BorderLayout.PAGE_END);
setPreferredSize(new Dimension(480, 350));
pack();
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/ImageWizard.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/ImageWizard.java
index 6de120e3..8e5dfecc 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/ImageWizard.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/ImageWizard.java
@@ -69,11 +69,11 @@ public class ImageWizard extends Wizard implements UiFeedback {
}
// push permissions to satellite server
- if (uploadWizardState.permissionList != null) {
+ if (uploadWizardState.permissionMap != null) {
// user skipped permission list stuff
try {
ThriftManager.getSatClient().writeImagePermissions(Session.getSatelliteToken(),
- uploadWizardState.uuid, uploadWizardState.permissionList);
+ uploadWizardState.uuid, uploadWizardState.permissionMap);
} catch (TException e) {
Gui.showMessageBox(this, "Could not write permissions list to satellite: ",
MessageType.ERROR, LOGGER, e);
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageCustomPermissionPageLayout.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageCustomPermissionPageLayout.java
index 969f61ae..7e32d35d 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageCustomPermissionPageLayout.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageCustomPermissionPageLayout.java
@@ -1,10 +1,6 @@
package org.openslx.dozmod.gui.wizard.layout;
-import javax.swing.JButton;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-
-import org.openslx.dozmod.gui.control.table.ImagePermissionTable;
+import org.openslx.dozmod.gui.control.ImageCustomPermissionManager;
import org.openslx.dozmod.gui.helper.GridManager;
import org.openslx.dozmod.gui.wizard.Wizard;
import org.openslx.dozmod.gui.wizard.WizardPage;
@@ -12,15 +8,7 @@ import org.openslx.dozmod.gui.wizard.WizardPage;
@SuppressWarnings("serial")
public class ImageCustomPermissionPageLayout extends WizardPage {
- // The table stuff
- protected ImagePermissionTable permissionTable;
-
- // Buttons
- protected JButton addUser;
- protected JButton removeUser;
-
- protected String addUserLabel = "Benutzer hinzufügen";
- protected String removeUserLabel = "Benutzer entfernen";
+ protected ImageCustomPermissionManager imageCustomPermissionManager;
/**
* wizard page for setting custom permissions
@@ -32,18 +20,8 @@ public class ImageCustomPermissionPageLayout extends WizardPage {
setDescription("Setzen Sie hier spezielle Berechtigungen, sofern Sie dies wünschen.");
GridManager grid = new GridManager(this, 1, false);
- // table in the center
- permissionTable = new ImagePermissionTable();
- grid.add(new JScrollPane(permissionTable)).fill(true, true).expand(true, true);
- grid.nextRow();
-
- // Buttons below Table
- JPanel panel = new JPanel();
- addUser = new JButton(addUserLabel);
- removeUser = new JButton(removeUserLabel);
- panel.add(addUser);
- panel.add(removeUser);
- grid.add(panel);
+ imageCustomPermissionManager = new ImageCustomPermissionManager();
+ grid.add(imageCustomPermissionManager).fill(true, true).expand(true, true);
grid.nextRow();
grid.finish(true);
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 858f49fc..dbabeb57 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
@@ -1,19 +1,9 @@
package org.openslx.dozmod.gui.wizard.page;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map.Entry;
-
-import javax.swing.JOptionPane;
+import java.util.Map;
import org.apache.log4j.Logger;
import org.openslx.bwlp.thrift.iface.ImagePermissions;
-import org.openslx.bwlp.thrift.iface.UserInfo;
-import org.openslx.dozmod.gui.control.table.ImagePermissionTable.UserImagePermissions;
-import org.openslx.dozmod.gui.window.UserListWindow;
-import org.openslx.dozmod.gui.window.UserListWindow.UserAddedCallback;
import org.openslx.dozmod.gui.wizard.Wizard;
import org.openslx.dozmod.gui.wizard.layout.ImageCustomPermissionPageLayout;
import org.openslx.dozmod.state.UploadWizardState;
@@ -23,12 +13,8 @@ public class ImageCustomPermissionPage extends ImageCustomPermissionPageLayout {
private final static Logger LOGGER = Logger.getLogger(ImageCustomPermissionPage.class);
- private final ImageCustomPermissionPage me = this;
-
private UploadWizardState state = null;
- private ArrayList<UserImagePermissions> permissionList = new ArrayList<>();
-
/**
* wizard page for setting custom permissions
*
@@ -38,69 +24,20 @@ public class ImageCustomPermissionPage extends ImageCustomPermissionPageLayout {
super(wizard);
setPageComplete(true);
this.state = uploadWizardState;
-
- // add user button adapter
- addUser.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- // TODO again: which frame to giev? JOptionPane.getFrameForComponent(me) sounds cool at least :)
- UserListWindow.open(JOptionPane.getFrameForComponent(me), new UserAddedCallback() {
- @Override
- public void userAdded(final UserInfo newUser, UserListWindow window) {
-
- // check if we have this user already
- for (UserImagePermissions current : permissionList) {
- if (current.userId.equals(newUser.userId)) {
- LOGGER.debug("User already present in the list, skipping!");
- return;
- }
- }
- // add it to the list with either default permissions if set, or none
- ImagePermissions newUserPerms = null;
- if (state.permissions == null) {
- newUserPerms = new ImagePermissions(false, false, false, false);
- } else {
- newUserPerms = new ImagePermissions(state.permissions);
- }
- permissionList.add(new UserImagePermissions(newUser.userId, newUserPerms));
- LOGGER.debug("User added: " + newUser);
- permissionTable.setData(permissionList, false);
- }
- }, "Hinzufügen");
- }
- });
- // delete user button adapter
- removeUser.addActionListener(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- final UserImagePermissions selected = permissionTable.getSelectedItem();
- LOGGER.debug("Removing: " + selected);
- if (!permissionList.remove(selected)) {
- LOGGER.debug("Could not remove: " + selected);
- }
- permissionTable.setData(permissionList, false);
- }
- });
}
@Override
+ protected void onPageEnter() {
+ imageCustomPermissionManager.initPanel(state.permissionMap, state.permissions);
+ }
+
+ @Override
protected void onPageLeave() {
LOGGER.debug("Saving permissions to state ...");
// save the table stuff to our upload wizard state
- if (permissionList == null || permissionList.isEmpty())
+ Map<String, ImagePermissions> newPermissionMap= imageCustomPermissionManager.getMap();
+ if (newPermissionMap == null || newPermissionMap.isEmpty())
return;
- // stuff in our list, clear old list in state before continuing
- if (state.permissionList == null) {
- state.permissionList = new HashMap<String, ImagePermissions>();
- } else {
- state.permissionList.clear();
- }
-
- // add them one by one
- for (UserImagePermissions perm : permissionList) {
- // for now just overwrite the saved permission list of the state
- state.permissionList.put(perm.userId, perm.permissions);
- }
+ state.permissionMap = newPermissionMap;
}
}
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/state/UploadWizardState.java b/dozentenmodul/src/main/java/org/openslx/dozmod/state/UploadWizardState.java
index c3686c78..f087fd5f 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/state/UploadWizardState.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/state/UploadWizardState.java
@@ -29,7 +29,7 @@ public class UploadWizardState {
// TODO: defaults per sat
public ImagePermissions permissions = null;
// explicit permissions per user as set by the creator
- public Map<String, ImagePermissions> permissionList = null;
+ public Map<String, ImagePermissions> permissionMap = null;
// local, publish, download frozen share mode
public ShareMode shareMode = null;
// enabled flag
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/thrift/ThriftActions.java b/dozentenmodul/src/main/java/org/openslx/dozmod/thrift/ThriftActions.java
index 5ffc323a..81add9a6 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/thrift/ThriftActions.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/thrift/ThriftActions.java
@@ -5,6 +5,7 @@ import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
+import java.security.NoSuchAlgorithmException;
import java.util.List;
import javax.swing.JFileChooser;
@@ -254,10 +255,15 @@ public class ThriftActions {
+ diskFile.getAbsolutePath(), MessageType.ERROR, LOGGER, e);
return null;
}
- AsyncHashGenerator hashGen = new AsyncHashGenerator(transferInformation.token, diskFile);
- Thread hashThread = new Thread(hashGen);
- hashThread.setDaemon(true);
- hashThread.start();
+ AsyncHashGenerator hashGen = null;
+ try {
+ hashGen = new AsyncHashGenerator(transferInformation.token, diskFile);
+ hashGen.start();
+ Util.sleep(50); // A little ugly... Give the hash generator a head start
+ } catch (FileNotFoundException | NoSuchAlgorithmException e) {
+ Gui.showMessageBox(frame, "Kann keine Block-Hashes für den Upload berechnen, "
+ + "automatische Fehlerkorrektur deaktiviert.", MessageType.WARNING, LOGGER, e);
+ }
Util.sleep(50); // A little ugly... Give the hash generator a head start
Thread uploadThread = new Thread(uploadTask);
uploadThread.setDaemon(true);