/* * Copyright (C) 2012 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ package com.facebook.swift.service.async; import com.facebook.swift.service.scribe.LogEntry; import com.facebook.swift.service.scribe.scribe; import org.apache.thrift.TApplicationException; import org.apache.thrift.TException; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.server.TServlet; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; public class HttpScribeServer implements AutoCloseable { Server jettyServer; public void start() throws Exception { jettyServer = createServer(); } public void close() throws Exception { shutdownServer(jettyServer); } public int getLocalPort() { return ((ServerConnector) jettyServer.getConnectors()[0]).getLocalPort(); } public List<LogEntry> getLogEntries() throws ServletException { return getServerServlet(jettyServer).getLogEntries(); } private Server createServer() throws Exception { Server httpServer = new Server(); ServerConnector connector = new ServerConnector(httpServer); connector.setPort(0); httpServer.addConnector(connector); List<LogEntry> logEntries = new ArrayList<LogEntry>(); com.facebook.swift.service.scribe.scribe.Iface handler = new TestThriftServletHandler(logEntries); TServlet servlet = new TestThriftServlet(handler, logEntries); ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); contextHandler.setContextPath("/thrift"); contextHandler.addServlet(new ServletHolder(servlet), "/*"); httpServer.setHandler(contextHandler); httpServer.start(); return httpServer; } private TestThriftServlet getServerServlet(Server server) throws ServletException { ServletContextHandler handler = (ServletContextHandler) server.getHandlers()[0]; return (TestThriftServlet) handler.getServletHandler().getServlets()[0].getServlet(); } private void shutdownServer(Server httpServer) throws Exception { if (httpServer != null) { httpServer.stop(); httpServer.join(); } } private static class TestThriftServletHandler implements com.facebook.swift.service.scribe.scribe.Iface { private final List<com.facebook.swift.service.scribe.LogEntry> logEntries; private TestThriftServletHandler(List<com.facebook.swift.service.scribe.LogEntry> logEntries) { this.logEntries = logEntries; } @Override public com.facebook.swift.service.scribe.ResultCode Log(List<com.facebook.swift.service.scribe.LogEntry> messages) throws TException { try { Thread.sleep(100); logEntries.addAll(messages); } catch (InterruptedException e) { throw new TApplicationException(TApplicationException.UNKNOWN); } return com.facebook.swift.service.scribe.ResultCode.OK; } } private class TestThriftServlet extends TServlet { public List<com.facebook.swift.service.scribe.LogEntry> getLogEntries() { return logEntries; } private final List<com.facebook.swift.service.scribe.LogEntry> logEntries; public TestThriftServlet( scribe.Iface handler, List<com.facebook.swift.service.scribe.LogEntry> logEntries) { super(new scribe.Processor<>(handler), new TBinaryProtocol.Factory()); this.logEntries = logEntries; } } }