load("@rules_java//java:defs.bzl", "java_binary", "java_library")
load("//tools/rules:build_defs.bzl", "DOCLINT_HTML_AND_SYNTAX")
load("//tools/rules:javadoc.bzl", "java_doc")

package(default_visibility = ["//visibility:public"])

java_doc(
    name = "heron-spi-javadoc",
    libs = [":heron-spi"],
    pkgs = ["org/apache/heron/spi"],
    title = "Heron Spi Documentation",
)

java_library(
    name = "heron-spi",
    srcs = glob([
        "**/spi/common/**/*.java",
        "**/spi/packing/**/*.java",
        "**/spi/scheduler/**/*.java",
        "**/spi/statefulstorage/**/*.java",
        "**/spi/uploader/**/*.java",
        "**/spi/utils/**/*.java",
        "**/spi/statemgr/**/*.java",
        "**/spi/metricsmgr/**/*.java",
    ]),
    javacopts = DOCLINT_HTML_AND_SYNTAX,
    resources = ["//:disclaimers"],
    deps = [
        "//heron/api/src/java:api-java-low-level",
        "//heron/api/src/java:classification",
        "//heron/common/src/java:basics-java",
        "//heron/common/src/java:config-java",
        "//heron/common/src/java:utils-java",
        "//heron/proto:proto_ckptmgr_java",
        "//heron/proto:proto_common_java",
        "//heron/proto:proto_execution_state_java",
        "//heron/proto:proto_packing_plan_java",
        "//heron/proto:proto_physical_plan_java",
        "//heron/proto:proto_scheduler_java",
        "//heron/proto:proto_tmanager_java",
        "//heron/proto:proto_topology_java",
        "@com_google_protobuf//:protobuf_java",
        "@maven//:com_google_guava_guava",
        "@maven//:org_yaml_snakeyaml",
    ],
)

utils_deps_files = \
    heron_java_proto_files() + [
        ":common-spi-java",
        ":statemgr-spi-java",
        ":scheduler-spi-java",
        ":statefulstorage-spi-java",
        ":packing-spi-java",
        ":metricsmgr-spi-java",
        "//heron/common/src/java:basics-java",
        "//heron/common/src/java:config-java",
        "//heron/common/src/java:utils-java",
        "//heron/api/src/java:api-java-low-level",
        "@maven//:com_google_guava_guava",
    ]

scheduler_deps_files = \
    heron_java_proto_files() + [
        ":common-spi-java",
        ":packing-spi-java",
        "//heron/api/src/java:classification",
        "//heron/common/src/java:config-java",
        "@maven//:com_google_guava_guava",
    ]

statefulstorage_deps_files = \
    heron_java_proto_files() + [
        ":common-spi-java",
        "//heron/common/src/java:config-java",
    ]

packing_deps_files = [
    "//heron/api/src/java:api-java-low-level",
    ":common-spi-java",
    "//heron/api/src/java:classification",
    "//heron/common/src/java:basics-java",
    "//heron/common/src/java:config-java",
    "//heron/proto:proto_packing_plan_java",
    "//heron/proto:proto_topology_java",
    "@maven//:com_google_guava_guava",
]

uploader_deps_files = [
    ":common-spi-java",
    "//heron/common/src/java:config-java",
]

statemgr_deps_files = \
    heron_java_proto_files() + [
        ":common-spi-java",
        "//heron/api/src/java:classification",
        "//heron/common/src/java:config-java",
        "@maven//:com_google_guava_guava",
    ]

java_library(
    name = "common-spi-java",
    srcs = glob([
        "**/spi/common/**/*.java",
    ]),
    deps = [
        "//heron/common/src/java:basics-java",
        "//heron/common/src/java:config-java",
        "@maven//:com_google_guava_guava",
    ],
)

java_library(
    name = "utils-spi-java",
    srcs = glob([
        "**/spi/utils/**/*.java",
    ]),
    deps = utils_deps_files,
)

java_library(
    name = "packing-spi-java",
    srcs = glob([
        "**/spi/packing/**/*.java",
    ]),
    deps = packing_deps_files,
)

java_library(
    name = "scheduler-spi-java",
    srcs = glob([
        "**/spi/scheduler/**/*.java",
    ]),
    deps = scheduler_deps_files,
)

java_library(
    name = "statefulstorage-spi-java",
    srcs = glob([
        "**/spi/statefulstorage/**/*.java",
    ]),
    deps = statefulstorage_deps_files,
)

java_library(
    name = "shell-utils-java",
    srcs = glob([
        "**/spi/utils/ShellUtils.java",
    ]),
    deps = ["@maven//:com_google_guava_guava"],
)

java_library(
    name = "network-utils-java",
    srcs = glob([
        "**/spi/utils/NetworkUtils.java",
    ]),
    deps = [
        ":common-spi-java",
        ":shell-utils-java",
        "//heron/common/src/java:basics-java",
    ],
)

java_library(
    name = "uploader-spi-java",
    srcs = glob([
        "**/spi/uploader/**/*.java",
    ]),
    deps = uploader_deps_files,
)

java_library(
    name = "uploader-utils-java",
    srcs = glob([
        "**/spi/utils/UploaderUtils.java",
    ]),
    deps = uploader_deps_files,
)

java_library(
    name = "metricsmgr-spi-java",
    srcs = glob(
        ["**/spi/metricsmgr/**/*.java"],
    ),
)

java_library(
    name = "statemgr-spi-java",
    srcs = glob(
        ["**/spi/statemgr/**/*.java"],
    ),
    deps = statemgr_deps_files,
)

java_binary(
    name = "spi-unshaded",
    srcs = glob([
        "**/spi/common/**/*.java",
        "**/spi/metricsmgr/**/*.java",
        "**/spi/packing/**/*.java",
        "**/spi/scheduler/**/*.java",
        "**/spi/statefulstorage/**/*.java",
        "**/spi/statemgr/**/*.java",
        "**/spi/uploader/**/*.java",
        "**/spi/utils/**/*.java",
    ]),
    deps = [
        "//heron/api/src/java:classification",
    ] + utils_deps_files,
)

genrule(
    name = "heron-spi-jar",
    srcs = [":spi-unshaded_deploy.jar"],
    outs = ["heron-spi.jar"],
    cmd = "cp $< $@",
)
