// Copyright 2012 Citrix Systems, Inc. Licensed under the
// Apache License, Version 2.0 (the "License"); you may not use this
// file except in compliance with the License.  Citrix Systems, Inc.
// reserves all rights not expressly granted by 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.
// 
// Automatically generated by addcopyright.py at 04/03/2012
package com.cloud.cluster.agentlb;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;

import com.cloud.utils.db.GenericDao;

@Entity
@Table(name = "op_host_transfer")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class HostTransferMapVO {

    public enum HostTransferState {
        TransferRequested, TransferStarted;
    }

    @Id
    @Column(name = "id")
    private long id;

    @Column(name = "initial_mgmt_server_id")
    private long initialOwner;

    @Column(name = "future_mgmt_server_id")
    private long futureOwner;

    @Column(name = "state")
    private HostTransferState state;
    
    @Column(name=GenericDao.CREATED_COLUMN)
    private Date created;

    public HostTransferMapVO(long hostId, long initialOwner, long futureOwner) {
        this.id = hostId;
        this.initialOwner = initialOwner;
        this.futureOwner = futureOwner;
        this.state = HostTransferState.TransferRequested;
    }

    protected HostTransferMapVO() {
    }

    public long getInitialOwner() {
        return initialOwner;
    }

    public long getFutureOwner() {
        return futureOwner;
    }

    public HostTransferState getState() {
        return state;
    }

    public void setInitialOwner(long initialOwner) {
        this.initialOwner = initialOwner;
    }

    public void setFutureOwner(long futureOwner) {
        this.futureOwner = futureOwner;
    }

    public void setState(HostTransferState state) {
        this.state = state;
    }

    public long getId() {
        return id;
    }
    
    public Date getCreated() {
        return created;
    }

}
