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 */
016package org.joda.time.field;
017
018import java.io.Serializable;
019import java.util.Locale;
020import org.joda.time.DateTimeField;
021import org.joda.time.DateTimeFieldType;
022import org.joda.time.DurationField;
023import 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 */
036public 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}