/*******************************************************************************
* Copyright (c) 2008 Pierre-Antoine Grégoire.
* 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:
* Pierre-Antoine Grégoire - initial API and implementation
*******************************************************************************/
package org.org.eclipse.dws.core.internal.model;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import org.org.eclipse.dws.core.internal.bridges.RepositoryModelUtils;
import org.org.eclipse.dws.core.internal.model.visitors.PomDependenciesFilteredDependenciesRemover;
import org.org.eclipse.dws.core.internal.model.visitors.PomDependenciesFilteringOptions;
import org.org.eclipse.dws.core.internal.model.visitors.PomDependenciesFilteringOptions.Filter;
import org.org.eclipse.dws.core.internal.model.visitors.PomDependenciesFilteringOptions.ScopeFilter;
import org.org.model.AbstractModelItem;
import org.org.model.IModelItem;
import org.org.repository.crawler.maven2.model.Artifact;
import org.org.repository.crawler.maven2.model.ArtifactVersion;
import org.org.repository.crawler.maven2.model.Group;
@SuppressWarnings("rawtypes")
public class Pom extends AbstractModelItem<IModelItem, PomDependency> {
private ParentPom parentPom;
private String groupId;
private String artifactId;
private String version;
private String packaging;
private String description;
private String name;
final private PomRepositoriesSet pomRepositoriesSet = new PomRepositoriesSet();
final private PomProfilesSet pomProfilesSet = new PomProfilesSet();
final private PomPropertiesSet properties = new PomPropertiesSet();
/**
* @return
*/
public String getArtifactId() {
return artifactId;
}
/**
* @param artifactId
*/
public void setArtifactId(String artifactId) {
this.artifactId = artifactId;
}
/**
* @return
*/
public String getGroupId() {
return groupId;
}
/**
* @param groupId
*/
public void setGroupId(String groupId) {
this.groupId = groupId;
}
/**
* @return
*/
public String getVersion() {
return version;
}
/**
* @param version
*/
public void setVersion(String version) {
this.version = version;
}
/**
* @see java.lang.Comparable
*/
@Override
public int compareTo(IModelItem o) {
Pom pomCreationDescription = (Pom) o;
return String.CASE_INSENSITIVE_ORDER.compare(groupId + artifactId + version, pomCreationDescription.groupId + pomCreationDescription.artifactId + pomCreationDescription.version);
}
@Override
public String getUID() {
return this.getGroupId() + ":" + this.getArtifactId() + ":" + this.getVersion() + ":" + this.getPackaging();
}
@Override
public StringBuilder toStringBuilderDescription() {
return new StringBuilder(this.getUID());
}
public String getPackaging() {
return packaging;
}
public void setPackaging(String archiveType) {
this.packaging = archiveType;
}
public ParentPom getParentPom() {
return parentPom;
}
public void setParentPom(ParentPom parentPom) {
this.parentPom = parentPom;
}
public void filterDependencies(PomDependenciesFilteringOptions filteringOptions) {
PomDependenciesFilteredDependenciesRemover pomDependenciesFilteredDependenciesRemover = new PomDependenciesFilteredDependenciesRemover(filteringOptions);
accept(pomDependenciesFilteredDependenciesRemover);
}
public boolean areAllDependenciesOptional() {
boolean result = true;
for (PomDependency pomDependency : getChildren()) {
result = pomDependency.isOptional() && pomDependency.areTransitiveAllOptional();
}
return result;
}
public boolean areAllDependenciesRisky() {
boolean result = true;
for (PomDependency pomDependency : getChildren()) {
result = pomDependency.isScopeNarrow() && pomDependency.areTransitiveAllNarrowScoped();
}
return result;
}
private static boolean testIfSkipped(String groupId, String artifactId, Set<SkippedDependency> skippedDependencies) {
boolean result = false;
for (SkippedDependency skippedDependency : skippedDependencies) {
if (groupId.equals(skippedDependency.getGroupId()) && artifactId.equals(skippedDependency.getArtifactId())) {
result = true;
break;
}
}
return result;
}
public Set<AbstractChosenArtifactVersion> computeLibrariesFromPomDependencies(PomDependenciesFilteringOptions filteringOptions) {
return computeLibrariesFromPomDependencies(getChildren(), filteringOptions);
}
private Set<AbstractChosenArtifactVersion> computeLibrariesFromPomDependencies(Set<PomDependency> pomDependencies, PomDependenciesFilteringOptions filteringOptions) {
Set<AbstractChosenArtifactVersion> result = null;
if (hasChildren()) {
result = new TreeSet<AbstractChosenArtifactVersion>();
Set<ResolvedArtifact> resolvedArtifacts = new HashSet<ResolvedArtifact>();
for (PomDependency pomDependency : pomDependencies) {
List<ArtifactVersion> artifactVersionsFromRepositories = RepositoryModelUtils.findArtifactVersionsMatchingPomDependencyInRepositories(pomDependency, filteringOptions.getArtifactExtensions());
if (artifactVersionsFromRepositories.size() > 0) {
for (ArtifactVersion artifactVersion : artifactVersionsFromRepositories) {
ResolvedArtifact listElement = new ResolvedArtifact();
listElement.setArtifactVersion(artifactVersion);
listElement.setScope(pomDependency.getScope());
listElement.setOptional(pomDependency.isOptional());
listElement.setSystemPath(pomDependency.getSystemPath());
Artifact artifact = artifactVersion.getParent();
Group group = artifact.getParent();
listElement.setSkipped(testIfSkipped(group.getName(), artifact.getId(), filteringOptions.getSkippedDependencies()));
if (pomDependency.isConflictingWithClasspathEntries()) {
listElement.setConflictingClasspathEntries(pomDependency.getConflictingClasspathEntries());
}
resolvedArtifacts.add(listElement);
if (artifactVersion.getPomUrl() != null && filteringOptions.dealWithTransitive()) {
PomDependenciesFilteringOptions derivedOptions = new PomDependenciesFilteringOptions.Builder(filteringOptions).scopeFilter(ScopeFilter.FILTER_NARROW_SCOPES).filter(Filter.CONFLICTING).build();
pomDependency.retrieveTransitiveDependencies(derivedOptions);
Set<PomDependency> transitiveDependencies = pomDependency.getChildren();
Set<AbstractChosenArtifactVersion> abstractChosenArtifactVersions = computeLibrariesFromPomDependencies(transitiveDependencies, filteringOptions);
if (abstractChosenArtifactVersions != null) {
for (AbstractChosenArtifactVersion abstractChosenArtifactVersion : abstractChosenArtifactVersions) {
listElement.addChild(abstractChosenArtifactVersion);
}
}
}
// ADDING THE RESOLVED ARTIFACT TO THE LIST
result.add(listElement);
}
} else {
UnresolvedArtifact listElement = new UnresolvedArtifact();
listElement.setUnresolvedPomDependency(pomDependency);
listElement.setScope(pomDependency.getScope());
listElement.setOptional(pomDependency.isOptional());
listElement.setSkipped(testIfSkipped(pomDependency.getGroupId(), pomDependency.getArtifactId(), filteringOptions.getSkippedDependencies()));
// ADDING THE UNRESOLVED ARTIFACT TO THE LIST
result.add(listElement);
}
}
}
return result;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public PomPropertiesSet getProperties() {
return properties;
}
public PomRepositoriesSet getRepositories() {
return pomRepositoriesSet;
}
public PomProfilesSet getProfiles() {
return pomProfilesSet;
}
}