001    /*
002     * Copyright (c) 2007-2015 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.Function;
031    import cascading.operation.FunctionCall;
032    import cascading.tuple.Fields;
033    import cascading.tuple.Tuple;
034    import cascading.util.Pair;
035    
036    /**
037     * Class DateFormatter is used to convert a date timestamp to a formatted string, where a timestamp
038     * is the number of milliseconds since January 1, 1970, 00:00:00 GMT,  using the {@link SimpleDateFormat} syntax.
039     * <p/>
040     * Note the timezone data is given to the SimpleDateFormat, not the internal Calendar instance which interprets
041     * the 'timestamp' value as it is assumed the timestamp is already in GMT.
042     */
043    public class DateFormatter extends DateOperation implements Function<Pair<SimpleDateFormat, Tuple>>
044      {
045      /** Field FIELD_NAME */
046      public static final String FIELD_NAME = "datetime";
047    
048      /**
049       * Constructor DateParser creates a new DateParser instance that creates a simple long time stamp of the parsed date.
050       *
051       * @param dateFormatString of type String
052       */
053      @ConstructorProperties({"dateFormatString"})
054      public DateFormatter( String dateFormatString )
055        {
056        super( 1, new Fields( FIELD_NAME ), dateFormatString );
057        }
058    
059      /**
060       * Constructor DateParser creates a new DateParser instance.
061       *
062       * @param fieldDeclaration of type Fields
063       * @param dateFormatString of type String
064       */
065      @ConstructorProperties({"fieldDeclaration", "dateFormatString"})
066      public DateFormatter( Fields fieldDeclaration, String dateFormatString )
067        {
068        super( 1, fieldDeclaration, dateFormatString );
069        }
070    
071      /**
072       * Constructor DateFormatter creates a new DateFormatter instance.
073       *
074       * @param fieldDeclaration of type Fields
075       * @param dateFormatString of type String
076       * @param zone             of type TimeZone
077       */
078      @ConstructorProperties({"fieldDeclaration", "dateFormatString", "zone"})
079      public DateFormatter( Fields fieldDeclaration, String dateFormatString, TimeZone zone )
080        {
081        super( 1, fieldDeclaration, dateFormatString, zone, null );
082        }
083    
084      /**
085       * Constructor DateFormatter creates a new DateFormatter instance.
086       *
087       * @param fieldDeclaration of type Fields
088       * @param dateFormatString of type String
089       * @param zone             of type TimeZone
090       * @param locale           of type Locale
091       */
092      @ConstructorProperties({"fieldDeclaration", "dateFormatString", "zone", "locale"})
093      public DateFormatter( Fields fieldDeclaration, String dateFormatString, TimeZone zone, Locale locale )
094        {
095        super( 1, fieldDeclaration, dateFormatString, zone, locale );
096        }
097    
098      @Override
099      public void operate( FlowProcess flowProcess, FunctionCall<Pair<SimpleDateFormat, Tuple>> functionCall )
100        {
101        long ts = functionCall.getArguments().getLong( 0 );
102    
103        Calendar calendar = getCalendar();
104    
105        calendar.setTimeInMillis( ts );
106    
107        functionCall.getContext().getRhs().set( 0, functionCall.getContext().getLhs().format( calendar.getTime() ) );
108    
109        functionCall.getOutputCollector().add( functionCall.getContext().getRhs() );
110        }
111      }