/*******************************************************************************
* Copyright (c) 2007 Spring IDE Developers
* 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:
* Spring IDE Developers - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.webflow.core.internal.model.resources;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.springframework.ide.eclipse.core.SpringCoreUtils;
import org.springframework.ide.eclipse.core.internal.model.resources.SpringResourceChangeListener;
import org.springframework.ide.eclipse.webflow.core.internal.model.WebflowModelUtils;
import org.springframework.ide.eclipse.webflow.core.model.IWebflowProject;
/**
* Implementation of {@link IResourceChangeListener} which detects modifications
* to Spring projects (add/remove Spring beans nature, open/close and delete)
* and Spring beans configurations (change and delete).
* <p>
* An implementation of {@link IWebflowResourceChangeEvents} has to be provided.
* Here are callbacks defined for the different events.
* @author Christian Dupuis
* @since 2.0.1
*/
public class WebflowResourceChangeListener extends SpringResourceChangeListener {
private IWebflowResourceChangeEvents events;
public WebflowResourceChangeListener(IWebflowResourceChangeEvents events) {
super(events);
this.events = events;
}
@Override
protected IResourceDeltaVisitor getVisitor(int eventType) {
return new WebflowResourceVisitor(eventType);
}
/**
* Internal resource delta visitor.
*/
protected class WebflowResourceVisitor extends SpringResourceVisitor {
public WebflowResourceVisitor(int eventType) {
super(eventType);
}
@Override
protected boolean resourceAdded(IResource resource) {
if (resource instanceof IFile) {
IFile file = (IFile) resource;
if (isProjectDescriptionFile(file)) {
if (SpringCoreUtils.isSpringProject(file)) {
events.projectDescriptionChanged(file, eventType);
}
} else if (WebflowModelUtils.isWebflowConfig(file)) {
events.configAdded(file, eventType);
}
return false;
}
return super.resourceAdded(resource);
}
@Override
protected boolean resourceChanged(IResource resource, int flags) {
if (resource instanceof IFile) {
if ((flags & IResourceDelta.CONTENT) != 0) {
IFile file = (IFile) resource;
if (isProjectDescriptionFile(file)) {
if (SpringCoreUtils.isSpringProject(file)) {
events.projectDescriptionChanged(file, eventType);
}
} else if (WebflowModelUtils.isWebflowConfig(file)) {
events.configChanged(file, eventType);
}
}
return false;
}
return super.resourceChanged(resource, flags);
}
@Override
protected boolean resourceRemoved(IResource resource) {
if (resource instanceof IFile) {
if (WebflowModelUtils.isWebflowConfig(resource)) {
events.configRemoved((IFile) resource, eventType);
}
return false;
}
return super.resourceRemoved(resource);
}
private boolean isProjectDescriptionFile(IResource resource) {
return resource != null
&& resource.isAccessible()
&& resource.getType() == IResource.FILE
&& resource.getFullPath().segmentCount() == 2
&& resource.getName()
.equals(IWebflowProject.DESCRIPTION_FILE);
}
}
}