summaryrefslogtreecommitdiff
path: root/sources/client/ServerRequester.java
blob: be73537dfa562f2dde9e7febb84be7653613410a (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
/* NetCalendar 2006, 2009 (c) Dipl.-Inform. (FH) Paul C. Buetow
 * http://buetow.org - netcalendar@dev.buetow.org
 */

/**
 *
 */
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 Paul C. 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;
    }
}