// Path: halvade_upload_tool/src/be/ugent/intec/halvade/uploader/Logger.java
// public class Logger {
//     /*
//      * levels of debugging
//      * 0: INFO
//      * 1: DEBUG
//      * 2: EXCEPTION
//      * 3:ALL
//      */
//     private static int LEVEL = 0;
//     private static final int EXCEPTION = 2;
//     private static final int DEBUG = 1;
//     private static final int INFO = 0;
//     
//     
//     // TODO use configuration set LEVEL
//     public static void SETLEVEL(int NEWLEVEL) {
//         LEVEL = NEWLEVEL;
//     }
//     
//     public static void EXCEPTION(Exception ex){
//         System.err.println("[EXCEPTION] " + ex.getLocalizedMessage());
//         ex.printStackTrace();
//     }
//     
//     public static void THROWABLE(Throwable ex){
//         System.err.println("[EXCEPTION] " + ex.getLocalizedMessage());
//         ex.printStackTrace();
//     }
//     
//     public static void DEBUG(String message) {
//         if(LEVEL >= DEBUG)
//             System.err.println("[" + Timer.getGlobalTime() + " - DEBUG] " + message);
//     }
//     
//     public static void INFO(String message) {
//         if(LEVEL >= INFO)
//             System.err.println("[INFO] " + message);
//     }
//     
//     public static void DEBUG(String message, int level) {
//         if(LEVEL >= level)
//             System.err.println("[" + Timer.getGlobalTime() + " - DEBUG] " + message);
//     }
// }


import be.ugent.intec.halvade.uploader.Logger;
import java.io.IOException;
import java.util.ArrayList;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;
            ReadBlock block = null;
            while((check || blocks.size() > 0) && block == null) {
//                Logger.INFO("get block" + blocks.size());
                block = blocks.poll(1000, TimeUnit.MILLISECONDS);
            }
            return block;
        } catch (InterruptedException ex) {
            Logger.EXCEPTION(ex);
            return null;
        }
    }
    
    
    @Override
    protected int addNextRead(ReadBlock block) throws IOException {
        return currentReader.addNextRead(block);
    }
    
    protected synchronized boolean getNextReader() {
//        Logger.INFO("getting next reader");
        if(currentReader == null) {
//            Logger.INFO("reader is null");
            if(readers.size() > 0) {
//                Logger.INFO("get first reader");
                // close reader?
                currentReader = readers.remove(0);
                Logger.INFO("Processing " + currentReader);
                return true;
            } else {
                Logger.DEBUG("Processed all readers");
// Path: halvade_upload_tool/src/be/ugent/intec/halvade/uploader/Logger.java
// public class Logger {
//     /*
//      * levels of debugging
//      * 0: INFO
//      * 1: DEBUG
//      * 2: EXCEPTION
//      * 3:ALL
//      */
//     private static int LEVEL = 0;
//     private static final int EXCEPTION = 2;
//     private static final int DEBUG = 1;
//     private static final int INFO = 0;
//     
//     
//     // TODO use configuration set LEVEL
//     public static void SETLEVEL(int NEWLEVEL) {
//         LEVEL = NEWLEVEL;
//     }
//     
//     public static void EXCEPTION(Exception ex){
//         System.err.println("[EXCEPTION] " + ex.getLocalizedMessage());
//         ex.printStackTrace();
//     }
//     
//     public static void THROWABLE(Throwable ex){
//         System.err.println("[EXCEPTION] " + ex.getLocalizedMessage());
//         ex.printStackTrace();
//     }
//     
//     public static void DEBUG(String message) {
//         if(LEVEL >= DEBUG)
//             System.err.println("[" + Timer.getGlobalTime() + " - DEBUG] " + message);
//     }
//     
//     public static void INFO(String message) {
//         if(LEVEL >= INFO)
//             System.err.println("[INFO] " + message);
//     }
//     
//     public static void DEBUG(String message, int level) {
//         if(LEVEL >= level)
//             System.err.println("[" + Timer.getGlobalTime() + " - DEBUG] " + message);
//     }
// }


// Path: halvade_upload_tool/src/be/ugent/intec/halvade/uploader/input/FileReaderFactory.java
import be.ugent.intec.halvade.uploader.Logger;
import java.io.IOException;
import java.util.ArrayList;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

            ReadBlock block = null;
            while((check || blocks.size() > 0) && block == null) {
//                Logger.INFO("get block" + blocks.size());
                block = blocks.poll(1000, TimeUnit.MILLISECONDS);
            }
            return block;
        } catch (InterruptedException ex) {
            Logger.EXCEPTION(ex);
            return null;
        }
    }
    
    
    @Override
    protected int addNextRead(ReadBlock block) throws IOException {
        return currentReader.addNextRead(block);
    }
    
    protected synchronized boolean getNextReader() {
//        Logger.INFO("getting next reader");
        if(currentReader == null) {
//            Logger.INFO("reader is null");
            if(readers.size() > 0) {
//                Logger.INFO("get first reader");
                // close reader?
                currentReader = readers.remove(0);
                Logger.INFO("Processing " + currentReader);
                return true;
            } else {
                Logger.DEBUG("Processed all readers");
                return false;