buildframework/helium/sf/java/core/src/com/nokia/helium/core/ant/taskdefs/RetryTask.java
author wbernard
Fri, 13 Aug 2010 14:59:05 +0300
changeset 628 7c4a911dc066
parent 587 85df38eb4012
permissions -rw-r--r--
helium_11.0.0-e00f171ca185
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     1
/*
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     2
 *  Licensed to the Apache Software Foundation (ASF) under one or more
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     3
 *  contributor license agreements.  See the NOTICE file distributed with
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     4
 *  this work for additional information regarding copyright ownership.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     5
 *  The ASF licenses this file to You under the Apache License, Version 2.0
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     6
 *  (the "License"); you may not use this file except in compliance with
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     7
 *  the License.  You may obtain a copy of the License at
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     8
 *
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     9
 *      http://www.apache.org/licenses/LICENSE-2.0
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    10
 *
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    11
 *  Unless required by applicable law or agreed to in writing, software
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    12
 *  distributed under the License is distributed on an "AS IS" BASIS,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    13
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    14
 *  See the License for the specific language governing permissions and
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    15
 *  limitations under the License.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    16
 *
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    17
 */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    18
/* package org.apache.tools.ant.taskdefs; */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    19
/* * Portion Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.*/
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    20
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    21
package com.nokia.helium.core.ant.taskdefs;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    22
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    23
import org.apache.tools.ant.BuildException;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    24
import org.apache.tools.ant.Project;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    25
import org.apache.tools.ant.Task;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    26
import org.apache.tools.ant.TaskContainer;
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
    27
import org.apache.tools.ant.taskdefs.Sleep;
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    28
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    29
/**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    30
 * Retries the nested task a set number of times
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    31
 * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    32
 * @since Ant 1.7.1
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    33
 * @ant.task name="retry" category="Core"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    34
 */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    35
public class RetryTask extends Task implements TaskContainer {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    36
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    37
     * task to execute n times
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    38
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    39
    private Task nestedTask;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    40
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    41
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    42
     * set retryCount to 1 by default
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    43
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    44
    private int retryCount = 1;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    45
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    46
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    47
     * set sleepTime to 0 by default
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    48
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    49
    private int sleepTime;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    50
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    51
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    52
     * set the task
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    53
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    54
     * @param t
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    55
     *            the task to retry.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    56
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    57
    public synchronized void addTask(Task t) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    58
        if (nestedTask != null) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    59
            throw new BuildException(
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    60
                    "The retry task container accepts a single nested task"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    61
                            + " (which may be a sequential task container)");
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    62
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    63
        nestedTask = t;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    64
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    65
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    66
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    67
     * set the number of times to retry the task
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    68
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    69
     * @param n
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    70
     *            the number to use.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    71
     * @ant.not-required Default is 1.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    72
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    73
    public void setRetryCount(int n) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    74
        retryCount = n;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    75
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    76
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    77
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    78
     * set the sleep time inbetween each retry
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    79
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    80
     * @param n
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    81
     *            the time in ms to sleep between each retry.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    82
     * @ant.not-required Default is 0.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    83
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    84
    public void setSleepTime(int n) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    85
        sleepTime = n;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    86
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    87
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    88
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    89
     * perform the work
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    90
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    91
     * @throws BuildException
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    92
     *             if there is an error.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    93
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    94
    public void execute() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    95
        if (nestedTask == null) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    96
            throw new BuildException("The nested retry task not defined");
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    97
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    98
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    99
        StringBuffer errorMessages = new StringBuffer();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   100
        String br = getProject().getProperty("line.separator");
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   101
        for (int i = 0; i <= retryCount; i++) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   102
            try {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   103
                nestedTask.perform();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   104
                break;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   105
            } catch (BuildException e) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   106
                errorMessages.append(e.getMessage());
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   107
                if (i >= retryCount) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   108
                    StringBuffer exceptionMessage = new StringBuffer();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   109
                    exceptionMessage.append("Task [").append(
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   110
                            nestedTask.getTaskName());
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   111
                    exceptionMessage.append("] failed after [").append(
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   112
                            retryCount);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   113
                    exceptionMessage.append("] attempts; giving up.")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   114
                            .append(br);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   115
                    exceptionMessage.append("Error messages:").append(br);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   116
                    exceptionMessage.append(errorMessages);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   117
                    throw new BuildException(exceptionMessage.toString(),
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   118
                            getLocation());
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   119
                }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   120
                log("Attempt [" + i + "]:  error occurred; retrying...", e,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   121
                        Project.MSG_INFO);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   122
                errorMessages.append(br);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   123
                if (sleepTime > 0) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   124
                    Sleep sleepTimer = new Sleep();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   125
                    sleepTimer.setMilliseconds(sleepTime);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   126
                    sleepTimer.execute();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   127
                }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   128
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   129
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   130
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   131
}