/**
 * 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 backtype.storm.utils;

import java.nio.ByteBuffer;
import java.util.List;
import java.util.Map;

import org.apache.heron.common.basics.TypeUtils;

// import org.json.simple.JSONValue;

public final class Utils {
  public static final String DEFAULT_STREAM_ID =
      org.apache.heron.api.utils.Utils.DEFAULT_STREAM_ID;

  private Utils() {
  }

  public static Object newInstance(String klass) {
    try {
      Class<?> c = Class.forName(klass);
      return c.newInstance();
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
      throw new RuntimeException("Failed to create instance for class: " + klass, e);
    }
  }

  public static List<Object> tuple(Object... values) {
    return org.apache.heron.api.utils.Utils.tuple(values);
  }

  public static void sleep(long millis) {
    org.apache.heron.api.utils.Utils.sleep(millis);
  }

    /*
    public static boolean isValidConf(Map<String, Object> stormConf) {
        return normalizeConf(stormConf).equals(
          normalizeConf((Map) JSONValue.parse(JSONValue.toJSONString(stormConf))));
    }
    */

  public static Map<String, String> readCommandLineOpts() {
    return org.apache.heron.api.utils.Utils.readCommandLineOpts();
  }

    /*
    private static Object normalizeConf(Object conf) {
        if(conf==null) return new HashMap();
        if(conf instanceof Map) {
            Map confMap = new HashMap((Map) conf);
            for(Object key: confMap.keySet()) {
                Object val = confMap.get(key);
                confMap.put(key, normalizeConf(val));
            }
            return confMap;
        } else if(conf instanceof List) {
            List confList =  new ArrayList((List) conf);
            for(int i=0; i<confList.size(); i++) {
                Object val = confList.get(i);
                confList.set(i, normalizeConf(val));
            }
            return confList;
        } else if (conf instanceof Integer) {
            return ((Integer) conf).longValue();
        } else if(conf instanceof Float) {
            return ((Float) conf).doubleValue();
        } else {
            return conf;
        }
    }
    */

  public static byte[] serialize(Object obj) {
    return org.apache.heron.api.utils.Utils.serialize(obj);
  }

  public static Object deserialize(byte[] serialized) {
    return org.apache.heron.api.utils.Utils.deserialize(serialized);
  }

  public static Integer getInt(Object o) {
    return TypeUtils.getInteger(o);
  }

  public static boolean getBoolean(Object o, boolean defaultValue) {
    if (o == null) {
      return defaultValue;
    } else {
      return TypeUtils.getBoolean(o);
    }
  }

  public static byte[] toByteArray(ByteBuffer buffer) {
    return org.apache.heron.api.utils.Utils.toByteArray(buffer);
  }

  public static <S, T> T get(Map<S, T> m, S key, T defaultValue) {
    return org.apache.heron.api.utils.Utils.get(m, key, defaultValue);
  }
}
