// Copyright 2011 Google 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 adaptorlib;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Map;

/**
 * Represents an individual transform in the transform pipeline.
 * Subclass this to add your own custom behavior.
 */
public class DocumentTransform  {

  public DocumentTransform(String name) {
    this.name = name;
  }

  /**
   * Override this function to do the actual data transformation.
   * Read data from the ByteArrayOutputStream instances holding the incoming data,
   * and write them to the OutputStreams. Any changes to the params map will be
   * passed on the subsequent transforms.
   *
   * @throws TransformException
   * @throws IOException
   */
  public void transform(ByteArrayOutputStream contentIn, OutputStream contentOut,
                        Map<String, String> metadata, Map<String, String> params)
      throws TransformException, IOException {
    // Defaults to identity transform
    contentIn.writeTo(contentOut);
  }

  public void name(String name) { this.name = name; }
  public String name() { return name; }

  /**
   * If this property is true, a failure of this transform will cause the entire
   * transform pipeline to abort. This is useful in the case where a particular
   * transform is required in order to server data. For example, a transform
   * tasked with redacting or filtering document content.
   *
   * If this is false and a error occurs, this transform is treated as a
   * identity transform.
   */
  public void errorHaltsPipeline(boolean errorHaltsPipeline) {
    this.errorHaltsPipeline = errorHaltsPipeline;
  }

  public boolean errorHaltsPipeline() {
    return errorHaltsPipeline;
  }

  private boolean errorHaltsPipeline = true;
  private String name = "";
}
