Job.java
/*
** Module : Job.java
** Abstract : POJO defining a scheduled job.
**
** Copyright (c) 2014-2021, Golden Code Development Corporation.
**
** -#- -I- --Date-- --------------------------------------Description---------------------------------------
** 001 CA 20140206 First version.
** 002 CA 20161027 Allow Runnable instances to be configured as jobs, at runtime.
** 003 GES 20210415 Changed RECURRENT to RECURRING.
*/
/*
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU Affero General Public License as
** published by the Free Software Foundation, either version 3 of the
** License, or (at your option) any later version.
**
** 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 Affero General Public License for more details.
**
** You may find a copy of the GNU Affero GPL version 3 at the following
** location: https://www.gnu.org/licenses/agpl-3.0.en.html
**
** Additional terms under GNU Affero GPL version 3 section 7:
**
** Under Section 7 of the GNU Affero GPL version 3, the following additional
** terms apply to the works covered under the License. These additional terms
** are non-permissive additional terms allowed under Section 7 of the GNU
** Affero GPL version 3 and may not be removed by you.
**
** 0. Attribution Requirement.
**
** You must preserve all legal notices or author attributions in the covered
** work or Appropriate Legal Notices displayed by works containing the covered
** work. You may not remove from the covered work any author or developer
** credit already included within the covered work.
**
** 1. No License To Use Trademarks.
**
** This license does not grant any license or rights to use the trademarks
** Golden Code, FWD, any Golden Code or FWD logo, or any other trademarks
** of Golden Code Development Corporation. You are not authorized to use the
** name Golden Code, FWD, or the names of any author or contributor, for
** publicity purposes without written authorization.
**
** 2. No Misrepresentation of Affiliation.
**
** You may not represent yourself as Golden Code Development Corporation or FWD.
**
** You may not represent yourself for publicity purposes as associated with
** Golden Code Development Corporation, FWD, or any author or contributor to
** the covered work, without written authorization.
**
** 3. No Misrepresentation of Source or Origin.
**
** You may not represent the covered work as solely your work. All modified
** versions of the covered work must be marked in a reasonable way to make it
** clear that the modified work is not originating from Golden Code Development
** Corporation or FWD. All modified versions must contain the notices of
** attribution required in this license.
*/
package com.goldencode.p2j.scheduler;
import org.quartz.*;
/**
* Definition of a {@link Scheduler} job.
* <p>
* For each job, the following can be defined:
* <ul>
* <li>{@link #name} - the job name; must be unique and is case insensitive.</li>
* <li>{@link #type} - the kind of the job being started:
* <p> {@link JobType#PROCESS} - start a new P2J process.
* <p>-{@link JobType#CLASS} - execute a certain java class which implements
* {@link Runnable}.
* <p>-{@link JobType#METHOD} - execute a certain java method.
* <p>-{@link JobType#INSTANCE} - execute a given {@link Runnable} instance. This job
* can't be configured in the directory.
* </li>
* <li>{@link #target}
* <p>- in case of {@link JobType#PROCESS}, is the subject ID of a P2J process.
* <p>- in case of {@link JobType#CLASS}, is the qualified name of a Java class which
* implements the {@link Runnable} interface
* <p>- in case of {@link JobType#METHOD}, is the qualified name of a Java class followed by
* the name of a no-arguments method, i.e. {@code foo.bar.Something.execute}
* <p>- in case of {@link JobType#INSTANCE}, this field will be <code>null</code>.
* </li>
* <li>{@link #instance} - the instance to be ran, only for {@link JobType#INSTANCE}</li>
* <li>{@link #enabled} - flag indicating if this job is enabled or not.</li>
* <li>{@link #mode} - the job mode. One of the following values:
* <p>- {@link JobMode#NOW} - for jobs being executed immediately
* <p>- {@link JobMode#ONE_TIME} - for jobs being executed at a certain time/date,
* a single time.
* <p>- {@link JobMode#RECURRING} - for recurrent jobs executed at a certain time/date.
* </li>
* <li>The {@link #second}, {@link #minute}, {@link #hour}, {@link #dayOfMonth},
* {@link #dayOfWeek}, {@link #month} and {@link #year} need to be specified only for
* {@link JobMode#RECURRING} or {@link JobMode#ONE_TIME} jobs. They follow the
* {@link CronExpression} specification for each cron field.
* </li>
* </ul>
*/
public class Job
{
/** The name of this job. */
private final String name;
/** The type of this job, one of the {@link JobType} values. */
private JobType type;
/** The target of this job. */
private String target;
/** The instance of this job, only with {@link JobType#INSTANCE}. */
private Runnable instance;
/** Flag indicating if this job is enabled. */
private boolean enabled;
/** The execution mode of this job, one of the {@link JobMode} values. */
private JobMode mode;
/** The second expression when the job needs to be executed. */
private String second;
/** The minute expression when the job needs to be executed. */
private String minute;
/** The hour expression when the job needs to be executed. */
private String hour;
/** The day the month expression when the job needs to be executed. */
private String dayOfMonth;
/** The day of the week expression when the job needs to be executed. */
private String dayOfWeek;
/** The month expression when the job needs to be executed. */
private String month;
/** The year expression when the job needs to be executed. */
private String year;
/**
* Create a new job.
*
* @param name
* The name of this job.
* @param type
* The job's {@link JobType type}.
* @param target
* The target of this job.
* @param enabled
* Flag indicating if this job is enabled.
* @param mode
* The execution mode of this job, one of the {@link JobMode} values.
*/
public Job(String name, JobType type, String target, boolean enabled, JobMode mode)
{
this.name = name;
this.type = type;
this.target = target;
this.enabled = enabled;
this.mode = mode;
}
/**
* Create a new job, with type {@link JobType#INSTANCE}
*
* @param name
* The name of this job.
* @param instance
* The instance of this job.
* @param enabled
* Flag indicating if this job is enabled.
* @param mode
* The execution mode of this job, one of the {@link JobMode} values.
*/
public Job(String name, Runnable instance, boolean enabled, JobMode mode)
{
this.type = JobType.INSTANCE;
this.name = name;
this.instance = instance;
this.enabled = enabled;
this.mode = mode;
}
/**
* Get the instance of this job.
*
* @return The job's {@link #instance}, to be executed.
*/
public Runnable getInstance()
{
return instance;
}
/**
* Get the job's {@link #name}.
*
* @return See above.
*/
public String getName()
{
return name;
}
/**
* Get the job's {@link #type}.
*
* @return See above.
*/
public JobType getType()
{
return type;
}
/**
* Get the job's {@link #target}.
*
* @return See above.
*/
public String getTarget()
{
return target;
}
/**
* Get the job's {@link #enabled} state.
*
* @return See above.
*/
public boolean isEnabled()
{
return enabled;
}
/**
* Get the job's {@link #mode}.
*
* @return See above.
*/
public JobMode getMode()
{
return mode;
}
/**
* Get the job's {@link #second}.
*
* @return See above.
*/
public String getSecond()
{
return second;
}
/**
* Set the job's execution {@link #second}.
*
* @param second
* The second, {@code null} or a value following the {@link CronExpression} syntax.
*/
public void setSecond(String second)
{
this.second = second;
}
/**
* Get the job's {@link #minute}.
*
* @return See above.
*/
public String getMinute()
{
return minute;
}
/**
* Set the job's execution {@link #minute}.
*
* @param minute
* The minute, {@code null} or a value following the {@link CronExpression} syntax.
*/
public void setMinute(String minute)
{
this.minute = minute;
}
/**
* Get the job's {@link #hour}.
*
* @return See above.
*/
public String getHour()
{
return hour;
}
/**
* Set the job's execution {@link #hour}.
*
* @param hour
* The hour, {@code null} or a value following the {@link CronExpression} syntax.
*/
public void setHour(String hour)
{
this.hour = hour;
}
/**
* Get the job's {@link #dayOfMonth}.
*
* @return See above.
*/
public String getDayOfMonth()
{
return dayOfMonth;
}
/**
* Set the job's execution {@link #dayOfMonth}.
*
* @param dayOfMonth
* The day of the month, {@code null} or a value following the {@link CronExpression}
* syntax.
*/
public void setDayOfMonth(String dayOfMonth)
{
this.dayOfMonth = dayOfMonth;
}
/**
* Get the job's {@link #dayOfWeek}.
*
* @return See above.
*/
public String getDayOfWeek()
{
return dayOfWeek;
}
/**
* Set the job's execution {@link #dayOfWeek}.
*
* @param dayOfWeek
* The day of the week, {@code null} or a value following the {@link CronExpression}
* syntax.
*/
public void setDayOfWeek(String dayOfWeek)
{
this.dayOfWeek = dayOfWeek;
}
/**
* Get the job's {@link #month}.
*
* @return See above.
*/
public String getMonth()
{
return month;
}
/**
* Set the job's execution {@link #month}.
*
* @param month
* The month, {@code null} or a value following the {@link CronExpression} syntax.
*/
public void setMonth(String month)
{
this.month = month;
}
/**
* Get the job's {@link #year}.
*
* @return See above.
*/
public String getYear()
{
return year;
}
/**
* Set the job's execution {@link #year}.
*
* @param year
* The year, {@code null} or a year following the {@link CronExpression} syntax.
*/
public void setYear(String year)
{
this.year = year;
}
/**
* Get the string representation of this job, using the
* {@code "<name> [<type>:<mode>] - <target>"} format.
*/
@Override
public String toString()
{
return String.format("%s [%s:%s] - %s", this.name, this.type, this.mode, this.target);
}
}