/**
 * 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.oozie.server;

import com.google.inject.Inject;
import org.apache.oozie.servlet.CallbackServlet;
import org.apache.oozie.servlet.ErrorServlet;
import org.apache.oozie.servlet.SLAServlet;
import org.apache.oozie.servlet.V0AdminServlet;
import org.apache.oozie.servlet.V0JobServlet;
import org.apache.oozie.servlet.V0JobsServlet;
import org.apache.oozie.servlet.V1AdminServlet;
import org.apache.oozie.servlet.V1JobServlet;
import org.apache.oozie.servlet.V1JobsServlet;
import org.apache.oozie.servlet.V2AdminServlet;
import org.apache.oozie.servlet.V2JobServlet;
import org.apache.oozie.servlet.V2SLAServlet;
import org.apache.oozie.servlet.V2ValidateServlet;
import org.apache.oozie.servlet.VersionServlet;
import org.eclipse.jetty.servlet.ServletHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.servlet.ServletMapping;
import org.eclipse.jetty.webapp.WebAppContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.Servlet;
import java.util.Objects;

public class ServletMapper {
    private final WebAppContext servletContextHandler;
    private static final Logger LOG = LoggerFactory.getLogger(ServletMapper.class);

    @Inject
    public ServletMapper(final WebAppContext servletContextHandler) {
        this.servletContextHandler = Objects.requireNonNull(servletContextHandler, "ServletContextHandler is null");
    }
    /**
     * Maps Oozie servlets to path specs. Make sure it is in sync with FilterMapper when making changes.
     * */
    void mapOozieServlets() {
        mapServlet(VersionServlet.class, "/versions");
        mapServlet(V0AdminServlet.class, "/v0/admin/*");
        mapServlet(V1AdminServlet.class, "/v1/admin/*");
        mapServlet(V2AdminServlet.class, "/v2/admin/*");

        mapServlet(CallbackServlet.class, "/callback/*");

        ServletHandler servletHandler = servletContextHandler.getServletHandler();
        String v0JobsServletName = V0JobsServlet.class.getSimpleName();
        servletHandler.addServlet(new ServletHolder(v0JobsServletName, new V0JobsServlet()));
        ServletMapping jobServletMappingV0 = new ServletMapping();
        jobServletMappingV0.setPathSpec("/v0/jobs");
        jobServletMappingV0.setServletName(v0JobsServletName);

        String v1JobsServletName = V1JobsServlet.class.getSimpleName();
        servletHandler.addServlet(new ServletHolder(v1JobsServletName, new V1JobsServlet()));
        ServletMapping jobServletMappingV1 = new ServletMapping();
        jobServletMappingV1.setPathSpec("/v1/jobs");
        jobServletMappingV1.setServletName(v1JobsServletName);

        // v1 and v2 version for the jobs API are same.
        ServletMapping jobServletMappingV2 = new ServletMapping();
        jobServletMappingV2.setPathSpec("/v2/jobs");
        jobServletMappingV2.setServletName(v1JobsServletName);

        servletHandler.addServletMapping(jobServletMappingV0);
        servletHandler.addServletMapping(jobServletMappingV1);
        servletHandler.addServletMapping(jobServletMappingV2);

        mapServlet(V0JobServlet.class, "/v0/job/*");
        mapServlet(V1JobServlet.class, "/v1/job/*");
        mapServlet(V2JobServlet.class, "/v2/job/*");
        mapServlet(SLAServlet.class, "/v1/sla/*");
        mapServlet(V2SLAServlet.class, "/v2/sla/*");
        mapServlet(V2ValidateServlet.class, "/v2/validate/*");
        mapServlet(ErrorServlet.class, "/error/*");
    }

    private void mapServlet(final Class<? extends Servlet> servletClass, final String servletPath) {
        try {
            servletContextHandler.addServlet(new ServletHolder(servletClass.newInstance()), servletPath);
        } catch (final InstantiationException | IllegalAccessException e) {
            LOG.error(e.getMessage(), e);
        }
    }
}
