001    /*
002     *  Copyright 2001-2005 Stephen Colebourne
003     *
004     *  Licensed under the Apache License, Version 2.0 (the "License");
005     *  you may not use this file except in compliance with the License.
006     *  You may obtain a copy of the License at
007     *
008     *      http://www.apache.org/licenses/LICENSE-2.0
009     *
010     *  Unless required by applicable law or agreed to in writing, software
011     *  distributed under the License is distributed on an "AS IS" BASIS,
012     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     *  See the License for the specific language governing permissions and
014     *  limitations under the License.
015     */
016    package org.joda.time.field;
017    
018    import java.io.Serializable;
019    import java.util.Locale;
020    import org.joda.time.DateTimeField;
021    import org.joda.time.DateTimeFieldType;
022    import org.joda.time.DurationField;
023    import org.joda.time.ReadablePartial;
024    
025    /**
026     * <code>DelegatedDateTimeField</code> delegates each method call to the
027     * date time field it wraps.
028     * <p>
029     * DelegatedDateTimeField is thread-safe and immutable, and its subclasses must
030     * be as well.
031     *
032     * @author Brian S O'Neill
033     * @since 1.0
034     * @see DecoratedDateTimeField
035     */
036    public class DelegatedDateTimeField extends DateTimeField implements Serializable {
037    
038        /** Serialization version */
039        private static final long serialVersionUID = -4730164440214502503L;
040    
041        /** The DateTimeField being wrapped */
042        private final DateTimeField iField;
043        /** The override field type */
044        private final DateTimeFieldType iType;
045    
046        /**
047         * Constructor.
048         * 
049         * @param field  the field being decorated
050         */
051        public DelegatedDateTimeField(DateTimeField field) {
052            this(field, null);
053        }
054    
055        /**
056         * Constructor.
057         * 
058         * @param field  the field being decorated
059         * @param type  the field type override
060         */
061        public DelegatedDateTimeField(DateTimeField field, DateTimeFieldType type) {
062            super();
063            if (field == null) {
064                throw new IllegalArgumentException("The field must not be null");
065            }
066            iField = field;
067            iType = (type == null ? field.getType() : type);
068        }
069    
070        /**
071         * Gets the wrapped date time field.
072         * 
073         * @return the wrapped DateTimeField
074         */
075        public final DateTimeField getWrappedField() {
076            return iField;
077        }
078    
079        public DateTimeFieldType getType() {
080            return iType;
081        }
082    
083        public String getName() {
084            return iType.getName();
085        }
086    
087        public boolean isSupported() {
088            return iField.isSupported();
089        }
090    
091        public boolean isLenient() {
092            return iField.isLenient();
093        }
094    
095        public int get(long instant) {
096            return iField.get(instant);
097        }
098    
099        public String getAsText(long instant, Locale locale) {
100            return iField.getAsText(instant, locale);
101        }
102    
103        public String getAsText(long instant) {
104            return iField.getAsText(instant);
105        }
106    
107        public String getAsText(ReadablePartial partial, int fieldValue, Locale locale) {
108            return iField.getAsText(partial, fieldValue, locale);
109        }
110    
111        public String getAsText(ReadablePartial partial, Locale locale) {
112            return iField.getAsText(partial, locale);
113        }
114    
115        public String getAsText(int fieldValue, Locale locale) {
116            return iField.getAsText(fieldValue, locale);
117        }
118    
119        public String getAsShortText(long instant, Locale locale) {
120            return iField.getAsShortText(instant, locale);
121        }
122    
123        public String getAsShortText(long instant) {
124            return iField.getAsShortText(instant);
125        }
126    
127        public String getAsShortText(ReadablePartial partial, int fieldValue, Locale locale) {
128            return iField.getAsShortText(partial, fieldValue, locale);
129        }
130    
131        public String getAsShortText(ReadablePartial partial, Locale locale) {
132            return iField.getAsShortText(partial, locale);
133        }
134    
135        public String getAsShortText(int fieldValue, Locale locale) {
136            return iField.getAsShortText(fieldValue, locale);
137        }
138    
139        public long add(long instant, int value) {
140            return iField.add(instant, value);
141        }
142    
143        public long add(long instant, long value) {
144            return iField.add(instant, value);
145        }
146    
147        public int[] add(ReadablePartial instant, int fieldIndex, int[] values, int valueToAdd) {
148            return iField.add(instant, fieldIndex, values, valueToAdd);
149        }
150    
151        public int[] addWrapPartial(ReadablePartial instant, int fieldIndex, int[] values, int valueToAdd) {
152            return iField.addWrapPartial(instant, fieldIndex, values, valueToAdd);
153        }
154    
155        public long addWrapField(long instant, int value) {
156            return iField.addWrapField(instant, value);
157        }
158    
159        public int[] addWrapField(ReadablePartial instant, int fieldIndex, int[] values, int valueToAdd) {
160            return iField.addWrapField(instant, fieldIndex, values, valueToAdd);
161        }
162    
163        public int getDifference(long minuendInstant, long subtrahendInstant) {
164            return iField.getDifference(minuendInstant, subtrahendInstant);
165        }
166    
167        public long getDifferenceAsLong(long minuendInstant, long subtrahendInstant) {
168            return iField.getDifferenceAsLong(minuendInstant, subtrahendInstant);
169        }
170    
171        public long set(long instant, int value) {
172            return iField.set(instant, value);
173        }
174    
175        public long set(long instant, String text, Locale locale) {
176            return iField.set(instant, text, locale);
177        }
178    
179        public long set(long instant, String text) {
180            return iField.set(instant, text);
181        }
182    
183        public int[] set(ReadablePartial instant, int fieldIndex, int[] values, int newValue) {
184            return iField.set(instant, fieldIndex, values, newValue);
185        }
186    
187        public int[] set(ReadablePartial instant, int fieldIndex, int[] values, String text, Locale locale) {
188            return iField.set(instant, fieldIndex, values, text, locale);
189        }
190    
191        public DurationField getDurationField() {
192            return iField.getDurationField();
193        }
194    
195        public DurationField getRangeDurationField() {
196            return iField.getRangeDurationField();
197        }
198    
199        public boolean isLeap(long instant) {
200            return iField.isLeap(instant);
201        }
202    
203        public int getLeapAmount(long instant) {
204            return iField.getLeapAmount(instant);
205        }
206    
207        public DurationField getLeapDurationField() {
208            return iField.getLeapDurationField();
209        }
210    
211        public int getMinimumValue() {
212            return iField.getMinimumValue();
213        }
214    
215        public int getMinimumValue(long instant) {
216            return iField.getMinimumValue(instant);
217        }
218    
219        public int getMinimumValue(ReadablePartial instant) {
220            return iField.getMinimumValue(instant);
221        }
222    
223        public int getMinimumValue(ReadablePartial instant, int[] values) {
224            return iField.getMinimumValue(instant, values);
225        }
226    
227        public int getMaximumValue() {
228            return iField.getMaximumValue();
229        }
230    
231        public int getMaximumValue(long instant) {
232            return iField.getMaximumValue(instant);
233        }
234    
235        public int getMaximumValue(ReadablePartial instant) {
236            return iField.getMaximumValue(instant);
237        }
238    
239        public int getMaximumValue(ReadablePartial instant, int[] values) {
240            return iField.getMaximumValue(instant, values);
241        }
242    
243        public int getMaximumTextLength(Locale locale) {
244            return iField.getMaximumTextLength(locale);
245        }
246    
247        public int getMaximumShortTextLength(Locale locale) {
248            return iField.getMaximumShortTextLength(locale);
249        }
250    
251        public long roundFloor(long instant) {
252            return iField.roundFloor(instant);
253        }
254    
255        public long roundCeiling(long instant) {
256            return iField.roundCeiling(instant);
257        }
258    
259        public long roundHalfFloor(long instant) {
260            return iField.roundHalfFloor(instant);
261        }
262    
263        public long roundHalfCeiling(long instant) {
264            return iField.roundHalfCeiling(instant);
265        }
266    
267        public long roundHalfEven(long instant) {
268            return iField.roundHalfEven(instant);
269        }
270    
271        public long remainder(long instant) {
272            return iField.remainder(instant);
273        }
274    
275        public String toString() {
276            return ("DateTimeField[" + getName() + ']');
277        }
278    
279    }