package org.alien4cloud.tosca.model;
import static alien4cloud.dao.model.FetchContext.SUMMARY;
import java.util.Date;
import java.util.List;
import java.util.Set;
import org.elasticsearch.annotation.ESObject;
import org.elasticsearch.annotation.Id;
import org.elasticsearch.annotation.NestedObject;
import org.elasticsearch.annotation.ObjectField;
import org.elasticsearch.annotation.StringField;
import org.elasticsearch.annotation.query.FetchContext;
import org.elasticsearch.annotation.query.TermFilter;
import org.elasticsearch.annotation.query.TermsFacet;
import org.elasticsearch.mapping.IndexType;
import alien4cloud.exception.IndexingServiceException;
import alien4cloud.model.common.IWorkspaceResource;
import alien4cloud.model.common.Tag;
import alien4cloud.security.IManagedSecuredResource;
import alien4cloud.tosca.parser.ParsingContextExecution;
import alien4cloud.utils.version.Version;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@EqualsAndHashCode(of = { "name", "version" })
@ESObject
public class Csar implements IManagedSecuredResource, IWorkspaceResource {
@TermFilter
@StringField(indexType = IndexType.not_analyzed)
@FetchContext(contexts = { SUMMARY }, include = { true })
private String name;
@TermFilter
@StringField(indexType = IndexType.not_analyzed)
@FetchContext(contexts = { SUMMARY }, include = { true })
private String version;
@ObjectField
@TermFilter(paths = { "majorVersion", "minorVersion", "incrementalVersion", "buildNumber", "qualifier" })
private Version nestedVersion;
@TermFilter
@StringField(indexType = IndexType.not_analyzed)
@TermsFacet
private String workspace;
/** This is the hashcode of all files in the archive. */
@StringField(indexType = IndexType.not_analyzed)
@FetchContext(contexts = { SUMMARY }, include = { true })
private String hash;
/** This is the hashcode of the definition file only (yaml). */
@StringField(indexType = IndexType.not_analyzed)
@FetchContext(contexts = { SUMMARY }, include = { true })
private String definitionHash;
/** Eventually the id of the application. */
private String delegateId;
/** Type of delegate if the archive is an application archive. */
private String delegateType;
/** Path of the yaml file in the archive (relative to the root). */
private String yamlFilePath;
private String toscaDefinitionsVersion;
private String toscaDefaultNamespace;
@TermsFacet
@StringField(indexType = IndexType.not_analyzed, includeInAll = false)
private String templateAuthor;
private String description;
@TermFilter(paths = { "name", "version" })
@NestedObject(nestedClass = CSARDependency.class)
private Set<CSARDependency> dependencies;
private String license;
/** Archive metadata. */
private List<Tag> tags;
/** Alien 4 Cloud meta-data to know how the archive has been imported. */
private String importSource;
/** Date on which the archive has been imported or updated in alien4cloud. */
private Date importDate;
/** Default constructor */
public Csar() {
}
/** Argument constructor */
public Csar(String name, String version) {
this.name = name;
this.version = version;
this.nestedVersion = new Version(version);
}
@Id
@StringField(indexType = IndexType.not_analyzed, includeInAll = false)
@FetchContext(contexts = { SUMMARY }, include = { true })
public String getId() {
return createId(name, version);
}
public static String createId(String name, String version) {
if (name == null) {
throw new IndexingServiceException("Csar name is mandatory");
}
if (version == null) {
throw new IndexingServiceException("Csar version is mandatory");
}
return name + ":" + version;
}
public void setId(String id) {
// Not authorized to set id as it's auto-generated from name and version
}
/**
* Merge the given dependencies with the current ones.
*
* @param dependencies
*/
public void setDependencies(Set<CSARDependency> dependencies) {
this.dependencies = dependencies;
}
/**
* In the context of parsing you can not override name when already provided (in case of tosca meta).
*
* @param name The new name of the archive.
*/
public void setName(String name) {
if (this.name == null || !ParsingContextExecution.exist()) {
this.name = name;
}
}
/**
* In the context of parsing you can not override version when already provided (in case of tosca meta).
*
* @param version The new version of the archive.
*/
public void setVersion(String version) {
if (this.version == null || !ParsingContextExecution.exist()) {
this.version = version;
this.nestedVersion = new Version(version);
}
}
/**
* In the context of parsing you can not override template author when already provided (in case of tosca meta).
*
* @param templateAuthor The new template author of the archive.
*/
public void setTemplateAuthor(String templateAuthor) {
if (this.templateAuthor == null || !ParsingContextExecution.exist()) {
this.templateAuthor = templateAuthor;
}
}
}