blob: 4f59494c70aa19510732cff34372edcf9afb649e [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2005, 2008 IBM Corporation, Zeligsoft Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
* Zeligsoft - Bug 233004
*
* </copyright>
*
* $Id: SynchRequest.java,v 1.3 2008/08/13 13:24:44 cdamus Exp $
*/
package org.eclipse.egf.core.workspace;
import org.eclipse.emf.ecore.resource.Resource;
/**
* Abstract definition of a single request to synchronize a workspace
* resource change with the EMF resource representation in the editing
* domain.
*
* @author Christian W. Damus (cdamus)
*/
abstract class EGFSynchRequest {
protected final EGFWorkspaceSynchronizer synch;
protected final Resource resource;
/**
* Initializes me with the synchronizer on whose behalf I perform a
* synchronization and the resource whose workspace partner is changed.
*
* @param synch
* the workspace synchronizer
* @param resource
* the resource that has changed
*/
EGFSynchRequest(EGFWorkspaceSynchronizer synch, Resource resource) {
this.synch = synch;
this.resource = resource;
}
/**
* Performs the synchronization on the synchronizer's behalf.
* Clients must hold my {@linkplain #getLock() synchronization lock} when
* calling this method.
*
* @throws InterruptedException
* if the job thread is interrupted while
* attempting to start a read-only transaction in the editing domain
*
* @see #getLock()
*/
public final void perform() throws InterruptedException {
synch.getEditingDomain().runExclusive(new Runnable() {
public void run() {
doPerform();
}
});
}
/**
* Implemented by subclasses to actually perform their synchronization
* by delegation to the synchronizer's delegate.
*/
protected abstract void doPerform();
/**
* Queries whether I am disposed. If I am disposed, then I should not
* be performed. Clients must hold my {@linkplain #getLock() synchronization lock} when calling this method.
*
* @return whether I am disposed
*
* @see #getLock()
* @since 1.2.1
*/
protected final boolean isDisposed() {
return synch.isDisposed();
}
/**
* My synchronization lock, for external synchronization of calls to
* such methods as {@link #isDisposed()} and {@link #perform()}.
* Note that this lock is held while the request is being performed, but
* that this still allows the delegate (if any) to dispose its synchronizer
* during its invocation.
*
* @return my external lock object
*/
final Object getLock() {
return synch;
}
}