org.eclipse.che.ide.maven.tools.BuildBase Maven / Gradle / Ivy
/*
* Copyright (c) 2012-2018 Red Hat, Inc.
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
*/
package org.eclipse.che.ide.maven.tools;
import static com.google.common.base.Strings.isNullOrEmpty;
import static org.eclipse.che.commons.xml.NewElement.createElement;
import static org.eclipse.che.commons.xml.XMLTreeLocation.after;
import static org.eclipse.che.commons.xml.XMLTreeLocation.inTheBegin;
import static org.eclipse.che.commons.xml.XMLTreeLocation.inTheEnd;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.che.commons.xml.Element;
import org.eclipse.che.commons.xml.ElementMapper;
import org.eclipse.che.commons.xml.NewElement;
/**
* Describes build for /project/profiles/profile/activation.
*
* Supports next data:
*
*
* - defaultGoal
*
- resources
*
- testResources
*
- finalName
*
*/
public class BuildBase {
private static final ElementMapper RESOURCE_MAPPER = new ResourceMapper();
public Element element;
private String finalName;
private String defaultGoal;
private List resources;
private List testResources;
BuildBase() {}
BuildBase(Element element) {
this.element = element;
if (element.hasSingleChild("finalName")) {
finalName = element.getChildText("finalName");
}
if (element.hasSingleChild("defaultGoal")) {
defaultGoal = element.getChildText("defaultGoal");
}
if (element.hasSingleChild("resources")) {
resources = element.getSingleChild("resources").getChildren(RESOURCE_MAPPER);
}
if (element.hasSingleChild("testResources")) {
testResources = element.getSingleChild("testResources").getChildren(RESOURCE_MAPPER);
}
}
public String getFinalName() {
return finalName;
}
/**
* Sets final name of current build element.
*
* If {@code finalName} is {@code null} and this build instance is associated with xml element
* then {@code finalName} will be removed from model as well as from xml.
*
* @param finalName new final name
*/
public BuildBase setFinalName(String finalName) {
this.finalName = finalName;
if (!isNew()) {
if (isNullOrEmpty(finalName)) {
element.removeChild("finalName");
} else if (element.hasSingleChild("finalName")) {
element.getSingleChild("finalName").setText(finalName);
} else {
element.insertChild(createElement("finalName", finalName), inTheBegin());
}
}
return this;
}
public String getDefaultGoal() {
return defaultGoal;
}
/**
* Sets default goal of current build element.
*
*
If {@code defaultGoal} is {@code null} and this build instance is associated with xml
* element then {@code defaultGoal} will be removed from model as well as from xml.
*
* @param defaultGoal new default goal
*/
public BuildBase setDefaultGoal(String defaultGoal) {
this.defaultGoal = defaultGoal;
if (!isNew()) {
if (isNullOrEmpty(defaultGoal)) {
element.removeChild("defaultGoal");
} else if (element.hasSingleChild("defaultGoal")) {
element.getSingleChild("defaultGoal").setText(defaultGoal);
} else {
element.insertChild(
createElement("defaultGoal", defaultGoal), after("finalName").or(inTheEnd()));
}
}
return this;
}
public List getResources() {
return resources;
}
/**
* Sets build resources, each resource contains information about where associated with project
* files should be included.
*
* If {@code resources} is {@code null} or empty and this build instance is associated
* with xml element then {@code resources} will be removed from model as well as from xml.
*
* @param resources new build resources
* @return this build instance
*/
public BuildBase setResources(Collection resources) {
if (resources == null || resources.isEmpty()) {
removeResources();
} else {
setResources0(resources);
}
return this;
}
public List getTestResources() {
return testResources;
}
/**
* Sets build test resources, each resource contains information about where associated with
* project test files should be included.
*
* If {@code resources} is {@code null} or empty and this build instance is associated
* with xml element then {@code resources} will be removed from model as well as from xml.
*
* @param testResources new build test resources
* @return this build instance
*/
public BuildBase setTestResources(List testResources) {
if (testResources == null || testResources.isEmpty()) {
removeTestResources();
} else {
setTestResources0(testResources);
}
return this;
}
public void remove() {
if (element != null) {
element.remove();
element = null;
}
}
private void setResources0(Collection resources) {
this.resources = new ArrayList<>(resources);
if (isNew()) {
return;
}
if (element.hasSingleChild("resources")) {
final Element resourcesElement = element.getSingleChild("resources");
for (Element resource : resourcesElement.getChildren()) {
resource.remove();
}
for (Resource resource : resources) {
resourcesElement.appendChild(resource.asXMLElement());
resource.resourceElement = resourcesElement.getLastChild();
}
} else {
element.appendChild(newResourcesElement(this.resources));
}
}
private void removeResources() {
if (!isNew()) {
element.removeChild("resources");
}
this.resources = null;
}
private void setTestResources0(Collection resources) {
this.testResources = new ArrayList<>(resources);
if (isNew()) {
return;
}
if (element.hasSingleChild("testResources")) {
final Element resourcesElement = element.getSingleChild("testResources");
for (Element resource : resourcesElement.getChildren()) {
resource.remove();
}
for (Resource resource : resources) {
resourcesElement.appendChild(resource.asXMLElement());
resource.resourceElement = resourcesElement.getLastChild();
}
} else {
element.appendChild(newResourcesElement(this.testResources));
}
}
private void removeTestResources() {
if (!isNew()) {
element.removeChild("testResources");
}
this.testResources = null;
}
private NewElement newResourcesElement(List resources) {
final NewElement resourcesElement = createElement("resources");
for (Resource resource : resources) {
resourcesElement.appendChild(resource.asXMLElement());
}
return resourcesElement;
}
protected NewElement newTestResourcesElement(List resources) {
final NewElement resourcesElement = createElement("testResources");
for (Resource resource : resources) {
resourcesElement.appendChild(resource.asXMLElement());
}
return resourcesElement;
}
private static class ResourceMapper implements ElementMapper {
@Override
public Resource map(Element element) {
return new Resource(element);
}
}
private static class ElementTextMapper implements ElementMapper {
@Override
public String map(Element element) {
return element.getText();
}
}
private boolean isNew() {
return element == null;
}
}