From 3aa85cd588b745fb2537dbe748580d9c3b980133 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 8 Sep 2015 17:38:07 +0200 Subject: Compilable... --- .../serverconnection/ConnectionHandler.java | 196 +++++++++------------ 1 file changed, 79 insertions(+), 117 deletions(-) (limited to 'src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java') diff --git a/src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java b/src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java index 12b5701..9340706 100644 --- a/src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java +++ b/src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java @@ -1,17 +1,11 @@ package org.openslx.imagemaster.serverconnection; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; -import java.security.KeyManagementException; import java.security.KeyStore; -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; -import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -20,16 +14,22 @@ import javax.net.ssl.KeyManager; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; -import org.apache.commons.lang.mutable.MutableInt; import org.apache.log4j.Logger; +import org.openslx.bwlp.thrift.iface.ImagePublishData; +import org.openslx.bwlp.thrift.iface.InvocationError; +import org.openslx.bwlp.thrift.iface.TInvocationException; +import org.openslx.bwlp.thrift.iface.TTransferRejectedException; +import org.openslx.bwlp.thrift.iface.TransferInformation; import org.openslx.filetransfer.Downloader; -import org.openslx.filetransfer.FileRange; import org.openslx.filetransfer.IncomingEvent; import org.openslx.filetransfer.Listener; import org.openslx.filetransfer.Uploader; -import org.openslx.filetransfer.WantRangeCallback; import org.openslx.imagemaster.Globals; -import org.openslx.imagemaster.db.DbImage; +import org.openslx.imagemaster.crcchecker.CrcFile; +import org.openslx.imagemaster.db.mappers.DbOsVirt; +import org.openslx.imagemaster.db.mappers.DbUser; +import org.openslx.imagemaster.util.RandomString; +import org.openslx.imagemaster.util.Util; /** * Class to handle all incoming and outgoing connections. @@ -41,8 +41,8 @@ public class ConnectionHandler implements IncomingEvent private static Logger log = Logger.getLogger( ConnectionHandler.class ); private static SSLContext sslContext; - private static Map pendingIncomingUploads = new ConcurrentHashMap<>(); - private static Map pendingIncomingDownloads = new ConcurrentHashMap<>(); + private static Map pendingIncomingUploads = new ConcurrentHashMap<>(); + private static Map pendingIncomingDownloads = new ConcurrentHashMap<>(); private static IncomingEvent eventHandler = new ConnectionHandler(); private static ThreadPoolExecutor uploadPool = new ThreadPoolExecutor( 0, 5, 6, TimeUnit.MINUTES, new SynchronousQueue() ); private static ThreadPoolExecutor downloadPool = new ThreadPoolExecutor( 0, 5, 6, TimeUnit.MINUTES, new SynchronousQueue() ); @@ -61,32 +61,67 @@ public class ConnectionHandler implements IncomingEvent sslContext = SSLContext.getInstance( "SSLv3" ); KeyManager[] keyManagers = kmf.getKeyManagers(); sslContext.init( keyManagers, null, null ); - listener = new Listener( eventHandler, sslContext, Globals.getSslSocketPort() ); + listener = new Listener( eventHandler, sslContext, Globals.getSslSocketPort(), 15000 ); listener.start(); - } catch ( FileNotFoundException e ) { - log.error( "Could not find keystore." ); - System.exit( 2 ); - } catch ( KeyStoreException e ) { - log.error( "KeyStore implemenation not supported." ); - System.exit( 2 ); - } catch ( NoSuchAlgorithmException e ) { - log.error( "Could not find such Algorithm" ); - System.exit( 2 ); - } catch ( CertificateException e ) { - log.error( "Certificate unvalid." ); - System.exit( 2 ); - } catch ( IOException e ) { - log.error( "Could not read keyfile" ); - System.exit( 2 ); - } catch ( UnrecoverableKeyException e ) { - log.error( "Key in keystore is not valid" ); - System.exit( 2 ); - } catch ( KeyManagementException e ) { - log.error( "Context initialization failed." ); + } catch ( Exception e ) { + log.error( "Initialization failed.", e ); System.exit( 2 ); } } + /** + * Checks if this image is already uploading and returns a new list with missing blocks if so. + * Puts the new image into processing list else. + * + * @param serverSessionId The uploading server + * @param imageData The data of the image + * @return + * @throws UploadException If some error occurred during the process + */ + public static TransferInformation getUploadInfos( ImagePublishData imageData, List crcSums ) + throws TTransferRejectedException, TInvocationException + { + // check image data + if ( Util.isEmpty( imageData.imageName ) ) + throw new TInvocationException( InvocationError.INVALID_DATA, "Image name not set" ); + if ( !DbUser.exists( imageData.user ) ) + throw new TInvocationException( InvocationError.INVALID_DATA, "Invalid or missing image owner" ); + if ( DbOsVirt.osExists( imageData.osId ) ) + throw new TInvocationException( InvocationError.INVALID_DATA, "Content operating system not set" ); + if ( DbOsVirt.virtExists( imageData.virtId ) ) + throw new TInvocationException( InvocationError.INVALID_DATA, "Content virtualizer system not set" ); + if ( imageData.fileSize <= 0 ) + throw new TInvocationException( InvocationError.INVALID_DATA, "File size is too small" ); + + log.debug( "A satellite is submitting " + imageData.imageVersionId ); + + final String uuid = imageData.imageVersionId; + final String filepathRelative; + final CrcFile crcFile; + if ( crcSums == null ) { + crcFile = null; + } else { + crcFile = new CrcFile( crcSums ); + } + ImagePublishData image; + + synchronized ( pendingIncomingUploads ) { + /* + // check if image is already uploading + if ( ( image = uploadingImages.get( uuid ) ) == null ) { + // TODO insert new image to DB + uploadingImages.put( uuid, image ); + } + */ + } + + final String token = RandomString.generate( 50, false ); + + // TODO addUpload( token, image ); + // TODO Set crc file on image - if there is already a crc file assigned, this does nothing + return new TransferInformation( token, Globals.getPlainSocketPort(), Globals.getSslSocketPort() ); + } + /** * Add a new allowed incoming upload connection * for the given token and image. @@ -94,7 +129,7 @@ public class ConnectionHandler implements IncomingEvent * @param token The unique token * @param image Image being uploaded */ - public static void addUpload( String token, UploadingImage image ) + public static void addUpload( String token, AbstractTransfer image ) { pendingIncomingUploads.put( token, image ); log.debug( "Added upload" ); @@ -107,7 +142,7 @@ public class ConnectionHandler implements IncomingEvent * @param token The unique token * @param image Image being uploaded */ - public static void addDownload( String token, DbImage image ) + public static void addDownload( String token, AbstractTransfer image ) { pendingIncomingDownloads.put( token, image ); log.debug( "Added download" ); @@ -117,94 +152,21 @@ public class ConnectionHandler implements IncomingEvent * Server is uploading - client is downloading! */ @Override - public void incomingUploader( final Uploader uploader ) + public void incomingDownloadRequest( final Uploader uploader ) { - String token = uploader.getToken(); - // check token to identify the client - if ( token == null ) { - uploader.sendErrorCode( "No token available." ); - uploader.close( null ); - return; - } - - final DbImage image = pendingIncomingDownloads.remove( token ); - if ( image == null ) { - uploader.sendErrorCode( "Token not accepted." ); - uploader.close( null ); - return; - } - - try { - uploadPool.execute( new Runnable() { - @Override - public void run() - { - uploader.upload( image.getAbsolutePath() ); - } - } ); - } catch ( RejectedExecutionException e ) { - uploader.sendErrorCode( "Too many concurrent uploads." ); - uploader.close( null ); - } + // TODO + uploader.sendErrorCode( "Too many concurrent uploads." ); + uploader.cancel(); } /** * Server is downloading - client is uploading! */ @Override - public void incomingDownloader( final Downloader downloader ) throws IOException + public void incomingUploadRequest( final Downloader downloader ) throws IOException { - log.debug( "Client wants to upload" ); - String token = downloader.getToken(); - if ( token == null ) - { - downloader.sendErrorCode( "No token available." ); - downloader.close( null ); - return; - } - - final UploadingImage image = pendingIncomingUploads.remove( token ); - if ( image == null ) { - downloader.sendErrorCode( "Token not accepted." ); - downloader.close( null ); - return; - } - final MutableInt lastBlock = new MutableInt( -1 ); - - try { - downloadPool.execute( new Runnable() { - @Override - public void run() - { - downloader.download( image.getAbsolutePath(), new WantRangeCallback() { - @Override - public FileRange get() - { - if ( lastBlock.intValue() != -1 ) { - image.setNeedsCheck( lastBlock.intValue() ); - image.increaseTransmittedTimes( lastBlock.intValue() ); - } - // get start of range. - int blockNumber = image.getNextMissingBlock(); - if ( blockNumber == -1 ) { - log.debug( "Download complete." ); - return null; - } - lastBlock.setValue( blockNumber ); - log.debug( "Block " + blockNumber + " was transmitted " + image.getTimesTransmitted( blockNumber ) + " time(s)." ); - - long startOfRange = image.getNextMissingBlock() * Globals.blockSize; - long endOfRange = Math.min( startOfRange + Globals.blockSize, image.getFileSize() ); - FileRange range = new FileRange( startOfRange, endOfRange ); - return range; - } - } ); - image.updateDb(); - } - } ); - } catch ( RejectedExecutionException e ) { - downloader.sendErrorCode( "Too many concurrent downloads." ); - downloader.close( null ); - } + // TODO + downloader.sendErrorCode( "Too many concurrent downloads." ); + downloader.cancel(); } } -- cgit v1.2.3-55-g7522