/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 1997-2013 Oracle and/or its affiliates. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can
* obtain a copy of the License at
* http://glassfish.java.net/public/CDDL+GPL_1_1.html
* or packager/legal/LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at packager/legal/LICENSE.txt.
*
* GPL Classpath Exception:
* Oracle designates this particular file as subject to the "Classpath"
* exception as provided by Oracle in the GPL Version 2 section of the License
* file that accompanied this code.
*
* Modifications:
* If applicable, add the following below the License Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyright [year] [name of copyright owner]"
*
* Contributor(s):
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
package com.sun.xml.ws.cts.dl_swa;
import java.awt.Image;
import java.awt.Rectangle;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import javax.activation.DataHandler;
import javax.xml.namespace.QName;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.ws.WebServiceFeature;
import javax.xml.ws.handler.MessageContext;
import com.oracle.webservices.api.databinding.DatabindingModeFeature;
import com.oracle.webservices.api.databinding.JavaCallInfo;
import org.xml.sax.EntityResolver;
import com.sun.xml.ws.WsDatabindingTestBase;
import com.sun.xml.ws.api.databinding.Databinding;
import com.sun.xml.ws.api.databinding.DatabindingConfig;
import com.sun.xml.ws.api.message.Attachment;
import com.sun.xml.ws.api.message.AttachmentSet;
import com.sun.xml.ws.api.message.Packet;
import com.sun.xml.ws.api.model.wsdl.WSDLModel;
import com.sun.xml.ws.api.model.wsdl.WSDLPort;
import com.sun.xml.ws.api.wsdl.parser.WSDLParserExtension;
import com.sun.xml.ws.handler.SOAPMessageContextImpl;
import com.sun.xml.ws.message.DataHandlerAttachment;
import com.sun.xml.ws.util.ServiceFinder;
import com.sun.xml.ws.util.xml.XmlUtil;
import com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser;
public class SwaMimeAttachmentTest extends WsDatabindingTestBase {
static public final String ECLIPSELINK_JAXB = "eclipselink.jaxb";
// static public final String ECLIPSELINK_JAXB = "glassfish.jaxb";
protected DatabindingModeFeature databindingMode() {
return new DatabindingModeFeature(ECLIPSELINK_JAXB);
}
public void testAttachmentContentId() throws Exception {
WSDLPort wsdlPort = getWSDLPort(getResource("WSW2JDLSwaTestService.wsdl"));
Class proxySEIClass = SwaTest1.class;
WebServiceFeature[] f = { databindingMode() };
DatabindingConfig cliConfig = new DatabindingConfig();
cliConfig.setContractClass(proxySEIClass);
cliConfig.setFeatures(f);
cliConfig.setWsdlPort(wsdlPort);
cliConfig.setWsdlPort(wsdlPort);
cliConfig.getMappingInfo().setServiceName(new QName("http://SwaTestService.org/wsdl", "WSIDLSwaTestService"));
Databinding cli = (Databinding) factory.createRuntime(cliConfig);
URL url1 = getResource("attach.text");
URL url2 = getResource("attach.html");
URL url3 = getResource("attach.xml");
URL url4 = getResource("attach.jpeg1");
URL url5 = getResource("attach.jpeg2");
DataHandler dh1 = new DataHandler(url1);
DataHandler dh2 = new DataHandler(url2);
DataHandler dh3 = new DataHandler(url3);
// DataHandler dh4 = new DataHandler(url4);
// DataHandler dh5 = new DataHandler(url5);
javax.xml.ws.Holder<javax.activation.DataHandler> attach1 = new javax.xml.ws.Holder<javax.activation.DataHandler>();
attach1.value = dh1;
javax.xml.ws.Holder<javax.activation.DataHandler> attach2 = new javax.xml.ws.Holder<javax.activation.DataHandler>();
attach2.value = dh2;
javax.xml.ws.Holder<javax.xml.transform.Source> attach3 = new javax.xml.ws.Holder<javax.xml.transform.Source>();
attach3.value = new StreamSource(dh3.getInputStream());
javax.xml.ws.Holder<java.awt.Image> attach4 = new javax.xml.ws.Holder<java.awt.Image>();
javax.xml.ws.Holder<java.awt.Image> attach5 = new javax.xml.ws.Holder<java.awt.Image>();
attach4.value = javax.imageio.ImageIO.read(url4);
attach5.value = javax.imageio.ImageIO.read(url5);
VoidRequest request = new VoidRequest();
Object[] args = { request, attach1, attach2, attach3, attach4, attach5 };
Method method = findMethod(proxySEIClass, "echoAllAttachmentTypes");
JavaCallInfo cliCall = cli.createJavaCallInfo(method, args);
Packet cliSoapReq = (Packet)cli.serializeRequest(cliCall);
SOAPMessageContextImpl smc = new SOAPMessageContextImpl(null, cliSoapReq, null);
Map<String, DataHandler> smcAtts1 = (Map<String, DataHandler>) smc.get(MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS);
smc.put(MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS, smcAtts1);
assertEquals( 5, smcAtts1.size() );
for (String cid : smcAtts1.keySet())
assertTrue(cid.charAt(0)!='<');
for (com.sun.xml.ws.api.message.Attachment a : cliSoapReq.getMessage().getAttachments())
assertTrue(a.getContentId().charAt(0)!='<');
Object s1 = cliSoapReq.getAsSOAPMessage();
Object s2 = smc.getMessage();
assertTrue(s1 == s2);
for (com.sun.xml.ws.api.message.Attachment a : cliSoapReq.getMessage().getAttachments())
assertTrue(a.getContentId().charAt(0)!='<');
// {
// Map<String, DataHandler> atts = (Map<String, DataHandler>) smc.get(MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS);
// AttachmentSet attSet = cliSoapReq.getMessage().getAttachments();
// for(String cid : atts.keySet()){
// if (attSet.get(cid) == null) { // Otherwise we would be adding attachments twice
// Attachment att = new DataHandlerAttachment(cid, atts.get(cid));
// attSet.add(att);
// }
// }
// }
Map<String, DataHandler> smcAtts2 = (Map<String, DataHandler>) smc.get(MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS);
assertEquals( 5, smcAtts1.size() );
for (String cid : smcAtts2.keySet()) assertTrue(cid.charAt(0)!='<');
}
public void testCustomAttachmentContentId() throws Exception {
WSDLPort wsdlPort = getWSDLPort(getResource("WSW2JDLSwaTestService.wsdl"));
Class proxySEIClass = SwaTest1.class;
WebServiceFeature[] f = { databindingMode() };
DatabindingConfig cliConfig = new DatabindingConfig();
cliConfig.setContractClass(proxySEIClass);
cliConfig.setFeatures(f);
cliConfig.setWsdlPort(wsdlPort);
cliConfig.setWsdlPort(wsdlPort);
cliConfig.getMappingInfo().setServiceName(new QName("http://SwaTestService.org/wsdl", "WSIDLSwaTestService"));
Databinding cli = (Databinding) factory.createRuntime(cliConfig);
URL url1 = getResource("attach.text");
URL url2 = getResource("attach.html");
URL url3 = getResource("attach.xml");
URL url4 = getResource("attach.jpeg1");
URL url5 = getResource("attach.jpeg2");
DataHandler dh1 = new DataHandler(url1);
DataHandler dh2 = new DataHandler(url2);
DataHandler dh3 = new DataHandler(url3);
DataHandler dh4 = new DataHandler(url4);
// DataHandler dh5 = new DataHandler(url5);
javax.xml.ws.Holder<javax.activation.DataHandler> attach1 = new javax.xml.ws.Holder<javax.activation.DataHandler>();
attach1.value = dh1;
javax.xml.ws.Holder<javax.activation.DataHandler> attach2 = new javax.xml.ws.Holder<javax.activation.DataHandler>();
attach2.value = dh2;
javax.xml.ws.Holder<javax.xml.transform.Source> attach3 = new javax.xml.ws.Holder<javax.xml.transform.Source>();
attach3.value = new StreamSource(dh3.getInputStream());
javax.xml.ws.Holder<java.awt.Image> attach4 = new javax.xml.ws.Holder<java.awt.Image>();
javax.xml.ws.Holder<java.awt.Image> attach5 = new javax.xml.ws.Holder<java.awt.Image>();
attach4.value = javax.imageio.ImageIO.read(url4);
attach5.value = javax.imageio.ImageIO.read(url5);
VoidRequest request = new VoidRequest();
Object[] args = { request, attach1, attach2, attach3, attach4, attach5 };
Method method = findMethod(proxySEIClass, "echoAllAttachmentTypes");
JavaCallInfo cliCall = cli.createJavaCallInfo(method, args);
Packet cliSoapReq = (Packet)cli.serializeRequest(cliCall);
String customContentId = "<abcd@example.org>";
Map<String, DataHandler> attMap = new HashMap<String, DataHandler>();
attMap.put(customContentId, dh4);
cliSoapReq.invocationProperties.put(MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS, attMap);
SOAPMessageContextImpl smc = new SOAPMessageContextImpl(null, cliSoapReq, null);
Map<String, DataHandler> smcAtts1 = (Map<String, DataHandler>) smc.get(MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS);
assertEquals( 6, smcAtts1.size() );
assertNotNull(smcAtts1.get(customContentId));
{//ClientSOAPHandlerTube.callHandlersOnRequest
Map<String, DataHandler> atts = (Map<String, DataHandler>) smc.get(MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS);
AttachmentSet attSet = cliSoapReq.getMessage().getAttachments();
for(String cid : atts.keySet()){
if (attSet.get(cid) == null) { // Otherwise we would be adding attachments twice
Attachment att = new DataHandlerAttachment(cid, atts.get(cid));
attSet.add(att);
}
}
}
int attCount = 0;
for (com.sun.xml.ws.api.message.Attachment a : cliSoapReq.getMessage().getAttachments()) {
// assertTrue(a.getContentId().charAt(0)!='<');
attCount++;
}
assertEquals( 6, attCount);
Object s1 = cliSoapReq.getAsSOAPMessage();
Object s2 = smc.getMessage();
assertTrue(s1 == s2);
int attCountSaaj = 0;
for (com.sun.xml.ws.api.message.Attachment a : cliSoapReq.getMessage().getAttachments()) {
assertTrue(a.getContentId().charAt(0)!='<');
attCountSaaj++;
}
assertEquals( 6, attCountSaaj);
Map<String, DataHandler> smcAtts2 = (Map<String, DataHandler>) smc.get(MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS);
assertEquals( 6, smcAtts2.size() );
// System.out.println(smcAtts2.size() + " " + smcAtts2);
assertNotNull(smcAtts2.get(customContentId));
}
public void testCTS_WsiDocLitSwaTest() throws Exception {
WSDLPort wsdlPort = getWSDLPort(getResource("WSW2JDLSwaTestService.wsdl"));
Class endpointClass = SwaTestImpl1.class;
Class proxySEIClass = SwaTest1.class;
DatabindingConfig srvConfig = new DatabindingConfig();
srvConfig.setEndpointClass(endpointClass);
// srvConfig.setMetadataReader(new DummyAnnotations());
WebServiceFeature[] f = { databindingMode() };
srvConfig.setFeatures(f);
srvConfig.setWsdlPort(wsdlPort);
DatabindingConfig cliConfig = new DatabindingConfig();
// cliConfig.setMetadataReader(new DummyAnnotations());
cliConfig.setContractClass(proxySEIClass);
cliConfig.setFeatures(f);
cliConfig.setWsdlPort(wsdlPort);
SwaTest1 port = createProxy(SwaTest1.class, srvConfig, cliConfig, false);
{
URL url1 = getResource("attach.text");
URL url2 = getResource("attach.html");
URL url3 = getResource("attach.xml");
URL url4 = getResource("attach.jpeg1");
URL url5 = getResource("attach.jpeg2");
DataHandler dh1 = new DataHandler(url1);
DataHandler dh2 = new DataHandler(url2);
DataHandler dh3 = new DataHandler(url3);
DataHandler dh4 = new DataHandler(url4);
DataHandler dh5 = new DataHandler(url5);
javax.xml.ws.Holder<javax.activation.DataHandler> attach1 = new javax.xml.ws.Holder<javax.activation.DataHandler>();
attach1.value = dh1;
javax.xml.ws.Holder<javax.activation.DataHandler> attach2 = new javax.xml.ws.Holder<javax.activation.DataHandler>();
attach2.value = dh2;
javax.xml.ws.Holder<javax.xml.transform.Source> attach3 = new javax.xml.ws.Holder<javax.xml.transform.Source>();
attach3.value = new StreamSource(dh3.getInputStream());
javax.xml.ws.Holder<java.awt.Image> attach4 = new javax.xml.ws.Holder<java.awt.Image>();
javax.xml.ws.Holder<java.awt.Image> attach5 = new javax.xml.ws.Holder<java.awt.Image>();
attach4.value = javax.imageio.ImageIO.read(url4);
attach5.value = javax.imageio.ImageIO.read(url5);
VoidRequest request = new VoidRequest();
OutputResponseAll response = port.echoAllAttachmentTypes(request,
attach1, attach2, attach3, attach4, attach5);
assertTrue(ValidateRequestResponseAttachmentsEchoAllTestCase(
request, response, attach1, attach2, attach3, attach4,
attach5));
}
{
InputRequestGet request = new InputRequestGet();
URL url1 = getResource("attach.text");
URL url2 = getResource("attach.html");
request.setMimeType1("text/plain");
request.setMimeType2("text/html");
request.setUrl1(url1.toString());
request.setUrl2(url2.toString());
javax.xml.ws.Holder<DataHandler> attach1 = new javax.xml.ws.Holder<DataHandler>();
javax.xml.ws.Holder<DataHandler> attach2 = new javax.xml.ws.Holder<DataHandler>();
javax.xml.ws.Holder<OutputResponse> response = new javax.xml.ws.Holder<OutputResponse>();
port.getMultipleAttachments(request, response, attach1, attach2);
assertTrue(ValidateRequestResponseAttachmentsGetTestCase(request,
response.value, attach1, attach2));
}
{
javax.xml.ws.Holder<byte[]> data = new javax.xml.ws.Holder<byte[]>();
// InputStream in = getSwaAttachmentURL("attach.jpeg1").openStream();
// java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
// byte[] bytes = new byte[4096];
// int read = in.read(bytes);
// while (read != -1) {
// baos.write(bytes, 0, read);
// read = in.read(bytes);
// }
java.awt.Image image = javax.imageio.ImageIO.read(getResource("attach.jpeg1"));
java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
javax.imageio.ImageIO.write((java.awt.image.RenderedImage) image, "jpeg", baos);
data.value = baos.toByteArray();
byte[] bytes = baos.toByteArray();
port.echoData("EnableMIMEContent = false", data);
// for ( int i = 0; i < data.value.length; i++ ) {
// assertTrue(bytes[i] == data.value[i]);
// }
}
}
/***************************************************************************
* Validate request, response and attachments (echoAllAttachmentTypes)
**************************************************************************/
private boolean ValidateRequestResponseAttachmentsEchoAllTestCase(
VoidRequest request, OutputResponseAll response,
javax.xml.ws.Holder<DataHandler> attach1,
javax.xml.ws.Holder<DataHandler> attach2,
javax.xml.ws.Holder<Source> attach3,
javax.xml.ws.Holder<Image> attach4,
javax.xml.ws.Holder<Image> attach5) throws Exception {
boolean result = true;
URL url1 = getResource("attach.text");
URL url2 = getResource("attach.html");
URL url3 = getResource("attach.xml");
URL url4 = getResource("attach.jpeg1");
URL url5 = getResource("attach.jpeg2");
DataHandler dh1 = new DataHandler(url1);
byte data1[] = new byte[4096];
byte data2[] = new byte[4096];
int count1 = dh1.getInputStream().read(data1, 0, 4096);
int count2 = attach1.value.getInputStream().read(data2, 0, 4096);
if (!ValidateAttachmentData(count1, data1, count2, data2, "Attachment1"))
result = false;
data2 = new byte[4096];
dh1 = new DataHandler(url2);
count1 = dh1.getInputStream().read(data1, 0, 4096);
count2 = attach2.value.getInputStream().read(data2, 0, 4096);
if (!ValidateAttachmentData(count1, data1, count2, data2, "Attachment2"))
result = false;
data2 = new byte[4096];
dh1 = new DataHandler(url3);
count1 = dh1.getInputStream().read(data1, 0, 4096);
count2 = ((StreamSource) attach3.value).getInputStream().read(data2, 0,
4096);
// System.out.println("------------------------------ " + count1);
// System.out.println(new String(data1, 0, count1));
// System.out.println("------------------------------ " + count2);
// System.out.println(new String(data2, 0, count2));
//// if (!ValidateAttachmentData(count1, data1, count2, data2, "Attachment3"))
//// result = false;
dh1 = new DataHandler(url4);
count1 = dh1.getInputStream().read(data1, 0, 4096);
Image image1 = javax.imageio.ImageIO.read(url4);
Image image2 = attach4.value;
AttachmentHelper helper = new AttachmentHelper();
if (!helper.compareImages(image1, image2,
new Rectangle(0, 0, 100, 120), "Attachment4"))
result = false;
dh1 = new DataHandler(url5);
count1 = dh1.getInputStream().read(data1, 0, 4096);
image1 = javax.imageio.ImageIO.read(url5);
image2 = attach5.value;
helper = new AttachmentHelper();
if (!helper.compareImages(image1, image2,
new Rectangle(0, 0, 100, 120), "Attachment5"))
result = false;
return result;
}
private boolean ValidateAttachmentData(int count1, byte[] data1,
int count2, byte[] data2, String attach) {
int max = 0;
java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
java.io.PrintStream ps = new java.io.PrintStream(baos);
if (count2 > count1) {
for (int i = count1; i < count2; i++) {
if ((char) data2[i] != '\r')
break;
}
count2 = count1;
}
if (count1 != count2) {
if (count2 > count1)
max = count1;
else
max = count2;
ps.printf("data1[%d]=0x%x data2[%d]=0x%x", max - 1,
data1[max - 1], max - 1, data2[max - 1]);
baos.reset();
if (count2 > count1) {
for (int i = count1; i < count2; i++) {
ps.printf("Extra data was: data2[%d]=0x%x|0%o", i,
data2[i], data2[i]);
baos.reset();
}
} else {
for (int i = count2; i < count1; i++) {
ps.printf("Extra data was: data1[%d]=0x%x|0%o", i,
data1[i], data1[i]);
baos.reset();
}
}
return false;
}
for (int i = 0; i < count1; i++) {
if (data1[i] != data2[i]) {
return false;
}
}
return true;
}
/***************************************************************************
* Validate request, response and attachments (getMultipleAttachments)
**************************************************************************/
private boolean ValidateRequestResponseAttachmentsGetTestCase(
InputRequestGet request, OutputResponse response,
javax.xml.ws.Holder<DataHandler> attach1,
javax.xml.ws.Holder<DataHandler> attach2) {
boolean result = true;
if (!response.getMimeType1().equals(request.getMimeType1())) {
result = false;
}
if (!response.getMimeType2().equals(request.getMimeType2())) {
result = false;
} else {
}
if (!response.getResult().equals("ok")) {
result = false;
} else {
}
try {
DataHandler dh1 = new DataHandler(new URL(request.getUrl1()));
DataHandler dh2 = new DataHandler(new URL(request.getUrl2()));
byte data1[] = new byte[4096];
byte data2[] = new byte[4096];
int count1 = dh1.getInputStream().read(data1, 0, 4096);
int count2 = attach1.value.getInputStream().read(data2, 0, 4096);
if (!ValidateAttachmentData(count1, data1, count2, data2,
"Attachment1"))
result = false;
count1 = dh2.getInputStream().read(data1, 0, 4096);
data2 = new byte[4096];
count2 = attach2.value.getInputStream().read(data2, 0, 4096);
if (!ValidateAttachmentData(count1, data1, count2, data2,
"Attachment2"))
result = false;
} catch (Exception e) {
result = false;
}
return result;
}
static WSDLPort getWSDLPort(URL wsdlLoc) throws Exception {
EntityResolver er = XmlUtil.createDefaultCatalogResolver();
WSDLModel wsdl = RuntimeWSDLParser.parse(wsdlLoc, new StreamSource(wsdlLoc.toExternalForm()), er,
true, null, ServiceFinder.find(WSDLParserExtension.class).toArray());
QName serviceName = wsdl.getFirstServiceName();
return wsdl.getService(serviceName).getFirstPort();
}
private URL getResource(String str) throws Exception {
// return new File("D:/oc4j/webservices/devtest/data/cts15/DLSwaTest/" + str).toURL();
return Thread.currentThread().getContextClassLoader().getResource("etc/"+str);
}
}