Class ProgressReporter
- All Implemented Interfaces:
IProgressReportConstants, IProgressReporter, Comparable
IProgressReporter
Any process wishing to participate in providing global progress indication can instantiate this class and simply use the available methods so set values or issue a command
When ever any state changes in this reporter a notification will be sent to the global
reporting manager ProgressReportingManager followed by a notification to all
registered listeners of this reporter
ProgressReporter.ProgressReport which
represents a snapshot of all the public properties contained in this reporter; inspecting the
ProgressReport is the only way a listener can query the properties of this reporter. This pattern
allows the ProgressReporter to continue and process requests by not having to thread lock all public
methods. Additionally, the listeners are guaranteed a consistent snapshot of the reporter.
This reporter also has the capability to receive loop back commands from a listener for actions such like
cancel() and retry(). These commands are enabled by calling
setCancelAllowed(boolean)
or setRetryAllowed(boolean).
The listener only initiates these actions by sending a notification back to the owner of the reporter;
it is up the to owner to perform the actual act of canceling or retrying.
A typical life cycle of the ProgresReporter as seen from an owner is as follows (an owner is defined as the process that created the reporter):
- Create ProgressReporter
- Set initial properties
- Register a listener to the reporter to respond to loopback notifications (optional)
- Update the reporter
- Set selection or percentage [
setSelection(int, String),setPercentage(int, String)] - Set message [
setMessage(String)] - ...
- Repeat until done
- Set done [
setDone()] - Then optionally Dispose of the reporter [
]
invalid reference
ProgressReporter#dispose(Object).
In addition to internal clean-ups, calling dispose(Object) will effectively remove the reporter from the history stack of the reporting manager and no more messages from this reporter will be processed.
Once a reporter is created and any property in the reporter is set the global reporting manager is notified; at which point any listener listening to the manager is forwarded this reporter. The manager listener may decide to display this reporter in a UI element, may register specific listeners to this reporter, may query its properties and take action, or can simply monitor it for such functions as logging.
This implementation is non-intrusive to the owner process and so provides existing processes the ability to participate in global progress indication without significant modification to the underlying processes.-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionclassAn immutable object containing all interesting values in aProgressReporter. -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate booleanprivate Stringprivate Stringprivate intAn instance id for this reporter that is guaranteed to be unique within this same sessionprivate org.eclipse.swt.graphics.Imageprivate booleanIf any of the following states have been reached then the reporter is considered inactive:isDisposed==trueisDone==trueisInErrorState==trueisCanceled==trueprivate booleanprivate booleanprivate booleanprivate booleanprivate booleanprivate booleanprivate booleanprivate booleanprivate IProgressReportprivate intprivate ProgressReportingManagerprivate intprivate Stringprivate CopyOnWriteListAccumulates the detail messages in a Listprivate intprivate intprivate Stringprivate ObjectAn arbitrary object reference that can be used by the owner of theProgressReporterand its listeners to share additional information should the current implementation be insufficientprivate intprivate CopyOnWriteListprivate Stringprivate intprivate StringFields inherited from interface IProgressReportConstants
AUTO_CLOSE, BORDER, MANAGER_EVENT_ADDED, MANAGER_EVENT_REMOVED, MANAGER_EVENT_UPDATED, MODAL, MSG_TYPE_ERROR, MSG_TYPE_INFO, MSG_TYPE_LOG, NONE, REPORT_TYPE_CANCEL, REPORT_TYPE_DISPOSED, REPORT_TYPE_DONE, REPORT_TYPE_ERROR, REPORT_TYPE_INIT, REPORT_TYPE_MODE_CHANGE, REPORT_TYPE_PROPERTY_CHANGED, REPORT_TYPE_RETRY, REPORTER_TYPE_DEFAULT, REPORTER_VISIBILITY_SYSTEM, REPORTER_VISIBILITY_USER, RETVAL_OK, RETVAL_OK_TO_DISPOSE, SHOW_TOOLBAR, STANDALONE -
Constructor Summary
ConstructorsModifierConstructorDescriptionprotectedProgressReporter(ProgressReportingManager manager) Construct aProgressReporter; the returned instance is initialized with the proper IDprotectedProgressReporter(ProgressReportingManager _manager, String name) Construct aProgressReporterwith the givenname; the returned instance would have been initialized with the proper ID -
Method Summary
Modifier and TypeMethodDescriptionvoidaddListener(IProgressReporterListener listener) private voidaddToMessageHistory(String value, int type) Create and add anIMessageto the message historyvoidappendDetailMessage(String detailMessage) Appends the detail message to this reporter.voidcancel()Marks this reporter as canceled and notify any listeners about itintNumerically compare by reporter ID'svoiddispose()Disposes any resources or listeners that this reporter has references to or otherwise is responsible forbooleanReporters are equal iif they have the same IDbooleanIMessage[]Returns an array ofIMessage's that has been generated since the reporter was createdReturns anIProgressReportwhich is a snapshot of this reporterinthashCode()Hashcode and ID are the sameprivate voidprivate voidnotifyListeners(IProgressReport report) Notifies registered listener that an event has occurred.private voidreInit()Resets this reporter to its initial states such that values are reset to defaultvoidremoveListener(IProgressReporterListener listener) voidretry()Notifies listener that a retry is requestedvoidsetCancelAllowed(boolean cancelAllowed) Sets whether the process associated with this reporter is allowed to be canceled by the user.voidsetCancelCloses(boolean b) voidsetDone()Indicates that the associated process is donevoidsetErrorMessage(String errorMessage) Sets an error message to this reporter; subsequentlyisInErrorStatewill be set totruevoidsetImage(org.eclipse.swt.graphics.Image image) Sets the image corresponding to this reporter; this image may be used by the UI to decorate this reportervoidsetIndeterminate(boolean isIndeterminate) Set this reporter into indeterminate mode; use this when an accurate ratio of amount of work done vs.voidsetMaximum(int max) voidsetMessage(String message) Sets the current status message for this reporter; this is typically used to display a message at each incremental updatevoidsetMinimum(int min) voidvoidsetObjectData(Object objectData) An arbitrary object reference that can be used to further identify the reporter.voidsetPercentage(int percentage, String message) Sets thepercentagevalue to the progress reporter; this is used when a simple percentage is specified as opposed to setting min, max, and selection.voidsetReporterType(String reporterType) Sets the type of a reporter.voidsetRetryAllowed(boolean retryOnError) This is a hint to any UI components displaying this reporter to determine if the user should be prompted to retry on errorvoidsetSelection(int selection, String message) Sets theselectionto the progress reporter; this is used when a traditional min, max, selection is specified.voidSets the title that may be used by a UI component.private booleanA convenience method to return whether this reporter should ignore subsequent calls to its accessor methods.private voidupdateAndNotify(int eventType) Updates and notifies listeners
-
Field Details
-
manager
-
ID
private int IDAn instance id for this reporter that is guaranteed to be unique within this same session -
minimum
private int minimum -
maximum
private int maximum -
selection
private int selection -
percentage
private int percentage -
latestReportType
private int latestReportType -
isIndeterminate
private boolean isIndeterminate -
isDone
private boolean isDone -
isPercentageInUse
private boolean isPercentageInUse -
isCancelAllowed
private boolean isCancelAllowed -
isCanceled
private boolean isCanceled -
isRetryAllowed
private boolean isRetryAllowed -
isInErrorState
private boolean isInErrorState -
isDisposed
private boolean isDisposed -
title
-
message
-
messageHistory
Accumulates the detail messages in a ListThis is for when a listener starts listening to this reporter after it has started running; upon initialization the listener may query this list to get all messages sent up to that point.
-
detailMessage
-
errorMessage
-
name
-
image
private org.eclipse.swt.graphics.Image image -
reporterType
-
latestProgressReport
-
reporterListeners
-
objectData
An arbitrary object reference that can be used by the owner of theProgressReporterand its listeners to share additional information should the current implementation be insufficient -
messageHistoryLimit
private int messageHistoryLimit -
isActive
private boolean isActiveIf any of the following states have been reached then the reporter is considered inactive:isDisposed==trueisDone==trueisInErrorState==trueisCanceled==true
-
cancelCloses
private boolean cancelCloses
-
-
Constructor Details
-
ProgressReporter
Construct aProgressReporter; the returned instance is initialized with the proper ID -
ProgressReporter
Construct aProgressReporterwith the givenname; the returned instance would have been initialized with the proper ID- Parameters:
name-
-
-
Method Details
-
setReporterType
Description copied from interface:IProgressReporterSets the type of a reporter. This is a user defined property and no duplication check is ensured. This optional property can be used to identify particular types of reports so that report consumers have a way to ignore uninteresting report types- Specified by:
setReporterTypein interfaceIProgressReporter- Parameters:
reporterType-
-
dispose
public void dispose()Description copied from interface:IProgressReporterDisposes any resources or listeners that this reporter has references to or otherwise is responsible forAlso removes it from the global
ProgressReportingManagerso that any subsequent event from this reporter is no longer forwarded- Specified by:
disposein interfaceIProgressReporter
-
reInit
private void reInit()Resets this reporter to its initial states such that values are reset to defaultAn appropriate use for this is when a process is restarting or retrying; this allows an owning process to keep on using the same instance of this reporter without having to create and dispatch a new one
-
initMessageHistory
private void initMessageHistory() -
notifyListeners
Notifies registered listener that an event has occurred. Subsequently a listener may be removed if it returns the value ofRETVAL_OK_TO_DISPOSE; this optimization is designed to prevent dangling/orphaned listeners, and also reduces the number of listeners to notify upon the next event -
updateAndNotify
private void updateAndNotify(int eventType) Updates and notifies listeners- Parameters:
REPORT_TYPE-
-
setSelection
Description copied from interface:IProgressReporterSets theselectionto the progress reporter; this is used when a traditional min, max, selection is specified.NOTE: this selection value also synchronize the
percentagevalue of this reporter- Specified by:
setSelectionin interfaceIProgressReporter- Parameters:
selection-message-
-
setPercentage
Description copied from interface:IProgressReporterSets thepercentagevalue to the progress reporter; this is used when a simple percentage is specified as opposed to setting min, max, and selection.NOTE: this percentage value also synchronize the
selectionvalue of this reporter- Specified by:
setPercentagein interfaceIProgressReporter- Parameters:
percentage- an integer from 0-100message- a textual message to display;nullto leave the previous message untouched, empty String to clear any previous message
-
setIndeterminate
public void setIndeterminate(boolean isIndeterminate) Description copied from interface:IProgressReporterSet this reporter into indeterminate mode; use this when an accurate ratio of amount of work done vs. total amount of work can not be calculated- Specified by:
setIndeterminatein interfaceIProgressReporter- Parameters:
isIndeterminate-
-
setDone
public void setDone()Description copied from interface:IProgressReporterIndicates that the associated process is done- Specified by:
setDonein interfaceIProgressReporter
-
setMessage
Description copied from interface:IProgressReporterSets the current status message for this reporter; this is typically used to display a message at each incremental update- Specified by:
setMessagein interfaceIProgressReporter- Parameters:
message- a textual message
-
appendDetailMessage
Description copied from interface:IProgressReporterAppends the detail message to this reporter. This is typically a more verbose message that is optionally displayed by the UI. This is an optional property so UI components displaying this can decide to show nothing for it (if it'snull)or show the regular message in its placeAdditionally this is an appending message so that reporters can send smaller units of the message rather than having to store and send the entire (and ever increasing) messages for each update
- Specified by:
appendDetailMessagein interfaceIProgressReporter- Parameters:
detailMessage-
-
setMinimum
public void setMinimum(int min) - Specified by:
setMinimumin interfaceIProgressReporter- Parameters:
min- the min to set
-
setMaximum
public void setMaximum(int max) - Specified by:
setMaximumin interfaceIProgressReporter- Parameters:
max- the max to set
-
cancel
public void cancel()Description copied from interface:IProgressReporterMarks this reporter as canceled and notify any listeners about itNOTE: This is only a hint back to the processes listening to this reporter; it is up to that process to determine the correct course of action in response to this flag
- Specified by:
cancelin interfaceIProgressReporter
-
retry
public void retry()Description copied from interface:IProgressReporterNotifies listener that a retry is requested- Specified by:
retryin interfaceIProgressReporter
-
setCancelAllowed
public void setCancelAllowed(boolean cancelAllowed) Description copied from interface:IProgressReporterSets whether the process associated with this reporter is allowed to be canceled by the user. This serves as a hint to the progress manager handling this reporter. If set totruethe manager may enable a UI component allowing the user to cancel the associated process if appropriate.The holder of this reporter can register a listener to receive the cancel event
- Specified by:
setCancelAllowedin interfaceIProgressReporter- Parameters:
cancelAllowed-trueto indicate that this process may solicit aREPORT_TYPE_CANCELinput from the user; default isfalse- See Also:
-
setName
- Specified by:
setNamein interfaceIProgressReporter- Parameters:
name- a textual name to identify the process this reporter represents; need not be unique (should not be used as a lookup key), and may benull.
-
setTitle
Description copied from interface:IProgressReporterSets the title that may be used by a UI component. A typical usage would be for the title of a progress dialog- Specified by:
setTitlein interfaceIProgressReporter- Parameters:
title- the title to set
-
setImage
public void setImage(org.eclipse.swt.graphics.Image image) Description copied from interface:IProgressReporterSets the image corresponding to this reporter; this image may be used by the UI to decorate this reporterNOTE: Though not strictly required (nor enforced) the image should be 32X32 pixels with transparency. If not then cropping or enlargement may be applied as required by the particular UI
- Specified by:
setImagein interfaceIProgressReporter- Parameters:
image- the image; may benull
-
setErrorMessage
Description copied from interface:IProgressReporterSets an error message to this reporter; subsequentlyisInErrorStatewill be set totrue- Specified by:
setErrorMessagein interfaceIProgressReporter- Parameters:
errorMessage-- See Also:
-
setRetryAllowed
public void setRetryAllowed(boolean retryOnError) Description copied from interface:IProgressReporterThis is a hint to any UI components displaying this reporter to determine if the user should be prompted to retry on error- Specified by:
setRetryAllowedin interfaceIProgressReporter
-
shouldIgnore
private boolean shouldIgnore()A convenience method to return whether this reporter should ignore subsequent calls to its accessor methods. When a reporter has reached this state listeners usually make the assumption that there will be no more changes to any properties in this reporter. The use of this method is intended to provide a more consistent state for the reporter; without this check a listener may have reference to a reporter that is marked asdonebut then a subsequent message says it's at 50% completion. By cutting of the notification here we prevent such ambiguity from occurring for the listeners.If any of the following states have been reached then the reporter can ignore subsequent calls to its accessor methods:
isDisposed==trueisDone==true
- Returns:
-
getCancelCloses
public boolean getCancelCloses()- Specified by:
getCancelClosesin interfaceIProgressReporter
-
setCancelCloses
public void setCancelCloses(boolean b) - Specified by:
setCancelClosesin interfaceIProgressReporter
-
addToMessageHistory
Create and add anIMessageto the message history- Parameters:
value-type-
-
setObjectData
Description copied from interface:IProgressReporterAn arbitrary object reference that can be used to further identify the reporter. This object is also accessible to listeners of the reporter throughProgressReporter.ProgressReport.objectDataso that it can be used to pass information to and from the listeners.- Specified by:
setObjectDatain interfaceIProgressReporter- Parameters:
objectData- the objectData to set
-
getMessageHistory
Description copied from interface:IProgressReporterReturns an array ofIMessage's that has been generated since the reporter was created- Specified by:
getMessageHistoryin interfaceIProgressReporter- Returns:
-
addListener
- Specified by:
addListenerin interfaceIProgressReporter- Parameters:
listener-
-
removeListener
- Specified by:
removeListenerin interfaceIProgressReporter- Parameters:
listener-
-
compareTo
Numerically compare by reporter ID's- Specified by:
compareToin interfaceComparable
-
equals
-
hashCode
-
getProgressReport
Description copied from interface:IProgressReporterReturns anIProgressReportwhich is a snapshot of this reporterNOTE: Each call to this method creates a new snapshot therefore the correct usage pattern is:
IProgressReport report = getProgressReport(); if( report.isDone() == false ){ // Do something { else if( report.isCanceled() == false ){ // Do something else { ...It may be tempting to use the less verbose pattern by repeatedly calling this method directly such as:if( getProgressReport().isDone == false ){ // Do something { else if( getProgressReport().isCanceled == false ){ // Do something else {BUT this can produce inconsistent results since each successive call to getProgressReport() is returning a different snapshot.- Specified by:
getProgressReportin interfaceIProgressReporter- Returns:
-