/*
* $Id$
* This file is a part of the Arakhne Foundation Classes, http://www.arakhne.org/afc
*
* Copyright (c) 2000-2012 Stephane GALLAND.
* Copyright (c) 2005-10, Multiagent Team, Laboratoire Systemes et Transports,
* Universite de Technologie de Belfort-Montbeliard.
* Copyright (c) 2013-2016 The original authors, and other authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.arakhne.maven;
import java.io.File;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.metadata.ArtifactMetadata;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import org.apache.maven.artifact.versioning.ArtifactVersion;
import org.apache.maven.artifact.versioning.OverConstrainedVersionException;
import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.model.Contributor;
import org.apache.maven.model.Developer;
import org.apache.maven.model.License;
import org.apache.maven.model.Organization;
import org.apache.maven.model.Scm;
import org.apache.maven.plugin.logging.Log;
/**
* Artifact implementation which also includes the artifact name,
* contributors, authors, and website.
*
* @author $Author: sgalland$
* @version $FullVersion$
* @mavengroupid $GroupId$
* @mavenartifactid $ArtifactId$
*/
@SuppressWarnings({"deprecation", "checkstyle:methodcount"})
public final class ExtendedArtifact implements Artifact {
/** Empty string constant.
*/
public static final String EMPTY_STRING = ""; //$NON-NLS-1$
private final String artifactName;
private final Artifact original;
private final List<? extends Developer> developers;
private final List<? extends Contributor> contributors;
private final String website;
private final Organization organization;
private final Scm scm;
private final String scmRevision;
private final List<? extends License> licenses;
private Map<Object, ArtifactMetadata> metadataMap;
/**
* @param artifact the artifact.
* @param name name of the artifact.
* @param website website.
* @param organization organization.
* @param scmRevision url of the SCM.
* @param scm SCM.
* @param developers developers.
* @param contributors constributors.
* @param licenses licenses.
*/
public ExtendedArtifact(
Artifact artifact, String name,
String website, Organization organization,
String scmRevision,
Scm scm,
List<? extends Developer> developers,
List<? extends Contributor> contributors,
List<? extends License> licenses) {
this.original = artifact;
this.artifactName = name;
this.developers = developers;
this.contributors = contributors;
this.website = website;
this.organization = organization;
this.scm = scm;
this.scmRevision = scmRevision;
this.licenses = licenses;
}
@Override
public String toString() {
return this.original.toString();
}
/** Replies the licenses of this artifact.
*
* @return the licenses of this artifact.
*/
public List<? extends License> getLicenses() {
return this.licenses;
}
/** Replies the SCM definition of this artifact.
*
* @return the SCM definition of this artifact.
*/
public Scm getScm() {
return this.scm;
}
/** Replies the organization of this artifact.
*
* @return the organization of this artifact.
*/
public Organization getOrganization() {
return this.organization;
}
/** Replies the URL of the website for this artifact.
*
* @return the URL of the website for this artifact.
*/
public String getWebsite() {
return this.website;
}
/** Replies the list of contributors.
*
* @return the list of contributors.
*/
public List<? extends Contributor> getContributors() {
return this.contributors == null ? Collections.<Contributor>emptyList() : this.contributors;
}
/** Replies the list of developers.
*
* @return the list of developers.
*/
public List<? extends Developer> getDevelopers() {
return this.developers == null ? Collections.<Developer>emptyList() : this.developers;
}
/** Replies the people with the given login.
* This function checks the peoples replied
* by {@link #getDevelopers()} and
* {@link #getContributors()}.
*
* @param login contributor login
* @return the people or <code>null</code>
*/
public Contributor getPeople(String login) {
return getPeople(login, null);
}
/** Replies the people with the given login.
* This function checks the peoples replied
* by {@link #getDevelopers()} and
* {@link #getContributors()}.
*
* @param login login.
* @param logger logger.
* @return the people or <code>null</code>
*/
@SuppressWarnings({"checkstyle:cyclomaticcomplexity", "npathcomplexity"})
public Contributor getPeople(String login, Log logger) {
for (final Developer devel : getDevelopers()) {
if (devel != null) {
if (logger != null && logger.isDebugEnabled()) {
logger.debug(
"Comparing '" + login //$NON-NLS-1$
+ " to the developer [ID=" + devel.getId() //$NON-NLS-1$
+ ";NAME=" + devel.getName() //$NON-NLS-1$
+ ";EMAIL=" + devel.getEmail() //$NON-NLS-1$
+ "]"); //$NON-NLS-1$
}
String idprop = null;
final Properties props = devel.getProperties();
if (props != null) {
idprop = props.getProperty("id", null); //$NON-NLS-1$
if (idprop == null) {
idprop = props.getProperty("login", null); //$NON-NLS-1$
}
}
if (login.equals(devel.getId())
|| login.equals(devel.getName())
|| login.equals(devel.getEmail())
|| login.equals(idprop)) {
if (logger != null && logger.isDebugEnabled()) {
logger.debug(
"Selecting the developer [ID=" + devel.getId() //$NON-NLS-1$
+ ";NAME=" + devel.getName() //$NON-NLS-1$
+ ";EMAIL=" + devel.getEmail() //$NON-NLS-1$
+ "]"); //$NON-NLS-1$
}
return devel;
}
}
}
for (final Contributor contrib : getContributors()) {
if (contrib != null) {
if (logger != null && logger.isDebugEnabled()) {
logger.debug(
"Comparing '" + login //$NON-NLS-1$
+ " to the contributor [NAME=" + contrib.getName() //$NON-NLS-1$
+ ";EMAIL=" + contrib.getEmail() //$NON-NLS-1$
+ "]"); //$NON-NLS-1$
}
String idprop = null;
final Properties props = contrib.getProperties();
if (props != null) {
idprop = props.getProperty("id", null); //$NON-NLS-1$
if (idprop == null) {
idprop = props.getProperty("login", null); //$NON-NLS-1$
}
}
if (login.equals(contrib.getName())
|| login.equals(contrib.getEmail())
|| login.equals(idprop)) {
if (logger != null && logger.isDebugEnabled()) {
logger.debug(
"Selecting the contributor [NAME=" + contrib.getName() //$NON-NLS-1$
+ ";EMAIL=" + contrib.getEmail() //$NON-NLS-1$
+ "]"); //$NON-NLS-1$
}
return contrib;
}
}
}
if (logger != null && logger.isDebugEnabled()) {
logger.debug("No people found for: " + login); //$NON-NLS-1$
logger.debug("Developers are: " + this.developers.toString()); //$NON-NLS-1$
logger.debug("Contributors are: " + this.contributors.toString()); //$NON-NLS-1$
}
return null;
}
/** Replies the name of the artifact.
*
* @return the name of the artifact.
*/
public String getName() {
if (this.artifactName == null || EMPTY_STRING.equals(this.artifactName)) {
return getArtifactId();
}
return this.artifactName;
}
@Override
public ArtifactHandler getArtifactHandler() {
return this.original.getArtifactHandler();
}
@Override
public String getArtifactId() {
return this.original.getArtifactId();
}
@Override
public List<ArtifactVersion> getAvailableVersions() {
return this.original.getAvailableVersions();
}
@Override
public String getBaseVersion() {
return this.original.getBaseVersion();
}
@Override
public String getClassifier() {
return this.original.getClassifier();
}
@Override
public String getDependencyConflictId() {
return this.original.getDependencyConflictId();
}
@Override
public ArtifactFilter getDependencyFilter() {
return this.original.getDependencyFilter();
}
@Override
public List<String> getDependencyTrail() {
return this.original.getDependencyTrail();
}
@Override
public String getDownloadUrl() {
return this.original.getDownloadUrl();
}
@Override
public File getFile() {
return this.original.getFile();
}
@Override
public String getGroupId() {
return this.original.getGroupId();
}
@Override
public String getId() {
return this.original.getId();
}
@Override
public ArtifactRepository getRepository() {
return this.original.getRepository();
}
@Override
public String getScope() {
return this.original.getScope();
}
@Override
public ArtifactVersion getSelectedVersion() throws OverConstrainedVersionException {
return this.original.getSelectedVersion();
}
@Override
public String getType() {
return this.original.getType();
}
@Override
public String getVersion() {
return this.original.getVersion();
}
@Override
public VersionRange getVersionRange() {
return this.original.getVersionRange();
}
@Override
public boolean hasClassifier() {
return this.original.hasClassifier();
}
@Override
public boolean isOptional() {
return this.original.isOptional();
}
@Override
public boolean isRelease() {
return this.original.isRelease();
}
@Override
public boolean isResolved() {
return this.original.isResolved();
}
@Override
public boolean isSelectedVersionKnown() throws OverConstrainedVersionException {
return this.original.isSelectedVersionKnown();
}
@Override
public boolean isSnapshot() {
return this.original.isSnapshot();
}
@Override
public void selectVersion(String version) {
this.original.selectVersion(version);
}
@Override
public void setArtifactHandler(ArtifactHandler handler) {
this.original.setArtifactHandler(handler);
}
@Override
public void setArtifactId(String artifactId) {
this.original.setArtifactId(artifactId);
}
@Override
public void setBaseVersion(String baseVersion) {
this.original.setBaseVersion(baseVersion);
}
@Override
public void setDependencyFilter(ArtifactFilter artifactFilter) {
this.original.setDependencyFilter(artifactFilter);
}
@Override
public void setDownloadUrl(String downloadUrl) {
this.original.setDownloadUrl(downloadUrl);
}
@Override
public void setFile(File destination) {
this.original.setFile(destination);
}
@Override
public void setGroupId(String groupId) {
this.original.setGroupId(groupId);
}
@Override
public void setRelease(boolean release) {
this.original.setRelease(release);
}
@Override
public void setRepository(ArtifactRepository remoteRepository) {
this.original.setRepository(remoteRepository);
}
@Override
public void setResolved(boolean resolved) {
this.original.setResolved(resolved);
}
@Override
public void setResolvedVersion(String version) {
this.original.setResolvedVersion(version);
}
@Override
public void setScope(String scope) {
this.original.setScope(scope);
}
@Override
public void setVersion(String version) {
this.original.setVersion(version);
}
@Override
public void setVersionRange(VersionRange newRange) {
this.original.setVersionRange(newRange);
}
@Override
public void updateVersion(String version, ArtifactRepository localRepository) {
this.original.updateVersion(version, localRepository);
}
@Override
public int compareTo(Artifact artifact) {
return this.original.compareTo(artifact);
}
@Override
public void setAvailableVersions(List<ArtifactVersion> versions) {
this.original.setAvailableVersions(versions);
}
@Override
public void setDependencyTrail(List<String> dependencyTrail) {
this.original.setDependencyTrail(dependencyTrail);
}
@Override
public void setOptional(boolean optional) {
this.original.setOptional(optional);
}
/** Replies the SCM revision for the artifact.
*
* @return the revision number in the SCM repository.
*/
public String getScmRevision() {
return this.scmRevision;
}
@Override
public void addMetadata(ArtifactMetadata metadata) {
if (this.metadataMap == null) {
this.metadataMap = new HashMap<>();
}
final ArtifactMetadata m = this.metadataMap.get(metadata.getKey());
if (m != null) {
m.merge(metadata);
} else {
this.metadataMap.put(metadata.getKey(), metadata);
}
}
@Override
public Collection<ArtifactMetadata> getMetadataList() {
if (this.metadataMap == null) {
return Collections.emptyList();
}
return this.metadataMap.values();
}
}