/* * Copyright © 2014-2016 Cask Data, Inc. * * Licensed 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 co.cask.cdap.proto; import co.cask.cdap.api.schedule.SchedulableProgramType; import com.google.gson.annotations.SerializedName; import java.util.HashMap; import java.util.Map; import javax.annotation.Nullable; /** * Defines types of programs supported by the system. */ public enum ProgramType { // @SerializedName to maintain backwards-compatibility @SerializedName("Flow") FLOW(1, Parameters.builder() .setCategoryName("flows") .setPrettyName("Flow") .setListable(true) .build()), @SerializedName("Mapreduce") MAPREDUCE(3, Parameters.builder() .setCategoryName("mapreduce") .setPrettyName("MapReduce") .setListable(true) .setSchedulableType(SchedulableProgramType.MAPREDUCE) .build()), @SerializedName("Workflow") WORKFLOW(4, Parameters.builder() .setCategoryName("workflows") .setPrettyName("Workflow") .setListable(true) .setSchedulableType(SchedulableProgramType.WORKFLOW) .build()), @SerializedName("Webapp") WEBAPP(5, Parameters.builder() .setCategoryName("webapp") .setPrettyName("Webapp") .setListable(false) .build()), @SerializedName("Service") SERVICE(6, Parameters.builder() .setCategoryName("services") .setPrettyName("Service") .setListable(true) .build()), @SerializedName("Spark") SPARK(7, Parameters.builder() .setCategoryName("spark") .setPrettyName("Spark") .setListable(true) .setSchedulableType(SchedulableProgramType.SPARK) .build()), @SerializedName("Worker") WORKER(8, Parameters.builder() .setCategoryName("workers") .setPrettyName("Worker") .setListable(true) .build()), CUSTOM_ACTION(9, Parameters.builder() .setCategoryName("custom") .setPrettyName("Custom") .setListable(false) .setSchedulableType(SchedulableProgramType.CUSTOM_ACTION) .build()); private static final Map<String, ProgramType> CATEGORY_MAP; static { CATEGORY_MAP = new HashMap<>(); for (ProgramType type : ProgramType.values()) { CATEGORY_MAP.put(type.getCategoryName(), type); } } private final int index; private final Parameters parameters; ProgramType(int type, Parameters parameters) { this.index = type; this.parameters = parameters; } public boolean isListable() { return parameters.listable; } public String getCategoryName() { return parameters.getCategoryName(); } public String getPrettyName() { return parameters.getPrettyName(); } public SchedulableProgramType getSchedulableType() { if (parameters.getSchedulableType() == null) { throw new IllegalArgumentException(this + " is not a SchedulableProgramType"); } return parameters.getSchedulableType(); } public int getIndex() { return index; } public static ProgramType valueOfSchedulableType(SchedulableProgramType schedulableType) { for (ProgramType type : ProgramType.values()) { if (schedulableType.equals(type.parameters.getSchedulableType())) { return type; } } throw new IllegalArgumentException("No ProgramType found for SchedulableProgramType " + schedulableType); } public static ProgramType valueOfPrettyName(String pretty) { return valueOf(pretty.toUpperCase()); } public static ProgramType valueOfCategoryName(String categoryName) { ProgramType type = CATEGORY_MAP.get(categoryName); if (type == null) { throw new IllegalArgumentException("Unknown category name " + categoryName); } return type; } @Override public String toString() { return parameters.getPrettyName(); } /** * Holds various properties of each ProgramType. */ private static final class Parameters { private final String prettyName; private final boolean listable; private final String categoryName; private final SchedulableProgramType schedulableType; public Parameters(String prettyName, Boolean listable, String categoryName, @Nullable SchedulableProgramType schedulableType) { if (prettyName == null) { throw new IllegalArgumentException("prettyName cannot be null"); } if (listable == null) { throw new IllegalArgumentException("listable cannot be null"); } if (categoryName == null) { throw new IllegalArgumentException("categoryName cannot be null"); } this.prettyName = prettyName; this.listable = listable; this.categoryName = categoryName; this.schedulableType = schedulableType; } @Nullable public SchedulableProgramType getSchedulableType() { return schedulableType; } public String getPrettyName() { return prettyName; } public boolean isListable() { return listable; } public String getCategoryName() { return categoryName; } public static Builder builder() { return new Builder(); } /** * Builder for {@link ProgramType.Parameters}. */ private static final class Builder { private String prettyName; private Boolean listable; private String categoryName; private SchedulableProgramType schedulableType; public Builder setSchedulableType(SchedulableProgramType schedulableType) { this.schedulableType = schedulableType; return this; } public Builder setPrettyName(String prettyName) { this.prettyName = prettyName; return this; } public Builder setListable(boolean listable) { this.listable = listable; return this; } public Builder setCategoryName(String categoryName) { this.categoryName = categoryName; return this; } public Parameters build() { return new Parameters(prettyName, listable, categoryName, schedulableType); } } } }