package org.axway.grapes.commons.utils;
import org.axway.grapes.commons.datamodel.Artifact;
import org.axway.grapes.commons.datamodel.Dependency;
import org.axway.grapes.commons.datamodel.Module;
import java.util.*;
import java.util.regex.Pattern;
/**
* Module Utils
*
* <p>Provide a set of utility method around modules</p>
*
* @author jdcoffre
*/
public final class ModuleUtils {
private ModuleUtils(){
// hide utility class constructor
}
/**
* Returns all the Artifacts of the module
*
* @param module Module
* @return List<Artifact>
*/
public static List<Artifact> getAllArtifacts(final Module module){
final List<Artifact> artifacts = new ArrayList<Artifact>();
for(Module subModule: module.getSubmodules()){
artifacts.addAll(getAllArtifacts(subModule));
}
artifacts.addAll(module.getArtifacts());
return artifacts;
}
/**
* Returns all the dependencies of a module
*
* @param module Module
* @return List<Dependency>
*/
public static List<Dependency> getAllDependencies(final Module module) {
final Set<Dependency> dependencies = new HashSet<Dependency>();
final List<String> producedArtifacts = new ArrayList<String>();
for(Artifact artifact: getAllArtifacts(module)){
producedArtifacts.add(artifact.getGavc());
}
dependencies.addAll(getAllDependencies(module, producedArtifacts));
return new ArrayList<Dependency>(dependencies);
}
/**
* Returns all the dependencies taken into account the artifact of the module that will be removed from the dependencies
*
* @param module Module
* @param producedArtifacts List<String>
* @return Set<Dependency>
*/
public static Set<Dependency> getAllDependencies(final Module module, final List<String> producedArtifacts) {
final Set<Dependency> dependencies = new HashSet<Dependency>();
for(Dependency dependency: module.getDependencies()){
if(!producedArtifacts.contains(dependency.getTarget().getGavc())){
dependencies.add(dependency);
}
}
for(Module subModule: module.getSubmodules()){
dependencies.addAll(getAllDependencies(subModule, producedArtifacts));
}
return dependencies;
}
/**
* Returns the corporate dependencies of a module
*
* @param module Module
* @param corporateFilters List<String>
* @return List<Dependency>
*/
public static List<Dependency> getCorporateDependencies(final Module module, final List<String> corporateFilters) {
final List<Dependency> corporateDependencies = new ArrayList<Dependency>();
final Pattern corporatePattern = generateCorporatePattern(corporateFilters);
for(Dependency dependency: getAllDependencies(module)){
if(dependency.getTarget().getGavc().matches(corporatePattern.pattern())){
corporateDependencies.add(dependency);
}
}
return corporateDependencies;
}
/**
* Returns the third party libraries of a module
*
* @param module Module
* @param corporateFilters List<String>
* @return List<Dependency>
*/
public static List<Dependency> getThirdPartyLibraries(final Module module, final List<String> corporateFilters) {
final List<Dependency> thirdParty = new ArrayList<Dependency>();
final Pattern corporatePattern = generateCorporatePattern(corporateFilters);
for(Dependency dependency: getAllDependencies(module)){
if(!dependency.getTarget().getGavc().matches(corporatePattern.pattern())){
thirdParty.add(dependency);
}
}
return thirdParty;
}
private static Pattern generateCorporatePattern(final List<String> corporateFilters) {
final StringBuilder sb = new StringBuilder();
if(!corporateFilters.isEmpty()){
sb.append("^(");
final Iterator<String> filters = corporateFilters.iterator();
while(filters.hasNext()){
sb.append(filters.next());
if(filters.hasNext()){
sb.append("|");
}
}
sb.append(")");
}
sb.append("(.*)");
return Pattern.compile(sb.toString());
}
}