001/*
002 * file BasicDetailedFeedback.java
003 *
004 * Licensed Materials - Property of IBM
005 * Restricted Materials of IBM
006 * 
007 * (c) Copyright IBM Corporation 2007, 2008.  All Rights Reserved. 
008 * Note to U.S. Government Users Restricted Rights:  Use, duplication or  
009 * disclosure restricted by GSA ADP  Schedule Contract with IBM Corp. 
010 */
011
012package javax.wvcm;
013
014import java.text.MessageFormat;
015
016import javax.wvcm.PropertyRequestItem.PropertyRequest;
017
018public class DetailedFeedback implements Feedback
019{
020    public static class NestedDetailedFeedback implements Feedback
021    {
022        private DetailedFeedback _detailedFeedback = null;
023        private PropertyRequest _forResult = null;
024        private int _begin = 0; // The beginning of the nested interval
025        private int _end = 0; // The end of the nested interval
026        
027        private NestedDetailedFeedback(
028                DetailedFeedback detailedFeedback,
029                PropertyRequest forResult,
030                int end) {
031            _detailedFeedback = detailedFeedback;
032            _forResult = forResult;
033            _begin = detailedFeedback._last;
034            _end = end;
035          }
036          
037        public PropertyRequest getPropertyRequestForResult() {
038            return _forResult;
039        }
040
041        public PropertyRequest getPropertyRequestForModified() {
042            return _detailedFeedback._forModified;
043        }
044
045        public boolean isAbortRequested() {
046            return _detailedFeedback.isAbortRequested();
047        }
048
049        public Feedback nest() {
050            return nest(null, 0);
051        }
052        
053        public Feedback nest(PropertyRequest forResult) {
054            return nest(forResult, 0);
055        }
056
057        public Feedback nest(int percentCompleted) {
058            return nest(null, percentCompleted);
059        }
060
061        private boolean equalPropertyRequest(PropertyRequest pr1, PropertyRequest pr2) {
062            if (pr1 == pr2) {
063                return true;
064            }
065            if (pr1 != null) {
066                return pr1.equals(pr2);
067            }
068            return false;
069        }
070            
071        public Feedback nest(PropertyRequest forResult, int percentToBeCompleted) {
072            if (equalPropertyRequest(forResult, _forResult) && (_end - _begin) == 0) {
073                return this;
074            }
075            int end = _begin + (percentToBeCompleted * (_end - _begin) / 100);
076            return new NestedDetailedFeedback(_detailedFeedback, forResult, end);
077        }
078        
079        public String format(String fmt, Object...arguments) {
080            return MessageFormat.format(fmt, arguments);
081        }
082
083        public void notifyActive(String message) {
084            _detailedFeedback.notifyActive(message);
085        }
086
087        public void notifyWarning(String message) {
088            _detailedFeedback.notifyWarning(message);
089        }
090
091        public void notifyIsModified(Resource resource) {
092            _detailedFeedback.notifyIsModified(resource);
093        }
094
095        public void notifyPercentComplete(int percentComplete) {
096            int done = _begin + (percentComplete * (_end - _begin) / 100);
097            if (done > _detailedFeedback._last) {
098                _detailedFeedback.notifyPercentComplete(done);
099            }
100        }
101        
102        public void abortRequested(boolean isAbortRequested) {
103            _detailedFeedback._isAbortRequested = isAbortRequested;
104        }
105
106        public void setPropertyRequestForResult(PropertyRequest propertyRequestForResult) {
107            _forResult = propertyRequestForResult;
108        }
109
110        public void setPropertyRequestForModified(PropertyRequest propertyRequestForModified) {
111            _detailedFeedback._forModified = propertyRequestForModified;
112        }
113
114    }
115    private static final Feedback nullDetailedFeedback = new DetailedFeedback();
116    
117    private PropertyRequest _forResult = null;
118    private PropertyRequest _forModified = null;
119    private boolean _isAbortRequested = false;
120    protected int _last = 0; // The last percentage reported
121    
122    public DetailedFeedback() {
123    }
124      
125    /**
126     * Create a non-null Feedback object.
127     * @return a non-null Feedback object.
128     */
129    public static Feedback fb(Feedback feedback) {
130        if (feedback == null) {
131            return nullDetailedFeedback;
132        }
133        if (feedback instanceof Feedback) {
134            return (Feedback)feedback;
135        }
136        throw new RuntimeException("Unexpected feedback type"); //$NON-NLS-1$
137    }
138
139    public PropertyRequest getPropertyRequestForResult() {
140        return _forResult;
141    }
142
143    public PropertyRequest getPropertyRequestForModified() {
144        return _forModified;
145    }
146
147    public boolean isAbortRequested() {
148        return _isAbortRequested;
149    }
150
151    public Feedback nest() {
152        return nest(null, 0);
153    }
154    
155    public Feedback nest(PropertyRequest forResult) {
156        return nest(forResult, 0);
157    }
158
159    public Feedback nest(int percentCompleted) {
160        return nest(null, percentCompleted);
161    }
162
163    public Feedback nest(PropertyRequest forResult, int percentToBeCompleted) {
164        int end = _last;
165        if (end < percentToBeCompleted) {
166            end = percentToBeCompleted;
167        }
168        return new NestedDetailedFeedback(this, forResult, end);
169    }
170
171    public String format(String fmt, Object...arguments) {
172        return MessageFormat.format(fmt, arguments);
173    }
174
175    public void notifyActive(String message) {
176    }
177
178    public void notifyWarning(String message) {
179    }
180
181    public void notifyIsModified(Resource resource) {
182    }
183
184    public void notifyPercentComplete(int percentComplete) {
185        _last = percentComplete;
186    }
187    
188    public void abortRequested(boolean isAbortRequested) {
189        _isAbortRequested = isAbortRequested;
190    }
191
192    public void setPropertyRequestForResult(PropertyRequest propertyRequestForResult) {
193        _forResult = propertyRequestForResult;
194    }
195
196    public void setPropertyRequestForModified(PropertyRequest propertyRequestForModified) {
197        _forModified = propertyRequestForModified;
198    }
199
200}
201