/*
 * Created on Oct 26, 2004
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package org.eclipse.wst.common.internal.emf;

import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.jobs.ILock;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.wst.common.internal.emf.utilities.ResourceIsLoadingAdapter;





/**
 * The ResourceSynchronizedIsLoadingAdapter is used to synchronize the loading 
 * of EMF resources. This is the Eclipse version of ResourceIsLoadingAdapter,
 * and uses the Eclipse ILock technology to acquire a semaphore until the 
 * Resource is loaded. the waitForResourceToLoad() method will pause until
 * either (a) the Resource has loaded, the Adapter is notified, and the 
 * semaphore is released or (b) the DELAY timeout is exceeded, which prevents
 * full deadlock. 
 * 
 * @author mdelder 
 */
public class ResourceSynchronizedIsLoadingAdapter extends ResourceIsLoadingAdapter {
    
    private final ILock loadingLock;
    
    /**
     * The delay is default to 5 minutes. This is the upward threshhold. The lock
     * will wait up to DELAY milliseconds to acquire the lock, and bail if not. It 
     * does not mean that it will wait DELAY milliseconds always. In general, the 
     * wait should be almost instanteous -- just as long as document loading remains
     * speedy. 
     */
    private static final long DELAY = 300000; 
    
    public ResourceSynchronizedIsLoadingAdapter() {
        loadingLock = Platform.getJobManager().newLock();
        if(loadingLock != null)
            loadingLock.acquire();
    }    
    
    
    /* (non-Javadoc)
     * @see com.ibm.wtp.internal.emf.utilities.ResourceIsLoadingAdapter#waitForResourceToLoad()
     */
    public void waitForResourceToLoad() { 
        
        if(loadingLock == null)
            return;
        
        boolean lockAcquired = false;
        try {
            if( loadingLock != null ) 
                if( !(lockAcquired = loadingLock.acquire(DELAY)) )  
                    logWarning(); 
        } catch (Throwable t) { 
        } finally {
            if(lockAcquired)
                loadingLock.release();
        }
        
    }
    
    
    /**
     * 
     */
    private void logWarning() { 
        Notifier target = getTarget();
        if(target == null || !(target instanceof Resource)) { 
            Resource resource = (Resource) target;
            System.err.println("[WARNING] Could not acquire Semaphore Lock for Resource: \""+resource.getURI() + "\" in " + getClass());
        }
        
    }


    /* (non-Javadoc)
     * @see com.ibm.wtp.internal.emf.utilities.ResourceIsLoadingAdapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
     */
    public void notifyChanged(Notification notification) { 

		if (notification.getNotifier() != null) {		    
			//listen for the remove of the loading adapter
			if (isSetLoadedResourceNotification(notification)) {
			    if(loadingLock != null)
			        loadingLock.release();
				removeIsLoadingSupport();  				
			}
		}         
    }
    
    
    /* (non-Javadoc)
     * @see com.ibm.wtp.internal.emf.utilities.ResourceIsLoadingAdapter#forceRelease()
     */
    public void forceRelease() { 
        try {
	        if(loadingLock != null && loadingLock.getDepth() > 0)
	            loadingLock.release();
        } catch(Throwable t) {}
    }

}
