/*
* 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.wadl.inference.schema;
import com.eviware.soapui.impl.wadl.inference.ConflictHandler;
import com.eviware.soapui.inferredSchema.SchemaConfig;
import com.eviware.soapui.inferredSchema.SchemaSetConfig;
import org.apache.xmlbeans.XmlCursor;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject;
import javax.xml.namespace.QName;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
/**
* Represents a set of namespaces with inferred schemas.
*
* @author Dain Nilsson
*/
public class SchemaSystem {
Map<String, Schema> schemas;
/**
* Constructs a new SchemaSystem object.
*/
public SchemaSystem() {
schemas = new LinkedHashMap<String, Schema>();
}
/**
* Constructs a SchemaSystem object using previously saved data.
*
* @param xml The XmlObject to which data has previously been saved.
*/
public SchemaSystem(SchemaSetConfig xml) {
schemas = new LinkedHashMap<String, Schema>();
for (SchemaConfig item : xml.getSchemaList()) {
schemas.put(item.getNamespace(), new Schema(item, this));
}
}
/**
* Saves the SchemaSystem to an XmlObject.
*
* @param xml A blank XmlObject to save to.
*/
public void save(SchemaSetConfig xml) {
for (Schema item : schemas.values()) {
item.save(xml.addNewSchema());
}
}
/**
* Create a blank new Schema under this SchemaSystem for a given namespace.
*
* @param namespace The namespace for which to create a Schema.
* @return The newly created Schema.
*/
public Schema newSchema(String namespace) {
Schema schema = new Schema(namespace, this);
schemas.put(namespace, schema);
return schema;
}
/**
* Returns the matching Schema for the given namespace.
*
* @param namespace A namespace that already exists within the SchemaSystem.
* @return Returns the Schema corresponding to the given namespace if one
* exists. Otherwise returns null.
*/
public Schema getSchemaForNamespace(String namespace) {
return schemas.get(namespace);
}
/**
* Get an existing Type by its QName.
*
* @param qname A QName containing the namespace URI of the schema in which the
* Type exists, and also the name of the type.
* @return Returns the Type, if one is found. Otherwise returns null.
*/
public Type getType(QName qname) {
return getSchemaForNamespace(qname.getNamespaceURI()).getType(qname.getLocalPart());
}
/**
* Validate an XmlObject against the contained inferred schemas. Upon
* validation errors, the ConflictHandler is used to determine if a schema
* should be adjusted, or if validation should fail.
*
* @param xmlo An XmlObject containing the document to be validated.
* @param handler A ConflictHandler to use on validation errors.
* @throws XmlException On unresolvable validation error.
*/
public void validate(XmlObject xmlo, ConflictHandler handler) throws XmlException {
XmlCursor cursor = xmlo.newCursor();
cursor.toFirstChild();
Schema s = getSchemaForNamespace(cursor.getName().getNamespaceURI());
boolean created = false;
if (s == null) {
s = newSchema(cursor.getName().getNamespaceURI());
created = true;
}
Context context = new Context(this, handler, cursor);
try {
s.validate(context);
} catch (XmlException e) {
if (created) {
schemas.remove(s.getNamespace());
}
throw e;
}
}
/**
* Get a list of contained namespaces.
*
* @return Returns the contained namespaces, as a Set.
*/
public Set<String> getNamespaces() {
return schemas.keySet();
}
public void deleteNamespace(String ns) {
schemas.remove(ns);
}
}