001/*
002 * Copyright (c) 2016-2017 Chris K Wensel <chris@wensel.net>. All Rights Reserved.
003 * Copyright (c) 2007-2017 Xplenty, Inc. All Rights Reserved.
004 *
005 * Project and contact information: http://www.cascading.org/
006 *
007 * This file is part of the Cascading project.
008 *
009 * Licensed under the Apache License, Version 2.0 (the "License");
010 * you may not use this file except in compliance with the License.
011 * You may obtain a copy of the License at
012 *
013 *     http://www.apache.org/licenses/LICENSE-2.0
014 *
015 * Unless required by applicable law or agreed to in writing, software
016 * distributed under the License is distributed on an "AS IS" BASIS,
017 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
018 * See the License for the specific language governing permissions and
019 * limitations under the License.
020 */
021
022package cascading.operation.text;
023
024import java.beans.ConstructorProperties;
025import java.text.SimpleDateFormat;
026import java.util.Calendar;
027import java.util.Locale;
028import java.util.TimeZone;
029
030import cascading.flow.FlowProcess;
031import cascading.operation.Function;
032import cascading.operation.FunctionCall;
033import cascading.tuple.Fields;
034import cascading.tuple.TupleEntry;
035import cascading.util.Pair;
036
037/**
038 * Class DateFormatter is used to convert a date timestamp to a formatted string, where a timestamp
039 * is the number of milliseconds since January 1, 1970, 00:00:00 GMT,  using the {@link SimpleDateFormat} syntax.
040 * <p>
041 * Note the timezone data is given to the SimpleDateFormat, not the internal Calendar instance which interprets
042 * the 'timestamp' value as it is assumed the timestamp is already in GMT.
043 */
044public class DateFormatter extends DateOperation implements Function<Pair<SimpleDateFormat, TupleEntry>>
045  {
046  /** Field FIELD_NAME */
047  public static final String FIELD_NAME = "datetime";
048
049  /**
050   * Constructor DateParser creates a new DateParser instance that creates a simple long time stamp of the parsed date.
051   *
052   * @param dateFormatString of type String
053   */
054  @ConstructorProperties({"dateFormatString"})
055  public DateFormatter( String dateFormatString )
056    {
057    super( 1, new Fields( FIELD_NAME ), dateFormatString );
058    }
059
060  /**
061   * Constructor DateParser creates a new DateParser instance.
062   *
063   * @param fieldDeclaration of type Fields
064   * @param dateFormatString of type String
065   */
066  @ConstructorProperties({"fieldDeclaration", "dateFormatString"})
067  public DateFormatter( Fields fieldDeclaration, String dateFormatString )
068    {
069    super( 1, fieldDeclaration, dateFormatString );
070    }
071
072  /**
073   * Constructor DateFormatter creates a new DateFormatter instance.
074   *
075   * @param fieldDeclaration of type Fields
076   * @param dateFormatString of type String
077   * @param zone             of type TimeZone
078   */
079  @ConstructorProperties({"fieldDeclaration", "dateFormatString", "zone"})
080  public DateFormatter( Fields fieldDeclaration, String dateFormatString, TimeZone zone )
081    {
082    super( 1, fieldDeclaration, dateFormatString, zone, null );
083    }
084
085  /**
086   * Constructor DateFormatter creates a new DateFormatter instance.
087   *
088   * @param fieldDeclaration of type Fields
089   * @param dateFormatString of type String
090   * @param zone             of type TimeZone
091   * @param locale           of type Locale
092   */
093  @ConstructorProperties({"fieldDeclaration", "dateFormatString", "zone", "locale"})
094  public DateFormatter( Fields fieldDeclaration, String dateFormatString, TimeZone zone, Locale locale )
095    {
096    super( 1, fieldDeclaration, dateFormatString, zone, locale );
097    }
098
099  @Override
100  public void operate( FlowProcess flowProcess, FunctionCall<Pair<SimpleDateFormat, TupleEntry>> functionCall )
101    {
102    long ts = functionCall.getArguments().getLong( 0 );
103
104    Calendar calendar = getCalendar();
105
106    calendar.setTimeInMillis( ts );
107
108    String formatted = functionCall.getContext().getLhs().format( calendar.getTime() );
109
110    functionCall.getContext().getRhs().setString( 0, formatted );
111
112    functionCall.getOutputCollector().add( functionCall.getContext().getRhs() );
113    }
114  }