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