From d574bfa796392970c2866363723028da536f625a Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Fri, 25 Jun 2010 23:53:35 -0700 Subject: [PATCH] Copying changes from old SVn branch for multi-protocol refactor. --- .../src/net/sourceforge/guacamole/Client.java | 6 +- .../{net => }/GuacamoleException.java | 2 +- .../guacamole/{vnc => }/event/Event.java | 2 +- .../{vnc => }/event/EventHandler.java | 2 +- .../guacamole/{vnc => }/event/EventQueue.java | 2 +- .../guacamole/{vnc => }/event/KeyEvent.java | 2 +- .../{vnc => }/event/PointerEvent.java | 2 +- .../instruction/framebuffer/PNGImage.java | 11 ++- .../guacamole/net/Configuration.java | 1 + .../guacamole/net/GuacamoleConfiguration.java | 19 ++--- .../guacamole/net/GuacamoleServlet.java | 2 +- .../guacamole/net/GuacamoleSession.java | 73 ++++++++++++++----- .../guacamole/net/XMLGuacamoleServlet.java | 1 + .../guacamole/net/control/Connect.java | 2 +- .../guacamole/net/control/Disconnect.java | 2 +- .../guacamole/net/input/Clipboard.java | 2 +- .../sourceforge/guacamole/net/input/Key.java | 4 +- .../guacamole/net/input/Pointer.java | 4 +- .../net/output/InstructionStream.java | 2 +- .../sourceforge/guacamole/vnc/VNCClient.java | 14 ++-- .../guacamole/vnc/VNCConfiguration.java | 15 +++- 21 files changed, 108 insertions(+), 62 deletions(-) rename guacamole/src/net/sourceforge/guacamole/{net => }/GuacamoleException.java (96%) rename guacamole/src/net/sourceforge/guacamole/{vnc => }/event/Event.java (97%) rename guacamole/src/net/sourceforge/guacamole/{vnc => }/event/EventHandler.java (95%) rename guacamole/src/net/sourceforge/guacamole/{vnc => }/event/EventQueue.java (99%) rename guacamole/src/net/sourceforge/guacamole/{vnc => }/event/KeyEvent.java (96%) rename guacamole/src/net/sourceforge/guacamole/{vnc => }/event/PointerEvent.java (97%) diff --git a/guacamole/src/net/sourceforge/guacamole/Client.java b/guacamole/src/net/sourceforge/guacamole/Client.java index 944e21bc9..e5da483cf 100644 --- a/guacamole/src/net/sourceforge/guacamole/Client.java +++ b/guacamole/src/net/sourceforge/guacamole/Client.java @@ -20,9 +20,9 @@ package net.sourceforge.guacamole; */ import net.sourceforge.guacamole.instruction.Instruction; -import net.sourceforge.guacamole.net.GuacamoleException; -import net.sourceforge.guacamole.vnc.event.KeyEvent; -import net.sourceforge.guacamole.vnc.event.PointerEvent; +import net.sourceforge.guacamole.GuacamoleException; +import net.sourceforge.guacamole.event.KeyEvent; +import net.sourceforge.guacamole.event.PointerEvent; public abstract class Client { diff --git a/guacamole/src/net/sourceforge/guacamole/net/GuacamoleException.java b/guacamole/src/net/sourceforge/guacamole/GuacamoleException.java similarity index 96% rename from guacamole/src/net/sourceforge/guacamole/net/GuacamoleException.java rename to guacamole/src/net/sourceforge/guacamole/GuacamoleException.java index a1079f4a2..566cf862a 100644 --- a/guacamole/src/net/sourceforge/guacamole/net/GuacamoleException.java +++ b/guacamole/src/net/sourceforge/guacamole/GuacamoleException.java @@ -1,5 +1,5 @@ -package net.sourceforge.guacamole.net; +package net.sourceforge.guacamole; /* * Guacamole - Pure JavaScript/HTML VNC Client diff --git a/guacamole/src/net/sourceforge/guacamole/vnc/event/Event.java b/guacamole/src/net/sourceforge/guacamole/event/Event.java similarity index 97% rename from guacamole/src/net/sourceforge/guacamole/vnc/event/Event.java rename to guacamole/src/net/sourceforge/guacamole/event/Event.java index 270e388ea..88e8ed433 100644 --- a/guacamole/src/net/sourceforge/guacamole/vnc/event/Event.java +++ b/guacamole/src/net/sourceforge/guacamole/event/Event.java @@ -1,5 +1,5 @@ -package net.sourceforge.guacamole.vnc.event; +package net.sourceforge.guacamole.event; /* * Guacamole - Pure JavaScript/HTML VNC Client diff --git a/guacamole/src/net/sourceforge/guacamole/vnc/event/EventHandler.java b/guacamole/src/net/sourceforge/guacamole/event/EventHandler.java similarity index 95% rename from guacamole/src/net/sourceforge/guacamole/vnc/event/EventHandler.java rename to guacamole/src/net/sourceforge/guacamole/event/EventHandler.java index 637b991e1..12d363c36 100644 --- a/guacamole/src/net/sourceforge/guacamole/vnc/event/EventHandler.java +++ b/guacamole/src/net/sourceforge/guacamole/event/EventHandler.java @@ -1,5 +1,5 @@ -package net.sourceforge.guacamole.vnc.event; +package net.sourceforge.guacamole.event; /* * Guacamole - Pure JavaScript/HTML VNC Client diff --git a/guacamole/src/net/sourceforge/guacamole/vnc/event/EventQueue.java b/guacamole/src/net/sourceforge/guacamole/event/EventQueue.java similarity index 99% rename from guacamole/src/net/sourceforge/guacamole/vnc/event/EventQueue.java rename to guacamole/src/net/sourceforge/guacamole/event/EventQueue.java index d77276b36..65622a2d9 100644 --- a/guacamole/src/net/sourceforge/guacamole/vnc/event/EventQueue.java +++ b/guacamole/src/net/sourceforge/guacamole/event/EventQueue.java @@ -1,5 +1,5 @@ -package net.sourceforge.guacamole.vnc.event; +package net.sourceforge.guacamole.event; /* * Guacamole - Pure JavaScript/HTML VNC Client diff --git a/guacamole/src/net/sourceforge/guacamole/vnc/event/KeyEvent.java b/guacamole/src/net/sourceforge/guacamole/event/KeyEvent.java similarity index 96% rename from guacamole/src/net/sourceforge/guacamole/vnc/event/KeyEvent.java rename to guacamole/src/net/sourceforge/guacamole/event/KeyEvent.java index b5ac54e50..5f2f69270 100644 --- a/guacamole/src/net/sourceforge/guacamole/vnc/event/KeyEvent.java +++ b/guacamole/src/net/sourceforge/guacamole/event/KeyEvent.java @@ -1,4 +1,4 @@ -package net.sourceforge.guacamole.vnc.event; +package net.sourceforge.guacamole.event; /* * Guacamole - Pure JavaScript/HTML VNC Client diff --git a/guacamole/src/net/sourceforge/guacamole/vnc/event/PointerEvent.java b/guacamole/src/net/sourceforge/guacamole/event/PointerEvent.java similarity index 97% rename from guacamole/src/net/sourceforge/guacamole/vnc/event/PointerEvent.java rename to guacamole/src/net/sourceforge/guacamole/event/PointerEvent.java index 17e568a71..9a5401adc 100644 --- a/guacamole/src/net/sourceforge/guacamole/vnc/event/PointerEvent.java +++ b/guacamole/src/net/sourceforge/guacamole/event/PointerEvent.java @@ -1,4 +1,4 @@ -package net.sourceforge.guacamole.vnc.event; +package net.sourceforge.guacamole.event; /* * Guacamole - Pure JavaScript/HTML VNC Client diff --git a/guacamole/src/net/sourceforge/guacamole/instruction/framebuffer/PNGImage.java b/guacamole/src/net/sourceforge/guacamole/instruction/framebuffer/PNGImage.java index ae2a83e34..4a74d4a5e 100644 --- a/guacamole/src/net/sourceforge/guacamole/instruction/framebuffer/PNGImage.java +++ b/guacamole/src/net/sourceforge/guacamole/instruction/framebuffer/PNGImage.java @@ -27,8 +27,7 @@ import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageWriter; import javax.imageio.stream.ImageOutputStream; -import net.sourceforge.guacamole.vnc.VNCException; - +import net.sourceforge.guacamole.GuacamoleException; public class PNGImage { @@ -36,7 +35,7 @@ public class PNGImage { private int height; private byte[] data; - public PNGImage(BufferedImage image) throws VNCException { + public PNGImage(BufferedImage image) throws GuacamoleException { width = image.getWidth(); height = image.getHeight(); @@ -48,7 +47,7 @@ public class PNGImage { bos.flush(); } catch (IOException e) { - throw new VNCException("I/O Error while creating PNG.", e); + throw new GuacamoleException("I/O Error while creating PNG.", e); } data = bos.toByteArray(); @@ -66,13 +65,13 @@ public class PNGImage { return width; } - private static void writeImage(BufferedImage image, OutputStream outputStream) throws VNCException, IOException { + private static void writeImage(BufferedImage image, OutputStream outputStream) throws GuacamoleException, IOException { // Obtain list of image writers // If no such writers exist, fail with error, exit. Iterator writers = ImageIO.getImageWritersByMIMEType("image/png"); if (!writers.hasNext()) - throw new VNCException("No useful image writers found."); + throw new GuacamoleException("No useful image writers found."); // Obtain JPEG writer ImageWriter imageWriter = writers.next(); diff --git a/guacamole/src/net/sourceforge/guacamole/net/Configuration.java b/guacamole/src/net/sourceforge/guacamole/net/Configuration.java index 3a3b188b1..c1dead926 100644 --- a/guacamole/src/net/sourceforge/guacamole/net/Configuration.java +++ b/guacamole/src/net/sourceforge/guacamole/net/Configuration.java @@ -20,6 +20,7 @@ package net.sourceforge.guacamole.net; */ import javax.servlet.ServletContext; +import net.sourceforge.guacamole.GuacamoleException; public abstract class Configuration { diff --git a/guacamole/src/net/sourceforge/guacamole/net/GuacamoleConfiguration.java b/guacamole/src/net/sourceforge/guacamole/net/GuacamoleConfiguration.java index 0c84247ab..4ae3c759a 100644 --- a/guacamole/src/net/sourceforge/guacamole/net/GuacamoleConfiguration.java +++ b/guacamole/src/net/sourceforge/guacamole/net/GuacamoleConfiguration.java @@ -20,31 +20,26 @@ package net.sourceforge.guacamole.net; */ import javax.servlet.ServletContext; +import net.sourceforge.guacamole.GuacamoleException; public class GuacamoleConfiguration extends Configuration { - private String hostname; - private int port; private String password; private int outputBPP; private boolean compressStream; + private String protocol; public GuacamoleConfiguration(ServletContext context) throws GuacamoleException { super(context); - hostname = readParameter("host", null); - port = readIntParameter("port", null); password = context.getInitParameter("password"); outputBPP = readIntParameter("output-bpp", 8, 8, 24); compressStream = readBooleanParameter("compress-stream", false); + protocol = readParameter("protocol", "vnc", "vnc"); } - public String getHostname() { - return hostname; - } - public int getOutputBPP() { return outputBPP; } @@ -53,12 +48,12 @@ public class GuacamoleConfiguration extends Configuration { return password; } - public int getPort() { - return port; - } - public boolean getCompressStream() { return compressStream; } + public String getProtocol() { + return protocol; + } + } diff --git a/guacamole/src/net/sourceforge/guacamole/net/GuacamoleServlet.java b/guacamole/src/net/sourceforge/guacamole/net/GuacamoleServlet.java index 129329411..e64c104b1 100644 --- a/guacamole/src/net/sourceforge/guacamole/net/GuacamoleServlet.java +++ b/guacamole/src/net/sourceforge/guacamole/net/GuacamoleServlet.java @@ -24,7 +24,7 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import net.sourceforge.guacamole.vnc.VNCException; +import net.sourceforge.guacamole.GuacamoleException; public abstract class GuacamoleServlet extends HttpServlet { diff --git a/guacamole/src/net/sourceforge/guacamole/net/GuacamoleSession.java b/guacamole/src/net/sourceforge/guacamole/net/GuacamoleSession.java index b25c1e6cb..eb9d986e0 100644 --- a/guacamole/src/net/sourceforge/guacamole/net/GuacamoleSession.java +++ b/guacamole/src/net/sourceforge/guacamole/net/GuacamoleSession.java @@ -24,6 +24,10 @@ import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener; import net.sourceforge.guacamole.Client; +import net.sourceforge.guacamole.GuacamoleException; +import net.sourceforge.guacamole.instruction.Instruction; +import net.sourceforge.guacamole.event.KeyEvent; +import net.sourceforge.guacamole.event.PointerEvent; import net.sourceforge.guacamole.vnc.VNCClient; import net.sourceforge.guacamole.vnc.VNCConfiguration; import net.sourceforge.guacamole.vnc.VNCException; @@ -34,10 +38,12 @@ public class GuacamoleSession { private final HttpSession session; private Client client; - private class SessionVNCClient extends VNCClient implements HttpSessionBindingListener { + private class SessionClient extends Client implements HttpSessionBindingListener { - public SessionVNCClient(String host, int port, String password, int colorBits, int outputBPP) throws VNCException { - super(host, port, password, colorBits, outputBPP); + private Client client; + + public SessionClient(Client client) { + this.client = client; } public void valueBound(HttpSessionBindingEvent event) { @@ -53,6 +59,26 @@ public class GuacamoleSession { } } + public void send(KeyEvent event) throws GuacamoleException { + client.send(event); + } + + public void send(PointerEvent event) throws GuacamoleException { + client.send(event); + } + + public void setClipboard(String clipboard) throws GuacamoleException { + client.setClipboard(clipboard); + } + + public void disconnect() throws GuacamoleException { + client.disconnect(); + } + + public Instruction nextInstruction(boolean blocking) throws GuacamoleException { + return client.nextInstruction(blocking); + } + } public GuacamoleSession(HttpSession session) throws GuacamoleException { @@ -77,24 +103,35 @@ public class GuacamoleSession { if (client != null) client.disconnect(); - // Connect to VNC server - try { - // Read VNC-specific parameters - ServletContext context = session.getServletContext(); - VNCConfiguration vncconfig = new VNCConfiguration(context); + String protocol = config.getProtocol(); + if (protocol.equals("vnc")) { + + // Connect to VNC server + try { + + // Read VNC-specific parameters + ServletContext context = session.getServletContext(); + VNCConfiguration vncconfig = new VNCConfiguration(context); + + client = new SessionClient( + new VNCClient( + vncconfig.getHostname(), + vncconfig.getPort(), + vncconfig.getPassword(), + vncconfig.getBPP(), + config.getOutputBPP() + ) + ); + + } + catch (VNCException e) { + throw new GuacamoleException(e); + } - client = new SessionVNCClient( - config.getHostname(), - config.getPort(), - vncconfig.getPassword(), - vncconfig.getBPP(), - config.getOutputBPP() - ); - } - catch (VNCException e) { - throw new GuacamoleException(e); } + else + throw new GuacamoleException("Unsupported protocol: " + protocol); session.setAttribute("CLIENT", client); diff --git a/guacamole/src/net/sourceforge/guacamole/net/XMLGuacamoleServlet.java b/guacamole/src/net/sourceforge/guacamole/net/XMLGuacamoleServlet.java index c626a5211..fafe745fd 100644 --- a/guacamole/src/net/sourceforge/guacamole/net/XMLGuacamoleServlet.java +++ b/guacamole/src/net/sourceforge/guacamole/net/XMLGuacamoleServlet.java @@ -36,6 +36,7 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import net.sourceforge.guacamole.Client; +import net.sourceforge.guacamole.GuacamoleException; import org.w3c.dom.Document; import org.w3c.dom.Element; diff --git a/guacamole/src/net/sourceforge/guacamole/net/control/Connect.java b/guacamole/src/net/sourceforge/guacamole/net/control/Connect.java index c63126553..a102d224b 100644 --- a/guacamole/src/net/sourceforge/guacamole/net/control/Connect.java +++ b/guacamole/src/net/sourceforge/guacamole/net/control/Connect.java @@ -23,7 +23,7 @@ import javax.servlet.ServletRequest; import org.w3c.dom.Element; import net.sourceforge.guacamole.net.XMLGuacamoleServlet; -import net.sourceforge.guacamole.net.GuacamoleException; +import net.sourceforge.guacamole.GuacamoleException; import net.sourceforge.guacamole.net.GuacamoleSession; public class Connect extends XMLGuacamoleServlet { diff --git a/guacamole/src/net/sourceforge/guacamole/net/control/Disconnect.java b/guacamole/src/net/sourceforge/guacamole/net/control/Disconnect.java index bd889f540..c061284b1 100644 --- a/guacamole/src/net/sourceforge/guacamole/net/control/Disconnect.java +++ b/guacamole/src/net/sourceforge/guacamole/net/control/Disconnect.java @@ -23,7 +23,7 @@ import javax.servlet.ServletRequest; import org.w3c.dom.Element; import net.sourceforge.guacamole.net.XMLGuacamoleServlet; -import net.sourceforge.guacamole.net.GuacamoleException; +import net.sourceforge.guacamole.GuacamoleException; import net.sourceforge.guacamole.net.GuacamoleSession; public class Disconnect extends XMLGuacamoleServlet { diff --git a/guacamole/src/net/sourceforge/guacamole/net/input/Clipboard.java b/guacamole/src/net/sourceforge/guacamole/net/input/Clipboard.java index 549a19c10..959b604ea 100644 --- a/guacamole/src/net/sourceforge/guacamole/net/input/Clipboard.java +++ b/guacamole/src/net/sourceforge/guacamole/net/input/Clipboard.java @@ -20,7 +20,7 @@ package net.sourceforge.guacamole.net.input; */ import javax.servlet.ServletRequest; -import net.sourceforge.guacamole.net.GuacamoleException; +import net.sourceforge.guacamole.GuacamoleException; import org.w3c.dom.Element; import net.sourceforge.guacamole.net.GuacamoleSession; diff --git a/guacamole/src/net/sourceforge/guacamole/net/input/Key.java b/guacamole/src/net/sourceforge/guacamole/net/input/Key.java index 1099fe83e..5ad547a85 100644 --- a/guacamole/src/net/sourceforge/guacamole/net/input/Key.java +++ b/guacamole/src/net/sourceforge/guacamole/net/input/Key.java @@ -20,9 +20,9 @@ package net.sourceforge.guacamole.net.input; */ import javax.servlet.ServletRequest; -import net.sourceforge.guacamole.net.GuacamoleException; +import net.sourceforge.guacamole.GuacamoleException; import org.w3c.dom.Element; -import net.sourceforge.guacamole.vnc.event.KeyEvent; +import net.sourceforge.guacamole.event.KeyEvent; import net.sourceforge.guacamole.net.GuacamoleSession; import net.sourceforge.guacamole.net.XMLGuacamoleServlet; diff --git a/guacamole/src/net/sourceforge/guacamole/net/input/Pointer.java b/guacamole/src/net/sourceforge/guacamole/net/input/Pointer.java index 4abf0ce01..efb8c67d1 100644 --- a/guacamole/src/net/sourceforge/guacamole/net/input/Pointer.java +++ b/guacamole/src/net/sourceforge/guacamole/net/input/Pointer.java @@ -19,9 +19,9 @@ package net.sourceforge.guacamole.net.input; */ import javax.servlet.ServletRequest; -import net.sourceforge.guacamole.net.GuacamoleException; +import net.sourceforge.guacamole.GuacamoleException; import org.w3c.dom.Element; -import net.sourceforge.guacamole.vnc.event.PointerEvent; +import net.sourceforge.guacamole.event.PointerEvent; import net.sourceforge.guacamole.net.GuacamoleSession; import net.sourceforge.guacamole.net.XMLGuacamoleServlet; diff --git a/guacamole/src/net/sourceforge/guacamole/net/output/InstructionStream.java b/guacamole/src/net/sourceforge/guacamole/net/output/InstructionStream.java index 1bd9bc2c2..632d2ef78 100644 --- a/guacamole/src/net/sourceforge/guacamole/net/output/InstructionStream.java +++ b/guacamole/src/net/sourceforge/guacamole/net/output/InstructionStream.java @@ -28,7 +28,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.sourceforge.guacamole.Client; import net.sourceforge.guacamole.net.GuacamoleServlet; -import net.sourceforge.guacamole.net.GuacamoleException; +import net.sourceforge.guacamole.GuacamoleException; import net.sourceforge.guacamole.net.GuacamoleSession; import net.sourceforge.guacamole.instruction.Instruction; import net.sourceforge.guacamole.instruction.ErrorInstruction; diff --git a/guacamole/src/net/sourceforge/guacamole/vnc/VNCClient.java b/guacamole/src/net/sourceforge/guacamole/vnc/VNCClient.java index 52a0eeee1..ccce39174 100644 --- a/guacamole/src/net/sourceforge/guacamole/vnc/VNCClient.java +++ b/guacamole/src/net/sourceforge/guacamole/vnc/VNCClient.java @@ -22,10 +22,10 @@ import java.awt.image.WritableRaster; import net.sourceforge.guacamole.instruction.framebuffer.PNGInstruction; import net.sourceforge.guacamole.instruction.framebuffer.CursorInstruction; import net.sourceforge.guacamole.instruction.framebuffer.CopyRectInstruction; -import net.sourceforge.guacamole.vnc.event.PointerEvent; -import net.sourceforge.guacamole.vnc.event.EventQueue; -import net.sourceforge.guacamole.vnc.event.KeyEvent; -import net.sourceforge.guacamole.vnc.event.EventHandler; +import net.sourceforge.guacamole.event.PointerEvent; +import net.sourceforge.guacamole.event.EventQueue; +import net.sourceforge.guacamole.event.KeyEvent; +import net.sourceforge.guacamole.event.EventHandler; import java.awt.image.BufferedImage; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; @@ -58,7 +58,7 @@ import net.sourceforge.guacamole.instruction.Instruction; import net.sourceforge.guacamole.instruction.NameInstruction; import net.sourceforge.guacamole.instruction.SizeInstruction; import net.sourceforge.guacamole.instruction.framebuffer.PNGImage; -import net.sourceforge.guacamole.net.GuacamoleException; +import net.sourceforge.guacamole.GuacamoleException; public class VNCClient extends Client { @@ -355,7 +355,7 @@ public class VNCClient extends Client { // Handles all messages, blocking until at least one message is read if desired. - private void handleMessages(boolean blocking) throws IOException, VNCException { + private void handleMessages(boolean blocking) throws IOException, VNCException, GuacamoleException { synchronized (input) { @@ -414,7 +414,7 @@ public class VNCClient extends Client { } - private void handleFramebufferUpdate() throws IOException, VNCException { + private void handleFramebufferUpdate() throws IOException, VNCException, GuacamoleException { input.read(); // Padding int numberOfRectangles = input.readUnsignedShort(); diff --git a/guacamole/src/net/sourceforge/guacamole/vnc/VNCConfiguration.java b/guacamole/src/net/sourceforge/guacamole/vnc/VNCConfiguration.java index bdab8d826..a0a68ad3a 100644 --- a/guacamole/src/net/sourceforge/guacamole/vnc/VNCConfiguration.java +++ b/guacamole/src/net/sourceforge/guacamole/vnc/VNCConfiguration.java @@ -19,11 +19,14 @@ package net.sourceforge.guacamole.vnc; * along with this program. If not, see . */ -import net.sourceforge.guacamole.net.*; +import net.sourceforge.guacamole.net.Configuration; +import net.sourceforge.guacamole.GuacamoleException; import javax.servlet.ServletContext; public class VNCConfiguration extends Configuration { + private String hostname; + private int port; private String password; private int bpp; @@ -31,6 +34,8 @@ public class VNCConfiguration extends Configuration { super(context); + hostname = readParameter("host", null); + port = readIntParameter("port", null); password = context.getInitParameter("password"); bpp = readIntParameter("bpp", 24, 8, 16, 24); @@ -44,4 +49,12 @@ public class VNCConfiguration extends Configuration { return password; } + public String getHostname() { + return hostname; + } + + public int getPort() { + return port; + } + }