/*******************************************************************************
* Copyright (c) 2012-2016 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.afterAnyOf;
import static org.eclipse.che.commons.xml.XMLTreeLocation.before;
import static org.eclipse.che.commons.xml.XMLTreeLocation.beforeAnyOf;
import static org.eclipse.che.commons.xml.XMLTreeLocation.inTheBegin;
import static org.eclipse.che.commons.xml.XMLTreeLocation.inTheEnd;
/**
* Describes repository for <i>/project/repositories</i> or <i>/project/pluginRepositories</i>
* <p/>
* Supports next data:
* <ul>
* <li>id</li>
* <li>name</li>
* <li>url</li>
* <li>layout</li>
* <li>snapshots</li>
* <li>releases</li>
* </ul>
*
* @author Eugene Voevodin
*/
public class Repository {
Element element;
private String id;
private String name;
private String url;
private String layout;
private RepositoryPolicy snapshots;
private RepositoryPolicy releases;
public Repository() { }
Repository(Element element) {
this.element = element;
id = element.getChildText("id");
name = element.getChildText("name");
url = element.getChildText("url");
layout = element.getChildText("layout");
if (element.hasSingleChild("snapshots")) {
snapshots = new RepositoryPolicy(element.getSingleChild("snapshots"));
}
if (element.hasSingleChild("releases")) {
releases = new RepositoryPolicy(element.getSingleChild("releases"));
}
}
/**
* Returns repository identifier (i.e. maven2).
*/
public String getId() {
return id;
}
/**
* Sets repository identifier.
*
* @param id
* new repository identifier, if it is {@code null} then <i>id</i> element will be removed from xml if exists
*/
public Repository setId(String id) {
this.id = id;
if (element != null) {
if (id == null) {
element.removeChild("id");
} else if (element.hasSingleChild("id")) {
element.getSingleChild("id").setText(id);
} else {
element.insertChild(createElement("id", id), inTheBegin());
}
}
return this;
}
/**
* Returns repository name.
*/
public String getName() {
return name;
}
/**
* Sets repository name.
*
* @param name
* new repository name, if it is {@code null} then <i>name</i> element will be removed from xml if exists
*/
public Repository setName(String name) {
this.name = name;
if (element != null) {
if (name == null) {
element.removeChild("name");
} else if (element.hasSingleChild("name")) {
element.getSingleChild("name").setText(name);
} else {
element.insertChild(createElement("name", name), after("id").or(inTheBegin()));
}
}
return this;
}
/**
* Returns repository url.
*/
public String getUrl() {
return url;
}
/**
* Sets repository url.
*
* @param url
* new repository url, if it is {@code null} then <i>url</i> element will be removed from xml if exists
*/
public Repository setUrl(String url) {
this.url = url;
if (element != null) {
if (url == null) {
element.removeChild("url");
} else if (element.hasSingleChild("url")) {
element.getSingleChild("url").setText(url);
} else {
element.insertChild(createElement("url", url), afterAnyOf("name", "id").or(inTheBegin()));
}
}
return this;
}
/**
* Returns repository layout(i.e. default, legacy)
*/
public String getLayout() {
return layout;
}
/**
* Sets repository layout(i.e. default, legacy)
*
* @param layout
* new repository layout, if {@code null} then <i>layout</i> element will be removed from xml if exists
*/
public Repository setLayout(String layout) {
this.layout = layout;
if (element != null) {
if (layout == null) {
element.removeChild("layout");
} else if (element.hasSingleChild("layout")) {
element.getSingleChild("layout").setText(layout);
} else {
element.insertChild(createElement("layout", layout), beforeAnyOf("snapshots", "releases").or(inTheEnd()));
}
}
return this;
}
/**
* Returns repository snapshots details
*/
public RepositoryPolicy getSnapshots() {
return snapshots;
}
/**
* Sets repository snapshots details
*
* @param snapshots
* new repository snapshots details, if {@code null} then element will be removed from xml if exists
*/
public Repository setSnapshots(RepositoryPolicy snapshots) {
this.snapshots = snapshots;
if (element != null) {
if (snapshots == null) {
element.removeChild("snapshots");
} else if (element.hasSingleChild("snapshots")) {
snapshots.element = element.getSingleChild("snapshots").replaceWith(snapshots.asXMLElement("snapshots"));
} else {
element.insertChild(snapshots.asXMLElement("snapshots"), before("releases").or(inTheEnd()));
snapshots.element = element.getSingleChild("snapshots");
}
}
return this;
}
/**
* Returns repository releases details
*/
public RepositoryPolicy getReleases() {
return releases;
}
/**
* Sets repository releases details
*
* @param releases new repository releases details, if {@code null} then element will be removed from xml if exists
*/
public Repository setReleases(RepositoryPolicy releases) {
this.releases = releases;
if (element != null) {
if (releases == null) {
element.removeChild("releases");
} else if (element.hasSingleChild("releases")) {
releases.element = element.getSingleChild("releases").replaceWith(releases.asXMLElement("releases"));
} else {
element.appendChild(releases.asXMLElement("releases"));
releases.element = element.getSingleChild("releases");
}
}
return this;
}
NewElement asXMLElement() {
final NewElement repository = createElement("repository");
if (id != null) {
repository.appendChild(createElement("id", id));
}
if (name != null) {
repository.appendChild(createElement("name", name));
}
if (url != null) {
repository.appendChild(createElement("url", url));
}
if (layout != null) {
repository.appendChild(createElement("layout", layout));
}
if (snapshots != null) {
repository.appendChild(snapshots.asXMLElement("snapshots"));
}
if (releases != null) {
repository.appendChild(releases.asXMLElement("releases"));
}
return repository;
}
void remove() {
if (element != null) {
element.remove();
element = null;
if (getSnapshots() != null) {
getSnapshots().remove();
}
if (getReleases() != null) {
getReleases().remove();
}
}
}
}