blob: fe624e376efb73b9c811419feebd2b58ac70bc04 [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2008-2010 See4sys and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
*
* Contributors:
* See4sys - Initial API and implementation
*
* </copyright>
*/
package org.eclipse.sphinx.platform.resources.syncing;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.sphinx.platform.internal.Activator;
import org.eclipse.sphinx.platform.resources.ResourceDeltaVisitor;
import org.eclipse.sphinx.platform.util.PlatformLogUtil;
public abstract class AbstractResourceSynchronizer<T extends IResourceSyncRequest> implements IResourceChangeListener {
private T fSyncRequest;
protected Set<IResourceSynchronizerDelegate<T>> fSynchronizerDelegates = new HashSet<IResourceSynchronizerDelegate<T>>();
private int lastEventType;
public void addDelegate(IResourceSynchronizerDelegate<T> delegate) {
if (delegate != null) {
if (fSynchronizerDelegates.add(delegate)) {
delegate.setSyncRequest(getSyncRequest());
}
}
}
public void removeDelegate(IResourceSynchronizerDelegate<T> delegate) {
if (delegate != null) {
fSynchronizerDelegates.remove(delegate);
}
}
protected T getSyncRequest() {
if (fSyncRequest == null) {
fSyncRequest = createSyncRequest();
}
return fSyncRequest;
}
protected abstract T createSyncRequest();
/*
* @see
* org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent
* )
*/
@Override
public void resourceChanged(final IResourceChangeEvent event) {
try {
switch (event.getType()) {
case IResourceChangeEvent.PRE_CLOSE:
getSyncRequest().init();
doPreClose(event);
getSyncRequest().perform();
break;
case IResourceChangeEvent.PRE_DELETE:
getSyncRequest().init();
doPreDelete(event);
getSyncRequest().perform();
break;
case IResourceChangeEvent.POST_CHANGE:
if (lastEventType != IResourceChangeEvent.PRE_CLOSE && lastEventType != IResourceChangeEvent.PRE_DELETE) {
getSyncRequest().init();
}
doPostChange(event);
getSyncRequest().perform();
getSyncRequest().dispose();
break;
case IResourceChangeEvent.PRE_BUILD:
getSyncRequest().init();
doPreBuild(event);
getSyncRequest().perform();
getSyncRequest().dispose();
break;
case IResourceChangeEvent.POST_BUILD:
getSyncRequest().init();
doPostBuild(event);
getSyncRequest().perform();
getSyncRequest().dispose();
break;
case IResourceChangeEvent.PRE_REFRESH:
getSyncRequest().init();
doPreRefresh(event);
getSyncRequest().perform();
getSyncRequest().dispose();
break;
default:
break;
}
} catch (Exception ex) {
PlatformLogUtil.logAsError(Activator.getDefault(), ex);
} finally {
lastEventType = event.getType();
}
}
protected void doPreClose(final IResourceChangeEvent event) {
try {
IResource resource = event.getResource();
if (resource instanceof IProject) {
for (IResourceSynchronizerDelegate<T> delegate : fSynchronizerDelegates) {
delegate.handleProjectAboutToBeClosed((IProject) resource);
}
}
} catch (Exception ex) {
PlatformLogUtil.logAsError(Activator.getDefault(), ex);
}
}
protected void doPreDelete(final IResourceChangeEvent event) {
try {
IResource resource = event.getResource();
if (resource instanceof IProject) {
for (IResourceSynchronizerDelegate<T> delegate : fSynchronizerDelegates) {
delegate.handleProjectAboutToBeDeleted((IProject) resource);
}
}
} catch (Exception ex) {
PlatformLogUtil.logAsError(Activator.getDefault(), ex);
}
}
protected void doPostChange(final IResourceChangeEvent event) {
visitResourceDelta(event);
}
protected final void doPreBuild(IResourceChangeEvent event) {
visitResourceDelta(event);
}
protected final void doPostBuild(IResourceChangeEvent event) {
visitResourceDelta(event);
}
protected void doPreRefresh(IResourceChangeEvent event) {
// Nothing to do
}
protected final void visitResourceDelta(IResourceChangeEvent event) {
try {
IResourceDelta delta = event.getDelta();
if (delta != null) {
IResourceDeltaVisitor visitor = new ResourceDeltaVisitor(event.getType(), fSynchronizerDelegates);
delta.accept(visitor);
}
} catch (Exception ex) {
PlatformLogUtil.logAsError(Activator.getDefault(), ex);
}
}
}