/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* Copyright (c) 2013, MPL CodeInside http://codeinside.ru
*/
package ru.codeinside.gws.core;
import org.w3c.dom.Document;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import ru.codeinside.gws.api.ServiceDefinition;
import ru.codeinside.gws.wsdl.ServiceDefinitionParser;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import javax.xml.transform.dom.DOMSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class Support {
final public static class PortDefinition {
public QName service;
public QName port;
public ServiceDefinition.Port portDef;
}
public static PortDefinition getServicePort(String resource) {
final URL wsdl = R.getRequiredURL(resource);
final ServiceDefinitionParser definitionParser = new ServiceDefinitionParser();
final ServiceDefinition def = definitionParser.parseServiceDefinition(wsdl);
return Support.getPortDefinition(def, wsdl);
}
public static PortDefinition getPortDefinition(ServiceDefinition wsdl, URL wsdlUrl) {
if (wsdl.services == null) {
throw new IllegalArgumentException("Invalid wsdl " + wsdlUrl);
}
if (!wsdl.namespaces.contains(Xml.REV120315)) {
throw new IllegalArgumentException("WSDL " + wsdlUrl + " not use " + Xml.REV120315);
}
final QName serviceName;
final ServiceDefinition.Service serviceDef;
final QName portName;
final ServiceDefinition.Port port;
{
if (wsdl.services.size() != 1) {
throw new IllegalArgumentException("Ambiguous service in " + wsdlUrl);
}
final Map.Entry<QName, ServiceDefinition.Service> entry = first(wsdl.services);
serviceDef = entry.getValue();
serviceName = entry.getKey();
}
{
if (serviceDef.ports.size() != 1) {
throw new IllegalArgumentException("Ambiguous port for service " + serviceName);
}
final Map.Entry<QName, ServiceDefinition.Port> entry = first(serviceDef.ports);
portName = entry.getKey();
port = entry.getValue();
}
final PortDefinition portDefinition = new PortDefinition();
portDefinition.service = serviceName;
portDefinition.port = portName;
portDefinition.portDef = port;
return portDefinition;
}
static <K, V> Map.Entry<K, V> first(final Map<K, V> map) {
return map.entrySet().iterator().next();
}
private List<String> validateBySchema(final Document document, URL schemaUrl) {
final long startMs = System.currentTimeMillis();
final List<String> errors = new ArrayList<String>();
try {
final SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
final Schema schema = schemaFactory.newSchema(schemaUrl);
final Validator validator = schema.newValidator();
validator.setErrorHandler(new ErrorHandler() {
@Override
public void warning(SAXParseException exception) throws SAXException {
}
@Override
public void error(SAXParseException exception) throws SAXException {
errors.add(exception.getMessage());
}
@Override
public void fatalError(SAXParseException exception) throws SAXException {
errors.add(exception.getMessage());
}
});
validator.validate(new DOMSource(document));
} catch (SAXException e) {
errors.add(e.getMessage());
} catch (IOException e) {
errors.add(e.getMessage());
} finally {
System.out.println("VALIDATE: " + (System.currentTimeMillis() - startMs));
}
return errors;
}
}