private synchronized boolean handleReservationJob(Gridlet gridlet) {
        int reqPE = gridlet.getNumPE();
    	SSGridlet sgl = new SSGridlet(gridlet);
    	long runTime = super.forecastExecutionTime(ratingPE, sgl.getLength());
    	ServerReservation sRes = reservTable.get(gridlet.getReservationID());
    	
    	//-------------------- FOR DEBUGGING PURPOSES ONLY ---------------------
    	visualizer.notifyListeners(this.get_id(), ActionType.ITEM_ARRIVED, true, sgl);
    	//----------------------------------------------------------------------
    	
    	if(sRes == null) {
    		String userName = GridSim.getEntityName( gridlet.getUserID() );
    		logger.info("Gridlet #" + gridlet.getGridletID() + " from " +
	                userName + " cannot be accepted because the reservation #" +
		            gridlet.getReservationID() + " has not been found.");
    		return false;
    	}
    	// job requires more PEs than what the reservation currently has
    	else if( sRes.getNumRemainingPE() < reqPE ) {
	    	String userName = GridSim.getEntityName( gridlet.getUserID() );
	    	logger.info("Gridlet #" + gridlet.getGridletID() + " from " +
		            userName + " cannot be accepted because the reservation #" +
			        sRes.getID() + " has only " + sRes.getNumRemainingPE() + " PEs.");
	    	return false;
    	}
    	// job is expected to run for longer than the time previously reserved
    	else if (runTime > sRes.getRemainingTime()) {
    		String userName = GridSim.getEntityName( gridlet.getUserID() );
    		logger.info("Gridlet #" + gridlet.getGridletID() + " from " +
	                userName + " cannot be accepted because the reservation #" +
		            sRes.getID() + " has a remaining time of " + 
		            sRes.getRemainingTime() + " seconds," +
		            " whereas the gridlet is expected to run for " +
		            runTime + " seconds.");
    		return false;
    	}

    	double startTime = Math.max(sRes.getStartTime(), GridSim.clock());
       	PERangeList selected = sRes.selectPERangeList(reqPE);
       	sgl.setPERangeList(selected);
   		sgl.setStartTime(startTime);
   		sgl.setActualFinishTime(startTime + runTime);
   		sgl.setStatus(Gridlet.QUEUED);
   		waitingJobs.add(sgl);
   		
        // if reservation has not been committed, then commit the reservation
        if (sRes.getReservationStatus() == ReservationStatus.NOT_COMMITTED) {
           	sRes.setStatus(ReservationStatus.COMMITTED);
           	super.sendInternalEvent(sRes.getStartTime() - GridSim.clock(), 
           			ConservativeBackfill.UPT_SCHEDULE);
        }
        
        super.sendInternalEvent(startTime - GridSim.clock(), 
        		ConservativeBackfill.UPT_SCHEDULE);
        
    	//------------------ FOR DEBUGGING PURPOSES ONLY ----------------
    	visualizer.notifyListeners(this.get_id(), ActionType.ITEM_SCHEDULED, true, sgl);
    	//---------------------------------------------------------------
    	return true;
    }