package org.openslx.satellitedaemon.filetransfer; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.openslx.filetransfer.Downloader; import org.openslx.filetransfer.FileRange; import org.openslx.filetransfer.WantRangeCallback; import org.openslx.imagemaster.thrift.iface.DownloadData; import org.openslx.satellitedaemon.Globals; import org.openslx.satellitedaemon.Identity; import org.openslx.satellitedaemon.db.DbImage; import org.openslx.satellitedaemon.db.DbImage.Status; public class FileDownloadWorker implements Runnable { private static Logger log = Logger.getLogger( FileDownloadWorker.class ); @Override public void run() { while ( true ) { List imageList = DbImage.getAllMarkedForDownload(); log.info( "imageList Contains " + imageList.size() + " items." ); for ( final DbImage image : imageList ) { List range = new ArrayList(); for ( long i = 0; i < ( image.fileSize / Globals.BLOCKSIZE ); i++ ) { range.add( (int)i ); } DownloadData downInfos = ThriftConnection.getDownloadInfos( image ); if ( downInfos == null ) { log.error( "The DownloadInfos returned by ThriftConnection class are null" ); continue; } // create new instance of Downloader. Downloader d; try { d = new Downloader( Globals.getMasterserverHost(), downInfos.port, Globals.getMasterServerSslContext(), downInfos.token ); } catch ( IOException e ) { e.printStackTrace(); continue; } // start downloading process. d.download( Globals.getImageFolder() + "/" + image.path, new WantRangeCallback() { long pos = 0; long size = image.fileSize; @Override public FileRange get() { // get start of range. if ( pos >= size ) { log.debug( "Download completed." ); image.updateStatus( Status.successfully_decentralized ); return null; } long startOfRange = pos; long endOfRange = Math.min( pos + Globals.BLOCKSIZE, image.fileSize ); FileRange range = new FileRange( startOfRange, endOfRange ); pos += Globals.BLOCKSIZE; return range; } } ); } try { Thread.sleep( 5 * 60 * 1000 ); } catch ( InterruptedException e ) { Thread.currentThread().interrupt(); return; } } } }