/* * Copyright WSO2, Inc. (http://wso2.com) * * 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 org.wso2.carbon.cloud.gateway.transport.server; import org.apache.axis2.AxisFault; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocolFactory; import org.apache.thrift.server.TServer; import org.apache.thrift.server.TThreadPoolServer; import org.apache.thrift.transport.TSSLTransportFactory; import org.apache.thrift.transport.TServerSocket; import org.apache.thrift.transport.TTransportException; import org.wso2.carbon.cloud.gateway.common.thrift.gen.CloudGatewayService; import java.net.InetAddress; import java.net.UnknownHostException; /** * The thirft server implementation for csg transport */ public class CGThriftServer { private static Log log = LogFactory.getLog(CGThriftServer.class); private CGThriftServerHandler csgThriftServerHandler; public CGThriftServer(CGThriftServerHandler handler) { this.csgThriftServerHandler = handler; } /** * The server instance */ private TServer server; /** * Start the thrift server * * @param hostName the hostname * @param port thrift server port * @param timeOut the client timeout * @param keyStorePath the path of the key store * @param keyStorePassword the password of the key store * @param trustStorePath the path of the trust store * @param trustStorePassword the password of the trust store * @param taskName the name of the main server thread * @throws AxisFault throws in case of an starting error */ public void start(final String hostName, final int port, final int timeOut, final String keyStorePath, final String keyStorePassword, final String trustStorePath, final String trustStorePassword, final String taskName) throws AxisFault { try { TSSLTransportFactory.TSSLTransportParameters params = new TSSLTransportFactory.TSSLTransportParameters(); params.setKeyStore(keyStorePath, keyStorePassword); params.setTrustStore(trustStorePath, trustStorePassword); TServerSocket socket = TSSLTransportFactory.getServerSocket( port, timeOut, InetAddress.getByName(hostName), params); CloudGatewayService.Processor<CGThriftServerHandler> processor = new CloudGatewayService.Processor<CGThriftServerHandler>(csgThriftServerHandler); TProtocolFactory protocolFactory = new TBinaryProtocol.Factory(); server = new TThreadPoolServer(new TThreadPoolServer.Args(socket). processor(processor).inputProtocolFactory(protocolFactory)); log.info("Starting the Cloud Gateway Thrift server on host '" + hostName + "' on port '" + port + "'..."); new Thread(new CGServerMainLoop(server), taskName).start(); } catch (TTransportException e) { throw new AxisFault("TTransportException occurs", e); } catch (UnknownHostException e) { throw new AxisFault("Unknown host exception occurs", e); } } /** * Stop the server */ public void stop() { if (server != null) { server.stop(); } } /** * Returns if the server is still running * * @return true if server is running */ public boolean isServerAlive() { return server != null && server.isServing(); } /** * The task for starting the thrift server */ private static class CGServerMainLoop implements Runnable { private TServer server; private CGServerMainLoop(TServer server) { this.server = server; } public void run() { try { server.serve(); } catch (Exception e) { throw new RuntimeException("Could not start the CGThrift server", e); } } } }