/*
 * RHQ Management Platform
 * Copyright (C) 2005-2008 Red Hat, Inc.
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
package org.rhq.core.domain.operation.bean;

import java.io.Serializable;
import java.util.Date;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.common.JobTrigger;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.operation.HistoryJobId;
import org.rhq.core.domain.operation.JobId;

/**
 * A simple non-entity POJO that describes a particular scheduled operation.
 *
 * @author John Mazzitelli
 */
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class OperationSchedule implements Serializable {

    private static final long serialVersionUID = 1L;

    private int id;
    private String jobName;
    private String jobGroup;
    private String operationName;
    private String operationDisplayName;
    private Configuration parameters;
    private Subject subject;
    private String description;
    private JobTrigger jobTrigger;
    private Date nextFireTime;

    public OperationSchedule() {
    }

    public int getId() {
        return id;
    }

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

    public String getJobGroup() {
        return jobGroup;
    }

    public void setJobGroup(String jobGroup) {
        this.jobGroup = jobGroup;
    }

    public String getJobName() {
        return jobName;
    }

    public void setJobName(String jobName) {
        this.jobName = jobName;
    }

    public String getOperationName() {
        return operationName;
    }

    public void setOperationName(String operationName) {
        this.operationName = operationName;
    }

    public String getOperationDisplayName() {
        /*
         * this conditional is for "legacy" purposes, so that pre-existing operation schedules don't return blank
         * displayNames, they will default to returning the operationDefinition.name instead
         */
        if ((operationDisplayName == null) || operationDisplayName.equals("")) {
            return getOperationName();
        }

        return operationDisplayName;
    }

    public void setOperationDisplayName(String operationDisplayName) {
        this.operationDisplayName = operationDisplayName;
    }

    /**
     * Returns the option parameters that are passed to the operation invocation.
     *
     * @return the parameters, or <code>null</code> if no parameters are to be passed
     */
    public Configuration getParameters() {
        return parameters;
    }

    public void setParameters(Configuration parameters) {
        this.parameters = parameters;
    }

    public Subject getSubject() {
        return subject;
    }

    public void setSubject(Subject subject) {
        if (subject == null) {
            throw new NullPointerException("Cannot schedule an operation without a user associated with it");
        }

        this.subject = subject;
    }

    public String getDescription() {
        return description;
    }

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

    public JobTrigger getJobTrigger() {
        return jobTrigger;
    }

    public void setJobTrigger(JobTrigger jobTrigger) {
        this.jobTrigger = jobTrigger;
    }

    public Date getNextFireTime() {
        return nextFireTime;
    }

    public void setNextFireTime(Date nextFireTime) {
        this.nextFireTime = nextFireTime;
    }

    /**
     * The single job ID which identifies the operation. It can later be parsed via {@link JobId#JobId(String)}. Note
     * that this job ID only identifies the scheduled operation; it does not identify any specific invocation of that
     * operation (see {@link HistoryJobId} for that).
     *
     * @return job ID
     */
    @XmlElement
    public JobId getJobId() {
        return new JobId(this.jobName, this.jobGroup);
    }

    /* 
     * there may be some operations whose parameters are sensitive values, such as passwords - do not show them
     * as part of the toString.  they can still be gotten by explicitly calling getParameters()
     */
    @Override
    public String toString() {
        StringBuilder str = new StringBuilder();
        str.append("job-name=[" + this.jobName);
        str.append("], job-group=[" + this.jobGroup);
        str.append("], operation-name=[" + this.operationName);
        str.append("], subject=[" + this.subject);
        str.append("], description=[" + this.description);
        str.append("]");
        return str.toString();
    }
}