/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.logs;

import java.io.Serializable;
import java.util.Map;

/**
 * This interface is for extracting additional information given a value.
 * It could connect to a db to extract value, or using a 3rd party library to extract additional info.
 *
 * @since 0.9.4
 */
public interface InformationExtractor extends Serializable
{
  /**
   * Implementor should provide code that needs to be run for this extractor to be set up
   */
  public void setup();

  /**
   * Implementor should provide code that needs to be run for this extractor to be shut down
   */
  public void teardown();

  /**
   * Extracts information from the value and returns the extracted information as a map of string to object
   *
   * @param value
   * @return information map
   */
  public Map<String, Object> extractInformation(Object value);
}
