blob: f2d546b3c1dd7833290b40c78b0e7411e420a09e [file] [log] [blame]
/*
* 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