blob: 90ecb79e20b443d160fb6d806caaef793ad00924 [file] [log] [blame]
/*
* Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Mike Norman - Oct 30 2008: some re-work of DBWSPackager hierarchy
package org.eclipse.persistence.tools.dbws;
import static org.eclipse.persistence.internal.xr.Util.DBWS_WSDL;
import static org.eclipse.persistence.tools.dbws.DBWSPackager.ArchiveUse.noArchive;
import static org.eclipse.persistence.tools.dbws.Util.DBWS_PROVIDER_CLASS_FILE;
import static org.eclipse.persistence.tools.dbws.Util.DBWS_PROVIDER_SOURCE_FILE;
import static org.eclipse.persistence.tools.dbws.Util.DOT_CLASS;
import static org.eclipse.persistence.tools.dbws.Util.PROVIDER_LISTENER_CLASS_FILE;
import static org.eclipse.persistence.tools.dbws.Util.PROVIDER_LISTENER_SOURCE_FILE;
//javase imports
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
//java eXtension imports
import javax.tools.Diagnostic;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaFileObject;
import org.eclipse.persistence.internal.dbws.ProviderHelper;
//EclipseLink imports
import _dbws.ProviderListener;
/**
* <p>
* <b>INTERNAL:</b> ProviderPackager extends {@link XRPackager}. It is responsible for generating<br>
* the {@code jakarta.servlet.ServletContextListener} and the JAX-WS {@code jakarta.xml.ws.Provider} and saves the generated WSDL
* to ${stageDir}
* <pre>
* ${PACKAGER_ROOT}
* | DBWSProvider.class -- code-generated jakarta.xml.ws.Provider
* | ProviderListener.class -- code-generated jakarta.servlet.ServletContextListener
* </pre>
*
* @author Mike Norman - michael.norman@oracle.com
* @since EclipseLink 1.x
*/
public class ProviderPackager extends XRPackager {
public static final String PROVIDER_NAME = "_dbws.DBWSProvider";
public static final String PROVIDER_LISTENER_SOURCE =
"package _dbws;\n\n" +
"import jakarta.servlet.ServletContext;\n" +
"import jakarta.servlet.ServletContextEvent;\n" +
"import jakarta.servlet.ServletContextListener;\n\n" +
"public class ProviderListener implements ServletContextListener {\n\n" +
" public static ServletContext SC = null;\n\n" +
" public ProviderListener() {\n" +
" super();\n" +
" }\n\n" +
" public void contextInitialized(ServletContextEvent sce) {\n" +
" SC = sce.getServletContext();\n" +
" }\n\n" +
" public void contextDestroyed(ServletContextEvent sce) {\n" +
" // no-op\n" +
" }\n" +
"}\n";
public static final String DBWS_PROVIDER_SOURCE_PREAMBLE_START =
"package _dbws;\n" +
"\n//Java extension libraries\n" +
"import jakarta.annotation.PostConstruct;\n" +
"import jakarta.annotation.PreDestroy;\n" +
"import jakarta.annotation.Resource;\n" +
"import jakarta.servlet.ServletContext;\n" +
"import jakarta.xml.soap.SOAPMessage;\n" +
"import jakarta.xml.ws.BindingType;\n" +
"import jakarta.xml.ws.Provider;\n" +
"import jakarta.xml.ws.ServiceMode;\n" +
"import jakarta.xml.ws.WebServiceContext;\n" +
"import jakarta.xml.ws.WebServiceProvider;\n" +
"import static jakarta.xml.ws.Service.Mode.MESSAGE;\n";
public static final String DBWS_PROVIDER_SOURCE_SOAP11HTTP_MTOM_BINDING =
"import static jakarta.xml.ws.soap.SOAPBinding.SOAP11HTTP_MTOM_BINDING;\n";
public static final String DBWS_PROVIDER_SOURCE_SOAP12HTTP_BINDING =
"import static jakarta.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING;\n";
public static final String DBWS_PROVIDER_SOURCE_SOAP12HTTP_MTOM_BINDING =
"import static jakarta.xml.ws.soap.SOAPBinding.SOAP12HTTP_MTOM_BINDING;\n";
public static final String DBWS_PROVIDER_SOURCE_PREAMBLE_END =
"\n//EclipseLink imports\n" +
"import " + ProviderHelper.class.getName() + ";\n" +
"\n@WebServiceProvider(\n";
public static final String DBWS_PROVIDER_SOURCE_WSDL_LOCATION =
" wsdlLocation = \"WEB-INF/wsdl/eclipselink-dbws.wsdl\",\n";
public static final String DBWS_PROVIDER_SOURCE_SERVICE_NAME =
" serviceName = \"";
public static final String DBWS_PROVIDER_SOURCE_PORT_NAME =
"\",\n portName = \"";
public static final String DBWS_PROVIDER_SOURCE_TARGET_NAMESPACE =
"\",\n targetNamespace = \"";
public static final String DBWS_PROVIDER_SOURCE_SUFFIX =
"\"\n)\n@ServiceMode(MESSAGE)\n";
public static final String DBWS_PROVIDER_SOAP12_BINDING =
"@BindingType(value=SOAP12HTTP_BINDING)\n";
public static final String DBWS_PROVIDER_SOAP11_MTOM_BINDING =
"@BindingType(value=SOAP11HTTP_MTOM_BINDING)\n";
public static final String DBWS_PROVIDER_SOAP12_MTOM_BINDING =
"@BindingType(value=SOAP12HTTP_MTOM_BINDING)\n";
public static final String DBWS_PROVIDER_SOURCE_CLASSDEF =
"public class DBWSProvider extends ProviderHelper implements Provider<SOAPMessage> {\n\n" +
" // Container injects wsContext here\n" +
" @Resource\n" +
" protected WebServiceContext wsContext;\n\n" +
" public DBWSProvider() {\n" +
" super();\n" +
" }\n\n" +
" @PostConstruct\n" +
" public void init() {\n" +
" ClassLoader parentClassLoader = Thread.currentThread().getContextClassLoader();\n" +
" ServletContext sc = ProviderListener.SC;\n" +
" boolean mtomEnabled = false;\n" +
" BindingType thisBindingType = this.getClass().getAnnotation(BindingType.class);\n" +
" if (thisBindingType != null) {\n" +
" if (thisBindingType.value().toLowerCase().contains(\"mtom=true\")) {\n" +
" mtomEnabled = true;\n" +
" }\n" +
" }\n" +
" super.init(parentClassLoader, sc, mtomEnabled);\n" +
" }\n\n" +
" @Override\n" +
" public SOAPMessage invoke(SOAPMessage request) {\n" +
" if (wsContext != null) {\n" +
" setMessageContext(wsContext.getMessageContext());\n" +
" }\n" +
" return super.invoke(request);\n" +
" }\n\n" +
" @Override\n" +
" @PreDestroy\n" +
" public void destroy() {\n" +
" super.destroy();\n" +
" }\n" +
"};\n";
public ProviderPackager() {
this(new WarArchiver(),"provider", noArchive);
}
protected ProviderPackager(Archiver archiver, String packagerLabel, ArchiveUse useJavaArchive) {
super(archiver, packagerLabel, useJavaArchive);
}
@Override
public Archiver buildDefaultArchiver() {
return new WarArchiver(this);
}
@Override
public OutputStream getWSDLStream() throws FileNotFoundException {
return new FileOutputStream(new File(stageDir, DBWS_WSDL));
}
@Override
public OutputStream getProviderClassStream() throws FileNotFoundException {
return new FileOutputStream(new File(stageDir, DBWS_PROVIDER_CLASS_FILE));
}
@Override
public OutputStream getProviderSourceStream() throws FileNotFoundException {
return new FileOutputStream(new File(stageDir, DBWS_PROVIDER_SOURCE_FILE));
}
@Override
public OutputStream getProviderListenerSourceStream() throws FileNotFoundException {
return new FileOutputStream(new File(stageDir, PROVIDER_LISTENER_SOURCE_FILE));
}
@Override
public OutputStream getProviderListenerClassStream() throws FileNotFoundException {
return new FileOutputStream(new File(stageDir, PROVIDER_LISTENER_CLASS_FILE));
}
static final int DEFAULT_BUFFER_SIZE = 4096;
@Override
public void writeProvider(OutputStream sourceProviderStream, OutputStream classProviderStream,
OutputStream sourceProviderListenerStream, OutputStream classProviderListenerStream,
DBWSBuilder builder) {
StringBuilder source = new StringBuilder(DBWS_PROVIDER_SOURCE_PREAMBLE_START);
if (builder.usesSOAP12()) {
if (builder.mtomEnabled()) {
source.append(DBWS_PROVIDER_SOURCE_SOAP12HTTP_MTOM_BINDING);
} else {
source.append(DBWS_PROVIDER_SOURCE_SOAP12HTTP_BINDING);
}
} else {
if (builder.mtomEnabled()) {
source.append(DBWS_PROVIDER_SOURCE_SOAP11HTTP_MTOM_BINDING);
}
}
source.append(new StringBuilder(DBWS_PROVIDER_SOURCE_PREAMBLE_END));
String wsdlPathPrevix = getWSDLPathPrefix();
if (wsdlPathPrevix != null) {
source.append(DBWS_PROVIDER_SOURCE_WSDL_LOCATION);
}
source.append(DBWS_PROVIDER_SOURCE_SERVICE_NAME);
String serviceName = builder.getWSDLGenerator().getServiceName();
source.append(serviceName);
source.append(DBWS_PROVIDER_SOURCE_PORT_NAME);
source.append(serviceName + "Port");
source.append(DBWS_PROVIDER_SOURCE_TARGET_NAMESPACE);
source.append(builder.getWSDLGenerator().getServiceNameSpace());
source.append(DBWS_PROVIDER_SOURCE_SUFFIX);
if (builder.usesSOAP12()) {
if (builder.mtomEnabled()) {
source.append(DBWS_PROVIDER_SOAP12_MTOM_BINDING);
}
else {
source.append(DBWS_PROVIDER_SOAP12_BINDING);
}
}
else {
if (builder.mtomEnabled()) {
source.append(DBWS_PROVIDER_SOAP11_MTOM_BINDING);
}
// else the default BindingType, don't have to explicitly set it
}
source.append(DBWS_PROVIDER_SOURCE_CLASSDEF);
if (sourceProviderStream != __nullStream) {
OutputStreamWriter osw =
new OutputStreamWriter(new BufferedOutputStream(sourceProviderStream));
try {
osw.write(source.toString());
osw.flush();
}
catch (IOException e) {}
}
if (classProviderStream != __nullStream) {
InMemoryCompiler providerCompiler = new InMemoryCompiler(PROVIDER_NAME);
if (providerCompiler.getCompiler() == null) {
throw new IllegalStateException("DBWSBuilder cannot compile DBWSProvider code\n" +
"Please ensure that tools.jar is on your classpath");
}
byte[] bytes = providerCompiler.compile(source);
if (bytes.length == 0) {
DiagnosticCollector<JavaFileObject> collector = providerCompiler.getDiagnosticsCollector();
StringBuilder diagBuf =
new StringBuilder("DBWSBuilder cannot generate ProviderListener code " +
"(likely servlet jar missing from classpath)\n");
for (Diagnostic<? extends JavaFileObject> d : collector.getDiagnostics()) {
if (d.getKind() == Diagnostic.Kind.ERROR) {
diagBuf.append(d.getMessage(null));
diagBuf.append("\n");
}
}
throw new IllegalStateException(diagBuf.toString());
}
else {
try {
classProviderStream.write(bytes, 0, bytes.length);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
if (sourceProviderListenerStream != __nullStream) {
OutputStreamWriter osw =
new OutputStreamWriter(new BufferedOutputStream(sourceProviderListenerStream));
try {
osw.write(PROVIDER_LISTENER_SOURCE);
osw.flush();
}
catch (IOException e) {
e.printStackTrace();
}
}
if (classProviderListenerStream != __nullStream) {
try {
InputStream is = this.getClass().getClassLoader().getResourceAsStream(
ProviderListener.class.getName().replace('.', '/') + DOT_CLASS);
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
int n = 0;
while (-1 != (n = is.read(buffer))) {
classProviderListenerStream.write(buffer, 0, n);
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
}