private void  handle_piece(){
		int count_piece ;
		int totalDown = new File("peer_" + peerProcess.mypeerID).list().length;	
		if(peerProcess.iComp) {
			return;
		}
		
		if(peerProcess.mybitmap.get(((Piece)input).pieceIndex) == true) { 
		peerProcess.logObj.stuff("dup request return from  handle_piece & piece index is "+  ((Piece)input).pieceIndex);
		return;
		 } 
		synchronized(peerProcess.lock){
 peerProcess.logObj.stuff("current piece count: " +peerProcess.get_currentPieceCount()+ "Total piece count "+peerProcess.TotalPieces); 
			peerProcess.putPiece(((Piece)input).pieceBytes,((Piece)input).pieceIndex);
			peerProcess.mybitmap.set(((Piece)input).pieceIndex,true);
			peerProcess.bitMap.put(peerProcess.mypeerID,peerProcess.mybitmap);

			totalDown = new File("peer_" + peerProcess.mypeerID).list().length;
			if(peerProcess.iComp != true)  {
				if(totalDown == peerProcess.TotalPieces){
					peerProcess.iComp = true;
					try{
						peerProcess.fileJoiner();	
					} catch (FileNotFoundException ex){
					}
					peerProcess.logObj.logFinished();
				} 
			}
			try{
			if(peerProcess.downloadRate.get(peerID)==null) peerProcess.downloadRate.put(peerID,0);
			else {
			int temp = peerProcess.downloadRate.get(peerID);
			temp++;
			peerProcess.downloadRate.put(peerID,temp);
			}
			} catch (NullPointerException ex ) { System.out.println("Download rate thingy");}
			peerProcess.set_currentPieceCount();
		}
		Have haveMsg = new Have(((Piece)input).pieceIndex);
		for (Connection c : peerProcess.cMap.values()) {
			peerProcess.write(c.getOutputStream(),haveMsg);
		}
		peerProcess.logObj.logDownloaded(peerID,((Piece)input).pieceIndex , totalDown);
	}