/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2010 Sun Microsystems, Inc. */ package org.opends.server.tools.tasks; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.List; import org.opends.server.admin.client.cli.TaskScheduleArgs; import org.opends.server.backends.task.FailedDependencyAction; import org.opends.server.util.StaticUtils; import org.opends.server.util.args.ArgumentException; import org.opends.server.util.args.StringArgument; import org.opends.server.util.cli.CommandBuilder; /** * A generic data structure that contains the data that the user provided to * schedule a task. * <br> * The main difference with {@link TaskScheduleInformation} is that this class * is completely agnostic of the execution. */ public class TaskScheduleUserData { private boolean startNow; private Date startDate; private String recurringDateTime; private final List<String> dependencyIds = new ArrayList<String>(); private FailedDependencyAction failedDependencyAction; private final List<String> notifyUponCompletionEmailAddresses = new ArrayList<String>(); private final List<String> notifyUponErrorEmailAddresses = new ArrayList<String>(); /** * Whether the arguments provided by the user, indicate that the task should * be executed immediately. * @return {@code true} if the task must be executed immediately and * {@code false} otherwise. */ public boolean isStartNow() { return startNow; } /** * Sets whether the arguments provided by the user, indicate that the task * should be executed immediately. * @param startNow {@code true} if the task must be executed immediately and * {@code false} otherwise. */ public void setStartNow(boolean startNow) { this.startNow = startNow; } /** * Gets the date at which this task should be scheduled to start. * * @return date/time at which the task should be scheduled */ public Date getStartDate() { return startDate; } /** * Sets the date at which this task should be scheduled to start. * * @param startDate the date/time at which the task should be scheduled */ public void setStartDate(Date startDate) { this.startDate = startDate; } /** * Gets the date/time pattern for recurring task schedule. * * @return recurring date/time pattern at which the task * should be scheduled. */ public String getRecurringDateTime() { return recurringDateTime; } /** * Sets the date/time pattern for recurring task schedule. * * @param recurringDateTime recurring date/time pattern at which the task * should be scheduled. */ public void setRecurringDateTime(String recurringDateTime) { this.recurringDateTime = recurringDateTime; } /** * Gets a list of task IDs upon which this task is dependent. * * @return list of task IDs */ public List<String> getDependencyIds() { return dependencyIds; } /** * Sets the list of task IDs upon which this task is dependent. * * @param dependencyIds list of task IDs */ public void setDependencyIds(List<String> dependencyIds) { this.dependencyIds.clear(); this.dependencyIds.addAll(dependencyIds); } /** * Gets the action to take should one of the dependent task fail. * * @return action to take */ public FailedDependencyAction getFailedDependencyAction() { return failedDependencyAction; } /** * Sets the action to take should one of the dependent task fail. * * @param failedDependencyAction the action to take */ public void setFailedDependencyAction( FailedDependencyAction failedDependencyAction) { this.failedDependencyAction = failedDependencyAction; } /** * Gets a list of email address to which an email will be sent when this * task completes. * * @return list of email addresses */ public List<String> getNotifyUponCompletionEmailAddresses() { return notifyUponCompletionEmailAddresses; } /** * Sets the list of email address to which an email will be sent when this * task completes. * * @param notifyUponCompletionEmailAddresses the list of email addresses */ public void setNotifyUponCompletionEmailAddresses( List<String> notifyUponCompletionEmailAddresses) { this.notifyUponCompletionEmailAddresses.clear(); this.notifyUponCompletionEmailAddresses.addAll( notifyUponCompletionEmailAddresses); } /** * Gets the list of email address to which an email will be sent if this * task encounters an error during execution. * * @return list of email addresses */ public List<String> getNotifyUponErrorEmailAddresses() { return notifyUponErrorEmailAddresses; } /** * Sets the list of email address to which an email will be sent if this * task encounters an error during execution. * * @param notifyUponErrorEmailAddresses the list of email addresses */ public void setNotifyUponErrorEmailAddresses( List<String> notifyUponErrorEmailAddresses) { this.notifyUponErrorEmailAddresses.clear(); this.notifyUponErrorEmailAddresses.addAll(notifyUponErrorEmailAddresses); } /** * An static utility method that can be used to update the object used to * display the equivalent command-line with the contents of a given * task schedule object. * @param commandBuilder the command builder. * @param taskSchedule the task schedule. */ public static void updateCommandBuilderWithTaskSchedule( CommandBuilder commandBuilder, TaskScheduleUserData taskSchedule) { TaskScheduleArgs argsToClone = new TaskScheduleArgs(); String sDate = null; String recurringDateTime = null; if (!taskSchedule.isStartNow()) { Date date = taskSchedule.getStartDate(); if (date != null) { sDate = StaticUtils.formatDateTimeString(date); } recurringDateTime = taskSchedule.getRecurringDateTime(); } String sFailedDependencyAction = null; FailedDependencyAction fAction = taskSchedule.getFailedDependencyAction(); if (fAction != null) { sFailedDependencyAction = fAction.name(); } String[] sValues = {sDate, recurringDateTime, sFailedDependencyAction}; StringArgument[] args = {argsToClone.startArg, argsToClone.recurringArg, argsToClone.failedDependencyActionArg}; for (int i=0; i<sValues.length; i++) { if (sValues[i] != null) { commandBuilder.addArgument(getArgument(args[i], Collections.singleton(sValues[i]))); } } List<?>[] values = {taskSchedule.getDependencyIds(), taskSchedule.getNotifyUponCompletionEmailAddresses(), taskSchedule.getNotifyUponErrorEmailAddresses()}; args = new StringArgument[]{argsToClone.dependencyArg, argsToClone.completionNotificationArg, argsToClone.errorNotificationArg}; for (int i=0; i<values.length; i++) { if (!values[i].isEmpty()) { commandBuilder.addArgument(getArgument(args[i], values[i])); } } } private static StringArgument getArgument( StringArgument argToClone, Collection<?> values) { StringArgument arg; try { arg = new StringArgument(argToClone.getName(), argToClone.getShortIdentifier(), argToClone.getLongIdentifier(), argToClone.isRequired(), argToClone.isMultiValued(), argToClone.needsValue(), argToClone.getValuePlaceholder(), argToClone.getDefaultValue(), argToClone.getPropertyName(), argToClone.getDescription()); } catch (ArgumentException e) { // This is a bug. throw new RuntimeException("Unexpected error: "+e, e); } for (Object v : values) { arg.addValue(String.valueOf(v)); } return arg; } }