/*******************************************************************************
* Copyright (c) 2012-2015 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.maven.tools;
import org.eclipse.che.commons.xml.Element;
import org.eclipse.che.commons.xml.NewElement;
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.before;
import static org.eclipse.che.commons.xml.XMLTreeLocation.inTheBegin;
import static org.eclipse.che.commons.xml.XMLTreeLocation.inTheEnd;
/**
* The {@literal <parent>} element contains information required to
* locate the parent project which this project will inherit from.
* <p/>
* Supports next data:
* <ul>
* <li>artifactId</li>
* <li>groupId</li>
* <li>version</li>
* <li>relativePath</li>
* </ul>
*
* @author Eugene Voevodin
*/
public class Parent {
private String groupId;
private String artifactId;
private String version;
private String relativePath;
Element parentElement;
public Parent() {
}
public Parent(String groupId, String artifactId, String version) {
this.groupId = groupId;
this.artifactId = artifactId;
this.version = version;
}
Parent(Element element) {
parentElement = element;
groupId = element.getChildText("groupId");
artifactId = element.getChildText("artifactId");
version = element.getChildText("version");
}
/**
* Returns the artifact id of the parent project to inherit from.
*/
public String getArtifactId() {
return artifactId;
}
/**
* Returns the group id of the parent project to inherit from
*/
public String getGroupId() {
return groupId;
}
/**
* Returns the version of the parent project to inherit
*/
public String getVersion() {
return version;
}
public String getRelativePath() {
return relativePath == null ? "../pom.xml" : relativePath;
}
/**
* Sets the artifact id of the parent project to inherit from
* <p/>
* If {@code artifactId} is {@code null} and this parent instance is associated with
* xml element then {@code artifactId} will be removed from model as well as from xml.
*
* @param artifactId
* new parent artifact identifier
* @return this parent instance
*/
public Parent setArtifactId(String artifactId) {
this.artifactId = artifactId;
if (!isNew()) {
if (artifactId == null) {
parentElement.removeChild("artifactId");
} else if (parentElement.hasSingleChild("artifactId")) {
parentElement.getSingleChild("artifactId").setText(artifactId);
} else {
parentElement.insertChild(createElement("artifactId", artifactId), after("groupId").or(inTheBegin()));
}
}
return this;
}
/**
* Sets the group id of the parent project to inherit from
* <p/>
* If {@code groupId} is {@code null} and this parent instance is associated with
* xml element then {@code groupId} will be removed from model as well as from xml.
*
* @param groupId
* new parent group identifier
* @return this parent instance
*/
public Parent setGroupId(String groupId) {
this.groupId = groupId;
if (!isNew()) {
if (groupId == null) {
parentElement.removeChild("groupId");
} else if (parentElement.hasSingleChild("groupId")) {
parentElement.getSingleChild("groupId").setText(groupId);
} else {
parentElement.insertChild(createElement("groupId", groupId), inTheBegin());
}
}
return this;
}
/**
* Sets the version of the parent project to inherit
* <p/>
* If {@code version} is {@code null} and this parent instance is associated with
* xml element then {@code version} will be removed from model as well as from xml
*
* @param version
* new parent version
* @return this parent instance
*/
public Parent setVersion(String version) {
this.version = version;
if (!isNew()) {
if (version == null) {
parentElement.removeChild("version");
} else if (parentElement.hasSingleChild("version")) {
parentElement.getSingleChild("version").setText(version);
} else {
parentElement.insertChild(createElement("version", version), before("relativePath").or(inTheEnd()));
}
}
return this;
}
/**
* Sets parent relative path
* <p/>
* If {@code relativePath} is {@code null} and this parent instance is associated with
* xml element then {@code relativePath} will be removed from model as well as from xml
*
* @param relativePath
* new parent relative path
* @return this parent instance
*/
public Parent setRelativePath(String relativePath) {
this.relativePath = relativePath;
if (!isNew()) {
if (relativePath == null) {
parentElement.removeChild("relativePath");
} else if (parentElement.hasSingleChild("relativePath")) {
parentElement.getSingleChild("relativePath").setText(relativePath);
} else {
parentElement.appendChild(createElement("relativePath", relativePath));
}
}
return this;
}
/**
* Returns the id as <i>groupId:artifactId:version</i>
*/
public String getId() {
return groupId + ':' + artifactId + ":pom:" + version;
}
@Override
public String toString() {
return getId();
}
NewElement asXMLElement() {
final NewElement newParent = createElement("parent");
if (groupId != null) {
newParent.appendChild(createElement("groupId", groupId));
}
if (artifactId != null) {
newParent.appendChild(createElement("artifactId", artifactId));
}
if (version != null) {
newParent.appendChild(createElement("version", version));
}
if (relativePath != null) {
newParent.appendChild(createElement("relativePath", relativePath));
}
return newParent;
}
private boolean isNew() {
return parentElement == null;
}
}