/*
 * 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.ftpserver.example.springwar;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.ftpserver.FtpServer;

/*
 * @author <a href="http://mina.apache.org">Apache MINA Project</a>
 */
public class FtpServerServlet extends HttpServlet {

    private static final long serialVersionUID = 5539642787624981705L;

    /**
     * {@inheritDoc}
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        FtpServer server = (FtpServer) getServletContext().
            getAttribute(FtpServerListener.FTPSERVER_CONTEXT_NAME);

        PrintWriter wr = resp.getWriter();

        wr.print("<html>");
        wr.print("<head>");
        wr.print("<title>FtpServer status servlet</title>");
        wr.print("</head>");
        wr.print("<body>");
        wr.print("<form method='post'>");


        if (server.isStopped()) {
            wr.print("<p>FtpServer is stopped.</p>");
        } else {
            if (server.isSuspended()) {
                wr.print("<p>FtpServer is suspended.</p>");
                wr.print("<p><input type='submit' name='resume' value='Resume'></p>");
                wr.print("<p><input type='submit' name='stop' value='Stop'></p>");
            } else {
                wr.print("<p>FtpServer is running.</p>");
                wr.print("<p><input type='submit' name='suspend' value='Suspend'></p>");
                wr.print("<p><input type='submit' name='stop' value='Stop'></p>");
            }
        }

        wr.print("</form>");
        wr.print("</body>");
        wr.print("</html>");
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        FtpServer server = (FtpServer) getServletContext().
            getAttribute(FtpServerListener.FTPSERVER_CONTEXT_NAME);

        if (req.getParameter("stop") != null) {
            server.stop();
        } else if (req.getParameter("resume") != null) {
            server.resume();
        } else if (req.getParameter("suspend") != null) {
            server.suspend();
        }

        resp.sendRedirect("/");
    }
}

