package org.springframework.roo.project; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.apache.commons.lang3.builder.ToStringBuilder; import org.springframework.roo.support.util.DomUtils; import org.springframework.roo.support.util.XmlUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * Simplified immutable representation of a Maven resource. * <p> * Structured after the model used by Maven. * * @author Alan Stewart * @since 1.1 */ public class Resource implements Comparable<Resource> { private final String directory; private final Boolean filtering; private final List<String> includes = new ArrayList<String>(); /** * Convenience constructor when an XML element is available that represents * a Maven <resource>. * * @param resource to parse (required) */ public Resource(final Element resource) { final Element directoryElement = XmlUtils.findFirstElement("directory", resource); Validate.notNull(directoryElement, "directory element required"); directory = directoryElement.getTextContent(); final Element filteringElement = XmlUtils.findFirstElement("filtering", resource); filtering = filteringElement == null ? null : Boolean.valueOf(filteringElement.getTextContent()); // Parsing for includes for (final Element include : XmlUtils.findElements("includes/include", resource)) { includes.add(include.getTextContent()); } } /** * Creates an immutable {@link Resource} with no "includes". * * @param directory the {@link Path directory} (required) * @param filtering whether filtering should occur */ public Resource(final String directory, final Boolean filtering) { this(directory, filtering, null); } /** * Creates an immutable {@link Resource} with optional "includes". * * @param directory the {@link Path directory} (required) * @param filtering whether filtering should occur * @param includes the list of includes; can be <code>null</code> */ public Resource(final String directory, final Boolean filtering, final Collection<String> includes) { Validate.notNull(directory, "Directory required"); this.directory = directory; this.filtering = filtering; if (includes != null) { this.includes.addAll(includes); } } public int compareTo(final Resource o) { if (o == null) { throw new NullPointerException(); } return getSimpleDescription().compareTo(o.getSimpleDescription()); } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final Resource other = (Resource) obj; return getSimpleDescription().equals(other.getSimpleDescription()); } public String getDirectory() { return directory; } /** * Returns the Maven POM element for this resource * * @param document the POM document (required) * @return a non-<code>null</code> element */ public Element getElement(final Document document) { final Element resourceElement = document.createElement("resource"); resourceElement.appendChild(XmlUtils.createTextElement(document, "directory", directory)); if (filtering != null) { resourceElement.appendChild(XmlUtils.createTextElement(document, "filtering", filtering.toString())); } if (!includes.isEmpty()) { final Element includes = DomUtils.createChildElement("includes", resourceElement, document); for (final String include : this.includes) { includes.appendChild(XmlUtils.createTextElement(document, "include", include)); } } return resourceElement; } public Boolean getFiltering() { return filtering; } public List<String> getIncludes() { return includes; } public String getSimpleDescription() { final StringBuilder builder = new StringBuilder(); builder.append("directory ").append(directory); if (filtering != null) { builder.append(", filtering ").append(filtering.toString()); } if (!includes.isEmpty()) { builder.append(", includes ").append(StringUtils.join(includes, ",")); } return builder.toString(); } @Override public int hashCode() { return getSimpleDescription().hashCode(); } @Override public String toString() { final ToStringBuilder builder = new ToStringBuilder(this); builder.append("directory", directory); builder.append("filtering", filtering); builder.append("includes", includes); return builder.toString(); } }