package org.jbake.app; import org.apache.commons.configuration.CompositeConfiguration; import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List; /** * Deals with assets (static files such as css, js or image files). * * @author Jonathan Bullock <a href="mailto:jonbullock@gmail.com">jonbullock@gmail.com</a> * */ public class Asset { private static final Logger LOGGER = LoggerFactory.getLogger(Asset.class); private final File source; private final File destination; private CompositeConfiguration config; private final List<Throwable> errors = new LinkedList<Throwable>(); private final boolean ignoreHidden; /** * Creates an instance of Asset. * * @param source Source file for the asset * @param destination Destination (target) directory for asset file * @param config Project configuration */ public Asset(File source, File destination, CompositeConfiguration config) { this.source = source; this.destination = destination; this.config = config; this.ignoreHidden = config.getBoolean(ConfigUtil.Keys.ASSET_IGNORE_HIDDEN, false); } /** * Copy all files from supplied path. * * @param path The starting path */ public void copy(File path) { copy(path, destination); } private void copy(File sourceFolder, File targetFolder) { final File[] assets = sourceFolder.listFiles(new FileFilter() { @Override public boolean accept(File file) { return !ignoreHidden || !file.isHidden(); } }); if (assets != null) { Arrays.sort(assets); for (File asset : assets) { final File target = new File(targetFolder, asset.getName()); if (asset.isFile()) { final StringBuilder sb = new StringBuilder(); sb.append("Copying [").append(asset.getPath()).append("]... "); try { FileUtils.copyFile(asset, target); sb.append("done!"); LOGGER.info(sb.toString()); } catch (IOException e) { sb.append("failed!"); LOGGER.error(sb.toString(), e); errors.add(e); } } else if (asset.isDirectory()) { copy(asset, target); } } } } public List<Throwable> getErrors() { return new ArrayList<Throwable>(errors); } }