/*******************************************************************************
 * Copyright (c) 2011, 2015 Oracle and/or its affiliates. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
 * which accompanies this distribution.
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     09/09/2011-2.3.1 Peter Krogh
 *       - 356197: Add new VPD type to MultitenantType
 *     11/15/2011-2.3.2 Guy Pelletier
 *       - 363820: Issue with clone method from VPDMultitenantPolicy
 ******************************************************************************/
package org.eclipse.persistence.testing.models.jpa.advanced.multitenant;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Cacheable;
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.eclipse.persistence.annotations.Multitenant;
import org.eclipse.persistence.annotations.MultitenantType;
import org.eclipse.persistence.annotations.TenantDiscriminatorColumn;

import static javax.persistence.InheritanceType.SINGLE_TABLE;
import static org.eclipse.persistence.annotations.MultitenantType.VPD;

/**
 * A multitenant VPD class. Do not add @Entity to this class as it will be
 * picked up by the 'default' testing PU. We do not want this to happen
 * as any multitenant VPD entity will mark the connection mode to exclusive
 * always. We want this class to remain exclusive to the multi-tenant-vpd PU.
 *
 * Don't add an Entity annotation to this class as we don't want this class to
 * be picked up from other test persistence unit classes that do not exclude
 * unlisted classes.
 *
 * @see Related mapping file:
 * trunk\jpa\eclipselink.jpa.test\resource\eclipselink-annotation-model\multitenant-vpd.xml
 *
 * Multi-tenant to do list.
 * Each user can see its own list of tasks.
 * Each task has a set of subtasks.
 *
 * @author pkrogh
 * @since EclipseLink 2.3.1
 */
@Table(name="VPD_TASK")
@Multitenant(VPD)
@Inheritance(strategy=SINGLE_TABLE)
@DiscriminatorColumn(name="DTYPE")
@DiscriminatorValue("TASK")
@TenantDiscriminatorColumn(name = "TENANT_ID", contextProperty = "tenant.id")
@Cacheable(false)
public class Task implements Serializable {
    @Id
    @GeneratedValue
    private int id;

    @Column(name="DESCRIP")
    private String description;

    private boolean completed;

    @OneToMany(mappedBy="parent")
    private List<Task> subtasks= new ArrayList<Task>();

    @OneToOne
    @JoinColumn(name="PARENT_ID")
    public Task parent;

    public void addSubtask(Task task) {
        task.parent=this;
        this.subtasks.add(task);
    }

    public boolean getCompleted() {
        return completed;
    }

    public String getDescription() {
        return description;
    }

    public int getId() {
        return id;
    }

    public List<Task> getSubtasks() {
        return subtasks;
    }

    public void setCompleted(boolean completed) {
        this.completed = completed;
    }

    public void setDescription(String description) {
        this.description = description;
    }

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

    public String toString() {
        String printString = "Task(id: " + getId() + " -- " + getDescription();

        if (completed) {
            return "Completed " + printString + ")";
        } else {
            return "Incomplete " + printString + ")";
        }
    }
}
