All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.aliyun.odps.graph.utils.CounterUtils Maven / Gradle / Ivy

/*
 * 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.aliyun.odps.graph.utils;

import java.util.Map.Entry;

import com.aliyun.odps.counter.Counter;
import com.aliyun.odps.counter.CounterGroup;
import com.aliyun.odps.counter.Counters;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

/**
 * 与 Counter 相关的静态工具类,包含一些工具方法
 *
 * @see Counter
 * @see CounterGroup
 * @see Counters
 */
public class CounterUtils {

  /**
   * 将 {@link Counters} 对象转化成一个JSON字符串
   *
   * @param counters
   *     需要转化的 {@link Counters} 对象
   * @return JSON字符串
   */
  public static String toJsonString(Counters counters) {
    JsonObject js = toJson(counters);
    return js.toString();
  }

  /**
   * 通过JSON字符串创建{@link Counters}对象
   * 字符串异常时会抛出 {@link RuntimeException}
   *
   * @param json
   *     JSON字符串
   * @return 构建好的{@link Counters}对象
   * @see #toJsonString(Counters)
   */
  public static Counters createFromJsonString(String json) {
    JsonObject el = new JsonParser().parse(json).getAsJsonObject();
    return createFromJson(el);
  }

  private static Counters createFromJson(JsonObject obj) {
    Counters counters = new Counters();
    for (Entry entry : obj.entrySet()) {
      String key = entry.getKey();
      CounterGroup group = counters.getGroup(key);
      fromJson(group, entry.getValue().getAsJsonObject());
    }
    return counters;
  }

  private static void fromJson(CounterGroup group, JsonObject obj) {
    JsonArray counterArray = obj.has("counters")? obj.get("counters").getAsJsonArray() : new JsonArray();
    for (int i = 0; i < counterArray.size(); i++) {
      JsonObject subObj = counterArray.get(i).getAsJsonObject();
      String counterName = subObj.has("name") ? subObj.get("name").getAsString() : null;
      Counter counter = group.findCounter(counterName);
      long value = subObj.has("value") ? subObj.get("value").getAsLong() : 0L;
      counter.increment(value);
    }
  }

  private static JsonObject toJson(Counters counters) {
    JsonObject obj = new JsonObject();
    for (CounterGroup group : counters) {
      obj.add(group.getName(), toJson(group));
    }
    return obj;
  }

  private static JsonObject toJson(CounterGroup counterGroup) {
    JsonObject obj = new JsonObject();
    obj.addProperty("name", counterGroup.getName());
    JsonArray counterArray = new JsonArray();
    for (Counter entry : counterGroup) {
      counterArray.add(toJson(entry));
    }
    obj.add("counters", counterArray);
    return obj;
  }

  private static JsonObject toJson(Counter counter) {
    JsonObject js = new JsonObject();
    js.addProperty("name", counter.getName());
    js.addProperty("value", counter.getValue());
    return js;
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy