From 43bbdb3808f8c78f76e17a7ecc0dea9c9cad6541 Mon Sep 17 00:00:00 2001 From: Nils Schwabe Date: Thu, 10 Jul 2014 17:00:52 +0200 Subject: Start to implement download functionallity --- .../imagemaster/serverconnection/Connection.java | 1 + .../serverconnection/ConnectionHandler.java | 44 ++++++++++++---------- .../serverconnection/DownloadingClient.java | 13 ++++--- .../serverconnection/ImageProcessor.java | 19 ++++++---- .../serverconnection/UploadingImage.java | 1 - 5 files changed, 43 insertions(+), 35 deletions(-) (limited to 'src') diff --git a/src/main/java/org/openslx/imagemaster/serverconnection/Connection.java b/src/main/java/org/openslx/imagemaster/serverconnection/Connection.java index c6606ac..28a9838 100644 --- a/src/main/java/org/openslx/imagemaster/serverconnection/Connection.java +++ b/src/main/java/org/openslx/imagemaster/serverconnection/Connection.java @@ -13,6 +13,7 @@ public class Connection */ protected final boolean type; public UploadingImage image = null; + public DownloadingClient client = null; public final static boolean UPLOADING = true; public final static boolean DOWNLOADING = false; diff --git a/src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java b/src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java index 439087a..7a3bf12 100644 --- a/src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java +++ b/src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java @@ -10,6 +10,7 @@ import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; +import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -115,28 +116,31 @@ public class ConnectionHandler implements IncomingEvent public void incomingUploader( Uploader uploader ) throws IOException { // try to read meta data - while ( uploader.readMetaData() ) { - String token = uploader.getToken(); - log.debug( "Got token :'" + token + "'" ); - // check token to identify the client - if ( !connections.containsKey( token ) ) { - uploader.sendErrorCode( "Token not accepted." ); - uploader.close(); - return; - } - - // check if he was a downloading client - if ( connections.get( token ).type == Connection.UPLOADING ) { - uploader.sendErrorCode( "You can not download, if you are uploading." ); - uploader.close(); - return; - } - // TODO: check which range needs to be sent and send this range - long length = ( new File( connections.get( token ).filepath ) ).length(); + if ( !uploader.readMetaData() ) return; + String token = uploader.getToken(); + log.debug( "Got token :'" + token + "'" ); + // check token to identify the client + if ( !connections.containsKey( token ) ) { + uploader.sendErrorCode( "Token not accepted." ); + uploader.close(); + return; + } - uploader.sendRange( 0, (int)length ); - uploader.sendFile( connections.get( token ).filepath ); + // check if he was a downloading client + if ( connections.get( token ).type == Connection.UPLOADING ) { + uploader.sendErrorCode( "You can not download, if you are uploading." ); + uploader.close(); + return; } + + List list = connections.get( token ).client.getLastRequestedBlocks( token ); + // TODO: check which range needs to be sent and send this range + // logik von michael + + long length = ( new File( connections.get( token ).filepath ) ).length(); + + uploader.sendRange( 0, (int)length ); + uploader.sendFile( connections.get( token ).filepath ); uploader.close(); } diff --git a/src/main/java/org/openslx/imagemaster/serverconnection/DownloadingClient.java b/src/main/java/org/openslx/imagemaster/serverconnection/DownloadingClient.java index 0acfa42..5754a6b 100644 --- a/src/main/java/org/openslx/imagemaster/serverconnection/DownloadingClient.java +++ b/src/main/java/org/openslx/imagemaster/serverconnection/DownloadingClient.java @@ -2,6 +2,7 @@ package org.openslx.imagemaster.serverconnection; import java.util.HashMap; import java.util.List; +import java.util.Map; /** * Helper class for the ImageProcessor to know some things about the downloading client @@ -10,7 +11,7 @@ import java.util.List; public class DownloadingClient { - public final HashMap downloadingImages = new HashMap<>(); + private final HashMap downloadingImages = new HashMap<>(); DownloadingClient() { @@ -36,11 +37,12 @@ public class DownloadingClient return (downloadingImages.size() > 0); } - public List getLastRequestedBlocks( String uuid ) + public List getLastRequestedBlocks( String token ) { - if ( !downloadingImages.containsKey( uuid ) ) - return null; - return downloadingImages.get( uuid ).lastRequestedBlocks; + for (Map.Entry entry : downloadingImages.entrySet() ) { + if (entry.getValue().token.equals( token )) return entry.getValue().lastRequestedBlocks; + } + return null; } public void requestBlocks( String uuid, List list ) @@ -59,7 +61,6 @@ public class DownloadingClient class ImageInfos { - public final String uuid; public final String token; private List lastRequestedBlocks; diff --git a/src/main/java/org/openslx/imagemaster/serverconnection/ImageProcessor.java b/src/main/java/org/openslx/imagemaster/serverconnection/ImageProcessor.java index 8306280..10580a7 100644 --- a/src/main/java/org/openslx/imagemaster/serverconnection/ImageProcessor.java +++ b/src/main/java/org/openslx/imagemaster/serverconnection/ImageProcessor.java @@ -64,8 +64,6 @@ public class ImageProcessor // check image data // TODO: do security checks - log.debug( "Trying to answer request:" + serverSessionId + ", " + imageData + ", " + crcSums ); - String uuid = imageData.uuid; String token; String filepath; @@ -77,7 +75,7 @@ public class ImageProcessor synchronized ( uploadingImages ) { // check if image is already uploading TODO: what if two clients call this at the same time? -> Good question.. (Thought about not sending the last requested. But then the upload will never finish...) if ( ( image = uploadingImages.get( uuid ) ) != null ) { - log.debug( "Image is already uploading" ); + log.debug( "Image is already uploading.. returning some missing blocks" ); List missing = getNMissingBlocks( image, AMOUNT ); if ( missing.isEmpty() ) { uploadDone( uuid ); @@ -87,7 +85,6 @@ public class ImageProcessor } // insert new image - log.debug( "Inserting new download" ); filepath = Globals.getImageDir() + "/" + uuid + ".vmdk"; token = RandomString.generate( 100, false ); crcPath = Globals.getImageDir() + "/" + uuid + ".crc"; @@ -103,7 +100,7 @@ public class ImageProcessor try { new CRCFile( crcSums, crcPath); } catch (IOException e) { - log.debug( "Could not create crc file" ); + log.error( "Could not create crc file", e ); return null; // TODO: what to do if we can not write the crc file to disk? Give object to crcscheduler? } @@ -111,7 +108,7 @@ public class ImageProcessor DbImage.insert( imageData, System.currentTimeMillis(), token, allBlocks, serverSessionId, filepath ); imagesToCheck.add( uuid ); - log.debug( "Returning UploadInfos" ); + log.debug( "Returning UploadInfos. Client should goint to start the upload. " ); return new UploadInfos( token, Globals.getSslSocketPort(), getNMissingBlocks( image, AMOUNT ) ); } @@ -148,13 +145,14 @@ public class ImageProcessor // insert new client and start listener synchronized ( downloadingClients ) { - DownloadingClient client = new DownloadingClient(); String token = RandomString.generate( 100, false ); String filepath = DbImage.getImageByUUID( uuid ).imagePath; - ConnectionHandler.addConnection( token, filepath, Connection.DOWNLOADING ); + DownloadingClient client = new DownloadingClient(); client.addDownload( uuid, requestedBlocks, token ); downloadingClients.put( serverSessionId, client ); + + ConnectionHandler.addConnection( token, filepath, Connection.DOWNLOADING ).client = client; return new DownloadInfos( token, Globals.getSslSocketPort() ); } } @@ -226,6 +224,11 @@ public class ImageProcessor return result; } + public static List getRequestedBlocks( String token) { + + return null; + } + /** * Checks pending uploads in database and adds them to process list again. */ diff --git a/src/main/java/org/openslx/imagemaster/serverconnection/UploadingImage.java b/src/main/java/org/openslx/imagemaster/serverconnection/UploadingImage.java index e6acb78..0e36175 100644 --- a/src/main/java/org/openslx/imagemaster/serverconnection/UploadingImage.java +++ b/src/main/java/org/openslx/imagemaster/serverconnection/UploadingImage.java @@ -39,7 +39,6 @@ public class UploadingImage this.ts = ts; this.uuid = uuid; this.crcFilename = crcFilename; - log.debug(missingBlocks); } protected void removeBlock( int number ) -- cgit v1.2.3-55-g7522