/*******************************************************************************
* Copyright (c) 2006-2015
* Software Technology Group, Dresden University of Technology
* DevBoost GmbH, Dresden, Amtsgericht Dresden, HRB 34001
*
* 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:
* Software Technology Group - TU Dresden, Germany;
* DevBoost GmbH - Dresden, Germany
* - initial API and implementation
******************************************************************************/
package de.devboost.buildboost.artifacts;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
import de.devboost.buildboost.model.IArtifact;
import de.devboost.buildboost.model.IDependable;
import de.devboost.buildboost.model.ResolvedDependency;
import de.devboost.buildboost.model.UnresolvedDependency;
/**
* AbstractArtifact is a base class for implementing artifact types. It provides common functionality shared across
* artifact type, for example, the resolution of unresolved dependencies.
*
* This class is intended to be subclasses by clients.
*/
@SuppressWarnings("serial")
public abstract class AbstractArtifact implements IArtifact, Serializable {
private String identifier;
private Collection<UnresolvedDependency> unresolvedDependencies = new LinkedHashSet<UnresolvedDependency>();
private Collection<ResolvedDependency> resolvedDependencies = new LinkedHashSet<ResolvedDependency>();
public String getIdentifier() {
return identifier;
}
public Collection<IDependable> getDependencies() {
Collection<IDependable> dependencies = new LinkedHashSet<IDependable>();
for (ResolvedDependency dependency : resolvedDependencies) {
dependencies.add(dependency.getTarget());
}
return Collections.unmodifiableCollection(dependencies);
}
protected void addDependency(IArtifact artifact) {
UnresolvedDependency dependency = new UnresolvedDependency(artifact.getClass(), artifact.getIdentifier(), null,
true, null, true, false, false);
addResolvedDependency(dependency, artifact);
}
public Collection<UnresolvedDependency> getUnresolvedDependencies() {
return unresolvedDependencies;
}
public Collection<ResolvedDependency> getResolvedDependencies() {
return Collections.unmodifiableCollection(resolvedDependencies);
}
public Collection<ResolvedDependency> getAllResolvedDependencies() {
Collection<ResolvedDependency> allDependencies = new LinkedHashSet<ResolvedDependency>();
for (ResolvedDependency dependency : getResolvedDependencies()) {
// Add direct dependency
allDependencies.add(dependency);
// Add transitive dependencies
IDependable target = dependency.getTarget();
if (target instanceof AbstractArtifact) {
AbstractArtifact abstractArtifact = (AbstractArtifact) target;
allDependencies.addAll(abstractArtifact.getAllResolvedDependencies());
}
}
return allDependencies;
}
public ResolvedDependency getResolvedDependency(UnresolvedDependency unresolvedDependency) {
for (ResolvedDependency resolvedDependency : resolvedDependencies) {
if (resolvedDependency.getUnresolvedDependency().equals(unresolvedDependency)) {
return resolvedDependency;
}
}
return null;
}
public void addResolvedDependency(UnresolvedDependency dependency, IDependable dependable) {
ResolvedDependency resolvedDependency = new ResolvedDependency(this, dependable, dependency);
resolvedDependencies.add(resolvedDependency);
unresolvedDependencies.remove(dependency);
}
protected void setIdentifier(String identifier) {
this.identifier = identifier;
}
public void resolveDependencies(Collection<? extends IArtifact> allArtifacts) {
for (IArtifact artifact : allArtifacts) {
Collection<UnresolvedDependency> unresolvedDependencies = new ArrayList<UnresolvedDependency>(
getUnresolvedDependencies());
for (UnresolvedDependency nextDependency : unresolvedDependencies) {
if (nextDependency.isFulfilledBy(artifact)) {
addResolvedDependency(nextDependency, artifact);
}
}
}
}
@Override
public long getTimestamp() {
return -1;
}
@Override
public String toString() {
return getClass().getSimpleName() + " [" + getIdentifier() + "]";
}
}