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;
}
}