/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * 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.apache.openejb.server.cxf; import org.apache.openejb.config.AppModule; import org.apache.openejb.config.EjbModule; import org.apache.openejb.config.WebModule; import org.apache.openejb.config.sys.Service; import org.apache.openejb.jee.Application; import org.apache.openejb.jee.EjbJar; import org.apache.openejb.jee.WebApp; import org.apache.openejb.jee.oejb3.OpenejbJar; import org.apache.openejb.jee.oejb3.PojoDeployment; import org.apache.openejb.junit.ApplicationComposer; import org.apache.openejb.testing.EnableServices; import org.apache.openejb.testing.Module; import org.apache.openejb.testing.RandomPort; import org.junit.Test; import org.junit.runner.RunWith; import javax.jws.WebService; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.namespace.QName; import javax.xml.ws.soap.SOAPFaultException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.Properties; import static javax.xml.bind.annotation.XmlAccessType.FIELD; import static org.junit.Assert.assertEquals; @EnableServices("jaxws") @RunWith(ApplicationComposer.class) public class MaxChildTest { @RandomPort("http") private URL root; @Test public void passing() throws MalformedURLException { assertEquals(0, javax.xml.ws.Service.create(new URL(root.toExternalForm() + "app/ws?wsdl"), new QName("http://cxf.server.openejb.apache.org/", "SimpleContractImplService")) .getPort(SimpleContract.class) .test(new Root()) .getChildren().size()); } @Test public void tooBig() throws MalformedURLException { try { final Root root = new Root(); for (int i = 0; i < 2; i++) { root.getChildren().add(new Child()); } javax.xml.ws.Service.create(new URL(this.root.toExternalForm() + "app/ws?wsdl"), new QName("http://cxf.server.openejb.apache.org/", "SimpleContractImplService")) .getPort(SimpleContract.class) .test(root); } catch (final SOAPFaultException e) { assertEquals("Unmarshalling Error: Maximum Number of Child Elements limit (1) Exceeded ", e.getMessage()); } } @Module public AppModule app() { final String jarLocation = "target/" + getClass().getSimpleName(); return new AppModule(Thread.currentThread().getContextClassLoader(), jarLocation, new Application(), true) {{ getEjbModules().add(new EjbModule(new EjbJar("app"), new OpenejbJar() {{ getPojoDeployment().add(new PojoDeployment() {{ setClassName(SimpleContractImpl.class.getName()); getProperties().setProperty("cxf.jaxws.properties", "cxfLargeMsgSize"); }}); }})); getWebModules().add(new WebModule( new WebApp().contextRoot("app").addServlet("ws", SimpleContractImpl.class.getName(), "/ws"), "app", Thread.currentThread().getContextClassLoader(), jarLocation, "app" )); getServices().add(new Service() {{ setId("cxfLargeMsgSize"); setClassName(Properties.class.getName()); getProperties().setProperty("org.apache.cxf.stax.maxChildElements", "1"); }}); }}; } @WebService public interface SimpleContract { Root test(Root root); } @WebService public static class SimpleContractImpl implements SimpleContract { @Override public Root test(final Root root) { return root; } } @XmlRootElement @XmlAccessorType(FIELD) public static class Root { @XmlElement private Collection<Child> children; public Collection<Child> getChildren() { return children == null ? (children = new ArrayList<>()) : children; } } @XmlAccessorType(FIELD) public static class Child { @XmlElement private String name; public String getName() { return name; } public void setName(final String name) { this.name = name; } } }