/*
 * $Id: RWLock.java,v 1.2 2003/11/14 15:37:34 jonyp Exp $
 *
 * Copyright (c) Siemens AG 2008 
 *           (c) Universität Paderborn 2008 
 * Licensed under EUPL 1.1. 
 *
 * $Log: RWLock.java,v $
 * Revision 1.2  2003/11/14 15:37:34  jonyp
 * *** empty log message ***
 *
 * Revision 1.1  2002/10/21 14:36:15  bigmac
 * *** empty log message ***
 *
 * Revision 1.1  2002/04/29 14:35:06  koppy
 * Vergabe von exklusiven Schreib- /Leserechten
 *
 *
 */


package vkc.server.archive;

import java.util.HashSet;


public class RWLock {
    
    private static final boolean  debug             = false;
    private HashSet               lockedForWriting  = new HashSet(); 
    private HashSet               lockedForReading  = new HashSet();

    public RWLock (){
	
    }


    /**
     * Sperrt den Zugriff auf den Datensatz der uebergebenen ID 
     *
     * @param id - Sperrung fuer diese ID     
     * @author koppy
     */
    public synchronized void forReading( String id ) {

	
	while( lockedForWriting.contains( id ) ) {

	    try {
		wait();
	    }
	    catch( InterruptedException e ) {}
	}	
       
	lockedForReading.add( id );

	if( debug ) System.out.println( "Locked for READING: " + id );
	
    }


    /**
     * Sperrt den Zugriff auf den Datensatz der angeforderten ID
     *
     * @param id - Sperre fuer diese ID     
     * @author koppy
     */
    public synchronized void forWriting( String id ) {
	
	
	while( lockedForReading.contains( id )
	       || lockedForWriting.contains( id ) ) {

	    try {		
		
		wait();
	    }
	    catch( InterruptedException e ) {}
	}	

	lockedForWriting.add( id );
	
	if( debug ) System.out.println( "Locked for WRITING: " + id );
		
	
    }
   


    /**
     * Hebt die Lese-Sperre auf den Datensatz der uebergebenen ID auf
     *
     * @param id - fuer diese ID     
     * @author koppy
     */
    public synchronized void releaseReading( String id ) {


	if( lockedForReading.remove( id ) ) {	    

	    notify();

	}

    }

    
    /**
     * Hebt die Schreib-Sperre auf den Datensatz der uebergebenen ID auf
     *
     * @param id - fuer diese ID     
     * @author koppy
     */
    public synchronized void releaseWriting( String id ) {


	if( lockedForWriting.remove( id ) ) {	    

	    notify();

	}

    }    

    
}














