/** | |
* <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; | |
} | |
} |