/*
 * 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 org.apache.slider.providers.agent.application.metadata;

import java.util.ArrayList;
import java.util.List;

/**
 * Application type defined in the metainfo
 */
public class Application {
  String name;
  String comment;
  String version;
  String exportedConfigs;
  List<Component> components;
  List<ExportGroup> exportGroups;
  List<OSSpecific> osSpecifics;
  List<CommandOrder> commandOrders;
  List<ConfigFile> configFiles;

  public Application() {
    exportGroups = new ArrayList<ExportGroup>();
    components = new ArrayList<Component>();
    osSpecifics = new ArrayList<OSSpecific>();
    commandOrders = new ArrayList<CommandOrder>();
    configFiles = new ArrayList<ConfigFile>();
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getComment() {
    return comment;
  }

  public void setComment(String comment) {
    this.comment = comment;
  }

  public String getVersion() {
    return version;
  }

  public void setVersion(String version) {
    this.version = version;
  }

  public String getExportedConfigs() {
    return exportedConfigs;
  }

  public void setExportedConfigs(String exportedConfigs) {
    this.exportedConfigs = exportedConfigs;
  }

  public List<ConfigFile> getConfigFiles() {
    return configFiles;
  }

  public void addConfigFile(ConfigFile configFile) {
    this.configFiles.add(configFile);
  }

  public void addComponent(Component component) {
    components.add(component);
  }

  public List<Component> getComponents() {
    return components;
  }

  public void addExportGroup(ExportGroup exportGroup) {
    exportGroups.add(exportGroup);
  }

  public List<ExportGroup> getExportGroups() {
    return exportGroups;
  }

  public void addOSSpecific(OSSpecific osSpecific) {
    osSpecifics.add(osSpecific);
  }

  public List<OSSpecific> getOSSpecifics() {
    return osSpecifics;
  }

  public void addCommandOrder(CommandOrder commandOrder) {
    commandOrders.add(commandOrder);
  }

  public List<CommandOrder> getCommandOrder() {
    return commandOrders;
  }

  @Override
  public String toString() {
    final StringBuilder sb =
        new StringBuilder("{");
    sb.append(",\n\"name\": ").append(name);
    sb.append(",\n\"comment\": ").append(comment);
    sb.append(",\n\"version\" :").append(version);
    sb.append(",\n\"components\" : {");
    for (Component component : components) {
      sb.append("\n").append(component);
    }
    sb.append("\n},");
    sb.append('}');
    return sb.toString();
  }
}
