public WebServer(String[] startArguments) {

		loadConfiguration(startArguments);
		Log.debug(Configuration.getInstance().toString());

		Log.debug("Information about the OS: " + System.getProperty("os.name")
				+ " - " + System.getProperty("os.version") + " - "
				+ System.getProperty("os.arch"));

		if (Configuration.getConfig().getProxyHost() != null) {
			Log.debug("setup proxy configuration");
			System.setProperty("http.proxyHost", Configuration.getConfig()
					.getProxyHost());
			System.setProperty("http.proxyPort",
					String.valueOf(Configuration.getConfig().getProxyPort()));
		}

		Log.debug("find supported scripting languages");
		supportedScriptLanguages = Collections.unmodifiableList(ScriptExecutor
				.getSupportedScriptLanguages());
		Log.debug("Supported Script Languages "
				+ Arrays.toString(supportedScriptLanguages.toArray()));

		Log.info("instantiating web server");
		try {
			ServerSocket server = new ServerSocket(Configuration.getConfig()
					.getServerPort());
			Log.debug("bound port " + Configuration.getConfig().getServerPort());

			int corePoolSize = Runtime.getRuntime().availableProcessors();
			int maxPoolSize = (2 * corePoolSize) + 1;
			Log.debug("core/max pool size: " + corePoolSize + "/" + maxPoolSize);
			LinkedBlockingQueue<Runnable> workerQueue = new LinkedBlockingQueue<Runnable>();
			long keepAliveTime = 30;
			/*
			 * keepAliveTime - If the pool currently has more than corePoolSize
			 * threads, excess threads will be terminated if they have been idle
			 * for more than the keepAliveTime.
			 */

			ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
					corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS,
					workerQueue);
			threadPool.prestartAllCoreThreads();

			Socket socket = null;
			while (true) {

				try {
					socket = server.accept();
					Log.info(socket.getInetAddress().getHostName()
							+ " client request");
					threadPool.execute(new HttpHandler(socket));
					Log.debug("current threads: " + threadPool.getActiveCount());
				} catch (final IOException ex) {
					Log.error("Connection failed!", ex);
				} catch (final RejectedExecutionException ex) {
					// XXX [sne] RejectedExecutionException
					// http://stackoverflow.com/questions/1519725/why-does-executors-newcachedthreadpool-throw-java-util-concurrent-rejectedexecut
					// http://www.javamex.com/tutorials/threads/thread_pools_queues.shtml
					// http://stackoverflow.com/questions/2001086/how-to-make-threadpoolexecutors-submit-method-block-if-it-is-saturated
					Log.error("RejectedExecutionException", ex);
					socket.close();
				} catch (final Exception ex) {
					Log.fatal("Unknown error!", ex);
				}
			}
		} catch (final IOException ex) {
			Log.fatal("Can not start the server!", ex);
			System.err.println("Can not start the server! " + ex.getMessage());
		} catch (final Exception ex) {
			Log.fatal("Unknown error!", ex);
		}
	}