/*
 * 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.slider.server.appmaster.web;

import com.google.common.base.Preconditions;
import com.sun.jersey.api.container.filter.GZIPContentEncodingFilter;
import com.sun.jersey.api.core.ResourceConfig;
import com.sun.jersey.guice.spi.container.servlet.GuiceContainer;
import com.sun.jersey.spi.container.servlet.ServletContainer;
import org.apache.hadoop.registry.client.api.RegistryOperations;
import org.apache.hadoop.yarn.webapp.Dispatcher;
import org.apache.hadoop.yarn.webapp.GenericExceptionHandler;
import org.apache.hadoop.yarn.webapp.WebApp;
import org.apache.slider.server.appmaster.web.rest.AMWadlGeneratorConfig;
import org.apache.slider.server.appmaster.web.rest.AMWebServices;
import org.apache.slider.server.appmaster.web.rest.SliderJacksonJaxbJsonProvider;

import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * 
 */
public class SliderAMWebApp extends WebApp {
  public static final String BASE_PATH = "slideram";
  public static final String CONTAINER_STATS = "/stats";
  public static final String CLUSTER_SPEC = "/spec";

  private final RegistryOperations registry;

  public SliderAMWebApp(RegistryOperations registry) {
    Preconditions.checkArgument(registry != null, "registry null");
    this.registry = registry;
  }

  @Override
  public void setup() {
    Logger.getLogger("com.sun.jersey").setLevel(Level.FINEST);
    // Make one of these to ensure that the jax-b annotations
    // are properly picked up.
    bind(SliderJacksonJaxbJsonProvider.class);
    
    // Get exceptions printed to the screen
    bind(GenericExceptionHandler.class);
    // bind the REST interface
    bind(AMWebServices.class);
    //bind(AMAgentWebServices.class);
    route("/", SliderAMController.class);
    route(CONTAINER_STATS, SliderAMController.class, "containerStats");
    route(CLUSTER_SPEC, SliderAMController.class, "specification");
  }

  @Override
  public void configureServlets() {
    setup();

    serve("/", "/__stop").with(Dispatcher.class);

    for (String path : this.getServePathSpecs()) {
      serve(path).with(Dispatcher.class);
    }

    String regex = "(?!/ws)";
    serveRegex(regex).with(SliderDefaultWrapperServlet.class);

    Map<String, String> params = new HashMap<String, String>();
    params.put(ResourceConfig.FEATURE_IMPLICIT_VIEWABLES, "true");
    params.put(ServletContainer.FEATURE_FILTER_FORWARD_ON_404, "true");
    params.put(ResourceConfig.FEATURE_XMLROOTELEMENT_PROCESSING, "true");
    params.put(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS, GZIPContentEncodingFilter.class.getName());
    params.put(ResourceConfig.PROPERTY_CONTAINER_RESPONSE_FILTERS, GZIPContentEncodingFilter.class.getName());
    //params.put("com.sun.jersey.spi.container.ContainerRequestFilters", "com.sun.jersey.api.container.filter.LoggingFilter");
    //params.put("com.sun.jersey.spi.container.ContainerResponseFilters", "com.sun.jersey.api.container.filter.LoggingFilter");
    //params.put("com.sun.jersey.config.feature.Trace", "true");
    params.put("com.sun.jersey.config.property.WadlGeneratorConfig",
        AMWadlGeneratorConfig.CLASSNAME);
    filter("/*").through(GuiceContainer.class, params);
  }
}
