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 }