/*
 * Copyright (c) 2015 DataTorrent, Inc. ALL Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.datatorrent.lib.converter;

import com.datatorrent.api.BaseOperator;
import com.datatorrent.api.DefaultInputPort;
import com.datatorrent.api.DefaultOutputPort;
import java.nio.charset.Charset;

/*
 * This operator converts Byte Array to String. User gets the option of providing character Encoding.
 */
public class ByteArrayToStringConverterOperator extends BaseOperator
{
  private Charset characterEncoding;

  public String getCharacterEncoding()
  {
    return characterEncoding.name();
  }

  public void setCharacterEncoding(String characterEncoding)
  {
    this.characterEncoding = Charset.forName(characterEncoding);
  }



  /**
   * Input port which accepts byte array.
   */
  public final transient DefaultInputPort<byte[]> input = new DefaultInputPort<byte[]>()
  {
    @Override
    public void process(byte[] message)
    {
      output.emit(characterEncoding == null? new String(message): new String(message, characterEncoding));
    }

  };

  /**
   * Output port which outputs String converted from byte array.
   */
  public final transient DefaultOutputPort<String> output = new DefaultOutputPort<String>();

}
