/* * SoapUI, Copyright (C) 2004-2016 SmartBear Software * * Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent * versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://ec.europa.eu/idabc/eupl * * Unless required by applicable law or agreed to in writing, software distributed under the Licence is * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the Licence for the specific language governing permissions and limitations * under the Licence. */ package com.eviware.soapui.impl.rest.panels.request.inspectors.schema; import com.eviware.soapui.impl.rest.RestService; import com.eviware.soapui.impl.wadl.inference.InferredSchema; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; /** * @author Dain.Nilsson */ public class InferredSchemaManager { private static Map<RestService, InferredSchema> schemas; private static Map<RestService, PropertyChangeSupport> propertyChangeSupports; private static Map<String, String> filenames; private static Map<String, String> rFilenames; static { schemas = new HashMap<RestService, InferredSchema>(); propertyChangeSupports = new HashMap<RestService, PropertyChangeSupport>(); filenames = new HashMap<String, String>(); rFilenames = new HashMap<String, String>(); } public static String filenameForNamespace(String namespace) { if (!filenames.containsKey(namespace)) { filenames.put(namespace, generateFilename(namespace)); rFilenames.put(filenames.get(namespace), namespace); } return filenames.get(namespace); } public static String namespaceForFilename(String filename) { if (!rFilenames.containsKey(filename)) { for (InferredSchema is : schemas.values()) { for (String ns : is.getNamespaces()) { if (filenameForNamespace(ns).equals(filename)) { return ns; } } } } else { return rFilenames.get(filename); } return null; } private static String generateFilename(String namespace) { if (namespace.equals("")) { return "unnamed.xsd"; } return namespace.replaceAll("[^a-zA-Z0-9]", "") + ".xsd"; } public static InferredSchema getInferredSchema(RestService service) { if (!schemas.containsKey(service)) { try { schemas.put(service, InferredSchema.Factory.parse(new ByteArrayInputStream(service.getInferredSchema().getBytes()))); } catch (Exception e) { schemas.put(service, InferredSchema.Factory.newInstance()); } propertyChangeSupports.put(service, new PropertyChangeSupport(schemas.get(service))); } return schemas.get(service); } public static void save(RestService service) { if (schemas.containsKey(service)) { OutputStream out = new ByteArrayOutputStream(); String old = service.getInferredSchema(); try { schemas.get(service).save(out); service.setInferredSchema(out.toString()); } catch (IOException e) { e.printStackTrace(); } propertyChangeSupports.get(service).firePropertyChange("inferredSchema", old, out.toString()); } } public static void release(RestService service) { schemas.remove(service); propertyChangeSupports.remove(service); } public static void delete(RestService service) { service.setInferredSchema(null); if (schemas.containsKey(service)) { schemas.remove(service); } propertyChangeSupports.get(service).firePropertyChange("inferredSchema", service.getInferredSchema(), null); } public static void addPropertyChangeListener(RestService service, PropertyChangeListener listener) { if (getInferredSchema(service) != null) { propertyChangeSupports.get(service).addPropertyChangeListener("inferredSchema", listener); } } public static void removePropertyChangeListener(RestService service, PropertyChangeListener listener) { propertyChangeSupports.get(service).removePropertyChangeListener("inferredSchema", listener); } public static void deleteNamespace(RestService service, String ns) { getInferredSchema(service).deleteNamespace(ns); save(service); } }