/*
* 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.p.router.web;
import com.sun.xml.ws.api.BindingID;
import com.sun.xml.ws.api.WSBinding;
import com.sun.xml.ws.api.server.InstanceResolver;
import com.sun.xml.ws.api.server.SDDocumentSource;
import com.sun.xml.ws.api.server.WSEndpoint;
import com.sun.xml.ws.binding.WebServiceFeatureList;
import com.sun.xml.ws.developer.SchemaValidationFeature;
import com.sun.xml.ws.transport.http.DeploymentDescriptorParser;
import com.sun.xml.ws.transport.http.servlet.ServletAdapter;
import com.sun.xml.ws.transport.http.servlet.ServletAdapterList;
import ru.codeinside.gws.p.adapter.Adapter;
import ru.codeinside.gws.p.adapter.ProviderEntry;
import javax.servlet.ServletContext;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
final public class ServletAdapterRegistrar {
ServletContext context;
DeploymentDescriptorParser.AdapterFactory<ServletAdapter> servletAdapters;
public void initialize(ServletContext context) {
this.context = context;
servletAdapters = new ServletAdapterList(context);
}
public void createEndpoint(final String name, final ProviderEntry entry) {
synchronized (entry) {
if (entry.servletAdapter != null) {
return;
}
final Adapter adapter = new Adapter(entry);
final WSEndpoint<?> endpoint = WSEndpoint.create(
adapter.getClass(),
false,
InstanceResolver.createSingleton(adapter).createInvoker(),
entry.wsService,
entry.wsPort,
new ServletContainer(context), // один контейнер на сервис
createBinding(adapter.getClass(), false), //TODO: включать валидацию
SDDocumentSource.create(entry.wsdl),
createMetadata(entry),
null,
false,
true
);
//for (SDDocument doc : endpoint.getServiceDefinition()) {
// logger.info(doc.getURL() + " includes " + doc.getImports());
//}
entry.servletAdapter = servletAdapters.createAdapter(name, "/" + name + "/", endpoint);
}
}
private List<SDDocumentSource> createMetadata(ProviderEntry entry) {
final List<SDDocumentSource> metadata = new ArrayList<SDDocumentSource>(entry.wsDef.resources.size());
for (URI uri : entry.wsDef.resources) {
try {
metadata.add(SDDocumentSource.create(new URL(entry.wsdl, uri.toString())));
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
return metadata;
}
private WSBinding createBinding(Class<?> implementorClass, boolean validate) {
final BindingID bindingID = BindingID.parse(implementorClass);
final WebServiceFeatureList features = new WebServiceFeatureList();
if (validate) {
features.add(new SchemaValidationFeature());
}
features.addAll(bindingID.createBuiltinFeatureList());
return bindingID.createBinding(features.toArray());
}
}