/*******************************************************************************
* Copyright (c) 2009, 2010 Innovation Gate GmbH.
* 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:
* Innovation Gate GmbH - initial API and implementation
******************************************************************************/
package de.innovationgate.eclipse.editors.all;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
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.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import de.innovationgate.eclipse.editors.Plugin;
import de.innovationgate.eclipse.utils.wga.WGADesignStructureHelper;
/**
* this resource change listener is responsible for keeping tml metadata files up to date
* for e.g.
* - deletion of an tml file should also delete the metadata file if present
* - moving/renaming an tml file should also move the metadata file
*
*
*/
public class TMLMetadataFileMaintainer implements IResourceChangeListener {
private Set<IFile> _metaDataFilesToRemove = new HashSet<IFile>();
private Map<IFile, IFile> _metaDataFilesToMove = new HashMap<IFile, IFile>();
public void resourceChanged(IResourceChangeEvent event) {
if (event.getType() == IResourceChangeEvent.POST_CHANGE) {
IResourceDelta delta = event.getDelta();
if (delta != null) {
try {
delta.accept(new IResourceDeltaVisitor() {
public boolean visit(IResourceDelta delta) throws CoreException {
if (delta.getResource() instanceof IFile) {
IFile file = (IFile) delta.getResource();
if (file != null && file.getLocation() != null && file.getLocation().getFileExtension() != null &&
file.getLocation().getFileExtension().equals("tml")) {
// a tml file changed
if (delta.getKind() == IResourceDelta.REMOVED) {
// tml file removed
IFile metadataFile = WGADesignStructureHelper.getMetadataFile(file);
if (metadataFile.exists()) {
_metaDataFilesToRemove.add(metadataFile);
}
} else if (delta.getKind() == IResourceDelta.ADDED && delta.getMovedFromPath() != null) {
// tml file moved from another location
IFile orgFile = ResourcesPlugin.getWorkspace().getRoot().getFile(delta.getMovedFromPath());
IFile metadataFileFrom = WGADesignStructureHelper.getMetadataFile(orgFile);
if (metadataFileFrom.exists()) {
IFile metadataFileTo = WGADesignStructureHelper.getMetadataFile(file);
_metaDataFilesToMove.put(metadataFileFrom, metadataFileTo);
}
}
}
}
return true;
}
});
} catch (CoreException e) {
Plugin.getDefault().logError("Unable to execute TMLMetadataMaintenance." , e);
}
}
} else if (event.getType() == IResourceChangeEvent.PRE_BUILD) {
Iterator<IFile> moveFromFiles = _metaDataFilesToMove.keySet().iterator();
while (moveFromFiles.hasNext()) {
IFile moveFrom = moveFromFiles.next();
IFile moveToFile = _metaDataFilesToMove.get(moveFrom);
try {
if (moveToFile.getParent() instanceof IFolder) {
IFolder folder = (IFolder) moveToFile.getParent();
if (!folder.exists()) {
folder.create(true,true, new NullProgressMonitor());
}
moveFrom.move(moveToFile.getFullPath(), true, new NullProgressMonitor());
}
} catch (CoreException e) {
Plugin.getDefault().logError("Unable to execute TMLMetadataMaintenance." , e);
}
}
Iterator<IFile> removeFiles = _metaDataFilesToRemove.iterator();
while (removeFiles.hasNext()) {
try {
removeFiles.next().delete(true, new NullProgressMonitor());
} catch (CoreException e) {
Plugin.getDefault().logError("Unable to execute TMLMetadataMaintenance." , e);
}
}
_metaDataFilesToMove.clear();
_metaDataFilesToRemove.clear();
}
}
}