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    
012    package javax.wvcm;
013    
014    import java.text.MessageFormat;
015    
016    import javax.wvcm.PropertyRequestItem.PropertyRequest;
017    
018    public 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