/******************************************************************************* * Copyright (c) 2005, 2009 eXXcellent solution gmbh 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: * Achim Demelt - initial API and implementation *******************************************************************************/ package org.eclipse.xpand2.incremental; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.emf.mwe.core.WorkflowContext; import org.eclipse.emf.mwe.core.issues.Issues; import org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent; import org.eclipse.emf.mwe.core.monitor.ProgressMonitor; import org.eclipse.xpand.incremental.trace.OutputFile; import org.eclipse.xpand.incremental.trace.Trace; import org.eclipse.xpand2.output.Outlet; public class FileCleaner extends AbstractWorkflowComponent { private String oldTraceModelSlot; private String newTraceModelSlot; private Map<String, Outlet> outlets = new HashMap<String, Outlet>(); private Outlet defaultOutlet; public void setOldTraceModelSlot(String oldTraceModelSlot) { this.oldTraceModelSlot = oldTraceModelSlot; } public void setNewTraceModelSlot(String newTraceModelSlot) { this.newTraceModelSlot = newTraceModelSlot; } public void addOutlet(Outlet outlet) { if (outlet == null) { return; } if (outlet.getName() == null) { defaultOutlet = outlet; } else { outlets.put(outlet.getName(), outlet); } } public void checkConfiguration(Issues issues) { if (oldTraceModelSlot == null) { issues.addError("oldTraceModelSlot must be set."); } if (newTraceModelSlot == null) { issues.addError("newTraceModelSlot must be set."); } if (outlets.isEmpty() && defaultOutlet == null) { issues.addError("outlets must be given."); } } @Override protected void invokeInternal(WorkflowContext ctx, ProgressMonitor monitor, Issues issues) { Trace oldTraceModel = (Trace) ctx.get(oldTraceModelSlot); if (oldTraceModel == null) { issues.addWarning(this, "oldTraceModelSlot " + oldTraceModelSlot + " is empty. Not cleaning any files."); return; } Trace newTraceModel = (Trace) ctx.get(newTraceModelSlot); if (newTraceModel == null) { issues.addWarning(this, "newTraceModelSlot " + newTraceModelSlot + " is empty. Not cleaning any files."); return; } // collect files to delete. that's all files that were generated in the old run (i.e. are // contained in the oldTraceModel), but are no longer generated in the new run List<OutputFile> toDelete = new ArrayList<OutputFile>(oldTraceModel.getOutputFiles()); for (OutputFile oldFile : oldTraceModel.getOutputFiles()) { for (OutputFile newFile : newTraceModel.getOutputFiles()) { if (isSameFile(oldFile, newFile)) { toDelete.remove(oldFile); } } } // now delete that int count = 0; for (OutputFile f : toDelete) { Outlet o = f.getOutlet() == null ? defaultOutlet : outlets.get(f.getOutlet()); File deleteMe= new File(o.getPath() + File.separator + f.getFileName()); if (!deleteMe.delete()) { issues.addWarning(this, "Could not delete file " + deleteMe.getAbsolutePath()); } else { count++; } } // and give some feedback if (count > 0) { issues.addInfo(this, "Deleted " + count + " files."); } } private boolean isSameFile(OutputFile oldFile, OutputFile newFile) { return oldFile.getFileName().equals(newFile.getFileName()) && (oldFile.getOutlet() == null ? newFile.getOutlet() == null : oldFile.getOutlet().equals(newFile.getOutlet())); } }