summaryrefslogtreecommitdiff
path: root/sources/shared/Main.java
blob: 37ebc03152efd9a745c61f858c79796ec0253843 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package shared;

import java.io.*;

import javax.swing.JFrame;

import server.*;

import client.*;

/**
 * This class contains the static main method to start the program from.
 * This class is also responsible for handling info ans status messages and
 * the logging option of those messages.
 * @author buetow
 *
 */
public final class Main {
  private static NetCalendarClient netCalendarClient = null;
  private static BufferedWriter bufferedLogfileWriter = null;

  /**
   * This method is the start point of the whole program. Its initializing the static Config object
   * and starts a calendar server and/or a calendar client thread depending on the "server_run" and
   * "client_run" configuration options.
   * @param args Specifies the program arguments (not used yet by the program)
   */
  public static void main(String[] args) {
    Config.initialize(args);

    try {
      FileWriter fileWriter = new FileWriter(Config.getStringValue("logfile"));
      bufferedLogfileWriter = new BufferedWriter(fileWriter);

    } catch (IOException e) {
      infoMessage("Error: Could not open logfile: " + e.getMessage());
    }


    if (Config.getBooleanValue("server_run")) {
      new NetCalendarServer(
        Config.getIntValue("server_port"),
        Config.getStringValue("server_database_dir"));
    }

    if (Config.getBooleanValue("client_run")) {
      new Thread(new SplashScreen()).start();
      //Make sure we have nice window decorations.
      JFrame.setDefaultLookAndFeelDecorated(true);
      netCalendarClient = new NetCalendarClient();
    }
  }

  /**
   * All info messages of the calendar client and the calendar server go through this method.
   * They are not using System.out.* directly.
   * @param sMessage Specifies the program info message.
   */
  public static void infoMessage(String sMessage) {
    // Later: Add logging to a logfile!
    System.out.println(sMessage);
    logMessage(sMessage);
  }

  /**
   * This method is for various messages. All messages will show up in the status bar of the client's main window.
   * If there is no main window, the infoMessage method will be used instead.
   * @param sMessage Specifies the message to be displayed in the status bar.
   */
  public static void statusMessage(String sMessage) {
    if (netCalendarClient != null)
      netCalendarClient.statusMessage(sMessage);
    else
      infoMessage(sMessage);
  }

  /**
   * This method writes a specific message string into a logfile which is specified in the config.txt.
   * @param sMessage Specified the message string to write into the logfile.
   */
  private static void logMessage(String sMessage) {
    if (bufferedLogfileWriter != null) {
      try {
        bufferedLogfileWriter.write(sMessage + "\n");
        // bufferedLogfileWriter.flush();

      } catch (IOException e) {
        Main.infoMessage("Error: Could not write to logfile: " + e.toString());
      }
    }
  }

  /**
   * This method is called thenever the server or the client process wants to exit.
   * @param iCode Specifies the exit code to use for the System.exit call.
   */
  public static void exit(int iCode) {
    infoMessage("Shutting down the current process");

    try {
      bufferedLogfileWriter.close();
    } catch (IOException e) {
      System.err.println("Error: Could not close logfile: " + e.toString());
    }

    System.exit(iCode);
  }


  /**
   * This method executes an external program.
   * @param sCommand Specifies the command string to execute.
   */
  public static void execExternalCommand(String sCommand) {
    if (sCommand.equals("none") || sCommand.equals(""))
      return;

    try {
      Runtime.getRuntime().exec(sCommand);

    } catch (IOException e) {
      Main.infoMessage("Error while executing external command: " + e.getMessage());
    }
  }
}