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 org.joda.time.DurationField;
020 import org.joda.time.DurationFieldType;
021
022 /**
023 * <code>DelegatedDurationField</code> delegates each method call to the
024 * duration field it wraps.
025 * <p>
026 * DelegatedDurationField is thread-safe and immutable, and its subclasses must
027 * be as well.
028 *
029 * @author Brian S O'Neill
030 * @see DecoratedDurationField
031 * @since 1.0
032 */
033 public class DelegatedDurationField extends DurationField implements Serializable {
034
035 /** Serialization lock. */
036 private static final long serialVersionUID = -5576443481242007829L;
037
038 /** The DurationField being wrapped */
039 private final DurationField iField;
040 /** The field type */
041 private final DurationFieldType iType;
042
043 /**
044 * Constructor.
045 *
046 * @param field the base field
047 */
048 protected DelegatedDurationField(DurationField field) {
049 this(field, null);
050 }
051
052 /**
053 * Constructor.
054 *
055 * @param field the base field
056 * @param type the field type to use
057 */
058 protected DelegatedDurationField(DurationField field, DurationFieldType type) {
059 super();
060 if (field == null) {
061 throw new IllegalArgumentException("The field must not be null");
062 }
063 iField = field;
064 iType = (type == null ? field.getType() : type);
065 }
066
067 //-----------------------------------------------------------------------
068 /**
069 * Gets the wrapped duration field.
070 *
071 * @return the wrapped DurationField
072 */
073 public final DurationField getWrappedField() {
074 return iField;
075 }
076
077 public DurationFieldType getType() {
078 return iType;
079 }
080
081 public String getName() {
082 return iType.getName();
083 }
084
085 /**
086 * Returns true if this field is supported.
087 */
088 public boolean isSupported() {
089 return iField.isSupported();
090 }
091
092 public boolean isPrecise() {
093 return iField.isPrecise();
094 }
095
096 public int getValue(long duration) {
097 return iField.getValue(duration);
098 }
099
100 public long getValueAsLong(long duration) {
101 return iField.getValueAsLong(duration);
102 }
103
104 public int getValue(long duration, long instant) {
105 return iField.getValue(duration, instant);
106 }
107
108 public long getValueAsLong(long duration, long instant) {
109 return iField.getValueAsLong(duration, instant);
110 }
111
112 public long getMillis(int value) {
113 return iField.getMillis(value);
114 }
115
116 public long getMillis(long value) {
117 return iField.getMillis(value);
118 }
119
120 public long getMillis(int value, long instant) {
121 return iField.getMillis(value, instant);
122 }
123
124 public long getMillis(long value, long instant) {
125 return iField.getMillis(value, instant);
126 }
127
128 public long add(long instant, int value) {
129 return iField.add(instant, value);
130 }
131
132 public long add(long instant, long value) {
133 return iField.add(instant, value);
134 }
135
136 public int getDifference(long minuendInstant, long subtrahendInstant) {
137 return iField.getDifference(minuendInstant, subtrahendInstant);
138 }
139
140 public long getDifferenceAsLong(long minuendInstant, long subtrahendInstant) {
141 return iField.getDifferenceAsLong(minuendInstant, subtrahendInstant);
142 }
143
144 public long getUnitMillis() {
145 return iField.getUnitMillis();
146 }
147
148 public int compareTo(Object durationField) {
149 return iField.compareTo(durationField);
150 }
151
152 public String toString() {
153 return (iType == null) ? iField.toString() :
154 ("DurationField[" + iType + ']');
155 }
156
157 }