/*
 * Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com)
 *
 * Licensed 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.traccar.http;

import org.traccar.database.DataManager;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;

public class MainServlet extends HttpServlet {

    private static final String USER_ID = "userId";

    private final DataManager dataManager;

    public MainServlet(DataManager dataManager) {
        this.dataManager = dataManager;
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String command = req.getPathInfo();

        if (command.equals("/login")) {
            login(req, resp);
        } else if (command.equals("/logout")) {
            logout(req, resp);
        } else {
            resp.sendError(HttpServletResponse.SC_BAD_REQUEST);
        }
    }

    private void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        try {
            req.getSession().setAttribute(USER_ID,
                    dataManager.login(req.getParameter("name"), req.getParameter("password")));
            resp.getWriter().println("{ success: true }");
        } catch (SQLException e) {
            throw new ServletException(e);
        }
    }

    private void logout(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        req.getSession().removeAttribute(USER_ID);
        resp.getWriter().println("{ success: true }");
    }

}

@@ -656,43 +656,94 @@
 ort 
-org.traccar.database.DataManager
+java.io.IOException;%0Aimport java.sql.SQLException;%0Aimport javax.servlet.AsyncContext
 ;%0A
-%0A
 impo
@@ -769,32 +769,70 @@
 rvletException;%0A
+import javax.servlet.ServletResponse;%0A
 import javax.ser
@@ -958,57 +958,71 @@
 ort 
-java.io.IOException;%0Aimport java.sql.SQLException
+org.traccar.database.DataManager;%0Aimport org.traccar.helper.Log
 ;%0A%0Ap
@@ -1445,24 +1445,108 @@
 %0A        if 
+(command.equals(%22/async%22)) %7B%0A            async(req.startAsync());%0A        %7D else if 
 (command.equ
@@ -1752,16 +1752,16 @@
 QUEST);%0A
-
         
@@ -1759,32 +1759,892 @@
 %0A        %7D%0A    %7D
+%0A    %0A    private void async(final AsyncContext context) %7B%0A        context.start(new Runnable() %7B%0A            @Override%0A            public void run() %7B%0A                try %7B%0A                    Thread.sleep(5000); // DELME%0A%0A                    ServletResponse response = context.getResponse();%0A                    response.getWriter().println(%22%7B success: true, data: %5B%22+%0A                            %22%7B id: 1, device_id: 1, time: %5C%222012-04-23T18:25:43.511Z%5C%22, latitude: 60, longitude: 30, speed: 0, course: 0 %7D,%22 +%0A                            %22%7B id: 2, device_id: 2, time: %5C%222012-04-23T19:25:43.511Z%5C%22, latitude: 61, longitude: 31, speed: 0, course: 0 %7D%22 +%0A                            %22%5D %7D%22);%0A                    context.complete();%0A%0A                %7D catch (Exception ex) %7B%0A                    Log.warning(ex);%0A                %7D%0A            %7D%0A        %7D);%0A    %7D
 %0A%0A    private vo

Add dummy asyc Servlet