package org.axway.grapes.server.db.datamodel;
import org.axway.grapes.commons.datamodel.Scope;
import org.jongo.marshall.jackson.oid.Id;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Database Module
*
* <p>Class that holds the representation of modules stored in the database.
* id composed of the name and the version of the module is used as an ID. A database index has been created on it.</p>
* @author jdcoffre
*
*/
public class DbModule {
public static final String DATA_MODEL_VERSION = "datamodelVersion";
private String datamodelVersion = DbCollections.datamodelVersion;
@Id
private String id = "";
public static final String NAME_DB_FIELD = "name";
private String name = "";
public static final String VERSION_DB_FIELD = "version";
private String version = "";
public static final String PROMOTION_DB_FIELD = "promoted";
private boolean promoted = false;
public static final String IS_SUBMODULE_DB_FIELD = "isSubmodule";
private boolean isSubmodule = false;
public static final String ARTIFACTS_DB_FIELD = "artifacts";
private List<String> artifacts = new ArrayList<String>();
public static final String SUBMODULES_DB_FIELD = "submodules";
private List<DbModule> submodules = new ArrayList<DbModule>();
public static final String DEPENDENCIES_DB_FIELD = "dependencies";
private List<DbDependency> dependencies = new ArrayList<DbDependency>();
public static final String ORGANIZATION_DB_FIELD = "organization";
private String organization = "";
public static final String BUILD_INFO_DB_FIELD = "buildInfo";
private Map<String, String> buildInfo = new HashMap<String, String>();
public void setDataModelVersion(final String newVersion){
this.datamodelVersion = newVersion;
}
public String getDataModelVersion(){
return datamodelVersion;
}
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
updateId();
}
public String getVersion() {
return version;
}
public void setVersion(final String version) {
this.version = version;
updateId();
}
public Boolean isPromoted() {
return promoted;
}
public void setPromoted(final boolean promoted) {
this.promoted = promoted;
}
public List<String> getArtifacts() {
return artifacts;
}
public void setArtifacts(final List<String> artifacts2) {
this.artifacts = artifacts2;
}
public void addArtifact(final DbArtifact artifact) {
final String artifactGavc = artifact.getGavc();
if(!artifacts.contains(artifactGavc)){
artifacts.add(artifactGavc);
}
}
public void flushArtifacts() {
artifacts.clear();
}
public List<DbModule> getSubmodules() {
return submodules;
}
public void setSubmodules(final List<DbModule> submodules) {
this.submodules = submodules;
}
public void addSubmodule(final DbModule submodule) {
submodules.add(submodule);
}
public void flushSubmodules() {
submodules.clear();
}
public void addArtifacts(final List<DbArtifact> artifacts) {
for(DbArtifact artifact: artifacts){
addArtifact(artifact);
}
}
public final void updateId(){
id = generateID(name, version);
}
public String getId() {
return id;
}
public boolean isSubmodule() {
return isSubmodule;
}
public void setSubmodule(final boolean isSubmodule) {
this.isSubmodule = isSubmodule;
}
public List<DbDependency> getDependencies() {
return dependencies;
}
public void setDependencies(final List<DbDependency> dependencies) {
this.dependencies = dependencies;
}
public void addDependencies(final List<DbDependency> dependencies) {
this.dependencies.addAll(dependencies);
}
public void addDependency(final String artifactGavc,final Scope scope) {
final DbDependency dependency = new DbDependency(this.getId(), artifactGavc, scope);
this.dependencies.add(dependency);
}
public void flushDependencies() {
dependencies.clear();
}
public String getOrganization() {
return organization;
}
public void setOrganization(String organization) {
this.organization = organization;
}
public Map<String, String> getBuildInfo() {
return buildInfo;
}
public void setBuildInfo(final Map<String, String> buildInfo) {
this.buildInfo = buildInfo;
}
@Override
public String toString(){
final StringBuilder sb = new StringBuilder();
sb.append("Name: ");
sb.append(name);
sb.append(", Version: ");
sb.append(version);
return sb.toString();
}
public static String generateID(final String moduleName, final String moduleVersion) {
final StringBuilder sb = new StringBuilder();
sb.append(moduleName);
sb.append(":");
sb.append(moduleVersion);
return sb.toString();
}
/**
* Here is a workaround because of this mongodb open issue:
* https://jira.mongodb.org/browse/SERVER-267
*/
public static final String HAS_DB_FIELD = "has";
private List<String> has = new ArrayList<String>();
public static final String USE_DB_FIELD = "uses";
private List<String> uses = new ArrayList<String>();
public List<String> getHas() {
return has;
}
public List<String> getUses() {
return uses;
}
public void updateHasAndUse(){
has.clear();
uses.clear();
for(DbModule submodule: submodules){
submodule.updateHasAndUse();
has.addAll(submodule.has);
uses.addAll(submodule.uses);
}
has.addAll(artifacts);
for(DbDependency dependency: dependencies){
uses.add(dependency.getTarget());
}
//Remove all the artifacts that the module produces from "use" field
uses.removeAll(has);
}
}