
import java.util.LinkedList;

public class Channel {

    private int bufferSize;
    private LinkedList<String> buffer = new LinkedList<>();

    public Channel(int bufferSize) {
        this.bufferSize = bufferSize;
    }
    
    public int size() {
        return buffer.size();
    }

    public synchronized void put(String data) {
        while (size() >= bufferSize) {
            try {
                wait();
            } catch (InterruptedException e) { /* empty */ }
        }

        buffer.add(data);
        printBuffer();
        notifyAll();
    }

    public synchronized String take() {
        while (size() <= 0) {
            try {
                wait();
            } catch (InterruptedException e) { /* empty */ }
        }

        String data = buffer.remove();
        printBuffer();
        notifyAll();
        return data;
    }

    private void printBuffer() {
        System.out.print(" buffer = [");
        for (String elem : buffer) {
            System.out.print(" " + elem);
        }
        System.out.println(" ]");
    }
}

    
