import java.awt.Frame;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class RWLockTest {

    protected static ReadWriteLock createLock(String lockClassName) {
	ReadWriteLock lock = null;
	try {
	    lock = (ReadWriteLock)Class.forName(lockClassName).newInstance();
	} catch (Exception e) {
	    System.err.println(e);
	    System.exit(1);
	}
	return lock;
    }

    protected static Frame createFrame(String title,
				       DataViewer dv1,
				       DataViewer dv2) {
	Frame f = new Frame(title);
	f.setBackground(Color.black);

	f.addWindowListener(new WindowAdapter() {
		public void windowClosed(WindowEvent we) {
		    System.exit(0);
		}
		public void windowClosing(WindowEvent we) {
		    System.exit(0);
		}
	    });

	f.setLayout(new FlowLayout(FlowLayout.LEFT, 2, 2));
	f.add(dv1);
	f.add(dv2);

	f.setSize(380, 480);
	f.setVisible(true);

	return f;
    }

    public static void main(String[] args) {
	String lockType = args[0];

	DataKeeper data = new DataKeeper(createLock(lockType));
	DataGenerator dg = new DataGenerator(data);
	DataViewer dv1 = new DataViewer(data);
	DataViewer dv2 = new DataViewer(data);

	Frame f = createFrame("Read-Write Lock Test", dv1, dv2);
	
	dv1.start();
	dv2.start();

	dg.start();
    }
}
