View Javadoc

1   /*
2    *  jDTAUS Core API
3    *  Copyright (C) 2005 Christian Schulte
4    *  <cs@schulte.it>
5    *
6    *  This library is free software; you can redistribute it and/or
7    *  modify it under the terms of the GNU Lesser General Public
8    *  License as published by the Free Software Foundation; either
9    *  version 2.1 of the License, or any later version.
10   *
11   *  This library is distributed in the hope that it will be useful,
12   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   *  Lesser General Public License for more details.
15   *
16   *  You should have received a copy of the GNU Lesser General Public
17   *  License along with this library; if not, write to the Free Software
18   *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19   *
20   */
21  package org.jdtaus.core.monitor;
22  
23  import java.io.Serializable;
24  import java.rmi.server.UID;
25  import java.util.Comparator;
26  import org.jdtaus.core.text.Message;
27  
28  /**
29   * A task of execution.
30   * <p>A task is a sequence of operations taking time. This class defines
31   * properties to be used by applications to query a task for information and for
32   * canceling a task. Property {@code indeterminate} indicates if a task
33   * supports properties {@code minimum}, {@code maximum} and {@code progress}.
34   * Property {@code cancelable} indicates if a task may be canceled by an
35   * application by setting property {@code cancelled} to {@code true}.
36   * Properties {@code description} and {@code progressDescription} hold
37   * presentation descriptions of a task itself and of the work currently
38   * performed by a task.</p>
39   *
40   * @author <a href="mailto:cs@schulte.it">Christian Schulte</a>
41   * @version $JDTAUS: Task.java 8743 2012-10-07 03:06:20Z schulte $
42   *
43   * @see TaskEvent
44   */
45  public abstract class Task implements Cloneable, Serializable
46  {
47      //--Constants---------------------------------------------------------------
48  
49      /**
50       * Comparator for sorting tasks in ascending order of creation time.
51       * <p><b>Note:</b><br/>
52       * This comparator imposes orderings that are inconsistent with equals.</p>
53       */
54      public static final Comparator ASCENDING = new AscendingTaskComparator();
55  
56      /**
57       * Comparator for sorting tasks in descending order of creation time.
58       * <p><b>Note:</b><br/>
59       * This comparator imposes orderings that are inconsistent with equals.</p>
60       */
61      public static final Comparator DESCENDING =
62          new DescendingTaskComparator();
63  
64      /** Serial version UID for backwards compatibility with 1.0.x classes. */
65      private static final long serialVersionUID = -3919376355708819307L;
66  
67      //---------------------------------------------------------------Constants--
68      //--Constructors------------------------------------------------------------
69  
70      /** Creates a new {@code Task} instance. */
71      public Task()
72      {
73          super();
74          this.uid = new UID();
75          this.indeterminate = true;
76          this.timestamp = System.currentTimeMillis();
77      }
78  
79      //------------------------------------------------------------Constructors--
80      //--Task--------------------------------------------------------------------
81  
82      /**
83       * Unique task identifier.
84       * @serial
85       */
86      private UID uid;
87  
88      /**
89       * The timestamp this task got created.
90       * @serial
91       */
92      private long timestamp;
93  
94      /**
95       * Flag indicating that an application cancelled the task.
96       * @serial
97       */
98      private boolean cancelled;
99  
100     /**
101      * Description of the {@code Task}.
102      * @serial
103      */
104     protected Message description;
105 
106     /**
107      * Description of the progress of the {@code Task}.
108      * @serial
109      */
110     protected Message progressDescription;
111 
112     /**
113      * The lower bound of the range.
114      * @serial
115      */
116     protected int minimum;
117 
118     /**
119      * The upper bound of the range.
120      * @serial
121      */
122     protected int maximum;
123 
124     /**
125      * Indicates the progress of the task.
126      * @serial
127      */
128     protected int progress;
129 
130     /**
131      * Flag indicating if the operations performed by the task are of unknown
132      * length.
133      * @serial
134      */
135     protected boolean indeterminate;
136 
137     /**
138      * Flag indicating that an application may cancel the task.
139      * @serial
140      */
141     protected boolean cancelable;
142 
143     /**
144      * Getter for property {@code timestamp}.
145      *
146      * @return the timestamp this task got created.
147      */
148     public final synchronized long getTimestamp()
149     {
150         return this.timestamp;
151     }
152 
153     /**
154      * Getter for property {@code description}.
155      *
156      * @return description of the task.
157      */
158     public final synchronized Message getDescription()
159     {
160         return this.description;
161     }
162 
163     /**
164      * Getter for property {@code progressDescription}.
165      *
166      * @return description of the progress of the task or {@code null}.
167      */
168     public final synchronized Message getProgressDescription()
169     {
170         return this.progressDescription;
171     }
172 
173     /**
174      * Gets the lower end of the progress value.
175      *
176      * @return an int representing the minimum value.
177      *
178      * @throws IllegalStateException if the task is indeterminate.
179      */
180     public final synchronized int getMinimum()
181     {
182         if ( this.isIndeterminate() )
183         {
184             throw new IllegalStateException();
185         }
186 
187         return this.minimum;
188     }
189 
190     /**
191      * Gets the higher end of the progress value.
192      *
193      * @return an int representing the maximum value.
194      *
195      * @throws IllegalStateException if the task is indeterminate.
196      */
197     public final synchronized int getMaximum()
198     {
199         if ( this.isIndeterminate() )
200         {
201             throw new IllegalStateException();
202         }
203 
204         return this.maximum;
205     }
206 
207     /**
208      * Gets the progress of the task.
209      *
210      * @return the progress of the task.
211      *
212      * @throws IllegalStateException if the task is indeterminate.
213      */
214     public final synchronized int getProgress()
215     {
216         if ( this.isIndeterminate() )
217         {
218             throw new IllegalStateException();
219         }
220 
221         return this.progress;
222     }
223 
224     /**
225      * Flag indicating if the task supports properties {@code minimum},
226      * {@code maximum} and {@code progress}.
227      *
228      * @return {@code true} if the operations performed by the task are of
229      * unknown length; {@code false} if properties {@code minimum},
230      * {@code maximum} and {@code progress} hold progress information.
231      */
232     public final synchronized boolean isIndeterminate()
233     {
234         return this.indeterminate;
235     }
236 
237     /**
238      * Flag indicating that the task supports property {@code cancelled}.
239      *
240      * @return {@code true} if the task supports property {@code cancelled};
241      * {@code false} if property {@code cancelled} is ignored by the task.
242      */
243     public final synchronized boolean isCancelable()
244     {
245         return this.cancelable;
246     }
247 
248     /**
249      * Flag indicating that the task is canceled.
250      *
251      * @return {@code true} if the task is canceled; {@code false} else.
252      *
253      * @throws IllegalStateException if the task is not cancelable.
254      */
255     public final synchronized boolean isCancelled()
256     {
257         if ( !this.isCancelable() )
258         {
259             throw new IllegalStateException();
260         }
261 
262         return this.cancelled;
263     }
264 
265     /**
266      * Setter for property {@code cancelled}.
267      * <p>Applications may request cancellation of a {@code Task} by setting
268      * property {@code cancelled} to {@code true}. Implementations indicate
269      * support for task cancellation by property {@code cancelable}.</p>
270      *
271      * @param value {@code true} to cancel the task; {@code false} else.
272      *
273      * @throws IllegalStateException if the task is not cancelable or is already
274      * canceled.
275      */
276     public final synchronized void setCancelled( final boolean value )
277     {
278         if ( !this.isCancelable() || this.isCancelled() )
279         {
280             throw new IllegalStateException();
281         }
282 
283         this.cancelled = value;
284     }
285 
286     /**
287      * Creates a string representing the properties of the instance.
288      *
289      * @return a string representing the properties of the instance.
290      */
291     private String internalString()
292     {
293         return new StringBuffer( 500 ).append( '{' ).
294             append( "uid=" ).append( this.uid ).
295             append( ", indeterminate=" ).append( this.indeterminate ).
296             append( ", cancelable=" ).append( this.cancelable ).
297             append( ", cancelled=" ).append( this.cancelled ).
298             append( ", maximum=" ).append( this.maximum ).
299             append( ", minimum=" ).append( this.minimum ).
300             append( ", progress=" ).append( this.progress ).
301             append( ", description=" ).append( this.description ).
302             append( ", progressDescription=" ).
303             append( this.progressDescription ).
304             append( ", timestamp=" ).append( this.timestamp ).
305             append( '}' ).toString();
306 
307     }
308 
309     //--------------------------------------------------------------------Task--
310     //--Object------------------------------------------------------------------
311 
312     /**
313      * Returns a string representation of the object.
314      *
315      * @return a string representation of the object.
316      */
317     public String toString()
318     {
319         return super.toString() + this.internalString();
320     }
321 
322     /**
323      * Returns a hash code value for this object.
324      *
325      * @return a hash code value for this object.
326      */
327     public final int hashCode()
328     {
329         return this.uid.hashCode();
330     }
331 
332     /**
333      * Indicates whether some other object is equal to this one.
334      * <p>Tasks internally cary a UID which is created during instantiation.
335      * This UID is used for comparing {@code o} with the instance.</p>
336      *
337      * @param o the reference object with which to compare.
338      *
339      * @return {@code true} if this object is the same as {@code o};
340      * {@code false} otherwise.
341      *
342      * @see UID
343      */
344     public final boolean equals( final Object o )
345     {
346         return o == this || ( o instanceof Task &&
347             ( (Task) o ).uid.equals( this.uid ) );
348 
349     }
350 
351     /**
352      * Creates and returns a copy of this object.
353      *
354      * @return a clone of this instance.
355      */
356     public Object clone()
357     {
358         try
359         {
360             return super.clone();
361         }
362         catch ( final CloneNotSupportedException e )
363         {
364             throw new AssertionError( e );
365         }
366     }
367 
368     //------------------------------------------------------------------Object--
369 }
370 
371 /**
372  * Comparator for sorting tasks in ascending order of creation time.
373  * <p><b>Note:</b><br/>
374  * This comparator imposes orderings that are inconsistent with equals.</p>
375  *
376  * @author <a href="mailto:cs@schulte.it">Christian Schulte</a>
377  * @version $JDTAUS: Task.java 8743 2012-10-07 03:06:20Z schulte $
378  */
379 class AscendingTaskComparator implements Comparator, Serializable
380 {
381     /** Creates a new {@code AscendingTaskComparator} instance. */
382     AscendingTaskComparator()
383     {
384         super();
385     }
386 
387     //--Comparator--------------------------------------------------------------
388 
389     /**
390      * {@inheritDoc}
391      *
392      * @throws NullPointerException if either {@code o1} or {@code o2} is
393      * {@code null}.
394      * @throws ClassCastException if either {@code o1} or {@code o2} is not an
395      * instance of {@code Task}.
396      */
397     public int compare( final Object o1, final Object o2 )
398     {
399         if ( o1 == null )
400         {
401             throw new NullPointerException( "o1" );
402         }
403         if ( o2 == null )
404         {
405             throw new NullPointerException( "o2" );
406         }
407         if ( !( o1 instanceof Task ) )
408         {
409             throw new ClassCastException( o1.getClass().getName() );
410         }
411         if ( !( o2 instanceof Task ) )
412         {
413             throw new ClassCastException( o2.getClass().getName() );
414         }
415 
416         // TODO JDK 1.5 Long.valueOf(long)
417         final Long l1 = new Long( ( (Task) o1 ).getTimestamp() );
418         final Long l2 = new Long( ( (Task) o2 ).getTimestamp() );
419         return l1.compareTo( l2 );
420     }
421 
422     //--------------------------------------------------------------Comparator--
423 }
424 
425 /**
426  * Comparator for sorting tasks in descending order of creation time.
427  * <p><b>Note:</b><br/>
428  * This comparator imposes orderings that are inconsistent with equals.</p>
429  *
430  * @author <a href="mailto:cs@schulte.it">Christian Schulte</a>
431  * @version $JDTAUS: Task.java 8743 2012-10-07 03:06:20Z schulte $
432  */
433 class DescendingTaskComparator
434     extends AscendingTaskComparator
435 {
436 
437     /** Creates a new {@code DescendingTaskComparator} instance. */
438     DescendingTaskComparator()
439     {
440         super();
441     }
442 
443     //--Comparator--------------------------------------------------------------
444 
445     /**
446      * {@inheritDoc}
447      *
448      * @throws NullPointerException if either {@code o1} or {@code o2} is
449      * {@code null}.
450      * @throws ClassCastException if either {@code o1} or {@code o2} is not an
451      * instance of {@code Task}.
452      */
453     public int compare( final Object o1, final Object o2 )
454     {
455         return super.compare( o2, o1 );
456     }
457 
458     //--------------------------------------------------------------Comparator--
459 }