summaryrefslogtreecommitdiff
path: root/client/ServerRequester.java
blob: 588d528d7a2a3f0bf079911e5c0be2b6fbd57fc1 (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;
	}
}