// 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.projects;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import com.cloud.utils.db.GenericDao;

@Entity
@Table(name="project_account")
@SuppressWarnings("unused")
public class ProjectAccountVO implements ProjectAccount{
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private long id;
    
    @Column(name="project_id")
    private long projectId;

    @Column(name="account_id")
    private long accountId;
    
    @Column(name="account_role")
    @Enumerated(value=EnumType.STRING)
    private Role accountRole = Role.Regular;
    
    @Column(name="project_account_id")
    long projectAccountId;
    
    @Column(name=GenericDao.CREATED_COLUMN)
    private Date created;

    
    protected ProjectAccountVO(){
    }
    
    public ProjectAccountVO(Project project, long accountId, Role accountRole) {
       this.accountId = accountId;
       this.accountRole = accountRole;
       this.projectId = project.getId();
       this.projectAccountId = project.getProjectAccountId();
    }

    public long getId() {
        return id;
    }

    @Override
    public long getProjectId() {
        return projectId;
    }

    @Override
    public long getAccountId() {
        return accountId;
    }

    @Override
    public Role getAccountRole() {
        return accountRole;
    }
    
    @Override
    public long getProjectAccountId() {
        return projectAccountId;
    }

    public void setAccountRole(Role accountRole) {
        this.accountRole = accountRole;
    }
}
