/* * Copyright 2014 Bernd Vogt and others. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.sourcepit.b2.internal.cleaner; import static java.io.File.separator; import static org.sourcepit.b2.files.ModuleDirectory.FLAG_DERIVED; import static org.sourcepit.common.utils.file.FileUtils.deleteFileOrDirectory; import static org.sourcepit.common.utils.path.PathUtils.getRelativePath; import java.io.File; import java.io.IOException; import java.util.HashSet; import java.util.Set; import javax.inject.Named; import javax.inject.Singleton; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sourcepit.b2.files.FileVisitor; import org.sourcepit.b2.files.ModuleDirectory; @Named @Singleton public class FileServie implements IFileService { private static final Logger LOGGER = LoggerFactory.getLogger(FileServie.class); private class Cleaner implements FileVisitor<IOException> { private final File moduleDir; private int counter = 0; public int getCounter() { return counter; } private Cleaner(File moduleDir) { this.moduleDir = moduleDir; } @Override public boolean visit(File file, int flags) throws IOException { if ((FLAG_DERIVED & flags) != 0) { LOGGER.debug("Deleting '" + getRelativePath(file, moduleDir, separator) + "'"); deleteFileOrDirectory(file); counter++; return false; } return true; } } private final Set<String> ignored; public FileServie() { ignored = new HashSet<String>(); ignored.add(".svn"); ignored.add(".CVS"); ignored.add(".git"); } public void clean(ModuleDirectory moduleDirectory) throws IOException { final File moduleDir = moduleDirectory.getFile(); int counter = 0; final File fileFlagsFile = new File(moduleDir, ".b2/moduleDirectory.properties"); if (fileFlagsFile.exists()) { counter += cleanFilesFromPreviousBuild(moduleDir, fileFlagsFile); } counter += doClean(moduleDir, moduleDirectory); LOGGER.info("Deleted " + counter + " files"); } private int cleanFilesFromPreviousBuild(final File moduleDir, final File fileFlagsFile) throws IOException { final ModuleDirectory moduleDirectory = ModuleDirectory.load(moduleDir, fileFlagsFile); return doClean(moduleDir, moduleDirectory); } private int doClean(final File moduleDir, final ModuleDirectory moduleDirectory) throws IOException { final Cleaner cleaner = new Cleaner(moduleDir); moduleDirectory.accept(cleaner, true, true); return cleaner.getCounter(); } }