package org.alien4cloud.tosca.model.types;
import static alien4cloud.dao.model.FetchContext.QUICK_SEARCH;
import static alien4cloud.dao.model.FetchContext.SUMMARY;
import static alien4cloud.dao.model.FetchContext.TAG_SUGGESTION;
import java.util.Date;
import java.util.List;
import org.elasticsearch.annotation.DateField;
import org.elasticsearch.annotation.ESAll;
import org.elasticsearch.annotation.ESObject;
import org.elasticsearch.annotation.Id;
import org.elasticsearch.annotation.ObjectField;
import org.elasticsearch.annotation.StringField;
import org.elasticsearch.annotation.StringFieldMulti;
import org.elasticsearch.annotation.query.FetchContext;
import org.elasticsearch.annotation.query.TermFilter;
import org.elasticsearch.annotation.query.TermsFacet;
import org.elasticsearch.mapping.IndexType;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import alien4cloud.exception.IndexingServiceException;
import alien4cloud.model.common.IDatableResource;
import alien4cloud.model.common.ITaggableResource;
import alien4cloud.model.common.IWorkspaceResource;
import alien4cloud.model.common.Tag;
import alien4cloud.utils.version.Version;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@EqualsAndHashCode(of = { "elementId", "archiveName", "archiveVersion" })
@JsonInclude(Include.NON_NULL)
@ESObject
@ESAll(analyser = "simple")
public abstract class AbstractToscaType implements IDatableResource, IWorkspaceResource, ITaggableResource {
@FetchContext(contexts = { TAG_SUGGESTION }, include = { false })
@StringField(indexType = IndexType.not_analyzed)
@TermFilter
private String archiveName;
@FetchContext(contexts = { TAG_SUGGESTION }, include = { false })
@StringField(indexType = IndexType.not_analyzed)
@TermFilter
private String archiveVersion;
@ObjectField
@TermFilter(paths = { "majorVersion", "minorVersion", "incrementalVersion", "buildNumber", "qualifier" })
@FetchContext(contexts = { TAG_SUGGESTION, QUICK_SEARCH, SUMMARY }, include = { false, false, false })
private Version nestedVersion;
@StringField(indexType = IndexType.not_analyzed)
@FetchContext(contexts = { TAG_SUGGESTION }, include = { false })
@TermsFacet
@TermFilter
private String workspace;
@FetchContext(contexts = { TAG_SUGGESTION }, include = { false })
@StringFieldMulti(main = @StringField(indexType = IndexType.analyzed), multiNames = "rawElementId", multi = @StringField(includeInAll = false, indexType = IndexType.not_analyzed))
@TermFilter
private String elementId;
@FetchContext(contexts = { TAG_SUGGESTION }, include = { false })
@DateField(includeInAll = false, index = IndexType.no)
private Date creationDate;
@FetchContext(contexts = { TAG_SUGGESTION }, include = { false })
@DateField(includeInAll = false, index = IndexType.no)
private Date lastUpdateDate;
/* Normative element */
@StringField(indexType = IndexType.no)
@FetchContext(contexts = { TAG_SUGGESTION }, include = { false })
private String description;
/* DSL extension */
private List<Tag> tags;
@Id
public String getId() {
if (elementId == null) {
throw new IndexingServiceException("Element id is mandatory");
}
if (archiveVersion == null) {
throw new IndexingServiceException("Archive version is mandatory");
}
return elementId + ":" + archiveVersion;
}
public void setId(String id) {
// Not authorized to set id as it's auto-generated
}
public void setArchiveVersion(String version) {
this.archiveVersion = version;
this.nestedVersion = new Version(version);
}
}