/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.falcon.persistence;

import org.apache.openjpa.persistence.jdbc.ForeignKey;
import org.apache.openjpa.persistence.jdbc.ForeignKeyAction;
import org.apache.openjpa.persistence.jdbc.Index;

import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import java.sql.Timestamp;

//SUSPEND CHECKSTYLE CHECK LineLengthCheck
/**
 * Instance State which will be stored in DB.
 */
@Entity
@NamedQueries({
        @NamedQuery(name = PersistenceConstants.GET_INSTANCE, query = "select OBJECT(a) from InstanceBean a where a.id = :id"),
        @NamedQuery(name = PersistenceConstants.GET_INSTANCE_FOR_EXTERNAL_ID, query = "select OBJECT(a) from InstanceBean a where a.externalID = :externalID"),
        @NamedQuery(name = PersistenceConstants.DELETE_INSTANCE, query = "delete from InstanceBean a where a.id = :id"),
        @NamedQuery(name = PersistenceConstants.DELETE_INSTANCE_FOR_ENTITY, query = "delete from InstanceBean a where a.entityId = :entityId"),
        @NamedQuery(name = PersistenceConstants.UPDATE_INSTANCE, query = "update InstanceBean a set a.cluster = :cluster, a.externalID = :externalID, a.instanceTime = :instanceTime, a.creationTime = :creationTime, a.actualEndTime = :actualEndTime, a.currentState = :currentState, a.actualStartTime = :actualStartTime, a.instanceSequence = :instanceSequence, a.awaitedPredicates = :awaitedPredicates, a.properties = :properties where a.id = :id"),
        @NamedQuery(name = PersistenceConstants.GET_INSTANCES_FOR_ENTITY_CLUSTER, query = "select OBJECT(a) from InstanceBean a where a.entityId = :entityId AND a.cluster = :cluster"),
        @NamedQuery(name = PersistenceConstants.GET_INSTANCES_FOR_ENTITY_CLUSTER_FOR_STATES, query = "select OBJECT(a) from InstanceBean a where a.entityId = :entityId AND a.cluster = :cluster AND a.currentState IN (:currentState)"),
        @NamedQuery(name = PersistenceConstants.GET_INSTANCES_FOR_ENTITY_FOR_STATES, query = "select OBJECT(a) from InstanceBean a where a.entityId = :entityId AND a.currentState IN (:currentState)"),
        @NamedQuery(name = PersistenceConstants.GET_INSTANCES_FOR_ENTITY_CLUSTER_FOR_STATES_WITH_RANGE, query = "select OBJECT(a) from InstanceBean a where a.entityId = :entityId AND a.cluster = :cluster AND a.currentState IN (:currentState) AND a.instanceTime >= :startTime AND a.instanceTime < :endTime"),
        @NamedQuery(name =  PersistenceConstants.GET_LAST_INSTANCE_FOR_ENTITY_CLUSTER, query = "select OBJECT(a) from InstanceBean a where a.entityId = :entityId AND a.cluster = :cluster order by a.instanceTime desc"),
        @NamedQuery(name = PersistenceConstants.DELETE_INSTANCES_TABLE, query = "delete from InstanceBean a"),
        @NamedQuery(name = PersistenceConstants.GET_INSTANCE_SUMMARY_BY_STATE_WITH_RANGE, query = "select a.currentState, COUNT(a) from InstanceBean a where a.entityId = :entityId AND a.cluster = :cluster AND a.instanceTime >= :startTime AND a.instanceTime < :endTime GROUP BY a.currentState")
})
//RESUME CHECKSTYLE CHECK  LineLengthCheck
@Table(name = "INSTANCES")
public class InstanceBean {

    @Id
    @NotNull
    private String id;

    @Basic
    @Index
    @NotNull
    @Column(name = "entity_id")
    private String entityId;

    @Basic
    @Index
    @NotNull
    @Column(name = "cluster")
    private String cluster;

    @Basic
    @Index
    @Column(name = "external_id")
    private String externalID;

    @Basic
    @Index
    @Column(name = "instance_time")
    private Timestamp instanceTime;

    @Basic
    @Index
    @NotNull
    @Column(name = "creation_time")
    private Timestamp creationTime;

    @Basic
    @Column(name = "actual_start_time")
    private Timestamp actualStartTime;

    @Basic
    @Column(name = "actual_end_time")
    private Timestamp actualEndTime;

    @Basic
    @Index
    @NotNull
    @Column(name = "current_state")
    private String currentState;

    @Basic
    @Index
    @NotNull
    @Column(name = "instance_sequence")
    private Integer instanceSequence;

    @ForeignKey(deleteAction= ForeignKeyAction.CASCADE)
    @ManyToOne(cascade= CascadeType.REMOVE)
    private EntityBean entityBean;


    @Column(name = "awaited_predicates")
    @Lob
    private byte[] awaitedPredicates;

    @Column(name = "properties")
    @Lob
    private byte[] properties;


    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getCluster() {
        return cluster;
    }

    public void setCluster(String cluster) {
        this.cluster = cluster;
    }

    public String getExternalID() {
        return externalID;
    }

    public void setExternalID(String externalID) {
        this.externalID = externalID;
    }

    public Timestamp getInstanceTime() {
        return instanceTime;
    }

    public void setInstanceTime(Timestamp instanceTime) {
        this.instanceTime = instanceTime;
    }

    public Timestamp getCreationTime() {
        return creationTime;
    }

    public void setCreationTime(Timestamp creationTime) {
        this.creationTime = creationTime;
    }

    public Timestamp getActualStartTime() {
        return actualStartTime;
    }

    public void setActualStartTime(Timestamp actualStartTime) {
        this.actualStartTime = actualStartTime;
    }

    public Timestamp getActualEndTime() {
        return actualEndTime;
    }

    public void setActualEndTime(Timestamp actualEndTime) {
        this.actualEndTime = actualEndTime;
    }

    public String getCurrentState() {
        return currentState;
    }

    public void setCurrentState(String currentState) {
        this.currentState = currentState;
    }

    public byte[] getAwaitedPredicates() {
        return awaitedPredicates;
    }

    public void setAwaitedPredicates(byte[] awaitedPredicates) {
        this.awaitedPredicates = awaitedPredicates;
    }

    public Integer getInstanceSequence() {
        return instanceSequence;
    }

    public void setInstanceSequence(Integer instanceSequence) {
        this.instanceSequence = instanceSequence;
    }

    public String getEntityId() {
        return entityId;
    }

    public void setEntityId(String entityId) {
        this.entityId = entityId;
    }

    public byte[] getProperties() {
        return properties;
    }

    public void setProperties(byte[] properties) {
        this.properties = properties;
    }

    public EntityBean getEntityBean() {
        return entityBean;
    }

    public void setEntityBean(EntityBean entityBean) {
        this.entityBean = entityBean;
    }
}
