From 75e52751eb632500aa75947c881cf4caec18f753 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Thu, 21 Nov 2013 12:07:05 +0100 Subject: [PATCH] Added MTOM sample --- mtom/README.md | 14 ++ mtom/build.gradle | 19 +++ mtom/client/jax-ws/.gitignore | 6 + mtom/client/jax-ws/build.gradle | 39 +++++ mtom/client/jax-ws/mtom.wsdl | 73 +++++++++ .../ws/samples/mtom/client/jaxws/Main.java | 76 +++++++++ mtom/client/spring-ws-logo.png | Bin 0 -> 23065 bytes mtom/client/spring-ws/.gitignore | 6 + mtom/client/spring-ws/build.gradle | 59 +++++++ .../mtom/client/sws/AxiomMtomClient.java | 150 ++++++++++++++++++ .../ws/samples/mtom/client/sws/Driver.java | 39 +++++ .../mtom/client/sws/SaajMtomClient.java | 82 ++++++++++ .../src/main/resources/log4j.properties | 6 + .../mtom/client/sws/applicationContext.xml | 28 ++++ mtom/server/.gitignore | 6 + mtom/server/build.gradle | 78 +++++++++ .../samples/mtom/service/ImageRepository.java | 29 ++++ .../mtom/service/StubImageRepository.java | 43 +++++ .../mtom/ws/ImageRepositoryEndpoint.java | 63 ++++++++ .../src/main/resources/log4j.properties | 8 + .../server/src/main/webapp/WEB-INF/schema.xsd | 19 +++ .../main/webapp/WEB-INF/spring-ws-servlet.xml | 37 +++++ mtom/server/src/main/webapp/WEB-INF/web.xml | 34 ++++ mtom/settings.gradle | 2 + 24 files changed, 916 insertions(+) create mode 100644 mtom/README.md create mode 100644 mtom/build.gradle create mode 100644 mtom/client/jax-ws/.gitignore create mode 100644 mtom/client/jax-ws/build.gradle create mode 100644 mtom/client/jax-ws/mtom.wsdl create mode 100644 mtom/client/jax-ws/src/main/java/org/springframework/ws/samples/mtom/client/jaxws/Main.java create mode 100644 mtom/client/spring-ws-logo.png create mode 100644 mtom/client/spring-ws/.gitignore create mode 100644 mtom/client/spring-ws/build.gradle create mode 100644 mtom/client/spring-ws/src/main/java/org/springframework/ws/samples/mtom/client/sws/AxiomMtomClient.java create mode 100644 mtom/client/spring-ws/src/main/java/org/springframework/ws/samples/mtom/client/sws/Driver.java create mode 100644 mtom/client/spring-ws/src/main/java/org/springframework/ws/samples/mtom/client/sws/SaajMtomClient.java create mode 100644 mtom/client/spring-ws/src/main/resources/log4j.properties create mode 100644 mtom/client/spring-ws/src/main/resources/org/springframework/ws/samples/mtom/client/sws/applicationContext.xml create mode 100644 mtom/server/.gitignore create mode 100644 mtom/server/build.gradle create mode 100644 mtom/server/src/main/java/org/springframework/ws/samples/mtom/service/ImageRepository.java create mode 100644 mtom/server/src/main/java/org/springframework/ws/samples/mtom/service/StubImageRepository.java create mode 100644 mtom/server/src/main/java/org/springframework/ws/samples/mtom/ws/ImageRepositoryEndpoint.java create mode 100644 mtom/server/src/main/resources/log4j.properties create mode 100644 mtom/server/src/main/webapp/WEB-INF/schema.xsd create mode 100644 mtom/server/src/main/webapp/WEB-INF/spring-ws-servlet.xml create mode 100644 mtom/server/src/main/webapp/WEB-INF/web.xml create mode 100644 mtom/settings.gradle diff --git a/mtom/README.md b/mtom/README.md new file mode 100644 index 0000000..2d6699c --- /dev/null +++ b/mtom/README.md @@ -0,0 +1,14 @@ +# MTOM Sample + +This sample shows how to use marshal and unmarshal MTOM attachments using JAXB2. + +## Build and deploy + +See the main [README](../README.md) for build instructions. + +## License + +[Spring Web Services] is released under version 2.0 of the [Apache License]. + +[Spring Web Services]: http://projects.spring.io/spring-ws +[Apache License]: http://www.apache.org/licenses/LICENSE-2.0 \ No newline at end of file diff --git a/mtom/build.gradle b/mtom/build.gradle new file mode 100644 index 0000000..5736641 --- /dev/null +++ b/mtom/build.gradle @@ -0,0 +1,19 @@ +subprojects { + apply plugin: 'java' + apply plugin: 'eclipse' + apply plugin: 'idea' + + repositories { + maven { url 'http://repo.spring.io/libs-release' } + } + + dependencies { + testCompile("junit:junit:4.10") + testCompile("org.easymock:easymock:3.1") + } + +} + +task wrapper(type: Wrapper) { + gradleVersion = '1.8' +} diff --git a/mtom/client/jax-ws/.gitignore b/mtom/client/jax-ws/.gitignore new file mode 100644 index 0000000..2739940 --- /dev/null +++ b/mtom/client/jax-ws/.gitignore @@ -0,0 +1,6 @@ +target +*.iml +.classpath +.project +.settings + diff --git a/mtom/client/jax-ws/build.gradle b/mtom/client/jax-ws/build.gradle new file mode 100644 index 0000000..5d7bf51 --- /dev/null +++ b/mtom/client/jax-ws/build.gradle @@ -0,0 +1,39 @@ +configurations { + wsimport +} + +ext.springWsVersion = '2.1.4.RELEASE' + +task wsImport { + ext.outputDir = "${buildDir}/classes/wsimport" + ext.wsdl = "${projectDir}/mtom.wsdl" + + inputs.files wsdl + outputs.dir outputDir + + doLast() { + project.ant { + taskdef name: "wsimport", classname: "com.sun.tools.ws.ant.WsImport", + classpath: configurations.wsimport.asPath + mkdir(dir: outputDir) + + wsimport(destdir: outputDir, wsdl: wsdl, + package: "org.springframework.ws.samples.mtom.client.jaxws") { + produces(dir: outputDir, includes: "**/*.class") + } + } + } +} + +dependencies { + compile("org.springframework.ws:spring-ws-core:$springWsVersion") + compile(files(wsImport.outputDir).builtBy(wsImport)) + runtime("log4j:log4j:1.2.16") + wsimport "com.sun.xml.ws:jaxws-tools:2.1.7" +} + +task runClient(dependsOn: 'classes', type:JavaExec) { + main = "org.springframework.ws.samples.mtom.client.jaxws.Main" + classpath = sourceSets.main.runtimeClasspath + systemProperty("java.awt.headless", "true") +} \ No newline at end of file diff --git a/mtom/client/jax-ws/mtom.wsdl b/mtom/client/jax-ws/mtom.wsdl new file mode 100644 index 0000000..0a6e0ba --- /dev/null +++ b/mtom/client/jax-ws/mtom.wsdl @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mtom/client/jax-ws/src/main/java/org/springframework/ws/samples/mtom/client/jaxws/Main.java b/mtom/client/jax-ws/src/main/java/org/springframework/ws/samples/mtom/client/jaxws/Main.java new file mode 100644 index 0000000..85ebca1 --- /dev/null +++ b/mtom/client/jax-ws/src/main/java/org/springframework/ws/samples/mtom/client/jaxws/Main.java @@ -0,0 +1,76 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.samples.mtom.client.jaxws; + +import java.io.File; +import java.io.IOException; +import java.awt.image.RenderedImage; +import java.awt.Toolkit; +import javax.activation.DataHandler; +import javax.xml.ws.BindingProvider; +import javax.xml.ws.soap.SOAPBinding; +import javax.xml.ws.soap.SOAPFaultException; + +import org.springframework.util.StopWatch; + +/** + * Simple client that calls the GetFlights and BookFlight operations using JAX-WS. + * + * @author Arjen Poutsma + */ +public class Main { + + public static void main(String[] args) throws IOException { + try { + + String fileName = "../spring-ws-logo.png"; + if (args.length > 0) { + fileName = args[0]; + } + + ImageRepositoryService service = new ImageRepositoryService(); + ImageRepository imageRepository = service.getImageRepositorySoap11(); + SOAPBinding binding = (SOAPBinding) ((BindingProvider) imageRepository).getBinding(); + binding.setMTOMEnabled(true); + + Image request = new Image(); + File file = new File(fileName); + if (!file.exists()) { + System.err.println("File [" + fileName + "] does not exist"); + System.exit(-1); + } + request.setName(file.getName()); + request.setImage(Toolkit.getDefaultToolkit().getImage(file.getAbsolutePath())); + StopWatch stopWatch = new StopWatch(); + stopWatch.start("store"); + imageRepository.storeImage(request); + stopWatch.stop(); + + stopWatch.start("load"); + Image response = imageRepository.loadImage(file.getName()); + stopWatch.stop(); + System.out.println(stopWatch.prettyPrint()); + } + catch (SOAPFaultException ex) { + System.err.format("SOAP Fault Code %1s%n", ex.getFault().getFaultCodeAsQName()); + System.err.format("SOAP Fault String: %1s%n", ex.getFault().getFaultString()); + } + + } + + +} diff --git a/mtom/client/spring-ws-logo.png b/mtom/client/spring-ws-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2bdbd1a65923bca3345cdf092855a04dce4a6abd GIT binary patch literal 23065 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 literal 0 HcmV?d00001 diff --git a/mtom/client/spring-ws/.gitignore b/mtom/client/spring-ws/.gitignore new file mode 100644 index 0000000..2739940 --- /dev/null +++ b/mtom/client/spring-ws/.gitignore @@ -0,0 +1,6 @@ +target +*.iml +.classpath +.project +.settings + diff --git a/mtom/client/spring-ws/build.gradle b/mtom/client/spring-ws/build.gradle new file mode 100644 index 0000000..8e8dd9b --- /dev/null +++ b/mtom/client/spring-ws/build.gradle @@ -0,0 +1,59 @@ +configurations { + jaxb +} + +ext.springWsVersion = '2.1.4.RELEASE' + +task genJaxb { + ext.sourcesDir = "${buildDir}/generated-sources/jaxb" + ext.classesDir = "${buildDir}/classes/jaxb" + ext.schema = "${projectDir}/../../server/src/main/webapp/WEB-INF/schema.xsd" + + inputs.files schema + outputs.dir classesDir + + doLast() { + project.ant { + taskdef name: "xjc", classname: "com.sun.tools.xjc.XJCTask", + classpath: configurations.jaxb.asPath + mkdir(dir: sourcesDir) + mkdir(dir: classesDir) + + xjc(destdir: sourcesDir, schema: schema, + package: "org.springframework.ws.samples.mtom.client.sws") { + produces(dir: sourcesDir, includes: "**/*.java") + } + + javac(destdir: classesDir, source: 1.6, target: 1.6, debug: true, + debugLevel: "lines,vars,source", + classpath: configurations.jaxb.asPath) { + src(path: sourcesDir) + include(name: "**/*.java") + include(name: "*.java") + } + + copy(todir: classesDir) { + fileset(dir: sourcesDir, erroronmissingdir: false) { + exclude(name: "**/*.java") + } + } + } + } +} + +dependencies { + compile("org.springframework.ws:spring-ws-core:$springWsVersion") + compile("org.apache.ws.commons.axiom:axiom-api:1.2.14") + compile(files(genJaxb.classesDir).builtBy(genJaxb)) + + runtime("log4j:log4j:1.2.16") + runtime("org.apache.ws.commons.axiom:axiom-impl:1.2.14") + + jaxb "com.sun.xml.bind:jaxb-xjc:2.1.7" +} + +task runClient(dependsOn: 'classes', type:JavaExec) { + main = "org.springframework.ws.samples.mtom.client.sws.Driver" + classpath = sourceSets.main.runtimeClasspath + systemProperty("java.awt.headless", "true") +} \ No newline at end of file diff --git a/mtom/client/spring-ws/src/main/java/org/springframework/ws/samples/mtom/client/sws/AxiomMtomClient.java b/mtom/client/spring-ws/src/main/java/org/springframework/ws/samples/mtom/client/sws/AxiomMtomClient.java new file mode 100644 index 0000000..a6ec661 --- /dev/null +++ b/mtom/client/spring-ws/src/main/java/org/springframework/ws/samples/mtom/client/sws/AxiomMtomClient.java @@ -0,0 +1,150 @@ +/* + * Copyright 2002-2009 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.samples.mtom.client.sws; + +import java.io.IOException; +import java.util.Iterator; +import javax.activation.DataHandler; +import javax.activation.DataSource; +import javax.activation.FileDataSource; +import javax.imageio.ImageIO; +import javax.xml.transform.TransformerException; + +import org.apache.axiom.om.OMElement; +import org.apache.axiom.om.OMNamespace; +import org.apache.axiom.om.OMOutputFormat; +import org.apache.axiom.om.OMText; +import org.apache.axiom.soap.SOAPBody; +import org.apache.axiom.soap.SOAPFactory; +import org.apache.axiom.soap.SOAPMessage; + +import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; +import org.springframework.util.StopWatch; +import org.springframework.util.StringUtils; +import org.springframework.ws.WebServiceMessage; +import org.springframework.ws.client.core.WebServiceMessageCallback; +import org.springframework.ws.client.core.WebServiceMessageExtractor; +import org.springframework.ws.client.core.support.WebServiceGatewaySupport; +import org.springframework.ws.soap.axiom.AxiomSoapMessage; +import org.springframework.ws.soap.axiom.AxiomSoapMessageFactory; +import org.springframework.ws.soap.client.SoapFaultClientException; + +/** + * Simple client that demonstartes MTOM by invoking StoreImage and LoadImage using a + * WebServiceTemplate and Axiom. + * + * @author Arjen Poutsma + */ +public class AxiomMtomClient extends WebServiceGatewaySupport { + + private StopWatch stopWatch = new StopWatch(ClassUtils.getShortName(getClass())); + + public AxiomMtomClient(AxiomSoapMessageFactory messageFactory) { + super(messageFactory); + } + + public void doIt(String path) { + try { + store(path); + load(path); + System.out.println(stopWatch.prettyPrint()); + } + catch (SoapFaultClientException ex) { + System.err.format("SOAP Fault Code %1s%n", ex.getFaultCode()); + System.err.format("SOAP Fault String: %1s%n", ex.getFaultStringOrReason()); + } + + } + + private void store(final String path) { + stopWatch.start("store"); + getWebServiceTemplate().sendAndReceive(new WebServiceMessageCallback() { + public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException { + AxiomSoapMessage soapMessage = (AxiomSoapMessage) message; + SOAPMessage axiomMessage = soapMessage.getAxiomMessage(); + SOAPFactory factory = (SOAPFactory) axiomMessage.getOMFactory(); + SOAPBody body = axiomMessage.getSOAPEnvelope().getBody(); + + OMNamespace ns = + factory.createOMNamespace("http://www.springframework.org/spring-ws/samples/mtom", "tns"); + + OMElement storeImageRequestElement = factory.createOMElement("StoreImageRequest", ns); + body.addChild(storeImageRequestElement); + OMElement nameElement = factory.createOMElement("name", ns); + storeImageRequestElement.addChild(nameElement); + nameElement.setText(StringUtils.getFilename(path)); + OMElement imageElement = factory.createOMElement("image", ns); + storeImageRequestElement.addChild(imageElement); + DataSource dataSource = new FileDataSource(path); + DataHandler dataHandler = new DataHandler(dataSource); + OMText text = factory.createOMText(dataHandler, true); + imageElement.addChild(text); + + OMOutputFormat outputFormat = new OMOutputFormat(); + outputFormat.setSOAP11(true); + outputFormat.setDoOptimize(true); + soapMessage.setOutputFormat(outputFormat); + } + }, new WebServiceMessageExtractor() { + public Object extractData(WebServiceMessage message) throws IOException, TransformerException { + return null; + } + }); + stopWatch.stop(); + } + + private void load(final String path) { + final StringBuilder name = new StringBuilder(); + stopWatch.start("load"); + java.awt.Image image = (java.awt.Image) getWebServiceTemplate().sendAndReceive(new WebServiceMessageCallback() { + public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException { + SOAPMessage axiomMessage = ((AxiomSoapMessage) message).getAxiomMessage(); + SOAPFactory factory = (SOAPFactory) axiomMessage.getOMFactory(); + SOAPBody body = axiomMessage.getSOAPEnvelope().getBody(); + + OMNamespace ns = + factory.createOMNamespace("http://www.springframework.org/spring-ws/samples/mtom", "tns"); + + OMElement loadImageRequestElement = factory.createOMElement("LoadImageRequest", ns); + loadImageRequestElement.setText(StringUtils.getFilename(path)); + body.addChild(loadImageRequestElement); + } + }, new WebServiceMessageExtractor() { + public Object extractData(WebServiceMessage message) throws IOException, TransformerException { + SOAPMessage axiomMessage = ((AxiomSoapMessage) message).getAxiomMessage(); + SOAPBody body = axiomMessage.getSOAPEnvelope().getBody(); + OMElement loadImageResponseElement = (OMElement) body.getChildElements().next(); + Assert.isTrue("LoadImageResponse".equals(loadImageResponseElement.getLocalName())); + Iterator childElements = loadImageResponseElement.getChildElements(); + OMElement nameElement = (OMElement) childElements.next(); + Assert.isTrue("name".equals(nameElement.getLocalName())); + name.append(nameElement.getText()); + OMElement imageElement = (OMElement) childElements.next(); + Assert.isTrue("image".equals(imageElement.getLocalName())); + OMText text = (OMText) imageElement.getFirstOMChild(); + + DataHandler dataHandler = (DataHandler) text.getDataHandler(); + return ImageIO.read(dataHandler.getInputStream()); + } + }); + stopWatch.stop(); + logger.info("Received image " + name + " [" + image.getWidth(null) + "x" + image.getHeight(null) + "]"); + } + + +} diff --git a/mtom/client/spring-ws/src/main/java/org/springframework/ws/samples/mtom/client/sws/Driver.java b/mtom/client/spring-ws/src/main/java/org/springframework/ws/samples/mtom/client/sws/Driver.java new file mode 100644 index 0000000..2f7c556 --- /dev/null +++ b/mtom/client/spring-ws/src/main/java/org/springframework/ws/samples/mtom/client/sws/Driver.java @@ -0,0 +1,39 @@ +/* + * Copyright 2002-2009 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.samples.mtom.client.sws; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +public class Driver { + + public static void main(String[] args) { + String fileName = "../spring-ws-logo.png"; + if (args.length > 0) { + fileName = args[0]; + } + ApplicationContext applicationContext = + new ClassPathXmlApplicationContext("applicationContext.xml", Driver.class); + + SaajMtomClient saajClient = applicationContext.getBean("saajClient", SaajMtomClient.class); + saajClient.doIt(fileName); + + AxiomMtomClient axiomClient = applicationContext.getBean("axiomClient", AxiomMtomClient.class); + axiomClient.doIt(fileName); + } + +} diff --git a/mtom/client/spring-ws/src/main/java/org/springframework/ws/samples/mtom/client/sws/SaajMtomClient.java b/mtom/client/spring-ws/src/main/java/org/springframework/ws/samples/mtom/client/sws/SaajMtomClient.java new file mode 100644 index 0000000..de78e43 --- /dev/null +++ b/mtom/client/spring-ws/src/main/java/org/springframework/ws/samples/mtom/client/sws/SaajMtomClient.java @@ -0,0 +1,82 @@ +/* + * Copyright 2002-2009 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.samples.mtom.client.sws; + +import java.awt.Toolkit; +import javax.xml.bind.JAXBElement; + +import org.springframework.util.ClassUtils; +import org.springframework.util.StopWatch; +import org.springframework.util.StringUtils; +import org.springframework.ws.client.core.support.WebServiceGatewaySupport; +import org.springframework.ws.soap.client.SoapFaultClientException; +import org.springframework.ws.soap.saaj.SaajSoapMessageFactory; + +/** + * Simple client that demonstartes MTOM by invoking StoreImage and LoadImage using a + * WebServiceTemplate and SAAJ. + * + * @author Tareq Abed Rabbo + * @author Arjen Poutsma + */ +public class SaajMtomClient extends WebServiceGatewaySupport { + + private ObjectFactory objectFactory = new ObjectFactory(); + + private StopWatch stopWatch = new StopWatch(ClassUtils.getShortName(getClass())); + + public SaajMtomClient(SaajSoapMessageFactory messageFactory) { + super(messageFactory); + } + + public void doIt(String path) { + try { + store(path); + load(path); + System.out.println(stopWatch.prettyPrint()); + } + catch (SoapFaultClientException ex) { + System.err.format("SOAP Fault Code %1s%n", ex.getFaultCode()); + System.err.format("SOAP Fault String: %1s%n", ex.getFaultStringOrReason()); + } + + } + + private void store(String path) { + Image image = objectFactory.createImage(); + image.setName(StringUtils.getFilename(path)); + image.setImage(Toolkit.getDefaultToolkit().getImage(path)); + JAXBElement storeImageRequest = objectFactory.createStoreImageRequest(image); + stopWatch.start("store"); + getWebServiceTemplate().marshalSendAndReceive(storeImageRequest); + stopWatch.stop(); + } + + private void load(String path) { + JAXBElement loadImageRequest = objectFactory.createLoadImageRequest(StringUtils.getFilename(path)); + + stopWatch.start("load"); + JAXBElement loadImageResponse = + (JAXBElement) getWebServiceTemplate().marshalSendAndReceive(loadImageRequest); + stopWatch.stop(); + Image image = loadImageResponse.getValue(); + logger.info("Received image " + image.getName() + " [" + image.getImage().getWidth(null) + "x" + + image.getImage().getHeight(null) + "]"); + + } + +} diff --git a/mtom/client/spring-ws/src/main/resources/log4j.properties b/mtom/client/spring-ws/src/main/resources/log4j.properties new file mode 100644 index 0000000..ecbc6e2 --- /dev/null +++ b/mtom/client/spring-ws/src/main/resources/log4j.properties @@ -0,0 +1,6 @@ +log4j.rootLogger=WARN, stdout +log4j.logger.org.springframework.ws.samples=INFO + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n diff --git a/mtom/client/spring-ws/src/main/resources/org/springframework/ws/samples/mtom/client/sws/applicationContext.xml b/mtom/client/spring-ws/src/main/resources/org/springframework/ws/samples/mtom/client/sws/applicationContext.xml new file mode 100644 index 0000000..52d6395 --- /dev/null +++ b/mtom/client/spring-ws/src/main/resources/org/springframework/ws/samples/mtom/client/sws/applicationContext.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mtom/server/.gitignore b/mtom/server/.gitignore new file mode 100644 index 0000000..2739940 --- /dev/null +++ b/mtom/server/.gitignore @@ -0,0 +1,6 @@ +target +*.iml +.classpath +.project +.settings + diff --git a/mtom/server/build.gradle b/mtom/server/build.gradle new file mode 100644 index 0000000..b932ee3 --- /dev/null +++ b/mtom/server/build.gradle @@ -0,0 +1,78 @@ +configurations { + jaxb +} + +buildscript { + repositories { + mavenCentral() + } + + dependencies { + classpath 'org.gradle.api.plugins:gradle-tomcat-plugin:0.9.9' + } +} + +ext.springVersion = '3.2.4.RELEASE' +ext.springWsVersion = '2.1.4.RELEASE' +ext.tomcatVersion = '7.0.42' + + +apply plugin: 'war' +apply plugin: 'tomcat' + +task genJaxb { + ext.sourcesDir = "${buildDir}/generated-sources/jaxb" + ext.classesDir = "${buildDir}/classes/jaxb" + ext.schema = "${projectDir}/src/main/webapp/WEB-INF/schema.xsd" + + inputs.files schema + outputs.dir classesDir + + doLast() { + project.ant { + taskdef name: "xjc", classname: "com.sun.tools.xjc.XJCTask", + classpath: configurations.jaxb.asPath + mkdir(dir: sourcesDir) + mkdir(dir: classesDir) + + xjc(destdir: sourcesDir, schema: schema, + package: "org.springframework.ws.samples.mtom.schema") { + produces(dir: sourcesDir, includes: "**/*.java") + } + + javac(destdir: classesDir, source: 1.6, target: 1.6, debug: true, + debugLevel: "lines,vars,source", + classpath: configurations.jaxb.asPath) { + src(path: sourcesDir) + include(name: "**/*.java") + include(name: "*.java") + } + + copy(todir: classesDir) { + fileset(dir: sourcesDir, erroronmissingdir: false) { + exclude(name: "**/*.java") + } + } + } + } +} + + +tomcatRun { + contextPath = 'mtom-server' +} + +dependencies { + compile("org.springframework.ws:spring-ws-core:$springWsVersion") + compile(files(genJaxb.classesDir).builtBy(genJaxb)) + + runtime("log4j:log4j:1.2.16") + + jaxb "com.sun.xml.bind:jaxb-xjc:2.1.7" + + tomcat("org.apache.tomcat.embed:tomcat-embed-core:$tomcatVersion", + "org.apache.tomcat.embed:tomcat-embed-logging-juli:$tomcatVersion") + tomcat("org.apache.tomcat.embed:tomcat-embed-jasper:$tomcatVersion") { + exclude group: 'org.eclipse.jdt.core.compiler', module: 'ecj' + } +} \ No newline at end of file diff --git a/mtom/server/src/main/java/org/springframework/ws/samples/mtom/service/ImageRepository.java b/mtom/server/src/main/java/org/springframework/ws/samples/mtom/service/ImageRepository.java new file mode 100644 index 0000000..3107214 --- /dev/null +++ b/mtom/server/src/main/java/org/springframework/ws/samples/mtom/service/ImageRepository.java @@ -0,0 +1,29 @@ +/* + * Copyright 2007 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.samples.mtom.service; + +import java.awt.Image; +import java.io.IOException; + +/** @author Arjen Poutsma */ +public interface ImageRepository { + + Image readImage(String name) throws IOException; + + void storeImage(String name, Image image) throws IOException; + +} diff --git a/mtom/server/src/main/java/org/springframework/ws/samples/mtom/service/StubImageRepository.java b/mtom/server/src/main/java/org/springframework/ws/samples/mtom/service/StubImageRepository.java new file mode 100644 index 0000000..163a228 --- /dev/null +++ b/mtom/server/src/main/java/org/springframework/ws/samples/mtom/service/StubImageRepository.java @@ -0,0 +1,43 @@ +/* + * Copyright 2002-2009 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.samples.mtom.service; + +import java.awt.Image; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** @author Arjen Poutsma */ +public class StubImageRepository implements ImageRepository { + + private static final Log logger = LogFactory.getLog(StubImageRepository.class); + + private Map images = new HashMap(); + + public Image readImage(String name) throws IOException { + logger.info("Loading image " + name); + return images.get(name); + } + + public void storeImage(String name, Image image) throws IOException { + logger.info("Storing image " + name + " [" + image.getWidth(null) + "x" + image.getHeight(null) + "]"); + images.put(name, image); + } +} diff --git a/mtom/server/src/main/java/org/springframework/ws/samples/mtom/ws/ImageRepositoryEndpoint.java b/mtom/server/src/main/java/org/springframework/ws/samples/mtom/ws/ImageRepositoryEndpoint.java new file mode 100644 index 0000000..bacba4c --- /dev/null +++ b/mtom/server/src/main/java/org/springframework/ws/samples/mtom/ws/ImageRepositoryEndpoint.java @@ -0,0 +1,63 @@ +/* + * Copyright 2005-2012 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.samples.mtom.ws; + +import java.io.IOException; +import javax.xml.bind.JAXBElement; + +import org.springframework.util.Assert; +import org.springframework.ws.samples.mtom.schema.Image; +import org.springframework.ws.samples.mtom.schema.ObjectFactory; +import org.springframework.ws.samples.mtom.service.ImageRepository; +import org.springframework.ws.server.endpoint.annotation.Endpoint; +import org.springframework.ws.server.endpoint.annotation.PayloadRoot; +import org.springframework.ws.server.endpoint.annotation.RequestPayload; +import org.springframework.ws.server.endpoint.annotation.ResponsePayload; + +/** @author Arjen Poutsma */ +@Endpoint +public class ImageRepositoryEndpoint { + + private ImageRepository imageRepository; + + private ObjectFactory objectFactory; + + public ImageRepositoryEndpoint(ImageRepository imageRepository) { + Assert.notNull(imageRepository, "'imageRepository' must not be null"); + this.imageRepository = imageRepository; + this.objectFactory = new ObjectFactory(); + } + + @PayloadRoot(localPart = "StoreImageRequest", namespace = "http://www.springframework.org/spring-ws/samples/mtom") + @ResponsePayload + public void store(@RequestPayload JAXBElement requestElement) throws IOException { + Image request = requestElement.getValue(); + imageRepository.storeImage(request.getName(), request.getImage()); + } + + @PayloadRoot(localPart = "LoadImageRequest", namespace = "http://www.springframework.org/spring-ws/samples/mtom") + @ResponsePayload + public JAXBElement load(@RequestPayload JAXBElement requestElement) throws IOException { + String name = requestElement.getValue(); + Image response = new Image(); + response.setName(name); + response.setImage(imageRepository.readImage(name)); + return objectFactory.createLoadImageResponse(response); + } + + +} diff --git a/mtom/server/src/main/resources/log4j.properties b/mtom/server/src/main/resources/log4j.properties new file mode 100644 index 0000000..5bb7c90 --- /dev/null +++ b/mtom/server/src/main/resources/log4j.properties @@ -0,0 +1,8 @@ +log4j.rootLogger=WARN, stdout +log4j.logger.org.springframework.ws=DEBUG +log4j.logger.org.springframework.xml=DEBUG +log4j.logger.org.springframework.ws.samples=INFO + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n diff --git a/mtom/server/src/main/webapp/WEB-INF/schema.xsd b/mtom/server/src/main/webapp/WEB-INF/schema.xsd new file mode 100644 index 0000000..1af18f5 --- /dev/null +++ b/mtom/server/src/main/webapp/WEB-INF/schema.xsd @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mtom/server/src/main/webapp/WEB-INF/spring-ws-servlet.xml b/mtom/server/src/main/webapp/WEB-INF/spring-ws-servlet.xml new file mode 100644 index 0000000..58e0614 --- /dev/null +++ b/mtom/server/src/main/webapp/WEB-INF/spring-ws-servlet.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mtom/server/src/main/webapp/WEB-INF/web.xml b/mtom/server/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..68288e8 --- /dev/null +++ b/mtom/server/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,34 @@ + + + + + + MyCompany HR Holiday Service + + + spring-ws + org.springframework.ws.transport.http.MessageDispatcherServlet + + + + spring-ws + /* + + + diff --git a/mtom/settings.gradle b/mtom/settings.gradle new file mode 100644 index 0000000..b3428de --- /dev/null +++ b/mtom/settings.gradle @@ -0,0 +1,2 @@ + +include "server", "client:jax-ws", "client:spring-ws"