Skip to content

Commit

Permalink
Replace static SocketFactory by interface+implementations.
Browse files Browse the repository at this point in the history
  • Loading branch information
amolenaar committed May 14, 2016
1 parent d19accd commit 3aef571
Show file tree
Hide file tree
Showing 27 changed files with 269 additions and 266 deletions.
10 changes: 2 additions & 8 deletions src/fitnesse/FitNesse.java
Expand Up @@ -19,7 +19,6 @@
import fitnesse.http.MockResponseSender;
import fitnesse.http.Request;
import fitnesse.http.Response;
import fitnesse.socketservice.SocketFactory;
import fitnesse.socketservice.SocketService;
import fitnesse.util.MockSocket;
import fitnesse.util.SerialExecutorService;
Expand All @@ -43,13 +42,8 @@ public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
new DaemonThreadFactory(), rejectionHandler);
}

public void start() throws IOException {
if (context.port > 0) {
ServerSocket serverSocket = context.useHTTPS
? SocketFactory.createSslServerSocket(context.port, context.sslClientAuth, context.sslParameterClassName)
: SocketFactory.createServerSocket(context.port);
theService = new SocketService(new FitNesseServer(context, executorService), false, serverSocket);
}
public void start(ServerSocket serverSocket) throws IOException {
theService = new SocketService(new FitNesseServer(context, executorService), false, serverSocket);
}

public synchronized void stop() throws IOException {
Expand Down
16 changes: 3 additions & 13 deletions src/fitnesse/FitNesseContext.java
Expand Up @@ -22,9 +22,10 @@
import fitnesse.wikitext.parser.VariableSource;

public class FitNesseContext {
private static final String WIKI_PROTOCOL_PROPERTY = "wiki.protocol";
public static final String WIKI_PROTOCOL_PROPERTY = "wiki.protocol";
public static final String SSL_PARAMETER_CLASS_PROPERTY = "wiki.protocol.ssl.parameter.class";
public static final String SSL_CLIENT_AUTH_PROPERTY = "wiki.protocol.ssl.client.auth";

public static final String recentChangesDateFormat = "kk:mm:ss EEE, MMM dd, yyyy";
public static final String rfcCompliantDateFormat = "EEE, d MMM yyyy HH:mm:ss Z";
public static final String testResultsDirectoryName = "testResults";
Expand All @@ -50,12 +51,6 @@ public class FitNesseContext {
public final RecentChanges recentChanges;
public final Logger logger;
public final Authenticator authenticator;
@Deprecated // ("Change to SocketFactory instead")
public final boolean useHTTPS;
@Deprecated // ("Change to SocketFactory instead")
public String sslParameterClassName;
@Deprecated // ("Change to SocketFactory instead")
public final boolean sslClientAuth;
private final Properties properties;

protected FitNesseContext(FitNesseVersion version, WikiPageFactory wikiPageFactory, String rootPath,
Expand Down Expand Up @@ -84,11 +79,6 @@ protected FitNesseContext(FitNesseVersion version, WikiPageFactory wikiPageFacto
variableSource = new SystemVariableSource(properties);
fitNesse = new FitNesse(this);
pageFactory = new PageFactory(this);
String protocol = variableSource.getProperty(WIKI_PROTOCOL_PROPERTY);
this.useHTTPS = (protocol != null && protocol.equalsIgnoreCase("https"));
String clientAuth = variableSource.getProperty(SSL_CLIENT_AUTH_PROPERTY);
this.sslClientAuth = (clientAuth != null && clientAuth.equalsIgnoreCase("required"));
this.sslParameterClassName = variableSource.getProperty(SSL_PARAMETER_CLASS_PROPERTY);
}

public WikiPage getRootPage() {
Expand Down Expand Up @@ -126,7 +116,7 @@ public Properties getProperties() {
public String getProperty(String name) {
return variableSource.getProperty(name);
}

private String unifiedPathPattern(String s)
{
return s.replace("/",File.separator);
Expand Down
2 changes: 0 additions & 2 deletions src/fitnesse/FitNesseExpediter.java
Expand Up @@ -23,7 +23,6 @@
import fitnesse.http.ResponseSender;
import fitnesse.http.SimpleResponse;
import fitnesse.responders.ErrorResponder;
import fitnesse.socketservice.SocketFactory;
import org.apache.commons.lang.StringUtils;

import static java.lang.String.format;
Expand Down Expand Up @@ -92,7 +91,6 @@ public void close() {

private Request makeRequest() {
Request request = new Request(input);
request.setPeerDn(SocketFactory.peerDn(socket));
request.setContextRoot(context.contextRoot);
return request;
}
Expand Down
13 changes: 5 additions & 8 deletions src/fitnesse/fixtures/SetUp.java
Expand Up @@ -2,17 +2,17 @@
// Released under the terms of the CPL Common Public License version 1.0.
package fitnesse.fixtures;

import static fitnesse.fixtures.FitnesseFixtureContext.context;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.util.Properties;

import util.FileUtil;
import fit.Fixture;
import fitnesse.authentication.Authenticator;
import fitnesse.responders.editing.SaveRecorder;
import fitnesse.testutil.FitNesseUtil;
import util.FileUtil;

import static fitnesse.fixtures.FitnesseFixtureContext.context;

public class SetUp extends Fixture {
public SetUp() throws Exception {
Expand All @@ -28,18 +28,15 @@ private SetUp(Properties properties) throws Exception {
properties.setProperty("FITNESSE_PORT", String.valueOf(port));
context = FitNesseUtil.makeTestContext(port, new Authenticator() {
@Override public boolean isAuthenticated(String username, String password) {
if (FitnesseFixtureContext.authenticator != null) {
return FitnesseFixtureContext.authenticator.isAuthenticated(username, password);
}
return true;
return FitnesseFixtureContext.authenticator == null || FitnesseFixtureContext.authenticator.isAuthenticated(username, password);
}
}, properties);
File historyDirectory = context.getTestHistoryDirectory();
if (historyDirectory.exists())
FileUtil.deleteFileSystemDirectory(historyDirectory);
historyDirectory.mkdirs();
SaveRecorder.clear();
context.fitNesse.start();
FitNesseUtil.startFitnesseWithContext(context);
}

private static Properties asProperties(String configuration) throws Exception {
Expand Down
13 changes: 0 additions & 13 deletions src/fitnesse/http/Request.java
Expand Up @@ -42,11 +42,6 @@ public class Request {
private volatile boolean hasBeenParsed;
private long bytesParsed = 0;

/**
* If SSL is being used the DN of the peer certificate, otherwise null.
*/
private String peerDn;

public static Set<String> buildAllowedMethodList() {
Set<String> methods = new HashSet<>(20);
methods.add("GET");
Expand Down Expand Up @@ -337,14 +332,6 @@ public String getAuthorizationPassword() {
return authorizationPassword;
}

public String getPeerDn() {
return peerDn;
}

public void setPeerDn(String peerDn) {
this.peerDn = peerDn;
}

public long numberOfBytesParsed() {
return bytesParsed + input.numberOfBytesConsumed();
}
Expand Down
2 changes: 0 additions & 2 deletions src/fitnesse/slim/SlimServer.java
Expand Up @@ -4,7 +4,6 @@

import fitnesse.slim.protocol.SlimDeserializer;
import fitnesse.slim.protocol.SlimSerializer;
import fitnesse.socketservice.SocketFactory;
import fitnesse.socketservice.SocketServer;
import util.FileUtil;

Expand Down Expand Up @@ -40,7 +39,6 @@ public SlimServer(SlimFactory slimFactory) {

@Override
public void serve(Socket s) throws IOException {
SocketFactory.printSocketInfo(s);
SlimStreamReader reader = null;
OutputStream writer = null;
try {
Expand Down
41 changes: 23 additions & 18 deletions src/fitnesse/slim/SlimService.java
Expand Up @@ -12,13 +12,17 @@

import fitnesse.slim.fixtureInteraction.DefaultInteraction;
import fitnesse.slim.fixtureInteraction.FixtureInteraction;
import fitnesse.socketservice.SocketFactory;
import fitnesse.socketservice.PlainServerSocketFactory;
import fitnesse.socketservice.ServerSocketFactory;
import fitnesse.socketservice.SslServerSocketFactory;
import util.CommandLine;

import static fitnesse.slim.JavaSlimFactory.createJavaSlimFactory;

public class SlimService {
public static final String OPTION_DESCRIPTOR = "[-v] [-i interactionClass] [-s statementTimeout] [-d] [-ssl parameterClass] port";
private static final String OPTION_DESCRIPTOR = "[-v] [-i interactionClass] [-s statementTimeout] [-d] [-ssl parameterClass] port";

// TODO: This should not be static, instead, move to SlimExecutoinContext
static FixtureInteraction interaction = getInteraction(null);

public static class Options {
Expand Down Expand Up @@ -72,8 +76,20 @@ protected static void parseCommandLineFailed(String[] args) {
}

public static void startWithFactory(SlimFactory slimFactory, Options options) throws IOException {
SlimService slimservice = new SlimService(slimFactory.getSlimServer(), options.port, options.interaction, options.daemon, options.useSSL, options.sslParameterClassName);
slimservice.accept();
ServerSocketFactory serverSocketFactory = options.useSSL ? new SslServerSocketFactory(true, options.sslParameterClassName) : new PlainServerSocketFactory();
try {
SlimService slimservice = new SlimService(slimFactory.getSlimServer(), serverSocketFactory.createServerSocket(options.port), options.interaction, options.daemon);
slimservice.accept();
} catch (java.lang.OutOfMemoryError e) {
System.err.println("Out of Memory. Aborting.");
e.printStackTrace();
System.exit(99);
throw e;
} catch (BindException e) {
System.err.println("Can not bind to port " + options.port + ". Aborting.");
e.printStackTrace();
throw e;
}
}

public static Options parseCommandLine(String[] args) {
Expand All @@ -93,23 +109,12 @@ public static Options parseCommandLine(String[] args) {
return null;
}

public SlimService(SlimServer slimServer, int port, FixtureInteraction interaction, boolean daemon, boolean useSSL, String sslParameterClassName) throws IOException {
public SlimService(SlimServer slimServer, ServerSocket serverSocket, FixtureInteraction interaction, boolean daemon) throws IOException {
SlimService.interaction = interaction;
this.daemon = daemon;
this.slimServer = slimServer;

try {
serverSocket = useSSL ? SocketFactory.createSslServerSocket(port, useSSL, sslParameterClassName) : SocketFactory.createServerSocket(port);
} catch (java.lang.OutOfMemoryError e) {
System.err.println("Out of Memory. Aborting.");
e.printStackTrace();
System.exit(99);
throw e;
} catch (BindException e) {
System.err.println("Can not bind to port " + port + ". Aborting.");
e.printStackTrace();
throw e;
}
this.serverSocket = serverSocket;
//
}

public int getPort() {
Expand Down
16 changes: 16 additions & 0 deletions src/fitnesse/socketservice/ClientSocketFactory.java
@@ -0,0 +1,16 @@
package fitnesse.socketservice;

import java.io.IOException;
import java.net.Socket;

public interface ClientSocketFactory {

/**
* Create a client socket.
* @param hostName host to connect to.
* @param port port to connect to.
* @return A fresh socket.
* @throws IOException Thrown if socket can not be opened.
*/
Socket createSocket(String hostName, int port) throws IOException;
}
17 changes: 17 additions & 0 deletions src/fitnesse/socketservice/PlainClientSocketFactory.java
@@ -0,0 +1,17 @@
package fitnesse.socketservice;

import java.io.IOException;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class PlainClientSocketFactory implements ClientSocketFactory {
private static final Logger LOG = Logger.getLogger(PlainClientSocketFactory.class.getName());

@Override
public Socket createSocket(final String hostName, final int port) throws IOException {
LOG.log(Level.FINER, "Creating plain client: " + hostName + ":" + port);
return new Socket(hostName, port);

}
}
16 changes: 16 additions & 0 deletions src/fitnesse/socketservice/PlainServerSocketFactory.java
@@ -0,0 +1,16 @@
package fitnesse.socketservice;

import java.io.IOException;
import java.net.ServerSocket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class PlainServerSocketFactory implements ServerSocketFactory {
private static final Logger LOG = Logger.getLogger(PlainServerSocketFactory.class.getName());

@Override
public ServerSocket createServerSocket(final int port) throws IOException {
LOG.log(Level.FINER, "Creating plain socket on port: " + port);
return new ServerSocket(port);
}
}
16 changes: 16 additions & 0 deletions src/fitnesse/socketservice/ServerSocketFactory.java
@@ -0,0 +1,16 @@
package fitnesse.socketservice;

import java.io.IOException;
import java.net.ServerSocket;

public interface ServerSocketFactory {

/**
* Create a new socket on the provided port number
*
* @param port port
* @return A fresh socket.
* @throws IOException Thrown if socket can not be created.
*/
ServerSocket createServerSocket(int port) throws IOException;
}
4 changes: 0 additions & 4 deletions src/fitnesse/socketservice/SocketService.java
Expand Up @@ -59,10 +59,6 @@ private void serviceThread() {
while (running) {
try {
Socket s = serverSocket.accept();
if (!everRan){
// Print information about the first connection done
SocketFactory.printSocketInfo(s);
}
everRan = true;
server.serve(s);
} catch (java.lang.OutOfMemoryError e) {
Expand Down

0 comments on commit 3aef571

Please sign in to comment.