001 /* 002 * Copyright (c) 2007-2014 Concurrent, Inc. All Rights Reserved. 003 * 004 * Project and contact information: http://www.cascading.org/ 005 * 006 * This file is part of the Cascading project. 007 * 008 * Licensed under the Apache License, Version 2.0 (the "License"); 009 * you may not use this file except in compliance with the License. 010 * You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, software 015 * distributed under the License is distributed on an "AS IS" BASIS, 016 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 017 * See the License for the specific language governing permissions and 018 * limitations under the License. 019 */ 020 021 package cascading.operation.text; 022 023 import java.beans.ConstructorProperties; 024 import java.text.SimpleDateFormat; 025 import java.util.Calendar; 026 import java.util.Locale; 027 import java.util.TimeZone; 028 029 import cascading.flow.FlowProcess; 030 import cascading.operation.BaseOperation; 031 import cascading.operation.OperationCall; 032 import cascading.tuple.Fields; 033 import cascading.tuple.Tuple; 034 import cascading.util.Pair; 035 036 /** Class DateOperation is the base class for {@link DateFormatter} and {@link DateParser}. */ 037 public class DateOperation extends BaseOperation<Pair<SimpleDateFormat, Tuple>> 038 { 039 /** Field zone */ 040 protected TimeZone zone; 041 /** Field locale */ 042 protected Locale locale; 043 /** Field dateFormatString */ 044 final String dateFormatString; 045 046 /** 047 * Constructor DateOperation creates a new DateOperation instance. 048 * 049 * @param numArgs of type int 050 * @param fieldDeclaration of type Fields 051 * @param dateFormatString of type String 052 */ 053 @ConstructorProperties({"numArgs", "fieldDeclaration", "dateFormatString"}) 054 public DateOperation( int numArgs, Fields fieldDeclaration, String dateFormatString ) 055 { 056 super( numArgs, fieldDeclaration ); 057 this.dateFormatString = dateFormatString; 058 059 if( !fieldDeclaration.isSubstitution() && fieldDeclaration.size() != 1 ) 060 throw new IllegalArgumentException( "fieldDeclaration may only declare one field name, got " + fieldDeclaration.print() ); 061 } 062 063 /** 064 * Constructor DateOperation creates a new DateOperation instance. 065 * 066 * @param numArgs of type int 067 * @param fieldDeclaration of type Fields 068 * @param dateFormatString of type String 069 * @param zone of type TimeZone 070 * @param locale of type Locale 071 */ 072 @ConstructorProperties({"numArgs", "fieldDeclaration", "dateFormatString", "zone", "locale"}) 073 public DateOperation( int numArgs, Fields fieldDeclaration, String dateFormatString, TimeZone zone, Locale locale ) 074 { 075 super( numArgs, fieldDeclaration ); 076 this.dateFormatString = dateFormatString; 077 this.zone = zone; 078 this.locale = locale; 079 } 080 081 public String getDateFormatString() 082 { 083 return dateFormatString; 084 } 085 086 /** 087 * Method getDateFormat returns the dateFormat of this DateParser object. 088 * 089 * @return the dateFormat (type SimpleDateFormat) of this DateParser object. 090 */ 091 public SimpleDateFormat getDateFormat() 092 { 093 SimpleDateFormat dateFormat = new SimpleDateFormat( dateFormatString, getLocale() ); 094 095 dateFormat.setTimeZone( getZone() ); 096 097 return dateFormat; 098 } 099 100 private Locale getLocale() 101 { 102 if( locale != null ) 103 return locale; 104 105 return Locale.getDefault(); 106 } 107 108 private TimeZone getZone() 109 { 110 if( zone != null ) 111 return zone; 112 113 return TimeZone.getTimeZone( "UTC" ); 114 } 115 116 protected Calendar getCalendar() 117 { 118 return Calendar.getInstance( TimeZone.getTimeZone( "UTC" ), getLocale() ); 119 } 120 121 @Override 122 public void prepare( FlowProcess flowProcess, OperationCall<Pair<SimpleDateFormat, Tuple>> operationCall ) 123 { 124 operationCall.setContext( new Pair<SimpleDateFormat, Tuple>( getDateFormat(), Tuple.size( 1 ) ) ); 125 } 126 127 @Override 128 public boolean equals( Object object ) 129 { 130 if( this == object ) 131 return true; 132 if( !( object instanceof DateOperation ) ) 133 return false; 134 if( !super.equals( object ) ) 135 return false; 136 137 DateOperation that = (DateOperation) object; 138 139 if( dateFormatString != null ? !dateFormatString.equals( that.dateFormatString ) : that.dateFormatString != null ) 140 return false; 141 if( locale != null ? !locale.equals( that.locale ) : that.locale != null ) 142 return false; 143 if( zone != null ? !zone.equals( that.zone ) : that.zone != null ) 144 return false; 145 146 return true; 147 } 148 149 @Override 150 public int hashCode() 151 { 152 int result = super.hashCode(); 153 result = 31 * result + ( zone != null ? zone.hashCode() : 0 ); 154 result = 31 * result + ( locale != null ? locale.hashCode() : 0 ); 155 result = 31 * result + ( dateFormatString != null ? dateFormatString.hashCode() : 0 ); 156 return result; 157 } 158 }