    001/*
    002 * Copyright (c) 2007-2017 Xplenty, 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
    021package cascading.operation.text;
    022
    023import java.beans.ConstructorProperties;
    024import java.util.Formatter;
    025
    026import cascading.flow.FlowProcess;
    027import cascading.operation.BaseOperation;
    028import cascading.operation.Function;
    029import cascading.operation.FunctionCall;
    030import cascading.operation.OperationCall;
    031import cascading.tuple.Fields;
    032import cascading.tuple.Tuple;
    033
    034/**
    035 * Class FieldFormatter formats the values in a Tuple with a given format and stuffs the result into a new field.
    036 * <p/>
    037 * This function uses the {@link Formatter} class for formatting the argument tuple values into a new string.
    038 */
    039public class FieldFormatter extends BaseOperation<Tuple> implements Function<Tuple>
    040  {
    041  /** Field FIELD_NAME */
    042  public static final String FIELD_NAME = "formatted";
    043
    044  /** Field format */
    045  private String format = null;
    046
    047  /**
    048   * Constructor FieldJoiner creates a new FieldFormatter instance using the default field name "formatted".
    049   *
    050   * @param format of type String
    051   */
    052  @ConstructorProperties({"format"})
    053  public FieldFormatter( String format )
    054    {
    055    super( new Fields( FIELD_NAME ) );
    056    this.format = format;
    057    }
    058
    059  /**
    060   * Constructor FieldJoiner creates a new FieldFormatter instance.
    061   *
    062   * @param fieldDeclaration of type Fields
    063   * @param format           of type String
    064   */
    065  @ConstructorProperties({"fieldDeclaration", "format"})
    066  public FieldFormatter( Fields fieldDeclaration, String format )
    067    {
    068    super( fieldDeclaration );
    069    this.format = format;
    070
    071    if( fieldDeclaration.size() != 1 )
    072      throw new IllegalArgumentException( "fieldDeclaration may only declare one field name, got " + fieldDeclaration.print() );
    073    }
    074
    075  /**
    076   * Method getFormat returns the format of this FieldFormatter object.
    077   *
    078   * @return the format (type String) of this FieldFormatter object.
    079   */
    080  public String getFormat()
    081    {
    082    return format;
    083    }
    084
    085  @Override
    086  public void prepare( FlowProcess flowProcess, OperationCall<Tuple> operationCall )
    087    {
    088    operationCall.setContext( Tuple.size( 1 ) );
    089    }
    090
    091  @Override
    092  public void operate( FlowProcess flowProcess, FunctionCall<Tuple> functionCall )
    093    {
    094    functionCall.getContext().set( 0, functionCall.getArguments().getTuple().format( format ) );
    095    functionCall.getOutputCollector().add( functionCall.getContext() );
    096    }
    097
    098  @Override
    099  public boolean equals( Object object )
    100    {
    101    if( this == object )
    102      return true;
    103    if( !( object instanceof FieldFormatter ) )
    104      return false;
    105    if( !super.equals( object ) )
    106      return false;
    107
    108    FieldFormatter that = (FieldFormatter) object;
    109
    110    if( format != null ? !format.equals( that.format ) : that.format != null )
    111      return false;
    112
    113    return true;
    114    }
    115
    116  @Override
    117  public int hashCode()
    118    {
    119    int result = super.hashCode();
    120    result = 31 * result + ( format != null ? format.hashCode() : 0 );
    121    return result;
    122    }
    123  }