You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by xu...@apache.org on 2011/05/24 16:37:13 UTC

svn commit: r1127089 - in /openejb/trunk/openejb3/container/openejb-jee/src: main/java/org/apache/openejb/jee/ test/java/org/apache/openejb/jee/ test/resources/

Author: xuhaihong
Date: Tue May 24 14:37:12 2011
New Revision: 1127089

URL: http://svn.apache.org/viewvc?rev=1127089&view=rev
Log:
Use a XmlAdapter to create the QName even if it is illegal, still have problems while marshal the objects to XML, those namespace information will be lost

Added:
    openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/HandlerChainsStringQNameAdapter.java   (with props)
    openejb/trunk/openejb3/container/openejb-jee/src/test/resources/handler.xml   (with props)
Modified:
    openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/HandlerChain.java
    openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/JaxbJavaee.java
    openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/JeeTest.java

Modified: openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/HandlerChain.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/HandlerChain.java?rev=1127089&r1=1127088&r2=1127089&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/HandlerChain.java (original)
+++ openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/HandlerChain.java Tue May 24 14:37:12 2011
@@ -16,18 +16,19 @@
  */
 package org.apache.openejb.jee;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlID;
-import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.XmlList;
+import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 import javax.xml.namespace.QName;
-import java.util.ArrayList;
-import java.util.List;
 
 /**
  * javaee_web_services_client_1_3.xsd
@@ -64,8 +65,10 @@ import java.util.List;
     "handler"
 })
 public class HandlerChain {
+    @XmlJavaTypeAdapter(HandlerChainsStringQNameAdapter.class)
     @XmlElement(name = "service-name-pattern")
     protected QName serviceNamePattern;
+    @XmlJavaTypeAdapter(HandlerChainsStringQNameAdapter.class)
     @XmlElement(name = "port-name-pattern")
     protected QName portNamePattern;
     @XmlList

Added: openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/HandlerChainsStringQNameAdapter.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/HandlerChainsStringQNameAdapter.java?rev=1127089&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/HandlerChainsStringQNameAdapter.java (added)
+++ openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/HandlerChainsStringQNameAdapter.java Tue May 24 14:37:12 2011
@@ -0,0 +1,70 @@
+/**
+ *  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 javax.xml.XMLConstants;
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+import javax.xml.namespace.QName;
+
+import org.apache.openejb.jee.JaxbJavaee.HandlerChainsNamespaceFilter;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class HandlerChainsStringQNameAdapter extends XmlAdapter<String, QName> {
+
+    private HandlerChainsNamespaceFilter xmlFilter;
+
+    @Override
+    public QName unmarshal(String value) throws Exception {
+        if (value == null || value.isEmpty()) {
+            return new QName(XMLConstants.NULL_NS_URI, "");
+        }
+        int colonIndex = value.indexOf(":");
+        if (colonIndex == -1) {
+            return new QName(XMLConstants.NULL_NS_URI, value);
+        }
+        String prefix = value.substring(0, colonIndex);
+        String localPart = (colonIndex == (value.length() - 1)) ? "" : value.substring(colonIndex + 1);
+        String nameSpaceURI = xmlFilter.lookupNamespaceURI(prefix);
+        if (nameSpaceURI == null) {
+            nameSpaceURI = XMLConstants.NULL_NS_URI;
+        }
+        return new QName(nameSpaceURI, localPart, prefix);
+    }
+
+    @Override
+    public String marshal(QName name) throws Exception {
+        String localPart = name.getLocalPart();
+        if (localPart == null || localPart.isEmpty()) {
+            return "";
+        }
+        if (localPart.equals("*")) {
+            return localPart;
+        }
+        String prefix = name.getPrefix();
+        if (prefix == null || prefix.isEmpty()) {
+            return localPart;
+        }
+        return prefix + ":" + localPart;
+    }
+
+    public void setHandlerChainsNamespaceFilter(HandlerChainsNamespaceFilter xmlFilter) {
+        this.xmlFilter = xmlFilter;
+    }
+}

Propchange: openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/HandlerChainsStringQNameAdapter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/HandlerChainsStringQNameAdapter.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/HandlerChainsStringQNameAdapter.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/JaxbJavaee.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/JaxbJavaee.java?rev=1127089&r1=1127088&r2=1127089&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/JaxbJavaee.java (original)
+++ openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/JaxbJavaee.java Tue May 24 14:37:12 2011
@@ -16,32 +16,35 @@
  */
 package org.apache.openejb.jee;
 
-import org.xml.sax.SAXException;
-import org.xml.sax.InputSource;
-import org.xml.sax.XMLReader;
-import org.xml.sax.Attributes;
-import org.xml.sax.helpers.XMLFilterImpl;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.AbstractMap;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.Stack;
+import java.util.TreeSet;
 
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBElement;
 import javax.xml.bind.JAXBException;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
-import javax.xml.bind.ValidationEventHandler;
 import javax.xml.bind.ValidationEvent;
+import javax.xml.bind.ValidationEventHandler;
 import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParserFactory;
 import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
 import javax.xml.transform.sax.SAXSource;
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.IOException;
-import java.io.ByteArrayInputStream;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Set;
-import java.util.TreeSet;
+
+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;
 
 /**
  * @version $Rev$ $Date$
@@ -204,6 +207,50 @@ public class JaxbJavaee {
         }
     }
 
+    /**   
+     *
+     * @param type Class of object to be read in
+     * @param in input stream to read
+     * @param <T> class of object to be returned
+     * @return a T read from the input stream
+     * @throws ParserConfigurationException is the SAX parser can not be configured
+     * @throws SAXException if there is an xml problem
+     * @throws JAXBException if the xml cannot be marshalled into a T.
+     */
+    public static <T>Object unmarshalHandlerChains(Class<T> type, InputStream in) throws ParserConfigurationException, SAXException, JAXBException {
+        InputSource inputSource = new InputSource(in);
+
+        SAXParserFactory factory = SAXParserFactory.newInstance();
+        factory.setNamespaceAware(true);
+        factory.setValidating(false);
+        SAXParser parser = factory.newSAXParser();
+
+        JAXBContext ctx = JaxbJavaee.getContext(type);
+        Unmarshaller unmarshaller = ctx.createUnmarshaller();
+        unmarshaller.setEventHandler(new ValidationEventHandler(){
+            public boolean handleEvent(ValidationEvent validationEvent) {
+                System.out.println(validationEvent);
+                return false;
+            }
+        });
+
+
+        JaxbJavaee.HandlerChainsNamespaceFilter xmlFilter = new JaxbJavaee.HandlerChainsNamespaceFilter(parser.getXMLReader());
+        xmlFilter.setContentHandler(unmarshaller.getUnmarshallerHandler());
+        HandlerChainsStringQNameAdapter adapter = new HandlerChainsStringQNameAdapter();
+        adapter.setHandlerChainsNamespaceFilter(xmlFilter);
+        unmarshaller.setAdapter(HandlerChainsStringQNameAdapter.class, adapter);
+
+        SAXSource source = new SAXSource(xmlFilter, inputSource);
+
+        currentPublicId.set(new TreeSet<String>());
+        try {
+            return unmarshaller.unmarshal(source);
+        } finally {
+            currentPublicId.set(null);
+        }
+    }
+
     public static class JavaeeNamespaceFilter extends XMLFilterImpl {
         private static final InputSource EMPTY_INPUT_SOURCE = new InputSource(new ByteArrayInputStream(new byte[0]));
 
@@ -247,6 +294,58 @@ public class JaxbJavaee {
         }
     }
 
+    public static class HandlerChainsNamespaceFilter extends XMLFilterImpl {
+
+        private static final InputSource EMPTY_INPUT_SOURCE = new InputSource(new ByteArrayInputStream(new byte[0]));
+
+        private Stack<Map.Entry<String, String>> effectiveNamespaces = new Stack<Map.Entry<String, String>>();
+
+        public HandlerChainsNamespaceFilter(XMLReader xmlReader) {
+            super(xmlReader);
+        }
+
+        @Override
+        public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
+            Set<String> publicIds = currentPublicId.get();
+            if (publicIds != null) {
+                publicIds.add(publicId);
+            }
+            return EMPTY_INPUT_SOURCE;
+        }
+
+        @Override
+        public void startElement(String uri, String localName, String qname, Attributes atts) throws SAXException {
+            super.startElement("http://java.sun.com/xml/ns/javaee", localName, qname, atts);
+        }
+
+        @Override
+        public void endElement(String uri, String localName, String qName) throws SAXException {
+            super.endElement("http://java.sun.com/xml/ns/javaee", localName, qName);
+        }
+
+        @Override
+        public void endPrefixMapping(String prefix) throws SAXException {
+            effectiveNamespaces.pop();
+            super.endPrefixMapping(prefix);
+        }
+
+        @Override
+        public void startPrefixMapping(String prefix, String uri) throws SAXException {
+            effectiveNamespaces.push(new AbstractMap.SimpleEntry<String, String>(prefix, uri));
+            super.startPrefixMapping(prefix, uri);
+        }
+
+        public String lookupNamespaceURI(String prefix) {
+            for (int index = effectiveNamespaces.size() - 1; index > 0; index--) {
+                Map.Entry<String, String> entry = effectiveNamespaces.get(index);
+                if (entry.getKey().equals(prefix)) {
+                    return entry.getValue();
+                }
+            }
+            return null;
+        }
+    }
+
     public static class TaglibNamespaceFilter extends XMLFilterImpl {
         private static final InputSource EMPTY_INPUT_SOURCE = new InputSource(new ByteArrayInputStream(new byte[0]));
 
@@ -296,5 +395,4 @@ public class JaxbJavaee {
             super.endElement("http://java.sun.com/xml/ns/javaee", localName, qName);
         }
     }
-
 }

Modified: openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/JeeTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/JeeTest.java?rev=1127089&r1=1127088&r2=1127089&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/JeeTest.java (original)
+++ openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/JeeTest.java Tue May 24 14:37:12 2011
@@ -22,23 +22,27 @@ import java.io.BufferedInputStream;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.List;
 import java.util.Properties;
 
+import javax.xml.XMLConstants;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
 import javax.xml.bind.ValidationEvent;
 import javax.xml.bind.ValidationEventHandler;
+import javax.xml.namespace.QName;
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 import javax.xml.transform.sax.SAXSource;
 
 import junit.framework.TestCase;
 
+import org.junit.Test;
 import org.xml.sax.Attributes;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
@@ -263,6 +267,28 @@ public class JeeTest extends TestCase {
     public void testRar16() throws Exception {
         marshalAndUnmarshal(Connector.class, "connector-1.6-example.xml", null);
     }
+    
+    public void testWebServiceHandlers() throws Exception {
+        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 };
+        InputStream in = this.getClass().getClassLoader().getResourceAsStream("handler.xml");
+        try {
+            HandlerChains handlerChains = (HandlerChains) JaxbJavaee.unmarshalHandlerChains(HandlerChains.class, in);
+            for (int index = 0; index < handlerChains.getHandlerChain().size(); index++) {
+                HandlerChain handlerChain = handlerChains.getHandlerChain().get(index);
+                QName serviceName = handlerChain.getServiceNamePattern();
+                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));
+        } finally {
+            in.close();
+        }        
+    }
 
     public static <T> T marshalAndUnmarshal(Class<T> type, String sourceXmlFile, String expectedXmlFile) throws Exception {
         InputStream in = JeeTest.class.getClassLoader().getResourceAsStream(sourceXmlFile);

Added: openejb/trunk/openejb3/container/openejb-jee/src/test/resources/handler.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-jee/src/test/resources/handler.xml?rev=1127089&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-jee/src/test/resources/handler.xml (added)
+++ openejb/trunk/openejb3/container/openejb-jee/src/test/resources/handler.xml Tue May 24 14:37:12 2011
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+-->
+<handler-chains xmlns="http://java.sun.com/xml/ns/javaee" xmlns:bar="http://www.bar.org">
+           <handler-chain>
+              <service-name-pattern xmlns:ns1="http://www.helloworld.org">ns1:HelloService</service-name-pattern>
+              <handler>
+	             <handler-name>Handler1</handler-name>
+	             <handler-class>org.helloworld.Handler1</handler-class>
+              </handler>
+           </handler-chain>
+          
+           <handler-chain>
+              <service-name-pattern xmlns:ns1="http://www.helloworld.org">bar:HelloService</service-name-pattern>
+              <handler>
+                  <handler-name>Handler3</handler-name>
+                  <handler-class>org.helloworld.Handler3</handler-class>
+              </handler>
+           </handler-chain>
+
+           <handler-chain>
+              <service-name-pattern xmlns:bar="http://www.bar1.org">bar:HelloService</service-name-pattern>
+              <handler>
+                  <handler-name>Handler4</handler-name>
+                  <handler-class>org.helloworld.Handler4</handler-class>
+              </handler>
+           </handler-chain>
+
+           <handler-chain>
+              <service-name-pattern>foo:HelloService</service-name-pattern>
+              <handler>
+                  <handler-name>Handler5</handler-name>
+                  <handler-class>org.helloworld.Handler5</handler-class>
+              </handler>
+           </handler-chain>
+
+           <handler-chain>
+              <service-name-pattern xmlns:ns1="http://www.helloworld.org">*</service-name-pattern>
+              <handler>
+                  <handler-name>Handler6</handler-name>
+                  <handler-class>org.helloworld.Handler6</handler-class>
+              </handler>
+           </handler-chain>
+
+           <handler-chain>
+              <protocol-bindings>##SOAP11_HTTP</protocol-bindings>
+              <handler>
+	             <handler-name>Handler7</handler-name>
+	             <handler-class>org.helloworld.Handler7</handler-class>
+              </handler>
+           </handler-chain>
+</handler-chains>

Propchange: openejb/trunk/openejb3/container/openejb-jee/src/test/resources/handler.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: openejb/trunk/openejb3/container/openejb-jee/src/test/resources/handler.xml
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: openejb/trunk/openejb3/container/openejb-jee/src/test/resources/handler.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml