1 //----------------------------------------------------------------------
2 //
3 // PerfectJPattern: "Design patterns are good but components are better!"
4 // ProgressData.java Copyright (c) 2009 Giovanni Azua Garcia
5 // bravegag@hotmail.com
6 //
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License
9 // as published by the Free Software Foundation; either version 3
10 // of the License, or (at your option) any later version.
11 //
12 // This program is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, see <http://www.gnu.org/licenses/>.
19 //
20 //----------------------------------------------------------------------
21 package org.perfectjpattern.core.behavioral.observer.data;
22
23 /**
24 * Immutable Observer event data intended to be used in notifying progress
25 * information.
26 *
27 * @author <a href="mailto:bravegag@hotmail.com">Giovanni Azua</a>
28 * @version $Revision: 1.0 $ $Date: Jun 17, 2007 3:00:29 PM $
29 */
30 public
31 class ProgressData
32 extends StatusData
33 {
34 //------------------------------------------------------------------------
35 // public
36 //------------------------------------------------------------------------
37 /**
38 * Creates a progress information with precalculated task percentage
39 * completed.
40 *
41 * @param aStatus Status of the task
42 * @param aMessage Description of the current status
43 * @param aProgress Percentage of completion of the task [0 .. 100]
44 * @throws IllegalArgumentException "'aStatus' must not be null"
45 * @throws IllegalArgumentException "'aMessage' must not be null"
46 */
47 public
48 ProgressData(Status aStatus, String aMessage, int aProgress)
49 {
50 super(aStatus, aMessage);
51
52 theProgress = aProgress;
53 }
54
55 //------------------------------------------------------------------------
56 /**
57 * Creates a progress information with total and current progress values,
58 * this variation of the constructor calculates the percentage based on the
59 * two values.
60 *
61 * @param aStatus Status of the task
62 * @param aMessage Description of the current status
63 * @param aTotal Numeric total of the task
64 * @param aCurrent Current value of the task in reference to the total
65 */
66 public
67 ProgressData(Status aStatus, String aMessage, int aTotal, int aCurrent)
68 {
69 this(aStatus, aMessage, Math.round((float) aCurrent /
70 (float) aTotal * 100.0f));
71 }
72
73 //------------------------------------------------------------------------
74 /**
75 * Copy constructor.
76 *
77 * @param aProgressData Existing ProgressData
78 */
79 public
80 ProgressData(ProgressData aProgressData)
81 {
82 this(aProgressData.getStatus(), aProgressData.getMessage(),
83 aProgressData.getProgress());
84 }
85
86 //------------------------------------------------------------------------
87 /**
88 * Returns the progress information as an Integer with value between 0
89 * and 100.
90 *
91 * @return Progress information as an Integer with value between 0
92 * and 100.
93 */
94 public int
95 getProgress()
96 {
97 return theProgress;
98 }
99
100 //------------------------------------------------------------------------
101
102 /**
103 * {@inheritDoc}
104 */
105 @Override
106 public boolean
107 equals(Object anObject)
108 {
109 if (this == anObject)
110 {
111 return true;
112 }
113
114 if (!super.equals(anObject))
115 {
116 return false;
117 }
118
119 if (getClass() != anObject.getClass())
120 {
121 return false;
122 }
123
124 final ProgressData myAnother = (ProgressData) anObject;
125 if (theProgress != myAnother.theProgress)
126 {
127 return false;
128 }
129
130 return true;
131 }
132
133 //------------------------------------------------------------------------
134 /**
135 * {@inheritDoc}
136 */
137 @Override
138 public int
139 hashCode()
140 {
141 final int myPrime = 31;
142 int myResult = super.hashCode();
143
144 myResult = myPrime * myResult + theProgress;
145
146 return myResult;
147 }
148
149 //------------------------------------------------------------------------
150 /**
151 * {@inheritDoc}
152 */
153 @Override
154 public String
155 toString()
156 {
157 return "ProgressData(" + super.toString() + ", Progress='" +
158 getProgress() + "%')";
159 }
160
161 //------------------------------------------------------------------------
162 // members
163 //------------------------------------------------------------------------
164 /**
165 * Progress completed in percent.
166 */
167 private final int theProgress;
168
169 /**
170 * Reusable <code>ProgressData</code> instance corresponding to a
171 * <b>Started</b> event.
172 */
173 public static final ProgressData STARTED =
174 new ProgressData(Status.STARTED, "Task has started.", 0);
175
176 /**
177 * Reusable <code>ProgressData</code> instance corresponding to a
178 * <b>Failed</b> event.
179 */
180 public static final ProgressData FAILED =
181 new ProgressData(Status.FAILED, "Task has failed", 0);
182
183 /**
184 * Reusable <code>ProgressData</code> instance corresponding to a
185 * <b>Completed</b> event.
186 */
187 public static final ProgressData COMPLETED =
188 new ProgressData(Status.COMPLETED, "Task has completed.", 100);
189 }