/* * 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; import java.util.HashMap; import java.util.Map; import org.apache.log4j.Logger; import org.json.JSONException; import org.json.JSONObject; import com.mockey.model.Service; import com.mockey.model.Url; import com.mockey.storage.IMockeyStorage; import com.mockey.storage.StorageRegistry; /** * Validator for contents of a MockServiceBean definition. * * @author chad.lafontaine * */ public class ServiceValidator { /** Basic logger */ private static Logger logger = Logger.getLogger(ServiceValidator.class); private static IMockeyStorage store = StorageRegistry.MockeyStorage; /** * Return a mapping of input field names and error messages. If the mock * service state is valid, then an empty Map is returned. * * @param ms * @return */ public static Map<String, String> validate(Service ms) { Map<String, String> errorMap = new HashMap<String, String>(); if ((ms.getServiceName() == null) || (ms.getServiceName().trim().length() < 1) || (ms.getServiceName().trim().length() > 250)) { errorMap.put("serviceName", "Service name must not be empty or greater than 250 chars."); } // Validate JSON format. if(ms.getRequestInspectorJsonRules() !=null && ms.getRequestInspectorJsonRules().trim().length()>0) try { new JSONObject(ms.getRequestInspectorJsonRules()); } catch (JSONException e1) { errorMap.put("requestInspectorJsonRules", "Invalid JSON format. "); logger.debug("Invalid JSON format for rules " + e1.getMessage()); } // This validation is important // for bad URL checking, but // prevents people from creating // a simple Mockey mock up. // E.g. http://localhost:8080/Mockey/service/dummy // if (ms.getUrl() != null && ms.getUrl().trim().length() > 0) { // URL aURL; // try { // aURL = new URL(ms.getUrl()); // // Let's make sure user doesn't have any REF or QUERY arguments // // Why? Because Mockey tries to find match incoming request // // to service Real and Mock URLs, and when people append // // random parameters on the end of similar URL, it gets // // hard to map URL X to URL X. // if (aURL.getQuery() != null || aURL.getRef() != null) { // errorMap // .put("urlMsg", // "It looks like you have a well form URL but you can't have any QUERY or REFERENCE arguments."); // return errorMap; // } // // } catch (MalformedURLException e) { // // errorMap.put("urlMsg", "It looks like you have a malformed URL: " + e.getMessage()); // // return errorMap; // } // } // Make sure there doesn't exist a service // w/ the same non-empty real URL. try { for (Service testService : store.getServices()) { Url firstMatch = testService.getFirstMatchingRealServiceUrl(ms); if (firstMatch != null && !testService.getId().equals(ms.getId())) { errorMap.put("serviceUrlMsg", "One of your Real service URL entries is already managed by the '" + testService.getServiceName() + "' service. Please choose another real URL pattern. "); errorMap.put("serviceUrl", firstMatch.getFullUrl()); break; } else if (testService.getUrl() != null && ms.getUrl() != null) { if (testService.getUrl().trim().equalsIgnoreCase(ms.getUrl().trim()) && !testService.getId().equals(ms.getId())) { errorMap.put("urlMsg", "Your Mock service URL entry is already used by the '" + testService.getServiceName() + "' service. Please choose another mock URL pattern. "); errorMap.put("url", ms.getUrl().trim()); break; } } } } catch (Exception e) { logger.error("Unable to verify if there are duplicate service URLs", e); } return errorMap; } }