/*
 * 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.geode.admin;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Date;

import org.apache.geode.internal.i18n.LocalizedStrings;


/**
 * AdminConfig loads/stores the member information list. The list contains all of the members being
 * monitored.
 *
 * Config must be of the format:
 * <p>
 * <li>Name=What you want displayed as a name for the instance
 * <li>Type=SERVER|CLIENT
 * <li>Host=A valid hostname or IP Address where the instance is running
 * <li>Port=The port you are using to open the monitor port for the instance
 *
 * @deprecated as of 7.0 use the <code><a href=
 *             "{@docRoot}/org/apache/geode/management/package-summary.html">management</a></code>
 *             package instead
 */
public class AdminConfig {
  // Name, Type, Host, Port
  public static Entry[] loadConfig(File file) throws IOException {

    // Place all lines into stack
    ArrayList entryList = new ArrayList();
    FileReader reader = null;
    BufferedReader fileReader = null;
    try {
      reader = new FileReader(file);
      fileReader = new BufferedReader(reader);
      // Read the first line.
      String line = fileReader.readLine();

      while (line != null) {
        line = line.trim();

        // Replace tabs with spaces
        line = line.replace('\t', ' ');

        // Skip all empty and comment lines
        if (line.length() != 0 && line.startsWith("#") == false) {
          try {
            entryList.add(new Entry(line));
          } catch (Exception ex) {
            // ignore - drop any lines that are not valid
          }
        }
        line = fileReader.readLine();
      }
    } finally {
      if (fileReader != null) {
        fileReader.close();
      }
      if (reader != null) {
        reader.close();
      }
    }

    return (Entry[]) entryList.toArray(new Entry[0]);
  }

  public static void storeConfig(File file, AdminConfig.Entry entries[]) throws IOException {
    FileOutputStream fos = null;
    PrintStream ps = null;
    try {
      fos = new FileOutputStream(file);
      ps = new PrintStream(fos);

      // Header
      ps.print("#");
      ps.println(
          LocalizedStrings.AdminConfig_THIS_FILE_IS_GENERATED_BY_ADMINCONSOLE_EDIT_AS_YOU_WISH_BUT_IT_WILL_BE_OVERWRITTEN_IF_IT_IS_MODIFIED_IN_ADMINCONSOLE
              .toLocalizedString());
      ps.println("#");
      ps.println(LocalizedStrings.AdminConfig_MODIFIED_0.toLocalizedString(new Date()));
      ps.println("#");
      ps.println("# Name, Type, Host, Port");
      ps.println("#");
      int len = entries.length;
      for (int i = 0; i < len; i++) {
        ps.println(entries[i].toString());
      }
      ps.flush();
    } finally {
      if (ps != null) {
        ps.close();
      }
      if (fos != null) {
        fos.close();
      }
    }
  }


  public static class Entry {
    public String name;
    public String type;
    public String host;
    public int port;

    public Entry(String line) {
      // Split
      String split[] = line.split(",");

      // Convert line to parameters
      name = split[0].trim();
      type = split[1].trim();
      host = split[2].trim();
      port = Integer.parseInt(split[3]);
    }

    public Entry(String name, String type, String host, int port) {
      this.name = name;
      this.type = type;
      this.host = host;
      this.port = port;
    }

    @Override // GemStoneAddition
    public String toString() {
      return name + "," + type + "," + host + "," + port;
    }
  }
}
