com.mockey.ui.ServiceSetupServlet.java Source code

Java tutorial

Introduction

Here is the source code for com.mockey.ui.ServiceSetupServlet.java

Source

/*
 * This file is part of Mockey, a tool for testing application 
 * interactions over HTTP, with a focus on testing web services, 
 * specifically web applications that consume XML, JSON, and HTML.
 *  
 * Copyright (C) 2009-2010  Authors:
 * 
 * chad.lafontaine (chad.lafontaine AT gmail DOT com)
 * neil.cronin (neil AT rackle DOT com) 
 * lorin.kobashigawa (lkb AT kgawa DOT com)
 * rob.meyer (rob AT bigdis DOT com)
 * 
 * This program 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.
 * 
 * This program 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.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 *
 */
package com.mockey.ui;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

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

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Logger;

import com.mockey.ServiceValidator;
import com.mockey.model.Service;
import com.mockey.model.Url;
import com.mockey.plugin.IRequestInspector;
import com.mockey.plugin.PluginStore;
import com.mockey.storage.IMockeyStorage;
import com.mockey.storage.StorageRegistry;

public class ServiceSetupServlet extends HttpServlet {
    private Log log = LogFactory.getLog(ServiceSetupServlet.class);

    private static final long serialVersionUID = 5503460488900643184L;
    private static IMockeyStorage store = StorageRegistry.MockeyStorage;
    private static final Boolean TRANSIENT_STATE = new Boolean(true);
    private static final SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");
    private static Logger logger = Logger.getLogger(ServiceSetupServlet.class);

    /**
     * 
     */
    public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        if (req.getParameter("all") != null && req.getParameter("responseType") != null) {
            List<Service> services = store.getServices();
            // #1. Get a handle of the original read-only-mode (transient?)
            Boolean origReadOnlyMode = store.getReadOnlyMode();
            try {
                // #2. Put the store in TRANSIENT STATE (memory only)
                // why? To prevent repeating file writes to the file system
                store.setReadOnlyMode(TRANSIENT_STATE);
                int serviceResponseType = Integer.parseInt(req.getParameter("responseType"));
                for (Iterator<Service> iterator = services.iterator(); iterator.hasNext();) {
                    Service service = iterator.next();

                    service.setServiceResponseType(serviceResponseType);
                    store.saveOrUpdateService(service);
                }
            } catch (Exception e) {
                log.error("Unable to update service(s", e);
            }
            // #3 Return store back to original setting.
            store.setReadOnlyMode(origReadOnlyMode);
            resp.setContentType("application/json");
            PrintWriter out = resp.getWriter();
            Map<String, String> successMessage = new HashMap<String, String>();
            successMessage.put("success", "updated");
            String resultingJSON = Util.getJSON(successMessage);
            out.println(resultingJSON);
            out.flush();
            out.close();
            return;
        }
        Long serviceId = null;
        try {
            serviceId = new Long(req.getParameter("serviceId"));
        } catch (Exception e) {
            // Do nothing
        }

        if (req.getParameter("deleteService") != null && serviceId != null) {
            Service service = store.getServiceById(serviceId);
            store.deleteService(service);
            store.deleteFulfilledClientRequestsForService(serviceId);

            Util.saveSuccessMessage("Service '" + service.getServiceName() + "' was deleted.", req);

            // Check to see if any plans need an update.
            String errorMessage = null;
            if (service.isReferencedInAServicePlan()) {
                errorMessage = "Warning: the deleted service is referenced in service plans.";
            }

            if (errorMessage != null) {
                Util.saveErrorMessage(errorMessage, req);
            }
            String contextRoot = req.getContextPath();
            resp.sendRedirect(Url.getContextAwarePath("home", contextRoot));
            return;
        }

        super.service(req, resp);
    }

    /**
     * 
     * 
     * @param req
     *            basic request
     * @param resp
     *            basic resp
     * @throws ServletException
     *             basic
     * @throws IOException
     *             basic
     */
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Long serviceId = null;
        try {
            serviceId = new Long(req.getParameter("serviceId"));
        } catch (Exception e) {
            // Do nothing
        }
        Service service = null;

        if (serviceId != null) {
            service = store.getServiceById(serviceId);
        }
        if (service == null) {
            service = new Service();
        }

        req.setAttribute("mockservice", service);

        req.setAttribute("requestInspectorList", PluginStore.getInstance().getRequestInspectorImplClassList());
        RequestDispatcher dispatch = req.getRequestDispatcher("/service_setup.jsp");
        dispatch.forward(req, resp);
    }

    /**
     * 
     * 
     * @param req
     *            basic request
     * @param resp
     *            basic resp
     * @throws ServletException
     *             basic
     * @throws IOException
     *             basic
     */
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String[] realSrvUrl = req.getParameterValues("realServiceUrl[]");

        Service service = new Service();

        Long serviceId = null;

        try {
            serviceId = new Long(req.getParameter("serviceId"));
            service = store.getServiceById(serviceId);
        } catch (Exception e) {
            // Do nothing
        }
        if (service == null) {
            service = new Service();
        }
        // NEW REAL URL LIST
        // 1. Overwrite list of predefined URLs
        // 2. Ensure non-empty trim String for new Url objects.
        if (realSrvUrl != null) {
            List<Url> newUrlList = new ArrayList<Url>();
            for (int i = 0; i < realSrvUrl.length; i++) {
                String url = realSrvUrl[i];
                if (url.trim().length() > 0) {

                    newUrlList.add(new Url(realSrvUrl[i].trim()));
                }

            }

            for (Url urlItem : newUrlList) {
                service.saveOrUpdateRealServiceUrl(urlItem);
            }
        }

        // UPDATE HANGTIME - optional
        try {
            service.setHangTime(Integer.parseInt(req.getParameter("hangTime")));

        } catch (Exception e) {
            // DO NOTHING
        }

        // NAME - optional
        if (req.getParameter("serviceName") != null) {
            service.setServiceName(req.getParameter("serviceName"));
        }

        // TAG - optional
        if (req.getParameter("tag") != null) {
            service.setTag(req.getParameter("tag"));
        }

        // Last visist
        if (req.getParameter("lastVisit") != null) {
            try {
                String lastvisit = req.getParameter("lastVisit");
                if (lastvisit.trim().length() > 0 && !"mm/dd/yyyy".equals(lastvisit.trim().toLowerCase())) {
                    Date f = formatter.parse(lastvisit);
                    service.setLastVisit(f.getTime());
                } else {
                    service.setLastVisit(null);
                }
            } catch (Exception e) {

            }

        }
        String classNameForRequestInspector = req.getParameter("requestInspectorName");
        if (classNameForRequestInspector != null && classNameForRequestInspector.trim().length() > 0) {
            /**
             * OPTIONAL See if we can create an instance of a request inspector.
             * If yes, then set the service to the name.
             */
            try {
                Class<?> clazz = Class.forName(classNameForRequestInspector);
                if (!clazz.isInterface() && IRequestInspector.class.isAssignableFrom(clazz)) {
                    service.setRequestInspectorName(classNameForRequestInspector);
                } else {
                    service.setRequestInspectorName("");
                }

            } catch (ClassNotFoundException t) {
                logger.error("Service setup: unable to find class '" + classNameForRequestInspector + "'", t);
            }

        }

        // DESCRIPTION - optional
        if (req.getParameter("description") != null) {
            service.setDescription(req.getParameter("description"));
        }

        // MOCK URL - optional
        if (req.getParameter("url") != null) {
            service.setUrl(req.getParameter("url"));
        }

        Map<String, String> errorMap = ServiceValidator.validate(service);

        if ((errorMap != null) && (errorMap.size() == 0)) {
            // no errors, so create service.

            Util.saveSuccessMessage("Service updated.", req);
            Service updatedService = store.saveOrUpdateService(service);

            String redirectUrl = Url.getContextAwarePath("/setup?serviceId=" + updatedService.getId(),
                    req.getContextPath());
            resp.setContentType("application/json");
            PrintWriter out = resp.getWriter();
            String resultingJSON = "{ \"result\": { \"redirect\": \"" + redirectUrl + "\"}}";
            out.println(resultingJSON);
            out.flush();
            out.close();
            return;

        } else {
            resp.setContentType("application/json");
            PrintWriter out = resp.getWriter();
            String resultingJSON = Util.getJSON(errorMap);
            out.println(resultingJSON);

            out.flush();
            out.close();

        }
        return;
        // AJAX thing. Return nothing at this time.
    }
}