content: 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.alien4cloud.tosca.model.Csar;
  import org.elasticsearch.annotation.DateField;
  import org.elasticsearch.annotation.ESAll;
  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.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, analyser = "simple"), 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 */
      @NestedObject(nestedClass = Tag.class)
      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);
      }
  }
  