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 org.joda.time.DateTimeField;
019    import org.joda.time.DateTimeFieldType;
020    import org.joda.time.DurationField;
021    
022    /**
023     * <code>DecoratedDateTimeField</code> extends {@link BaseDateTimeField},
024     * implementing only the minimum required set of methods. These implemented
025     * methods delegate to a wrapped field.
026     * <p>
027     * This design allows new DateTimeField types to be defined that piggyback on
028     * top of another, inheriting all the safe method implementations from
029     * BaseDateTimeField. Should any method require pure delegation to the
030     * wrapped field, simply override and use the provided getWrappedField method.
031     * <p>
032     * DecoratedDateTimeField is thread-safe and immutable, and its subclasses must
033     * be as well.
034     *
035     * @author Brian S O'Neill
036     * @since 1.0
037     * @see DelegatedDateTimeField
038     */
039    public abstract class DecoratedDateTimeField extends BaseDateTimeField {
040    
041        /** Serialization version */
042        private static final long serialVersionUID = 203115783733757597L;
043    
044        /** The DateTimeField being wrapped */
045        private final DateTimeField iField;
046    
047        /**
048         * Constructor.
049         * 
050         * @param field  the field being decorated
051         * @param type  allow type to be overridden
052         */
053        protected DecoratedDateTimeField(DateTimeField field, DateTimeFieldType type) {
054            super(type);
055            if (field == null) {
056                throw new IllegalArgumentException("The field must not be null");
057            }
058            if (!field.isSupported()) {
059                throw new IllegalArgumentException("The field must be supported");
060            }
061            iField = field;
062        }
063    
064        /**
065         * Gets the wrapped date time field.
066         * 
067         * @return the wrapped DateTimeField
068         */
069        public final DateTimeField getWrappedField() {
070            return iField;
071        }
072    
073        public boolean isLenient() {
074            return iField.isLenient();
075        }
076    
077        public int get(long instant) {
078            return iField.get(instant);
079        }
080    
081        public long set(long instant, int value) {
082            return iField.set(instant, value);
083        }
084    
085        public DurationField getDurationField() {
086            return iField.getDurationField();
087        }
088    
089        public DurationField getRangeDurationField() {
090            return iField.getRangeDurationField();
091        }
092    
093        public int getMinimumValue() {
094            return iField.getMinimumValue();
095        }
096    
097        public int getMaximumValue() {
098            return iField.getMaximumValue();
099        }
100    
101        public long roundFloor(long instant) {
102            return iField.roundFloor(instant);
103        }
104    
105    }