package ro.isdc.wro.maven.plugin.support; import static org.apache.commons.lang3.Validate.notNull; import java.io.File; import org.apache.commons.lang3.StringUtils; import org.apache.maven.plugin.logging.Log; import ro.isdc.wro.manager.factory.standalone.StandaloneContext; /** * Encapsulates the details about computation of aggregated folderPath in maven plugin. * * @author Alex Objelean * @created 28 Sep 2013 * @since 1.7.2 */ public class AggregatedFolderPathResolver { private File cssDestinationFolder; private File buildDirectory; private File buildFinalName; private File destinationFolder; private String contextFoldersAsCSV; private Log log; /** * The idea is to compute the aggregatedFolderPath based on a root folder. The root folder is determined by comparing * the cssTargetFolder (the folder where aggregated css files are located) with build directory or contextFolder. If * rootFolder is null, then the result is also null (equivalent to using the cssTargetFolder the same as the root * folder. * * @return the aggregated folder path, based on the cssDestinationFolder (if set) and the build folder or the * contextFolder. */ public String resolve() { notNull(buildDirectory, "Build directory cannot be null!"); notNull(log, "Logger cannot be null!"); String result = null; final File cssTargetFolder = cssDestinationFolder == null ? destinationFolder : cssDestinationFolder; File rootFolder = null; notNull(cssTargetFolder, "cssTargetFolder cannot be null!"); if (buildFinalName != null && cssTargetFolder.getPath().startsWith(buildFinalName.getPath())) { rootFolder = buildFinalName; } else if (cssTargetFolder.getPath().startsWith(buildDirectory.getPath())) { rootFolder = buildDirectory; } else { // find first best match for (final String contextFolder : getContextFolders()) { if (cssTargetFolder.getPath().startsWith(contextFolder)) { rootFolder = new File(contextFolder); break; } } } log.debug("buildDirectory: " + buildDirectory); log.debug("contextFolders: " + contextFoldersAsCSV); log.debug("cssTargetFolder: " + cssTargetFolder); log.debug("rootFolder: " + rootFolder); if (rootFolder != null) { result = StringUtils.removeStart(cssTargetFolder.getPath(), rootFolder.getPath()); } log.debug("computedAggregatedFolderPath: " + result); return result; } /** * Use {@link StandaloneContext} to tokenize the contextFoldersAsCSV value. */ private String[] getContextFolders() { final StandaloneContext context = new StandaloneContext(); context.setContextFoldersAsCSV(contextFoldersAsCSV); return context.getContextFolders(); } public AggregatedFolderPathResolver setCssDestinationFolder(final File cssDestinationFolder) { this.cssDestinationFolder = cssDestinationFolder; return this; } public AggregatedFolderPathResolver setBuildDirectory(final File buildDirectory) { this.buildDirectory = buildDirectory; return this; } public AggregatedFolderPathResolver setBuildFinalName(final File buildFinalName) { this.buildFinalName = buildFinalName; return this; } public AggregatedFolderPathResolver setDestinationFolder(final File destinationFolder) { this.destinationFolder = destinationFolder; return this; } public AggregatedFolderPathResolver setContextFoldersAsCSV(final String contextFoldersAsCSV) { this.contextFoldersAsCSV = contextFoldersAsCSV; return this; } public AggregatedFolderPathResolver setLog(final Log log) { this.log = log; return this; } }