package org.alien4cloud.tosca.model.types;
import static alien4cloud.dao.model.FetchContext.QUICK_SEARCH;
import static alien4cloud.dao.model.FetchContext.TAG_SUGGESTION;
import java.util.List;
import java.util.Map;
import org.alien4cloud.tosca.model.definitions.AbstractPropertyValue;
import org.alien4cloud.tosca.model.definitions.CapabilityDefinition;
import org.alien4cloud.tosca.model.definitions.RequirementDefinition;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import org.elasticsearch.annotation.ESObject;
import org.elasticsearch.annotation.NumberField;
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.component.portability.ESPortabilityPropertiesPathsGenerator;
import alien4cloud.json.deserializer.PropertyValueDeserializer;
import alien4cloud.utils.jackson.ConditionalAttributes;
import alien4cloud.utils.jackson.ConditionalOnAttribute;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
@Getter
@Setter
@EqualsAndHashCode(of = {}, callSuper = true)
@ESObject
public class NodeType extends AbstractInstantiableToscaType {
@FetchContext(contexts = { QUICK_SEARCH, TAG_SUGGESTION }, include = { false, false })
@TermsFacet(paths = "type")
private List<CapabilityDefinition> capabilities;
@FetchContext(contexts = { QUICK_SEARCH, TAG_SUGGESTION }, include = { false, false })
@TermsFacet(paths = "type")
private List<RequirementDefinition> requirements;
@FetchContext(contexts = { QUICK_SEARCH, TAG_SUGGESTION }, include = { false, false })
@TermsFacet
private List<String> defaultCapabilities;
@NumberField(index = IndexType.not_analyzed, includeInAll = false)
private long alienScore;
/** When the type is created from a topology template (substitution), contains the topology id. */
private String substitutionTopologyId;
/** Portability information. */
@ConditionalOnAttribute({ ConditionalAttributes.ES, ConditionalAttributes.REST })
@JsonDeserialize(contentUsing = PropertyValueDeserializer.class)
@TermFilter(pathGenerator = ESPortabilityPropertiesPathsGenerator.class)
private Map<String, AbstractPropertyValue> portability;
}