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 }