Project

General

Profile

Download (6.18 KB) Statistics
| Branch: | Tag: | Revision:
1
// $Id$
2
/**
3
* Copyright (C) 2009 EDIT
4
* European Distributed Institute of Taxonomy
5
* http://www.e-taxonomy.eu
6
*
7
* The contents of this file are subject to the Mozilla Public License Version 1.1
8
* See LICENSE.TXT at the top of this package for the full license terms.
9
*/
10
package eu.etaxonomy.cdm.common.monitor;
11

    
12
import java.io.Serializable;
13

    
14
import org.apache.log4j.Level;
15
import org.apache.log4j.Logger;
16

    
17
/**
18
 * This is a console style progress monitor with prints the progress information to configured {@link Logger} with level {@link Level#INFO}
19
 *
20
 * @author a.mueller
21
 * @date 14.09.2010
22
 *
23
 */
24
public class DefaultProgressMonitor implements IProgressMonitor {
25
    private static final long serialVersionUID = 8782649283568146667L;
26

    
27
    private static final Logger logger = Logger.getLogger(DefaultProgressMonitor.class);
28

    
29
    public static final DefaultProgressMonitor NewInstance(){
30
        return new DefaultProgressMonitor();
31
    }
32

    
33
    private boolean isCanceled = false;
34
    protected String taskName = "No task name";
35
    protected int totalWork = 0;
36
    protected double workDone = 0;
37
    protected String subTask = "No subtask name";
38

    
39

    
40
    private Serializable feedback;
41
    private transient Object feedbackLock;
42
    private boolean isWaitingForFeedback = false;
43
    private long feedbackWaitStartTime;
44
    private static final long DEFAULT_FEEDBACK_WAIT_TIMEOUT = 1000 * 60 * 60 * 24; // 24 hours
45
    private long feedbackWaitTimeout = DEFAULT_FEEDBACK_WAIT_TIMEOUT;
46

    
47
    private String owner;
48

    
49
    protected DefaultProgressMonitor(){
50

    
51
    }
52

    
53

    
54
    /* (non-Javadoc)
55
     * @see eu.etaxonomy.cdm.common.IProgressMonitor#beginTask(java.lang.String, int)
56
     */
57
    @Override
58
    public void beginTask(String taskName, int totalWork) {
59
        logger.info("Start " + taskName);
60
        this.taskName = taskName;
61
        this.totalWork = totalWork;
62
    }
63

    
64
    /* (non-Javadoc)
65
     * @see eu.etaxonomy.cdm.common.IProgressMonitor#done()
66
     */
67
    @Override
68
    public void done() {
69
        logger.info(taskName + "...Done");
70
    }
71

    
72
    /* (non-Javadoc)
73
     * @see eu.etaxonomy.cdm.common.IProgressMonitor#isCanceled()
74
     */
75
    @Override
76
    public boolean isCanceled() {
77
        return isCanceled;
78
    }
79

    
80
    /* (non-Javadoc)
81
     * @see eu.etaxonomy.cdm.common.IProgressMonitor#setCanceled(boolean)
82
     */
83
    @Override
84
    public void setCanceled(boolean isCanceled) {
85
        this.isCanceled = isCanceled;
86
    }
87

    
88
    /* (non-Javadoc)
89
     * @see eu.etaxonomy.cdm.common.IProgressMonitor#setTaskName(java.lang.String)
90
     */
91
    @Override
92
    public void setTaskName(String taskName) {
93
        this.taskName = taskName;
94
    }
95

    
96
    /* (non-Javadoc)
97
     * @see eu.etaxonomy.cdm.common.IProgressMonitor#subTask(java.lang.String)
98
     */
99
    @Override
100
    public void subTask(String subTask) {
101
        this.subTask = subTask;
102
        logger.info(/*getPercentage() + "% done." + */  " Next Task: " + subTask);
103
    }
104

    
105
    /* (non-Javadoc)
106
     * @see eu.etaxonomy.cdm.common.IProgressMonitor#worked(int)
107
     */
108
    @Override
109
    public void worked(int work) {
110
        computeWorked(work);
111
//      this.workDone = this.workDone +  work;
112
    }
113

    
114

    
115
    @Override
116
    public void internalWorked(double work) {
117
        computeWorked(work);
118
//      this.workDone = this.workDone +  work;
119
    }
120

    
121
    private void computeWorked(double work){
122
        this.workDone = this.workDone +  work;
123
        logger.info(getPercentage() + "% done (Completed Task: " + subTask + ")");
124
    }
125

    
126
    /* (non-Javadoc)
127
     * @see eu.etaxonomy.cdm.common.IProgressMonitor#warning(java.lang.String)
128
     */
129
    @Override
130
    public void warning(String warning) {
131
        logger.warn(warning);
132
    }
133

    
134
    /* (non-Javadoc)
135
     * @see eu.etaxonomy.cdm.common.IProgressMonitor#warning(java.lang.String, java.lang.Exception)
136
     */
137
    @Override
138
    public void warning(String warning, Throwable exception) {
139
        logger.warn(warning);
140
        exception.printStackTrace();
141
    }
142

    
143
    public Double getPercentage(){
144
        if(totalWork == 0 ){
145
            return null;
146
        }
147

    
148
        double result = this.workDone * 100 / this.totalWork ;
149
        result = Math.ceil((result * 100.0)) / 100.0;
150
        return result;
151
    }
152

    
153

    
154
    /**
155
     * {@inheritDoc}
156
     */
157
    @Override
158
    public void waitForFeedback() {
159
        if(feedbackLock == null) {
160
            feedbackLock =  new Object();
161
        }
162
        synchronized (feedbackLock) {
163
            feedback = null;
164
            while(feedback == null) {
165
                isWaitingForFeedback = true;
166
                try {
167
                    feedbackWaitStartTime = System.currentTimeMillis();
168
                    feedbackLock.wait();
169
                } catch (InterruptedException ie) {
170
                    throw new IllegalStateException(ie);
171
                }
172
            }
173
        }
174
    }
175

    
176
    /**
177
     * {@inheritDoc}
178
     */
179
    @Override
180
    public void setFeedback(Serializable feedback) {
181
        synchronized (feedbackLock) {
182
            this.feedback = feedback;
183
            this.feedbackLock.notifyAll();
184
            isWaitingForFeedback = false;
185
        }
186
    }
187

    
188

    
189
    /**
190
     * {@inheritDoc}
191
     */
192
    @Override
193
    public Serializable getFeedback() {
194
        return feedback;
195
    }
196

    
197
    /**
198
     * {@inheritDoc}
199
     */
200
    @Override
201
    public boolean getIsWaitingForFeedback() {
202
        return isWaitingForFeedback;
203
    }
204

    
205

    
206
    /**
207
     * {@inheritDoc}
208
     */
209
    @Override
210
    public void waitForFeedback(long feedbackWaitTimeout) {
211
        if(feedbackWaitTimeout <= 0 ) {
212
            throw new IllegalStateException("Feedback wait timeout should be a positive number");
213
        }
214
        this.feedbackWaitTimeout = feedbackWaitTimeout;
215
        waitForFeedback();
216
    }
217

    
218

    
219
    /**
220
     * {@inheritDoc}
221
     */
222
    @Override
223
    public boolean hasFeedbackWaitTimedOut() {
224
       long now = System.currentTimeMillis();
225
       return isWaitingForFeedback && (now - feedbackWaitStartTime > feedbackWaitTimeout);
226
    }
227

    
228

    
229

    
230
    /**
231
     * {@inheritDoc}
232
     */
233
    @Override
234
    public String getOwner() {
235
        return owner;
236
    }
237

    
238

    
239
    /**
240
     * {@inheritDoc}
241
     */
242
    @Override
243
    public void setOwner(String owner) {
244
        this.owner = owner;
245
    }
246

    
247

    
248
    /**
249
     * {@inheritDoc}
250
     */
251
    @Override
252
    public void interrupt() {
253
        // do nothing
254
    }
255

    
256

    
257

    
258
}
(1-1/10)