/*
* RHQ Management Platform
* Copyright (C) 2005-2009 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.enterprise.server.xmlschema;
/**
* Defines a type of schedule for a server plugin job.
*
* This also has a static factory that allows you to build concrete forms
* of schedule types.
*
* @author John Mazzitelli
*/
public abstract class AbstractScheduleType {
private final String typeName;
private final boolean concurrent;
private final boolean clustered;
/**
* Factory method that creates a concrete schedule type object based on the given parameters.
*
* @param concurrent if true, multiple jobs can run concurrently.
* @param clustered if true, the job may be executed by a server other than the one where the job was scheduled
* @param scheduleType the name of the concrete schedule type
* @param scheduleTrigger the string form of the schedule's trigger
*
* @return a new instance of the desired schedule type
*/
public static final AbstractScheduleType create(boolean concurrent, boolean clustered, String scheduleType,
String scheduleTrigger) {
AbstractScheduleType scheduleTypeObj = null;
if (PeriodicScheduleType.TYPE_NAME.equalsIgnoreCase(scheduleType)) {
scheduleTypeObj = new PeriodicScheduleType(concurrent, clustered, Long.parseLong(scheduleTrigger));
} else if (CronScheduleType.TYPE_NAME.equalsIgnoreCase(scheduleType)) {
scheduleTypeObj = new CronScheduleType(concurrent, clustered, scheduleTrigger);
}
return scheduleTypeObj;
}
/**
* Builds the schedule type.
*
* @param concurrent if true, multiple jobs can run concurrently. If false, only one
* scheduled job will run at any one time across the RHQ Server cloud.
* @param clustered if true, the job may be executed by a server other than the one where the job was scheduled
* @param typeName the name of the concrete schedule type (subclasses must provide this)
*/
public AbstractScheduleType(boolean concurrent, boolean clustered, String typeName) {
this.typeName = typeName;
this.concurrent = concurrent;
this.clustered = clustered;
}
/**
* The name that identifies this type of schedule.
*
* @return type name string
*/
public String getTypeName() {
return this.typeName;
}
/**
* If true, multiple jobs can execute at any one time. If false, only a single job will be allowed
* to run at any one time (across all servers in the RHQ Server cloud). Even if the schedule
* is triggered multiple times, if a job is still running, any future jobs that are triggered will
* be delayed.
*
* @return concurrent flag
*/
public boolean isConcurrent() {
return this.concurrent;
}
/**
* If <code>true</code>, the job may be executed on a server other than the one where the job was scheduled.
* If <code>false</code>, the job will always be executed on the server where it was scheduled (it will be
* considered a non-clustered job).
* If this is <code>false</code>, {@link #isConcurrent()} only affects the scheduler where the job is scheduled
* and to be executed. This means a non-clustered job may run at the same time on different machines, even
* if {@link #isConcurrent()} is <code>false</code>. When {@link #isConcurrent()} is <code>false</code>,
* and {@link #isClustered()} is <code>false</code>, it means that job will not run concurrently on the box
* where it was scheduled. But if the job was scheduled multiple times on different boxes, those multiple jobs
* can run concurrently because they are on different boxes.
*
* A job should not be clustered if it must run on all servers at the same regular schedule.
*
* @return clustered flag
*/
public boolean isClustered() {
return this.clustered;
}
/**
* Returns the string form of the trigger that causes the job to be invoked.
*
* @return a string that describes the trigger of the schedule
*/
public abstract String getScheduleTrigger();
}