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