summaryrefslogtreecommitdiff
path: root/client/ServerRequester.java
blob: 9cd748534c68c054efa54c345f881a4b1d52167a (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
/**
 *
 */
package client;


import java.io.*;
import java.net.*;
import java.security.*;
import javax.net.*;
import javax.net.ssl.*;

import shared.*;
import shared.remotecall.*;

/**
 * This class only has static members. Its used for creating a client socket to connect and
 * communicate with the calendar server.
 * @author buetow
 */
public class ServerRequester  {
  /**
   * This method creates a new client socket.
   * @return Returns a client socket object.
   * @throws IOException
   */
  private static Socket makeClientSocket() throws IOException {
    if (!Config.getBooleanValue("use_ssl")) {
      Main.statusMessage("Making non-SSL Socket...");
      return new Socket(Config.getServerAddress(), Config.getIntValue("server_port"));
    }

    Main.statusMessage("Making SSL Socket...");
    //Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
    SocketFactory socketFactory = SSLSocketFactory.getDefault();
    return socketFactory.createSocket(Config.getServerAddress(), Config.getIntValue("server_port"));
  }

  /**
   * Sends a client request to the netcalendar server end receives a server response object.
   * @param clientRequest Specifies the client request to send to the calendar server.
   * @return Returns the server response. It returns null if no response is available.
   */
  public final static ServerResponse sendClientRequest(ClientRequest clientRequest) {
    Main.statusMessage("Sending client request to server...");

    ServerResponse serverResponse = null;

    try {
      Socket socket = makeClientSocket();
      socket.setKeepAlive(true);

      // Send the client request to the server
      OutputStream outputStream = socket.getOutputStream();
      ObjectOutput objectOutput = new ObjectOutputStream(outputStream);

      objectOutput.writeObject(clientRequest);
      objectOutput.flush();

      // We only want to receive data if the request new events, not if we only send
      // changed events!
      if (clientRequest.requestsNewEvents()) {
        // Recieve the server's response
        InputStream inputStream = socket.getInputStream();
        ObjectInput objectInput = new ObjectInputStream(inputStream);
        serverResponse = (ServerResponse) objectInput.readObject();
      }

      objectOutput.close();
      socket.close();

    } catch (Exception e) {
      Main.infoMessage("Client error during serialization: " + e.getMessage());
      Main.statusMessage("Error: Client request did not succeed! Server down?");
      return serverResponse;
    }

    Main.statusMessage("Last client request succeeded");
    // Returns null if no response is available!
    return serverResponse;
  }
}