| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to you 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.apache.calcite.avatica.server; |
| |
| import org.apache.calcite.avatica.Meta; |
| import org.apache.calcite.avatica.remote.LocalService; |
| import org.apache.calcite.avatica.remote.Service; |
| |
| import org.eclipse.jetty.server.handler.AbstractHandler; |
| |
| import java.lang.reflect.InvocationTargetException; |
| import java.util.Arrays; |
| |
| /** |
| * Jetty handler that executes Avatica JSON request-responses. |
| */ |
| public class Main { |
| private Main() {} |
| |
| public static void main(String[] args) throws InterruptedException, ClassNotFoundException, |
| IllegalAccessException, InstantiationException, NoSuchMethodException, |
| InvocationTargetException { |
| HttpServer server = start(args); |
| server.join(); |
| } |
| |
| /** |
| * Factory that instantiates Jetty Handlers |
| */ |
| public interface HandlerFactory { |
| AbstractHandler createHandler(Service service); |
| } |
| |
| private static final HandlerFactory JSON_HANDLER_FACTORY = new HandlerFactory() { |
| public AbstractHandler createHandler(Service service) { |
| return new AvaticaJsonHandler(service); |
| } |
| }; |
| |
| /** |
| * Creates and starts an {@link HttpServer} using JSON POJO serialization of requests/responses. |
| * |
| * <p>Arguments are as follows: |
| * <ul> |
| * <li>args[0]: the {@link org.apache.calcite.avatica.Meta.Factory} class |
| * name |
| * <li>args[1+]: arguments passed along to |
| * {@link org.apache.calcite.avatica.Meta.Factory#create(java.util.List)} |
| * </ul> |
| * |
| * @param args Command-line arguments |
| */ |
| public static HttpServer start(String[] args) throws ClassNotFoundException, |
| InstantiationException, IllegalAccessException, NoSuchMethodException, |
| InvocationTargetException { |
| return start(args, 8765, JSON_HANDLER_FACTORY); |
| } |
| |
| /** |
| * Creates and starts an {@link HttpServer} using the given factory to create the Handler. |
| * |
| * <p>Arguments are as follows: |
| * <ul> |
| * <li>args[0]: the {@link org.apache.calcite.avatica.Meta.Factory} class |
| * name |
| * <li>args[1+]: arguments passed along to |
| * {@link org.apache.calcite.avatica.Meta.Factory#create(java.util.List)} |
| * </ul> |
| * |
| * @param args Command-line arguments |
| * @param port Server port to bind |
| * @param handlerFactory Factory to create the handler used by the server |
| */ |
| public static HttpServer start(String[] args, int port, HandlerFactory handlerFactory) |
| throws ClassNotFoundException, InstantiationException, IllegalAccessException, |
| NoSuchMethodException, InvocationTargetException { |
| String factoryClassName = args[0]; |
| @SuppressWarnings("unchecked") Class<Meta.Factory> factoryClass = |
| (Class<Meta.Factory>) Class.forName(factoryClassName); |
| Meta.Factory factory = factoryClass.getConstructor().newInstance(); |
| Meta meta = factory.create(Arrays.asList(args).subList(1, args.length)); |
| Service service = new LocalService(meta); |
| HttpServer server = new HttpServer(port, |
| HttpServer.wrapJettyHandler(handlerFactory.createHandler(service))); |
| server.start(); |
| return server; |
| } |
| } |
| |
| // End Main.java |