package org.objectstyle.woproject.maven2.wolifecycle;
//org.apache.maven.plugins:maven-compiler-plugin:compile
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.BooleanUtils;
import org.apache.maven.model.Resource;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
public abstract class AbstractDefineResourcesMojo extends AbstractWOMojo {
/**
* Search for the resource with the specified directory.
*
* @param resources
* The collection of available resources
* @param resourceDirectory
* The directory used on search
* @return Returns the resource found or a new one if no one could be found
*/
static Resource findOrCreateResource(final List<Resource> resources, final String resourceDirectory) {
if (resourceDirectory == null) {
throw new IllegalArgumentException("The resource directory argument cannot be null");
}
for (Resource resource : resources) {
if (resourceDirectory.equals(resource.getDirectory())) {
return resource;
}
}
Resource resource = new Resource();
resource.setDirectory(resourceDirectory);
return resource;
}
/**
* Flatten all Resources and WebServerResouces into the Resources folder of
* WO application/framework package.
*
* @parameter expression="flattenResources"
*/
private Boolean flattenResources;
public AbstractDefineResourcesMojo() {
super();
}
private void addResources(final List<Resource> resources) {
for (Resource resource : resources) {
if (getProject().getResources().contains(resource)) {
continue;
}
getProject().addResource(resource);
}
}
private Resource createResources(final List<String> resourcesInclude, final List<String> resourcesExclude, final String targetPath) {
Resource resource = new Resource();
resource.setDirectory(getProjectFolder().getAbsolutePath());
if (resourcesInclude != null) {
for (String resourceInclude : resourcesInclude) {
resource.addInclude(resourceInclude);
}
}
if (resourcesExclude != null) {
for (String resourceExclude : resourcesExclude) {
resource.addExclude(resourceExclude);
}
resource.addExclude("build/**");
resource.addExclude("dist/**");
resource.addExclude("target/**");
}
String fullTargetPath = getFullTargetPath(targetPath);
resource.setTargetPath(fullTargetPath);
return resource;
}
private List<Resource> createResources(final String directory, final String targetPath) {
String fullTargetPath = getFullTargetPath(targetPath);
File resourcesDirectory = new File(getProjectFolder(), directory);
@SuppressWarnings("unchecked")
Resource resource = findOrCreateResource(getProject().getResources(), resourcesDirectory.getAbsolutePath());
resource.addExclude("*.lproj/**");
if (flattenResources()) {
resource.addInclude("*");
resource.addInclude("*.wo/**");
resource.addInclude("*.eomodeld/**");
}
resource.setTargetPath(fullTargetPath);
List<Resource> resources = new ArrayList<Resource>();
resources.add(resource);
File[] files = resourcesDirectory.listFiles();
for (int i = 0; i < files.length; i++) {
File file = files[i];
String filename = file.getName();
if (filename != null && filename.endsWith(".lproj")) {
resource = new Resource();
resource.setDirectory(file.getAbsolutePath());
if (filename.equalsIgnoreCase("Nonlocalized.lproj")) {
resource.setTargetPath(fullTargetPath);
} else {
resource.setTargetPath(fullTargetPath + File.separator + filename);
}
resources.add(resource);
continue;
}
if (includeResourcesRecursively(file)) {
List<Resource> additionalResources = createResources(directory + File.separator + filename, targetPath);
resources.addAll(additionalResources);
}
}
return resources;
}
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info("Creating output folders");
executeCreateFolders();
getLog().info("Defining WO resources");
executeExistingComponents();
executeExistingResources();
executeExistingWebServerResources();
Boolean readPatternsets = this.readPatternsets();
if (readPatternsets != null && readPatternsets.booleanValue()) {
executeResourcesPatternsetFiles();
executeWebServerResourcesPatternsetFiles();
}
executeDefineProjectWonderStyleFolders();
executeDefineMavenStyleFolders();
}
private void executeCreateFolders() {
File target = new File(getProject().getBuild().getOutputDirectory());
if (!target.exists()) {
target.mkdirs();
}
}
private void executeDefineMavenStyleFolders() {
getLog().debug("Patching resources for WO Maven style");
String pathPrefix = "src" + File.separator + "main" + File.separator;
String resourcesFolder = pathPrefix + "resources";
File resourcesFile = new File(getProjectFolder(), resourcesFolder);
if (resourcesFile.exists()) {
getLog().debug("Patching " + resourcesFolder + " folder. Adding include...");
List<Resource> resourcesFromResourcesFolder = createResources(resourcesFolder, "Resources");
addResources(resourcesFromResourcesFolder);
} else {
getLog().debug("No " + resourcesFolder + " folder found within project. Skipping include...");
}
String componentsFolder = pathPrefix + "components";
File componentsFile = new File(getProjectFolder(), componentsFolder);
if (componentsFile.exists()) {
getLog().debug("Patching " + componentsFolder + " folder. Adding include...");
List<Resource> resourcesFromResourcesFolder = createResources(componentsFolder, "Resources");
addResources(resourcesFromResourcesFolder);
} else {
getLog().debug("No " + componentsFolder + " folder found within project. Skipping include...");
}
String webServerResourcesFolder = pathPrefix + "webserver-resources";
File webServerResourcesFile = new File(getProjectFolder(), webServerResourcesFolder);
if (webServerResourcesFile.exists()) {
getLog().debug("Patching " + webServerResourcesFolder + " folder. Adding include...");
List<Resource> webServerResourcesFromWebServerResourcesFolder = createResources(webServerResourcesFolder, "WebServerResources");
addResources(webServerResourcesFromWebServerResourcesFolder);
} else {
getLog().debug("No " + webServerResourcesFolder + " folder found within project. Skipping include...");
}
}
private void executeDefineProjectWonderStyleFolders() {
getLog().debug("Patching resources for WOnder style");
File componentsFile = new File(getProjectFolder(), "Components");
if (componentsFile.exists()) {
getLog().debug("Patching \"Components\" folder. Adding include...");
List<Resource> resourcesFromComponentsFolder = createResources("Components", "Resources");
addResources(resourcesFromComponentsFolder);
} else {
getLog().debug("No \"Components\" folder found within project. Skipping include...");
}
File resourcesFile = new File(getProjectFolder(), "Resources");
if (resourcesFile.exists()) {
getLog().debug("Patching \"Resources\" folder. Adding include...");
List<Resource> resourcesFromResourcesFolder = createResources("Resources", "Resources");
addResources(resourcesFromResourcesFolder);
} else {
getLog().debug("No \"Resources\" folder found within project. Skipping include...");
}
File webServerResourcesFile = new File(getProjectFolder(), "WebServerResources");
if (webServerResourcesFile.exists()) {
getLog().debug("Patching \"WebServerResources\" folder. Adding include...");
List<Resource> webServerResourcesFromWebServerResourcesFolder = createResources("WebServerResources", "WebServerResources");
addResources(webServerResourcesFromWebServerResourcesFolder);
} else {
getLog().debug("No \"WebServerResources\" folder found within project. Skipping include...");
}
}
private void executeExistingComponents() {
executePatchResources("Components", getFullTargetPath("Resources"));
}
private void executeExistingResources() {
this.executePatchResources("WebServerResources", this.getFullTargetPath("WebServerResources"));
}
private void executeExistingWebServerResources() {
this.executePatchResources("Resources", getFullTargetPath("Resources"));
}
private void executePatchResources(final String existingTargetPath, final String newTargetPath) {
@SuppressWarnings("unchecked")
List<Resource> resources = getProject().getResources();
for (Resource resource : resources) {
if (resource.getTargetPath() != null && resource.getTargetPath().equals(existingTargetPath)) {
getLog().debug("Patching target path of resource " + resource);
resource.setTargetPath(newTargetPath);
}
}
}
private void executeResourcesPatternsetFiles() {
getLog().debug("Loading Pattern Sets for Resources");
File woProjectFile = getWOProjectFolder();
if (woProjectFile == null) {
getLog().debug("No \"woproject\" folder found within project. Skipping patternsets...");
return;
}
getLog().debug("\"woproject\" folder found within project. Reading patternsets...");
List<String> resourcesIncludeFromAntPatternsetFiles = getResourcesInclude();
List<String> resourcesExcludeFromAntPatternsetFiles = getResourcesExclude();
if (resourcesIncludeFromAntPatternsetFiles != null && resourcesExcludeFromAntPatternsetFiles != null && (resourcesIncludeFromAntPatternsetFiles.size() > 0 || resourcesExcludeFromAntPatternsetFiles.size() > 0)) {
Resource resourcesFromAntPatternsetFiles = createResources(resourcesIncludeFromAntPatternsetFiles, resourcesExcludeFromAntPatternsetFiles, "Resources");
getProject().addResource(resourcesFromAntPatternsetFiles);
}
}
private void executeWebServerResourcesPatternsetFiles() {
getLog().debug("Loading Pattern Sets for Resources");
File woProjectFile = getWOProjectFolder();
if (woProjectFile == null) {
getLog().debug("No \"woproject\" folder found within project. Skipping patternsets...");
return;
}
getLog().debug("\"woproject\" folder found within project. Reading patternsets...");
List<String> webserverResourcesIncludeFromAntPatternsetFiles = getWebserverResourcesInclude();
List<String> webserverResourcesExcludeFromAntPatternsetFiles = getWebserverResourcesExclude();
if (webserverResourcesIncludeFromAntPatternsetFiles != null && webserverResourcesExcludeFromAntPatternsetFiles != null && (webserverResourcesIncludeFromAntPatternsetFiles.size() > 0 || webserverResourcesExcludeFromAntPatternsetFiles.size() > 0)) {
Resource webserverResourcesFromAntPatternsetFiles = this.createResources(webserverResourcesIncludeFromAntPatternsetFiles, webserverResourcesExcludeFromAntPatternsetFiles, "WebServerResources");
this.getProject().addResource(webserverResourcesFromAntPatternsetFiles);
}
}
public Boolean flattenResources() {
return BooleanUtils.toBooleanDefaultIfNull(flattenResources, false);
}
String getFullTargetPath(final String targetPath) {
StringBuilder builder = new StringBuilder();
builder.append("../");
if (includesVersionInArtifactName()) {
builder.append(getFinalName()).append(getClassifierAsString());
} else {
builder.append(getProject().getArtifactId());
}
builder.append(".").append(getProductExtension());
if (this.hasContentsFolder()) {
builder.append(File.separator).append("Contents");
}
return builder.append(File.separator).append(targetPath).toString();
}
private List<String> getResourcesExclude() {
String patternsetFileName = "resources.exclude.patternset";
return readPatternset(patternsetFileName);
}
private List<String> getResourcesInclude() {
String patternsetFileName = "resources.include.patternset";
return readPatternset(patternsetFileName);
}
private List<String> getWebserverResourcesExclude() {
String patternsetFileName = "wsresources.exclude.patternset";
return readPatternset(patternsetFileName);
}
private List<String> getWebserverResourcesInclude() {
String patternsetFileName = "wsresources.include.patternset";
return readPatternset(patternsetFileName);
}
public abstract boolean hasContentsFolder();
boolean includeResourcesRecursively(final File file) {
String filename = file.getName();
return flattenResources() && file.isDirectory() && !file.isHidden() && !filename.endsWith(".wo") && !filename.endsWith(".eomodeld");
}
public abstract boolean includesVersionInArtifactName();
private List<String> readPatternset(final String patternsetFileName) {
getLog().debug("Reading Pattern Sets file \"" + patternsetFileName + "\"");
File file = new File(getWOProjectFolder(), patternsetFileName);
if (!file.exists()) {
return null;
}
PatternsetReader patternsetReader;
List<String> pattern = null;
try {
patternsetReader = new PatternsetReader(file);
pattern = patternsetReader.getPattern();
} catch (IOException e) {
getLog().error("Exception while loading \"" + patternsetFileName + "\"", e);
}
return pattern;
}
protected abstract Boolean readPatternsets();
public void setFlattingResources(final Boolean flattenResources) {
this.flattenResources = flattenResources;
}
}