| /** |
| * |
| * 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 |
| * |
| * 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.apache.openejb.jee; |
| |
| import junit.framework.TestCase; |
| import org.xml.sax.Attributes; |
| import org.xml.sax.InputSource; |
| import org.xml.sax.SAXException; |
| import org.xml.sax.XMLReader; |
| import org.xml.sax.helpers.XMLFilterImpl; |
| |
| import javax.xml.XMLConstants; |
| import javax.xml.bind.*; |
| import javax.xml.namespace.QName; |
| import javax.xml.parsers.SAXParser; |
| import javax.xml.parsers.SAXParserFactory; |
| import javax.xml.transform.sax.SAXSource; |
| import java.io.*; |
| import java.util.List; |
| import java.util.Properties; |
| |
| /** |
| * @version $Revision$ $Date$ |
| */ |
| public class JeeTest extends TestCase { |
| |
| /** |
| * TODO Doesn't seem there are any asserts here |
| * |
| * @throws Exception |
| */ |
| public void testEjbJar() throws Exception { |
| final String fileName = "ejb-jar-example1.xml"; |
| // String fileName = "ejb-jar-empty.xml"; |
| |
| // marshalAndUnmarshal(EjbJar.class, fileName); |
| |
| final SAXParserFactory factory = SAXParserFactory.newInstance(); |
| factory.setNamespaceAware(true); |
| factory.setValidating(false); |
| final SAXParser parser = factory.newSAXParser(); |
| |
| final long start = System.currentTimeMillis(); |
| |
| // Unmarshaller unmarshaller = new UnmarshallerImpl(Collections.<JAXBMarshaller>singleton(EjbJarJaxB.INSTANCE)); |
| // Marshaller marshaller = new MarshallerImpl(Collections.<JAXBMarshaller>singleton(EjbJarJaxB.INSTANCE)); |
| final JAXBContext ctx = JAXBContextFactory.newInstance(EjbJar.class); |
| final Unmarshaller unmarshaller = ctx.createUnmarshaller(); |
| final Marshaller marshaller = ctx.createMarshaller(); |
| |
| final NamespaceFilter xmlFilter = new NamespaceFilter(parser.getXMLReader()); |
| xmlFilter.setContentHandler(unmarshaller.getUnmarshallerHandler()); |
| unmarshaller.setEventHandler(new TestValidationEventHandler()); |
| |
| final InputStream in = this.getClass().getClassLoader().getResourceAsStream(fileName); |
| final String expected = readContent(in); |
| |
| final SAXSource source = new SAXSource(xmlFilter, new InputSource(new ByteArrayInputStream(expected.getBytes()))); |
| final Object object = unmarshaller.unmarshal(source); |
| |
| marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); |
| |
| final ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| marshaller.marshal(object, baos); |
| |
| System.out.println("time: " + (System.currentTimeMillis() - start)); |
| } |
| |
| public void testEjbTimeout() throws Exception { |
| final String fileName = "ejb-jar-timeout.xml"; |
| final InputStream in = this.getClass().getClassLoader().getResourceAsStream(fileName); |
| |
| final Object o = JaxbJavaee.unmarshalJavaee(EjbJar.class, in); |
| |
| final EjbJar ejbJar = (EjbJar) o; |
| final EnterpriseBean bean = ejbJar.getEnterpriseBean("A"); |
| |
| assertTrue("The bean A is not a SessionBean", bean instanceof SessionBean); |
| final SessionBean sbean = (SessionBean) bean; |
| |
| assertNotNull("Unable to get the StatefulTimeout value", sbean.getStatefulTimeout()); |
| } |
| |
| public void testSessionSynchronization() throws Exception { |
| final String fileName = "ejb-session-synchronization.xml"; |
| final InputStream in = this.getClass().getClassLoader().getResourceAsStream(fileName); |
| |
| final Object o = JaxbJavaee.unmarshalJavaee(EjbJar.class, in); |
| |
| final EjbJar ejbJar = (EjbJar) o; |
| final EnterpriseBean bean = ejbJar.getEnterpriseBean("TestBean"); |
| |
| assertTrue("The bean TestBean is not a SessionBean", bean instanceof SessionBean); |
| final SessionBean sbean = (SessionBean) bean; |
| |
| assertNotNull("Unable to get the afterBegin value", sbean.getAfterBeginMethod()); |
| assertNotNull("Unable to get the beforeCompletion value", sbean.getBeforeCompletionMethod()); |
| assertNotNull("Unable to get the afterCompletion value", sbean.getAfterCompletionMethod()); |
| |
| assertNotNull("Unable to get the afterBegin value", sbean.getAfterBegin()); |
| assertNotNull("Unable to get the beforeCompletion value", sbean.getBeforeCompletion()); |
| assertNotNull("Unable to get the afterCompletion value", sbean.getAfterCompletion()); |
| } |
| |
| public void testAroundTimeout() throws Exception { |
| final String fileName = "ejb-jar-aroundtimeout.xml"; |
| final InputStream in = this.getClass().getClassLoader().getResourceAsStream(fileName); |
| |
| final Object o = JaxbJavaee.unmarshalJavaee(EjbJar.class, in); |
| |
| final EjbJar ejbJar = (EjbJar) o; |
| final EnterpriseBean bean = ejbJar.getEnterpriseBean("TestBean"); |
| |
| assertTrue("The bean TestBean is not a SessionBean", bean instanceof SessionBean); |
| final SessionBean sbean = (SessionBean) bean; |
| |
| final AroundTimeout beanAroundTimeout = sbean.getAroundTimeout().get(0); |
| assertEquals("aroundTimeout", beanAroundTimeout.getMethodName()); |
| |
| final AroundTimeout interceptorAroundTimeout = ejbJar.getInterceptors()[0].getAroundTimeout().get(0); |
| assertEquals("aroundTimeout", interceptorAroundTimeout.getMethodName()); |
| } |
| |
| public void testTimerSchedule() throws Exception { |
| final String fileName = "ejb-jar-timeschedule.xml"; |
| final InputStream in = this.getClass().getClassLoader().getResourceAsStream(fileName); |
| |
| final Object o = JaxbJavaee.unmarshalJavaee(EjbJar.class, in); |
| |
| final EjbJar ejbJar = (EjbJar) o; |
| final EnterpriseBean bean = ejbJar.getEnterpriseBean("TestBean"); |
| |
| assertTrue("The bean TestBean is not a SessionBean", bean instanceof SessionBean); |
| final SessionBean sbean = (SessionBean) bean; |
| |
| final List<Timer> timers = sbean.getTimer(); |
| assertEquals(1, timers.size()); |
| |
| final Timer timer = timers.get(0); |
| final TimerSchedule timerSchedule = timer.getSchedule(); |
| assertEquals("10", timerSchedule.getSecond()); |
| assertEquals("10", timerSchedule.getMinute()); |
| assertEquals("*", timerSchedule.getDayOfMonth()); |
| assertEquals("Mon", timerSchedule.getDayOfWeek()); |
| assertEquals("*", timerSchedule.getHour()); |
| assertEquals("Nov", timerSchedule.getMonth()); |
| assertEquals("*", timerSchedule.getYear()); |
| |
| assertEquals("2010-03-01T13:00:00Z", timer.getStart().toXMLFormat()); |
| assertEquals("2012-12-11T14:19:00Z", timer.getEnd().toXMLFormat()); |
| |
| final NamedMethod timeoutMethod = timer.getTimeoutMethod(); |
| assertEquals("testScheduleMethod", timeoutMethod.getMethodName()); |
| assertEquals("javax.ejb.Timer", timeoutMethod.getMethodParams().getMethodParam().get(0)); |
| |
| assertEquals(Boolean.FALSE, timer.getPersistent()); |
| assertEquals("America/New_York", timer.getTimezone()); |
| assertEquals("TestInfo", timer.getInfo()); |
| } |
| |
| public void testEjbJarMdb20() throws Exception { |
| final String fileName = "ejb-jar-mdb-2.0.xml"; |
| final InputStream in = this.getClass().getClassLoader().getResourceAsStream(fileName); |
| |
| final Object o = JaxbJavaee.unmarshalJavaee(EjbJar.class, in); |
| |
| final EjbJar ejbJar = (EjbJar) o; |
| |
| final MessageDrivenBean bean = (MessageDrivenBean) ejbJar.getEnterpriseBean("MyMdb"); |
| |
| final Properties properties = bean.getActivationConfig().toProperties(); |
| |
| assertEquals(4, properties.size()); |
| /* |
| <message-selector>mySelector</message-selector> |
| <acknowledge-mode>Auto-acknowledge</acknowledge-mode> |
| <message-driven-destination> |
| <destination-type>javax.jms.Queue</destination-type> |
| <subscription-durability>Durable</subscription-durability> |
| |
| */ |
| assertEquals("mySelector", properties.get("messageSelector")); |
| assertEquals("Auto-acknowledge", properties.get("acknowledgeMode")); |
| assertEquals("javax.jms.Queue", properties.get("destinationType")); |
| assertEquals("Durable", properties.get("subscriptionDurability")); |
| } |
| |
| public void testApplication() throws Exception { |
| marshalAndUnmarshal(Application.class, "application-example.xml", null); |
| } |
| |
| public void testApplicationClient() throws Exception { |
| marshalAndUnmarshal(ApplicationClient.class, "application-client-example.xml", null); |
| } |
| |
| public void testWar() throws Exception { |
| marshalAndUnmarshal(WebApp.class, "web-example.xml", "web-example-expected.xml"); |
| } |
| |
| public void testWar2_3() throws Exception { |
| marshalAndUnmarshal(WebApp.class, "web_2.3-example.xml", "web_2.3-example-expected.xml"); |
| } |
| |
| public void testTld() throws Exception { |
| marshalAndUnmarshal(TldTaglib.class, "tld-example.xml", null); |
| } |
| |
| public void testRar10() throws Exception { |
| final Connector10 c10 = marshalAndUnmarshal(Connector10.class, "connector-1.0-example.xml", null); |
| final Connector c = Connector.newConnector(c10); |
| final JAXBContext ctx = JAXBContextFactory.newInstance(Connector.class); |
| final Marshaller marshaller = ctx.createMarshaller(); |
| marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); |
| |
| final ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| marshaller.marshal(c, baos); |
| |
| final byte[] bytes = baos.toByteArray(); |
| final String actual = new String(bytes); |
| |
| final String expected; |
| final InputStream in2 = this.getClass().getClassLoader().getResourceAsStream("connector-1.0-example-expected-1.6.xml"); |
| expected = readContent(in2); |
| |
| try { |
| StaxCompare.compare(expected, actual); |
| } catch (final Exception e) { |
| // System.out.append(actual); |
| writeToTmpFile(bytes, "connector-1.0-example.xml"); |
| throw e; |
| } |
| } |
| |
| public void testRar15() throws Exception { |
| marshalAndUnmarshal(Connector.class, "connector-1.5-example.xml", null); |
| } |
| |
| public void testRar16() throws Exception { |
| marshalAndUnmarshal(Connector.class, "connector-1.6-example.xml", null); |
| } |
| |
| public void testWebServiceHandlers() throws Exception { |
| final QName[] expectedServiceNames = {new QName("http://www.helloworld.org", "HelloService", "ns1"), new QName("http://www.bar.org", "HelloService", "bar"), |
| new QName("http://www.bar1.org", "HelloService", "bar"), new QName(XMLConstants.NULL_NS_URI, "HelloService", "foo"), new QName(XMLConstants.NULL_NS_URI, "*"), null}; |
| try (InputStream in = this.getClass().getClassLoader().getResourceAsStream("handler.xml")) { |
| final HandlerChains handlerChains = (HandlerChains) JaxbJavaee.unmarshalHandlerChains(HandlerChains.class, in); |
| for (int index = 0; index < handlerChains.getHandlerChain().size(); index++) { |
| final HandlerChain handlerChain = handlerChains.getHandlerChain().get(index); |
| final QName serviceName = handlerChain.getServiceNamePattern(); |
| final QName expectedServiceName = expectedServiceNames[index]; |
| if (expectedServiceName == null) { |
| assertNull(serviceName); |
| } else { |
| assertEquals("serviceNamePattern at index " + index + " mismatches", expectedServiceName, serviceName); |
| } |
| } |
| System.out.println(JaxbJavaee.marshal(HandlerChains.class, handlerChains)); |
| } |
| } |
| |
| public static <T> T marshalAndUnmarshal(final Class<T> type, final String sourceXmlFile, final String expectedXmlFile) throws Exception { |
| final InputStream in = JeeTest.class.getClassLoader().getResourceAsStream(sourceXmlFile); |
| final T object = (T) JaxbJavaee.unmarshalJavaee(type, in); |
| in.close(); |
| assertTrue(object.getClass().isAssignableFrom(type)); |
| |
| final JAXBContext ctx = JAXBContextFactory.newInstance(type); |
| final Marshaller marshaller = ctx.createMarshaller(); |
| marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); |
| |
| final ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| marshaller.marshal(object, baos); |
| |
| final byte[] bytes = baos.toByteArray(); |
| final String actual = new String(bytes); |
| |
| final String expected; |
| if (expectedXmlFile == null) { |
| final InputStream in2 = JeeTest.class.getClassLoader().getResourceAsStream(sourceXmlFile); |
| expected = readContent(in2); |
| } else { |
| final InputStream in2 = JeeTest.class.getClassLoader().getResourceAsStream(expectedXmlFile); |
| expected = readContent(in2); |
| } |
| |
| try { |
| StaxCompare.compare(expected, actual); |
| } catch (final Exception e) { |
| // System.out.append(actual); |
| writeToTmpFile(bytes, sourceXmlFile); |
| throw e; |
| } |
| return object; |
| } |
| |
| public static class NamespaceFilter extends XMLFilterImpl { |
| |
| private static final InputSource EMPTY_INPUT_SOURCE = new InputSource(new ByteArrayInputStream(new byte[0])); |
| |
| public NamespaceFilter(final XMLReader xmlReader) { |
| super(xmlReader); |
| } |
| |
| public InputSource resolveEntity(final String publicId, final String systemId) throws SAXException, IOException { |
| return EMPTY_INPUT_SOURCE; |
| } |
| |
| public void startElement(final String uri, final String localName, final String qname, final Attributes atts) throws SAXException { |
| super.startElement("http://java.sun.com/xml/ns/javaee", localName, qname, atts); |
| } |
| } |
| |
| private static void writeToTmpFile(final byte[] bytes, final String xmlFileName) { |
| try { |
| File tempFile = null; |
| try { |
| tempFile = File.createTempFile("jaxb-output", "xml"); |
| } catch (final Throwable e) { |
| final File tmp = new File("tmp"); |
| if (!tmp.exists() && !tmp.mkdirs()) { |
| throw new IOException("Failed to create local tmp directory: " + tmp.getAbsolutePath()); |
| } |
| |
| tempFile = File.createTempFile("jaxb-output", "xml", tmp); |
| } |
| final FileOutputStream out = new FileOutputStream(tempFile); |
| out.write(bytes); |
| out.close(); |
| System.out.println("Jaxb output of " + xmlFileName + " written to " + tempFile.getAbsolutePath()); |
| } catch (final IOException e) { |
| e.printStackTrace(); |
| } |
| } |
| |
| private static String readContent(InputStream in) throws IOException { |
| final StringBuilder sb = new StringBuilder(); |
| in = new BufferedInputStream(in); |
| try { |
| int i = in.read(); |
| while (i != -1) { |
| sb.append((char) i); |
| i = in.read(); |
| } |
| } finally { |
| in.close(); |
| } |
| return sb.toString(); |
| } |
| |
| private static class TestValidationEventHandler implements ValidationEventHandler { |
| |
| public boolean handleEvent(final ValidationEvent validationEvent) { |
| System.out.println(validationEvent.getMessage()); |
| System.out.println(validationEvent.getLocator()); |
| return false; // if an error occurs we must be aware of |
| } |
| } |
| } |