All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.baratine.web.WebBuilder Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 1998-2015 Caucho Technology -- all rights reserved
 *
 * This file is part of Baratine(TM)
 *
 * Each copy or derived work must preserve the copyright notice and this
 * notice unmodified.
 *
 * Baratine is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * Baratine is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
 * of NON-INFRINGEMENT.  See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Baratine; if not, write to the
 *
 *   Free Software Foundation, Inc.
 *   59 Temple Place, Suite 330
 *   Boston, MA 02111-1307  USA
 *
 * @author Scott Ferguson
 */

package io.baratine.web;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.function.Supplier;

import javax.inject.Provider;

import io.baratine.convert.Convert;
import io.baratine.inject.InjectionPoint;
import io.baratine.inject.Injector;
import io.baratine.inject.Injector.BindingBuilder;
import io.baratine.inject.Injector.InjectAutoBind;
import io.baratine.inject.Injector.InjectorBuilder;
import io.baratine.inject.Key;
import io.baratine.service.ServiceRef.ServiceBuilder;

/**
 * Interface WebBuilder provides methods to assemble a basic set of services
 * exposed via Web
 */
public interface WebBuilder
{
  /**
   * Adds a class for binding as a service. The class should be a valid service
   * class.
   *
   * @param type type to include
   * @return instance of {@code WebBuilder}
   */
  WebBuilder include(Class type);
  
  //
  // inject methods
  //

  /**
   * Configures a generic Bean provider for a specified class
   *
   * @param impl
   * @param 
   * @return instance of {@code BindingBuilder}
   */
   BindingBuilder bean(Class impl);

  /**
   * Configures a generic bean provider for a specified instance
   *
   * @param instance
   * @param 
   * @return instance of {@code BindingBuilder}
   */
   BindingBuilder bean(T instance);

  /**
   * Adds a bean provider for type <T>
   *
   * @param provider
   * @param 
   * @return instance of {@code BindingBuilder}
   */
   BindingBuilder beanProvider(Provider provider);
  // BindingBuilder beanFunction(Function function);
  // BindingBuilder provider(Key parent, Method m);

  InjectorBuilder autoBind(InjectAutoBind autoBind);

  //
  // route methods
  //

  /**
   * Configures a route builder for a specified HTTP method and path.
   *
   * @param method
   * @param path
   * @return instance of {@code BindingBuilder}
   */
  RouteBuilder route(HttpMethod method, String path);

  /**
   * Configures route builder for a HTTP DELETE method at a specified path
   * @param path
   * @return instance of {@code RouteBuilder}
   */
  default RouteBuilder delete(String path)
  {
    return route(HttpMethod.DELETE, path);
  }

  /**
   * Configures route builder for HTTP GET method at specified path
   * @param path
   * @return instance of {@code RouteBuilder}
   */
  default RouteBuilder get(String path)
  {
    return route(HttpMethod.GET, path);
  }

  /**
   * Configures route builder for HTTP OPTIONS method at specified path
   * @param path
   * @return instance of {@code RouteBuilder}
   */
  default RouteBuilder options(String path)
  {
    return route(HttpMethod.OPTIONS, path);
  }

  /**
   * Configures route buidler for HTTP PATCH method at specified path
   * @param path
   * @return instance of {@code RouteBuilder}
   */
  default RouteBuilder patch(String path)
  {
    return route(HttpMethod.PATCH, path);
  }

  /**
   * Configures RouteBuilder for HTTP POST method at specified path
   * @param path
   * @return instance of {@code RouteBuilder}
   */
  default RouteBuilder post(String path)
  {
    return route(HttpMethod.POST, path);
  }

  /**
   * Configures RouteBuilder for HTTP PUT method at specified path
   * @param path
   * @return instance of {@code RouteBuilder}
   */
  default RouteBuilder put(String path)
  {
    return route(HttpMethod.PUT, path);
  }

  /**
   * Configures RouteBuilder for HTTP TRACE method for specified path
   * @param path
   * @return instance of {@code RouteBuilder}
   */
  default RouteBuilder trace(String path)
  {
    return route(HttpMethod.TRACE, path);
  }

  /**
   * Configures generic RouteBuilder for a specified path
   * @param path
   * @return instance of {@code RouteBuilder}
   */
  default RouteBuilder path(String path)
  {
    return route(HttpMethod.UNKNOWN, path);
  }

  /**
   * Configures WebSocketBuilder for a specified path
   * @param path
   * @return instance of {@code RouteBuilder}
   */
  RouteBuilder websocket(String path);

  /**
   * Adds an instance of a ViewRender to the list of available view renders.
   * A view render is selected based on <T> type of object
   * supplied with {@code RequestWeb#ok()}
   *
   * @param view
   * @param 
   * @return instance of {@code WebBuilder}
   */
   WebBuilder view(ViewRender view);

  /**
   * Adds a ViewRender to the list of available view renders.
   * A view render is selected based on <T> type of object
   * supplied with {@code RequestWeb#ok()}
   * @param view
   * @param 
   * @return instance of {@code WebBuilder}
   */
   WebBuilder view(Class> view);

  default WebBuilder push()
  {
    throw new UnsupportedOperationException();
  }

  /**
   * Returns an instance of Injector used with this instance of WebBuilder.
   *
   * @return
   */
  Injector injector();

  /**
   * Configures a ServiceBuilder for a specified service class
   *
   * @param serviceClass
   * @param 
   * @return
   */
   ServiceBuilder service(Class serviceClass);

  /**
   * Configures a ServiceBuilder for a specified service class and a service
   * instance supplier
   *
   * @param serviceClass
   * @param supplier
   * @param 
   * @return
   */
   ServiceBuilder service(Class serviceClass,
                             Supplier supplier);

  /**
   * Configures a ServiceBuilder for a specified Key (used in binding) and a service
   * class.
   *
   * @param key
   * @param apiClass
   * @return
   */
  ServiceBuilder service(Key key, Class apiClass);

  /**
   * Obtains a converter for converting objects from a source to target.
   *
   * @param source
   * @param target
   * @param 
   * @param 
   * @return
   *
   * @see Convert
   */
  default  Convert converter(Class source, Class target)
  {
    return injector().converter().converter(source, target);
  }
  
  public interface RouteBuilder
  {
    RouteBuilder ifAnnotation(Method method);
    
    RouteBuilder before(Class typeBefore);
     RouteBuilder before(X ann, InjectionPoint ip);
    
    OutBuilder to(ServiceWeb service);
    OutBuilder to(Class service);
    
    RouteBuilder after(Class typeAfter);
     RouteBuilder after(X ann, InjectionPoint ip);
    
  }
  
  public interface OutBuilder
  {
     OutBuilder view(ViewRender view);
  }
}