diff options
| author | Paul Buetow <paul@buetow.org> | 2009-02-07 11:29:36 +0000 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2009-02-07 11:29:36 +0000 |
| commit | 0031991fad54c376b742b1a425531345638cbf57 (patch) | |
| tree | 3b9092a0f725e45a81dc4d23cb0dbb602bebab7b /server/NetCalendarServer.java | |
initial import into svn
Diffstat (limited to 'server/NetCalendarServer.java')
| -rw-r--r-- | server/NetCalendarServer.java | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/server/NetCalendarServer.java b/server/NetCalendarServer.java new file mode 100644 index 0000000..10704c0 --- /dev/null +++ b/server/NetCalendarServer.java @@ -0,0 +1,160 @@ +/** + * + */ +package server; + +import java.io.*; +import java.net.*; +import java.util.*; +import javax.net.*; +import javax.net.ssl.*; + +import shared.*; +import shared.remotecall.*; + +/** + * This is the main class of the server part of the netcalendar suite. + * It contains the server socket part and hold a references to the calendar database. + * @author buetow + */ +public class NetCalendarServer extends Thread { + private int iPort; + private String sWorkdir; + + /** + * Creates a NetCalendarServer instance and runs it as a thread. + * @param iPort Specifies the server port of the server to be used. + * @param sWorkdir Specifies the working directory of the server. + */ + public NetCalendarServer(int iPort, String sWorkdir) { + this.iPort = iPort; + this.sWorkdir = sWorkdir; + + start(); + } + + /** + * This method initializes a new server socket. + * @return Returns the server socket object. + */ + private ServerSocket makeServerSocket() throws IOException { + if (!Config.getBooleanValue("use_ssl")) + return new ServerSocket(iPort); + + ServerSocketFactory sslSocketFactory = SSLServerSocketFactory.getDefault(); + return sslSocketFactory.createServerSocket(iPort); + } + + /** + * This method specifies the start method of the Thread. Its setting up the server port. + */ + public void run() { + ServerSocket serverSocket = null; + Socket socket = null; + + // Read and parse the whole calendar database from file! + CalendarFormatParser parser = new CalendarFormatParser(); + parser.setWorkdir(sWorkdir); + parser.start(); + + CalendarDatabase calendarDatabase = new CalendarDatabase(parser.getCategories()); + + try { + serverSocket = makeServerSocket(); + + while (true) { + // This will wait for a connection to be made to this socket. + socket = serverSocket.accept(); + // serverSocket.accept(); + socket.setKeepAlive(true); + + // Recieve the client's request object + InputStream inputStream = socket.getInputStream(); + ObjectInput objectInput = new ObjectInputStream(inputStream); + ClientRequest clientRequest = (ClientRequest) objectInput.readObject(); + + if (!clientRequest.checkPassphrase(Config.getStringValue("passphrase", false))) { + Main.infoMessage("Server: Client refused, wrong passphrase!"); + + // Check if a event has been modified! + } else if (clientRequest.requestsNewEvents()) { + Main.infoMessage("Server: Client requests new events"); + + // Get all calendar events which match the request + Vector vecEvents = calendarDatabase.getMatchingEvents(clientRequest); + ServerResponse serverResponse = new ServerResponse(vecEvents); + + OutputStream outputStream = socket.getOutputStream(); + ObjectOutput objectOutput = new ObjectOutputStream(outputStream); + objectOutput.writeObject(serverResponse); + objectOutput.flush(); + objectOutput.close(); + + } else if (clientRequest.actionIs(ClientRequest.MODIFY_EVENT)) { + Main.infoMessage("Server: Client wants to modify an event"); + calendarDatabase.modifyEvent(clientRequest); + // if (Config.getBooleanValue("client_run")) + calendarDatabase.flush(); + + } else if (clientRequest.actionIs(ClientRequest.DELETE_EVENT)) { + Main.infoMessage("Server: Client wants to delete an event"); + calendarDatabase.deleteEvent(clientRequest); + // if (Config.getBooleanValue("client_run")) + calendarDatabase.flush(); + + } else if (clientRequest.actionIs(ClientRequest.ADD_EVENT)) { + Main.infoMessage("Server: Client wants to add an event"); + calendarDatabase.addEvent(clientRequest); + // if (Config.getBooleanValue("client_run")) + calendarDatabase.flush(); + + } else if (clientRequest.actionIs(ClientRequest.RENAME_CATEGORY)) { + Main.infoMessage("Server: Client wants to rename a category"); + calendarDatabase.renameCategory(clientRequest); + // if (Config.getBooleanValue("client_run")) + calendarDatabase.flush(); + + } else if (clientRequest.actionIs(ClientRequest.DELETE_CATEGORY)) { + Main.infoMessage("Server: Client wants to delete a category (NYI)"); + calendarDatabase.deleteCategory(clientRequest); + // if (Config.getBooleanValue("client_run")) + calendarDatabase.flush(); + + } else if (clientRequest.actionIs(ClientRequest.RELOAD_DATABASE)) { + // Read and parse the whole calendar database from file! + parser = new CalendarFormatParser(); + parser.setWorkdir(sWorkdir); + parser.start(); + + calendarDatabase = new CalendarDatabase(parser.getCategories()); + + } else if (clientRequest.actionIs(ClientRequest.FLUSH_DATABASE)) { + Main.infoMessage("Server: Client wants to flush the database"); + calendarDatabase.flush(); + + } else if (clientRequest.actionIs(ClientRequest.SHUTDOWN_SERVER)) { + Main.infoMessage("Server: Client wants the server to shut down"); + calendarDatabase.flush(); + socket.close(); + + if (Config.getBooleanValue("client_run")) { + Main.infoMessage("Server: Shutting down the server thread"); + socket.close(); + serverSocket.close(); + break; + } else { + Main.exit(0); + } + } + + socket.close(); + } + + } catch (ClassNotFoundException e) { + Main.infoMessage("Error: Server error during serialization: " + e.getMessage()); + + } catch (IOException e) { + Main.infoMessage("Error: Server error during serialization: " + e.getMessage()); + } + } +} |
