/**
 * 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.stram.plan.logical;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import javax.validation.ValidationException;

import org.slf4j.Logger;

import org.apache.apex.api.DAGSetupPlugin;

import com.datatorrent.api.DAG;
import com.datatorrent.api.Operator;

import static org.slf4j.LoggerFactory.getLogger;

public class PropertyInjectorVisitor implements DAGSetupPlugin
{
  private static final Logger LOG = getLogger(PropertyInjectorVisitor.class);

  private String path;
  private Map<String, String> propertyMap = new HashMap<>();
  private DAG dag;

  @Override
  public void setup(DAGSetupPluginContext context)
  {
    this.dag = context.getDAG();
    try {
      this.path = context.getConfiguration().get("propertyVisitor.Path");
      Properties properties = new Properties();
      properties.load(this.getClass().getResourceAsStream(path));
      for (Map.Entry<Object, Object> entry : properties.entrySet()) {
        propertyMap.put(entry.getKey().toString(), entry.getValue().toString());
      }
    } catch (IOException ex) {
      throw new ValidationException("Not able to load input file " + path);
    }
  }

  @Override
  public void prePopulateDAG()
  {

  }

  @Override
  public void postPopulateDAG()
  {

  }

  @Override
  public void preConfigureDAG()
  {

  }

  @Override
  public void postConfigureDAG()
  {

  }

  @Override
  public void preValidateDAG()
  {
    for (DAG.OperatorMeta ometa : dag.getAllOperatorsMeta()) {
      Operator o = ometa.getOperator();
      LogicalPlanConfiguration.setOperatorProperties(o, propertyMap);
    }
  }

  @Override
  public void postValidateDAG()
  {

  }

  public PropertyInjectorVisitor()
  {
  }

  public String getPath()
  {
    return path;
  }

  public void setPath(String path)
  {
    this.path = path;
  }

  @Override
  public void teardown()
  {

  }
}
