package com.github.rmannibucau.cdi.configuration.xml.handlers;
import com.github.rmannibucau.cdi.configuration.ConfigurationException;
import com.github.rmannibucau.cdi.configuration.loader.ClassLoaders;
import com.github.rmannibucau.cdi.configuration.model.ConfigBean;
import org.xml.sax.Attributes;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.URL;
public class WebServiceHandler extends NamespaceHandlerSupport {
@Override
public String supportedUri() {
return "webservice";
}
@Override
public ConfigBean createBean(final String localName, final Attributes attributes) {
final String interfaceName = attributes.getValue("interface");
final ConfigBean bean = new ConfigBean(localName, interfaceName, attributes.getValue("scope"), attributes.getValue("qualifier"), WebServiceFactory.class.getName(), "create", null, null, false);
bean.getDirectAttributes().put("interfaceName", interfaceName);
bean.getDirectAttributes().put("serviceQName", attributes.getValue("service-qname"));
bean.getDirectAttributes().put("portQName", attributes.getValue("port-qname"));
bean.getDirectAttributes().put("url", attributes.getValue("wsdl"));
return bean;
}
public static class WebServiceFactory<T> {
private String interfaceName;
private QName serviceQName;
private QName portQName;
private URL url;
public T create() {
final Service service = Service.create(url, serviceQName);
final Class<T> itf;
try {
itf = (Class<T>) ClassLoaders.tccl().loadClass(interfaceName);
} catch (ClassNotFoundException e) {
throw new ConfigurationException(e);
}
if (portQName != null) {
return service.getPort(portQName, itf);
}
return service.getPort(itf);
}
}
}