You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2011/02/15 18:07:09 UTC
svn commit: r1070973 [1/2] - in /cxf/trunk:
common/common/src/main/java/org/apache/cxf/helpers/
common/common/src/main/java/org/apache/cxf/staxutils/transform/
rt/core/src/main/java/org/apache/cxf/feature/
rt/core/src/main/java/org/apache/cxf/intercept...
Author: sergeyb
Date: Tue Feb 15 17:07:08 2011
New Revision: 1070973
URL: http://svn.apache.org/viewvc?rev=1070973&view=rev
Log:
[CXF-3338] Adding StaxTransformFeature
Added:
cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/
cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/DelegatingNamespaceContext.java (with props)
cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/IgnoreNamespacesWriter.java (with props)
cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/InTransformReader.java (with props)
cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/OutTransformWriter.java (with props)
cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/QNamesMap.java (with props)
cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/TransformUtils.java (with props)
cxf/trunk/rt/core/src/main/java/org/apache/cxf/feature/StaxTransformFeature.java (with props)
cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutEndingInterceptor.java (with props)
cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/
cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformInInterceptor.java (with props)
cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformOutInterceptor.java (with props)
Modified:
cxf/trunk/common/common/src/main/java/org/apache/cxf/helpers/XMLUtils.java
cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxOutInterceptor.java
cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONUtils.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/jaxws/BookStoreSoapRestImpl.java
cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_soap_rest/WEB-INF/beans.xml
Modified: cxf/trunk/common/common/src/main/java/org/apache/cxf/helpers/XMLUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/common/common/src/main/java/org/apache/cxf/helpers/XMLUtils.java?rev=1070973&r1=1070972&r2=1070973&view=diff
==============================================================================
--- cxf/trunk/common/common/src/main/java/org/apache/cxf/helpers/XMLUtils.java (original)
+++ cxf/trunk/common/common/src/main/java/org/apache/cxf/helpers/XMLUtils.java Tue Feb 15 17:07:08 2011
@@ -28,9 +28,11 @@ import java.io.OutputStream;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Collections;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
+import java.util.Set;
import java.util.StringTokenizer;
import java.util.WeakHashMap;
import java.util.logging.Level;
@@ -455,4 +457,35 @@ public final class XMLUtils {
trans.transform(src, res);
return res.getNode();
}
+
+ public static QName convertStringToQName(String expandedQName) {
+ return convertStringToQName(expandedQName, "");
+ }
+
+ public static QName convertStringToQName(String expandedQName, String prefix) {
+ int ind1 = expandedQName.indexOf('{');
+ if (ind1 != 0) {
+ return new QName(expandedQName);
+ }
+
+ int ind2 = expandedQName.indexOf('}');
+ if (ind2 <= ind1 + 1 || ind2 >= expandedQName.length() - 1) {
+ return null;
+ }
+ String ns = expandedQName.substring(ind1 + 1, ind2);
+ String localName = expandedQName.substring(ind2 + 1);
+ return new QName(ns, localName, prefix);
+ }
+
+ public static Set<QName> convertStringsToQNames(List<String> expandedQNames) {
+ Set<QName> dropElements = Collections.emptySet();
+ if (expandedQNames != null) {
+ dropElements = new LinkedHashSet<QName>(expandedQNames.size());
+ for (String val : expandedQNames) {
+ dropElements.add(XMLUtils.convertStringToQName(val));
+ }
+ }
+ return dropElements;
+ }
+
}
Added: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/DelegatingNamespaceContext.java
URL: http://svn.apache.org/viewvc/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/DelegatingNamespaceContext.java?rev=1070973&view=auto
==============================================================================
--- cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/DelegatingNamespaceContext.java (added)
+++ cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/DelegatingNamespaceContext.java Tue Feb 15 17:07:08 2011
@@ -0,0 +1,52 @@
+/**
+ * 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.cxf.staxutils.transform;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.xml.namespace.NamespaceContext;
+
+class DelegatingNamespaceContext implements NamespaceContext {
+
+ private NamespaceContext nc;
+ private Map<String, String> nsMap;
+
+ public DelegatingNamespaceContext(NamespaceContext nc, Map<String, String> nsMap) {
+ this.nc = nc;
+ this.nsMap = nsMap;
+ }
+
+ public String getNamespaceURI(String prefix) {
+ return nc.getNamespaceURI(prefix);
+ }
+
+ public String getPrefix(String ns) {
+ String value = nsMap.get(ns);
+ if (value != null && value.length() == 0) {
+ return null;
+ }
+ return value != null ? nc.getPrefix(value) : nc.getPrefix(ns);
+ }
+
+ public Iterator getPrefixes(String ns) {
+ return nc.getPrefixes(ns);
+ }
+
+}
Propchange: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/DelegatingNamespaceContext.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/DelegatingNamespaceContext.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/IgnoreNamespacesWriter.java
URL: http://svn.apache.org/viewvc/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/IgnoreNamespacesWriter.java?rev=1070973&view=auto
==============================================================================
--- cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/IgnoreNamespacesWriter.java (added)
+++ cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/IgnoreNamespacesWriter.java Tue Feb 15 17:07:08 2011
@@ -0,0 +1,47 @@
+/**
+ * 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.cxf.staxutils.transform;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.cxf.staxutils.DelegatingXMLStreamWriter;
+
+public class IgnoreNamespacesWriter extends DelegatingXMLStreamWriter {
+
+ public IgnoreNamespacesWriter(XMLStreamWriter writer) {
+ super(writer);
+ }
+
+ public void writeStartElement(String prefix, String local, String uri) throws XMLStreamException {
+ super.writeStartElement(local);
+ }
+
+ public void writeStartElement(String uri, String local) throws XMLStreamException {
+ super.writeStartElement(local);
+ }
+
+ public void setPrefix(String pfx, String uri) throws XMLStreamException {
+ // completed
+ }
+
+ public void setDefaultNamespace(String uri) throws XMLStreamException {
+ // completed
+ }
+}
Propchange: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/IgnoreNamespacesWriter.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/IgnoreNamespacesWriter.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/InTransformReader.java
URL: http://svn.apache.org/viewvc/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/InTransformReader.java?rev=1070973&view=auto
==============================================================================
--- cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/InTransformReader.java (added)
+++ cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/InTransformReader.java Tue Feb 15 17:07:08 2011
@@ -0,0 +1,126 @@
+/**
+ * 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.cxf.staxutils.transform;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.cxf.staxutils.DepthXMLStreamReader;
+
+public class InTransformReader extends DepthXMLStreamReader {
+
+ private static final String INTERN_NAMES = "org.codehaus.stax2.internNames";
+ private static final String INTERN_NS = "org.codehaus.stax2.internNsUris";
+
+ private QNamesMap inElementsMap;
+ private Map<QName, QName> inAppendMap = new HashMap<QName, QName>(5);
+ private Map<String, String> nsMap = new HashMap<String, String>(5);
+ private QName currentQName;
+ private QName previousQName;
+ private int previousDepth = -1;
+
+ public InTransformReader(XMLStreamReader reader,
+ Map<String, String> inMap,
+ Map<String, String> appendMap) {
+ super(reader);
+ inElementsMap = new QNamesMap(inMap == null ? 0 : inMap.size());
+ TransformUtils.convertToQNamesMap(inMap, inElementsMap, nsMap);
+ TransformUtils.convertToMapOfQNames(appendMap, inAppendMap);
+ }
+
+ public int next() throws XMLStreamException {
+ if (currentQName != null) {
+ return XMLStreamConstants.START_ELEMENT;
+ } else if (previousDepth != -1 && previousDepth == getDepth() + 1) {
+ previousDepth = -1;
+ return XMLStreamConstants.END_ELEMENT;
+ } else {
+ return super.next();
+ }
+ }
+
+ public Object getProperty(String name) throws IllegalArgumentException {
+
+ if (INTERN_NAMES.equals(name) || INTERN_NS.equals(name)) {
+ return Boolean.FALSE;
+ }
+ return super.getProperty(name);
+ }
+
+ public String getLocalName() {
+ QName cQName = getCurrentName();
+ if (cQName != null) {
+ String name = cQName.getLocalPart();
+ resetCurrentQName();
+ return name;
+ }
+ return super.getLocalName();
+ }
+
+ private QName getCurrentName() {
+ return currentQName != null ? currentQName
+ : previousQName != null ? previousQName : null;
+ }
+
+ private void resetCurrentQName() {
+ currentQName = previousQName;
+ previousQName = null;
+ }
+
+ public NamespaceContext getNamespaceContext() {
+ return new DelegatingNamespaceContext(super.getNamespaceContext(), nsMap);
+ }
+
+ public String getNamespaceURI() {
+
+ QName theName = readCurrentElement();
+ QName appendQName = inAppendMap.remove(theName);
+ if (appendQName != null) {
+ previousDepth = getDepth();
+ previousQName = theName;
+ currentQName = appendQName;
+ return currentQName.getNamespaceURI();
+ }
+ QName expected = inElementsMap.get(theName);
+ if (expected == null) {
+ return theName.getNamespaceURI();
+ }
+ currentQName = expected;
+ return currentQName.getNamespaceURI();
+ }
+
+ private QName readCurrentElement() {
+ if (currentQName != null) {
+ return currentQName;
+ }
+ String ns = super.getNamespaceURI();
+ String name = super.getLocalName();
+ return new QName(ns, name);
+ }
+
+ public QName getName() {
+ return new QName(getNamespaceURI(), getLocalName());
+ }
+}
Propchange: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/InTransformReader.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/InTransformReader.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/OutTransformWriter.java
URL: http://svn.apache.org/viewvc/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/OutTransformWriter.java?rev=1070973&view=auto
==============================================================================
--- cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/OutTransformWriter.java (added)
+++ cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/OutTransformWriter.java Tue Feb 15 17:07:08 2011
@@ -0,0 +1,202 @@
+/**
+ * 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.cxf.staxutils.transform;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.cxf.helpers.XMLUtils;
+import org.apache.cxf.staxutils.DelegatingXMLStreamWriter;
+
+public class OutTransformWriter extends DelegatingXMLStreamWriter {
+ private QNamesMap elementsMap;
+ private Map<QName, QName> appendMap = new HashMap<QName, QName>(5);
+ private Map<String, String> nsMap = new HashMap<String, String>(5);
+ private Set<String> prefixes = new HashSet<String>(2);
+ private Set<String> writtenUris = new HashSet<String>(2);
+
+ private Set<QName> dropElements;
+ private List<Integer> droppingIndexes = new LinkedList<Integer>();
+ private List<QName> appendedElements = new LinkedList<QName>();
+ private List<Integer> appendedIndexes = new LinkedList<Integer>();
+ private int currentDepth;
+ private boolean attributesToElements;
+
+ public OutTransformWriter(XMLStreamWriter writer,
+ Map<String, String> outMap,
+ Map<String, String> append,
+ List<String> dropEls,
+ boolean attributesToElements) {
+ super(writer);
+ elementsMap = new QNamesMap(outMap == null ? 0 : outMap.size());
+ TransformUtils.convertToQNamesMap(outMap, elementsMap, nsMap);
+ TransformUtils.convertToMapOfQNames(append, appendMap);
+ dropElements = XMLUtils.convertStringsToQNames(dropEls);
+ this.attributesToElements = attributesToElements;
+ }
+
+ @Override
+ public void writeNamespace(String prefix, String uri) throws XMLStreamException {
+ if (matchesDropped()) {
+ return;
+ }
+ if (writtenUris.contains(uri)) {
+ return;
+ }
+ String value = nsMap.get(uri);
+ if (value != null && value.length() == 0) {
+ return;
+ }
+ super.writeNamespace(prefix, value != null ? value : uri);
+ }
+
+ @Override
+ public void writeStartElement(String prefix, String local, String uri) throws XMLStreamException {
+ currentDepth++;
+ QName currentQName = new QName(uri, local);
+
+ QName appendQName = appendMap.get(currentQName);
+ if (appendQName != null && !appendedElements.contains(appendQName)) {
+ currentDepth++;
+ String theprefix = uri.equals(appendQName.getNamespaceURI()) ? prefix : "";
+ write(new QName(appendQName.getNamespaceURI(), appendQName.getLocalPart(), theprefix));
+ if (theprefix.length() > 0) {
+ super.writeNamespace(theprefix, uri);
+ writtenUris.add(uri);
+ }
+ appendedElements.add(appendQName);
+ appendedIndexes.add(currentDepth - 1);
+ }
+
+ if (dropElements.contains(currentQName)) {
+ droppingIndexes.add(currentDepth - 1);
+ return;
+ }
+ write(new QName(uri, local, prefix));
+ }
+
+ @Override
+ public void writeEndElement() throws XMLStreamException {
+ --currentDepth;
+ if (indexRemoved(droppingIndexes)) {
+ return;
+ }
+ super.writeEndElement();
+ if (indexRemoved(appendedIndexes)) {
+ super.writeEndElement();
+ }
+ }
+
+ @Override
+ public void writeCharacters(String text) throws XMLStreamException {
+ if (matchesDropped()) {
+ return;
+ }
+ super.writeCharacters(text);
+ }
+
+ private void write(QName qname) throws XMLStreamException {
+ QName name = elementsMap.get(qname);
+ if (name == null) {
+ name = qname;
+ }
+ boolean writeNs = false;
+ String prefix = "";
+ if (name.getNamespaceURI().length() > 0) {
+ if (qname.getPrefix().length() == 0) {
+ prefix = findUniquePrefix();
+ writeNs = true;
+ } else {
+ prefix = qname.getPrefix();
+ prefixes.add(prefix);
+ }
+ prefixes.add(prefix);
+ }
+ super.writeStartElement(prefix, name.getLocalPart(), name.getNamespaceURI());
+ if (writeNs) {
+ this.writeNamespace(prefix, name.getNamespaceURI());
+ }
+ }
+
+ private String findUniquePrefix() {
+
+ int i = 0;
+ while (true) {
+ if (!prefixes.contains("ps" + ++i)) {
+ return "ps" + i;
+ }
+ }
+ }
+
+ private boolean matchesDropped() {
+ int size = droppingIndexes.size();
+ if (size > 0 && droppingIndexes.get(size - 1) == currentDepth - 1) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean indexRemoved(List<Integer> indexes) {
+ int size = indexes.size();
+ if (size > 0 && indexes.get(size - 1) == currentDepth) {
+ indexes.remove(size - 1);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public NamespaceContext getNamespaceContext() {
+ return new DelegatingNamespaceContext(super.getNamespaceContext(), nsMap);
+ }
+
+ @Override
+ public void writeAttribute(String uri, String local, String value) throws XMLStreamException {
+ if (!attributesToElements) {
+ super.writeAttribute(uri, local, value);
+ } else {
+ writeAttributeAsElement(uri, local, value);
+ }
+ }
+
+ @Override
+ public void writeAttribute(String local, String value) throws XMLStreamException {
+ if (!attributesToElements) {
+ super.writeAttribute(local, value);
+ } else {
+ writeAttributeAsElement("", local, value);
+ }
+ }
+
+ private void writeAttributeAsElement(String uri, String local, String value)
+ throws XMLStreamException {
+ this.writeStartElement(uri, local);
+ this.writeCharacters(value);
+ this.writeEndElement();
+ }
+}
Propchange: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/OutTransformWriter.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/OutTransformWriter.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/QNamesMap.java
URL: http://svn.apache.org/viewvc/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/QNamesMap.java?rev=1070973&view=auto
==============================================================================
--- cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/QNamesMap.java (added)
+++ cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/QNamesMap.java Tue Feb 15 17:07:08 2011
@@ -0,0 +1,54 @@
+/**
+ * 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.cxf.staxutils.transform;
+
+import javax.xml.namespace.QName;
+
+class QNamesMap {
+ private QName[] keys;
+ private QName[] values;
+ private int index;
+
+ public QNamesMap(int size) {
+ keys = new QName[size];
+ values = new QName[size];
+ }
+
+ public void put(QName key, QName value) {
+ keys[index] = key;
+ values[index] = value;
+ index++;
+ }
+
+ public QName get(QName key) {
+ for (int i = 0; i < keys.length; i++) {
+ if (keys[i].getNamespaceURI().equals(key.getNamespaceURI())) {
+ if (keys[i].getLocalPart().equals(key.getLocalPart())) {
+ return values[i];
+ } else if ("*".equals(keys[i].getLocalPart())) {
+ // assume it is something like {somens}* : *
+ return "*".equals(values[i]) ? new QName(key.getLocalPart())
+ : new QName(values[i].getNamespaceURI(), key.getLocalPart());
+ }
+ }
+ }
+ return null;
+ }
+}
Propchange: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/QNamesMap.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/QNamesMap.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/TransformUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/TransformUtils.java?rev=1070973&view=auto
==============================================================================
--- cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/TransformUtils.java (added)
+++ cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/TransformUtils.java Tue Feb 15 17:07:08 2011
@@ -0,0 +1,106 @@
+/**
+ * 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.cxf.staxutils.transform;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.cxf.helpers.XMLUtils;
+import org.apache.cxf.staxutils.StaxStreamFilter;
+import org.apache.cxf.staxutils.StaxUtils;
+
+public final class TransformUtils {
+ private TransformUtils() {
+
+ }
+
+ public static XMLStreamReader createNewReaderIfNeeded(XMLStreamReader reader, InputStream is) {
+ return reader == null ? StaxUtils.createXMLStreamReader(is) : reader;
+ }
+
+ public static XMLStreamWriter createNewWriterIfNeeded(XMLStreamWriter writer, OutputStream os) {
+ return writer == null ? StaxUtils.createXMLStreamWriter(os) : writer;
+ }
+
+ public static XMLStreamWriter createTransformWriterIfNeeded(XMLStreamWriter writer,
+ OutputStream os,
+ Map<String, String> outElementsMap,
+ List<String> outDropElements,
+ Map<String, String> outAppendMap,
+ boolean attributesToElements) {
+ if (outElementsMap != null || outDropElements != null
+ || outAppendMap != null || attributesToElements) {
+ writer = createNewWriterIfNeeded(writer, os);
+ writer = new OutTransformWriter(writer, outElementsMap, outAppendMap,
+ outDropElements, attributesToElements);
+ }
+ return writer;
+ }
+
+ public static XMLStreamReader createTransformReaderIfNeeded(XMLStreamReader reader,
+ InputStream is,
+ List<String> inDropElements,
+ Map<String, String> inElementsMap,
+ Map<String, String> inAppendMap) {
+ if (inDropElements != null) {
+ Set<QName> dropElements = XMLUtils.convertStringsToQNames(inDropElements);
+ reader = StaxUtils.createFilteredReader(createNewReaderIfNeeded(reader, is),
+ new StaxStreamFilter(dropElements.toArray(new QName[]{})));
+ }
+ if (inElementsMap != null || inAppendMap != null) {
+ reader = new InTransformReader(createNewReaderIfNeeded(reader, is),
+ inElementsMap, inAppendMap);
+ }
+ return reader;
+ }
+
+ protected static void convertToQNamesMap(Map<String, String> map,
+ QNamesMap elementsMap,
+ Map<String, String> nsMap) {
+ if (map != null) {
+ for (Map.Entry<String, String> entry : map.entrySet()) {
+ QName lname = XMLUtils.convertStringToQName(entry.getKey());
+ QName rname = XMLUtils.convertStringToQName(entry.getValue());
+ elementsMap.put(lname, rname);
+ if (nsMap != null) {
+ nsMap.put(lname.getNamespaceURI(), rname.getNamespaceURI());
+ }
+ }
+ }
+ }
+
+ protected static void convertToMapOfQNames(Map<String, String> map,
+ Map<QName, QName> elementsMap) {
+ if (map != null) {
+ for (Map.Entry<String, String> entry : map.entrySet()) {
+ QName lname = XMLUtils.convertStringToQName(entry.getKey());
+ QName rname = XMLUtils.convertStringToQName(entry.getValue());
+ elementsMap.put(lname, rname);
+ }
+ }
+ }
+
+}
Propchange: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/TransformUtils.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/TransformUtils.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: cxf/trunk/rt/core/src/main/java/org/apache/cxf/feature/StaxTransformFeature.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/feature/StaxTransformFeature.java?rev=1070973&view=auto
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/feature/StaxTransformFeature.java (added)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/feature/StaxTransformFeature.java Tue Feb 15 17:07:08 2011
@@ -0,0 +1,86 @@
+/**
+ * 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.cxf.feature;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.common.injection.NoJSR250Annotations;
+import org.apache.cxf.interceptor.InterceptorProvider;
+import org.apache.cxf.interceptor.transform.TransformInInterceptor;
+import org.apache.cxf.interceptor.transform.TransformOutInterceptor;
+
+/**
+ * <pre>
+ * <![CDATA[
+ <jaxws:endpoint ...>
+ <jaxws:features>
+ <bean class="org.apache.cxf.feature.StaxTransformFeature"/>
+ </jaxws:features>
+ </jaxws:endpoint>
+ ]]>
+ </pre>
+ */
+@NoJSR250Annotations
+public class StaxTransformFeature extends AbstractFeature {
+
+ private TransformInInterceptor in = new TransformInInterceptor();
+ private TransformOutInterceptor out = new TransformOutInterceptor();
+
+ public StaxTransformFeature() {
+ //
+ }
+
+ @Override
+ protected void initializeProvider(InterceptorProvider provider, Bus bus) {
+
+ provider.getInInterceptors().add(in);
+ provider.getOutInterceptors().add(out);
+ provider.getOutFaultInterceptors().add(out);
+ }
+
+ public void setOutTransformElements(Map<String, String> outElements) {
+ out.setOutTransformElements(outElements);
+ }
+
+ public void setAttributesToElements(boolean value) {
+ out.setAttributesToElements(value);
+ }
+
+ public void setOutAppendElements(Map<String, String> map) {
+ out.setOutAppendElements(map);
+ }
+
+ public void setOutDropElements(List<String> dropElementsSet) {
+ out.setOutDropElements(dropElementsSet);
+ }
+
+ public void setInAppendElements(Map<String, String> inElements) {
+ in.setInAppendElements(inElements);
+ }
+
+ public void setInDropElements(List<String> dropElementsSet) {
+ in.setInDropElements(dropElementsSet);
+ }
+
+ public void setInTransformElements(Map<String, String> inElements) {
+ in.setInTransformElements(inElements);
+ }
+}
Propchange: cxf/trunk/rt/core/src/main/java/org/apache/cxf/feature/StaxTransformFeature.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/rt/core/src/main/java/org/apache/cxf/feature/StaxTransformFeature.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxOutInterceptor.java?rev=1070973&r1=1070972&r2=1070973&view=diff
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxOutInterceptor.java (original)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxOutInterceptor.java Tue Feb 15 17:07:08 2011
@@ -24,14 +24,12 @@ import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import java.util.ResourceBundle;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import com.sun.xml.fastinfoset.stax.StAXDocumentSerializer;
-import org.apache.cxf.common.i18n.BundleUtils;
import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageUtils;
@@ -45,8 +43,7 @@ import org.apache.cxf.phase.Phase;
public class FIStaxOutInterceptor extends AbstractPhaseInterceptor<Message> {
public static final String FI_ENABLED = "org.apache.cxf.fastinfoset.enabled";
private static final String OUTPUT_STREAM_HOLDER = FIStaxOutInterceptor.class.getName() + ".outputstream";
- private static final FIStaxOutEndingInterceptor ENDING = new FIStaxOutEndingInterceptor();
- private static final ResourceBundle BUNDLE = BundleUtils.getBundle(FIStaxOutInterceptor.class);
+ private static final StaxOutEndingInterceptor ENDING = new StaxOutEndingInterceptor(OUTPUT_STREAM_HOLDER);
boolean force;
@@ -143,38 +140,6 @@ public class FIStaxOutInterceptor extend
*/
return new StAXDocumentSerializer(out);
}
- public static class FIStaxOutEndingInterceptor extends AbstractPhaseInterceptor<Message> {
- public FIStaxOutEndingInterceptor() {
- super(Phase.PRE_STREAM_ENDING);
- getAfter().add(AttachmentOutInterceptor.AttachmentOutEndingInterceptor.class.getName());
- }
-
- public void handleMessage(Message message) throws Fault {
- try {
- XMLStreamWriter xtw = message.getContent(XMLStreamWriter.class);
- if (xtw != null) {
- xtw.writeEndDocument();
- xtw.flush();
- xtw.close();
- }
- /*
- if (xtw instanceof StAXDocumentSerializer) {
- ((StAXDocumentSerializer)xtw).setOutputStream(null);
- message.getExchange().get(Endpoint.class)
- .put(StAXDocumentSerializer.class.getName(), xtw);
- }
- */
-
- OutputStream os = (OutputStream)message.get(OUTPUT_STREAM_HOLDER);
- if (os != null) {
- message.setContent(OutputStream.class, os);
- }
- message.removeContent(XMLStreamWriter.class);
- } catch (XMLStreamException e) {
- throw new Fault(new org.apache.cxf.common.i18n.Message("STAX_WRITE_EXC", BUNDLE), e);
- }
- }
-
- }
+
}
Added: cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutEndingInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutEndingInterceptor.java?rev=1070973&view=auto
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutEndingInterceptor.java (added)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutEndingInterceptor.java Tue Feb 15 17:07:08 2011
@@ -0,0 +1,63 @@
+/**
+ * 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.cxf.interceptor;
+
+import java.io.OutputStream;
+import java.util.ResourceBundle;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.cxf.common.i18n.BundleUtils;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.phase.AbstractPhaseInterceptor;
+import org.apache.cxf.phase.Phase;
+
+public class StaxOutEndingInterceptor extends AbstractPhaseInterceptor<Message> {
+
+ private static final ResourceBundle BUNDLE = BundleUtils.getBundle(StaxOutEndingInterceptor.class);
+
+ private String outStreamHolder;
+
+ public StaxOutEndingInterceptor(String outStreamHolder) {
+ super(Phase.PRE_STREAM_ENDING);
+ getAfter().add(AttachmentOutInterceptor.AttachmentOutEndingInterceptor.class.getName());
+ this.outStreamHolder = outStreamHolder;
+ }
+
+ public void handleMessage(Message message) throws Fault {
+ try {
+ XMLStreamWriter xtw = message.getContent(XMLStreamWriter.class);
+ if (xtw != null) {
+ xtw.writeEndDocument();
+ xtw.flush();
+ xtw.close();
+ }
+
+ OutputStream os = (OutputStream)message.get(outStreamHolder);
+ if (os != null) {
+ message.setContent(OutputStream.class, os);
+ }
+ message.removeContent(XMLStreamWriter.class);
+ } catch (XMLStreamException e) {
+ throw new Fault(new org.apache.cxf.common.i18n.Message("STAX_WRITE_EXC", BUNDLE), e);
+ }
+ }
+
+}
Propchange: cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutEndingInterceptor.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutEndingInterceptor.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java?rev=1070973&r1=1070972&r2=1070973&view=diff
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java (original)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java Tue Feb 15 17:07:08 2011
@@ -44,7 +44,7 @@ import org.apache.cxf.staxutils.StaxUtil
public class StaxOutInterceptor extends AbstractPhaseInterceptor<Message> {
public static final String OUTPUT_STREAM_HOLDER = StaxOutInterceptor.class.getName() + ".outputstream";
public static final String FORCE_START_DOCUMENT = "org.apache.cxf.stax.force-start-document";
- public static final StaxOutEndingInterceptor ENDING = new StaxOutEndingInterceptor();
+ public static final StaxOutEndingInterceptor ENDING = new StaxOutEndingInterceptor(OUTPUT_STREAM_HOLDER);
private static final ResourceBundle BUNDLE = BundleUtils.getBundle(StaxOutInterceptor.class);
private static Map<Object, XMLOutputFactory> factories = new HashMap<Object, XMLOutputFactory>();
@@ -151,30 +151,4 @@ public class StaxOutInterceptor extends
return null;
}
- public static class StaxOutEndingInterceptor extends AbstractPhaseInterceptor<Message> {
- public StaxOutEndingInterceptor() {
- super(Phase.PRE_STREAM_ENDING);
- getAfter().add(AttachmentOutInterceptor.AttachmentOutEndingInterceptor.class.getName());
- }
-
- public void handleMessage(Message message) throws Fault {
- try {
- XMLStreamWriter xtw = message.getContent(XMLStreamWriter.class);
- if (xtw != null) {
- xtw.writeEndDocument();
- xtw.flush();
- xtw.close();
- }
-
- OutputStream os = (OutputStream)message.get(OUTPUT_STREAM_HOLDER);
- if (os != null) {
- message.setContent(OutputStream.class, os);
- }
- message.removeContent(XMLStreamWriter.class);
- } catch (XMLStreamException e) {
- throw new Fault(new org.apache.cxf.common.i18n.Message("STAX_WRITE_EXC", BUNDLE), e);
- }
- }
-
- }
}
Added: cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformInInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformInInterceptor.java?rev=1070973&view=auto
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformInInterceptor.java (added)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformInInterceptor.java Tue Feb 15 17:07:08 2011
@@ -0,0 +1,81 @@
+/**
+ * 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.cxf.interceptor.transform;
+
+
+import java.io.InputStream;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.cxf.interceptor.StaxInInterceptor;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.phase.AbstractPhaseInterceptor;
+import org.apache.cxf.phase.Phase;
+import org.apache.cxf.staxutils.transform.TransformUtils;
+
+
+/**
+ * Creates an XMLStreamReader from the InputStream on the Message.
+ */
+public class TransformInInterceptor extends AbstractPhaseInterceptor<Message> {
+
+ protected List<String> inDropElements;
+ protected Map<String, String> inElementsMap;
+ protected Map<String, String> inAppendMap;
+
+ public TransformInInterceptor() {
+ super(Phase.POST_STREAM);
+ addBefore(StaxInInterceptor.class.getName());
+ }
+
+ public void handleMessage(Message message) {
+ XMLStreamReader reader = message.getContent(XMLStreamReader.class);
+ InputStream is = message.getContent(InputStream.class);
+
+ XMLStreamReader transformReader = createTransformReaderIfNeeded(reader, is);
+ if (transformReader != null) {
+ message.setContent(XMLStreamReader.class, transformReader);
+ message.removeContent(InputStream.class);
+ }
+
+ }
+
+ protected XMLStreamReader createTransformReaderIfNeeded(XMLStreamReader reader, InputStream is) {
+ return TransformUtils.createTransformReaderIfNeeded(reader, is,
+ inDropElements,
+ inElementsMap,
+ inAppendMap);
+ }
+
+ public void setInAppendElements(Map<String, String> inElements) {
+ this.inAppendMap = inElements;
+ }
+
+ public void setInDropElements(List<String> dropElementsSet) {
+ this.inDropElements = dropElementsSet;
+ }
+
+ public void setInTransformElements(Map<String, String> inElements) {
+ this.inElementsMap = inElements;
+ }
+
+}
Propchange: cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformInInterceptor.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformInInterceptor.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformOutInterceptor.java?rev=1070973&view=auto
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformOutInterceptor.java (added)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformOutInterceptor.java Tue Feb 15 17:07:08 2011
@@ -0,0 +1,109 @@
+/**
+ * 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.cxf.interceptor.transform;
+
+
+import java.io.OutputStream;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor;
+import org.apache.cxf.interceptor.StaxOutEndingInterceptor;
+import org.apache.cxf.interceptor.StaxOutInterceptor;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageUtils;
+import org.apache.cxf.phase.AbstractPhaseInterceptor;
+import org.apache.cxf.phase.Phase;
+import org.apache.cxf.staxutils.transform.TransformUtils;
+
+
+/**
+ * Creates an XMLStreamReader from the InputStream on the Message.
+ */
+public class TransformOutInterceptor extends AbstractPhaseInterceptor<Message> {
+
+ private static final String OUTPUT_STREAM_HOLDER =
+ TransformOutInterceptor.class.getName() + ".outputstream";
+ private static final StaxOutEndingInterceptor ENDING = new StaxOutEndingInterceptor(OUTPUT_STREAM_HOLDER);
+
+ private Map<String, String> outElementsMap;
+ private Map<String, String> outAppendMap;
+ private List<String> outDropElements;
+ private boolean attributesToElements;
+
+ public TransformOutInterceptor() {
+ super(Phase.PRE_STREAM);
+ addBefore(StaxOutInterceptor.class.getName());
+ }
+
+ @Override
+ public void handleFault(Message message) {
+ super.handleFault(message);
+ OutputStream os = (OutputStream)message.get(OUTPUT_STREAM_HOLDER);
+ if (os != null) {
+ message.setContent(OutputStream.class, os);
+ }
+ }
+
+ public void handleMessage(Message message) {
+ XMLStreamWriter writer = message.getContent(XMLStreamWriter.class);
+ OutputStream out = message.getContent(OutputStream.class);
+
+ XMLStreamWriter transformWriter = createTransformWriterIfNeeded(writer, out);
+ if (transformWriter != null) {
+ message.setContent(XMLStreamWriter.class, transformWriter);
+ if (MessageUtils.isRequestor(message)) {
+ message.removeContent(OutputStream.class);
+ message.put(OUTPUT_STREAM_HOLDER, out);
+ message.put(AbstractOutDatabindingInterceptor.DISABLE_OUTPUTSTREAM_OPTIMIZATION,
+ Boolean.TRUE);
+ message.getInterceptorChain().add(ENDING);
+ }
+ }
+ }
+
+ protected XMLStreamWriter createTransformWriterIfNeeded(XMLStreamWriter writer, OutputStream os) {
+ return TransformUtils.createTransformWriterIfNeeded(writer, os,
+ outElementsMap,
+ outDropElements,
+ outAppendMap,
+ attributesToElements);
+ }
+
+ public void setOutTransformElements(Map<String, String> outElements) {
+ this.outElementsMap = outElements;
+ }
+
+ public void setOutAppendElements(Map<String, String> map) {
+ this.outAppendMap = map;
+ }
+
+ public void setOutDropElements(List<String> dropElementsSet) {
+ this.outDropElements = dropElementsSet;
+ }
+
+ public void setAttributesToElements(boolean value) {
+ this.attributesToElements = value;
+ }
+
+
+}
Propchange: cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformOutInterceptor.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformOutInterceptor.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java?rev=1070973&r1=1070972&r2=1070973&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java Tue Feb 15 17:07:08 2011
@@ -72,6 +72,7 @@ import org.apache.cxf.common.xmlschema.X
import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.helpers.IOUtils;
+import org.apache.cxf.helpers.XMLUtils;
import org.apache.cxf.jaxb.JAXBBeanInfo;
import org.apache.cxf.jaxb.JAXBContextProxy;
import org.apache.cxf.jaxb.JAXBUtils;
@@ -1079,7 +1080,7 @@ public class WadlGenerator implements Re
name = type.getAnnotation(XMLName.class);
}
if (name != null) {
- QName qname = JAXRSUtils.convertStringToQName(name.value(), name.prefix());
+ QName qname = XMLUtils.convertStringToQName(name.value(), name.prefix());
if (qname.getPrefix().length() > 0) {
return qname;
} else {
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java?rev=1070973&r1=1070972&r2=1070973&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java Tue Feb 15 17:07:08 2011
@@ -27,12 +27,8 @@ import java.lang.annotation.Annotation;
import java.lang.reflect.Array;
import java.lang.reflect.Type;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
@@ -55,10 +51,7 @@ import javax.xml.bind.annotation.XmlAnyE
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import javax.xml.namespace.NamespaceContext;
import javax.xml.namespace.QName;
-import javax.xml.stream.XMLStreamConstants;
-import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;
import javax.xml.validation.Schema;
@@ -79,10 +72,7 @@ import org.apache.cxf.jaxrs.utils.Resour
import org.apache.cxf.jaxrs.utils.schemas.SchemaHandler;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.PhaseInterceptorChain;
-import org.apache.cxf.staxutils.DelegatingXMLStreamWriter;
-import org.apache.cxf.staxutils.DepthXMLStreamReader;
-import org.apache.cxf.staxutils.StaxStreamFilter;
-import org.apache.cxf.staxutils.StaxUtils;
+import org.apache.cxf.staxutils.transform.TransformUtils;
public abstract class AbstractJAXBProvider extends AbstractConfigurableProvider
implements MessageBodyReader<Object>, MessageBodyWriter<Object> {
@@ -583,74 +573,6 @@ public abstract class AbstractJAXBProvid
this.inDropElements = dropElementsSet;
}
- protected static Set<QName> convertToSetOfQNames(List<String> dropEls) {
- Set<QName> dropElements = Collections.emptySet();
- if (dropEls != null) {
- dropElements = new LinkedHashSet<QName>(dropEls.size());
- for (String val : dropEls) {
- dropElements.add(JAXRSUtils.convertStringToQName(val));
- }
- }
- return dropElements;
- }
-
- protected XMLStreamReader createTransformReaderIfNeeded(XMLStreamReader reader, InputStream is) {
- if (inDropElements != null) {
- Set<QName> dropElements = convertToSetOfQNames(inDropElements);
- reader = StaxUtils.createFilteredReader(createNewReaderIfNeeded(reader, is),
- new StaxStreamFilter(dropElements.toArray(new QName[]{})));
- }
- if (inElementsMap != null || inAppendMap != null) {
- reader = new InTransformReader(createNewReaderIfNeeded(reader, is),
- inElementsMap, inAppendMap);
- }
- return reader;
- }
-
- protected XMLStreamWriter createTransformWriterIfNeeded(XMLStreamWriter writer,
- OutputStream os) {
- if (outElementsMap != null || outDropElements != null
- || outAppendMap != null || attributesToElements) {
- writer = createNewWriterIfNeeded(writer, os);
- writer = new OutTransformWriter(writer, outElementsMap, outAppendMap,
- outDropElements, attributesToElements);
- }
- return writer;
- }
-
- protected XMLStreamReader createNewReaderIfNeeded(XMLStreamReader reader, InputStream is) {
- return reader == null ? StaxUtils.createXMLStreamReader(is) : reader;
- }
-
- protected XMLStreamWriter createNewWriterIfNeeded(XMLStreamWriter writer, OutputStream os) {
- return writer == null ? StaxUtils.createXMLStreamWriter(os) : writer;
- }
-
- protected static void convertToQNamesMap(Map<String, String> map,
- QNamesMap elementsMap,
- Map<String, String> nsMap) {
- if (map != null) {
- for (Map.Entry<String, String> entry : map.entrySet()) {
- QName lname = JAXRSUtils.convertStringToQName(entry.getKey());
- QName rname = JAXRSUtils.convertStringToQName(entry.getValue());
- elementsMap.put(lname, rname);
- if (nsMap != null) {
- nsMap.put(lname.getNamespaceURI(), rname.getNamespaceURI());
- }
- }
- }
- }
-
- protected static void convertToMapOfQNames(Map<String, String> map,
- Map<QName, QName> elementsMap) {
- if (map != null) {
- for (Map.Entry<String, String> entry : map.entrySet()) {
- QName lname = JAXRSUtils.convertStringToQName(entry.getKey());
- QName rname = JAXRSUtils.convertStringToQName(entry.getValue());
- elementsMap.put(lname, rname);
- }
- }
- }
public void setAttributesToElements(boolean value) {
@@ -710,323 +632,19 @@ public abstract class AbstractJAXBProvid
}
- protected static class OutTransformWriter extends DelegatingXMLStreamWriter {
- private QNamesMap elementsMap;
- private Map<QName, QName> appendMap = new HashMap<QName, QName>(5);
- private Map<String, String> nsMap = new HashMap<String, String>(5);
- private Set<String> prefixes = new HashSet<String>(2);
- private Set<String> writtenUris = new HashSet<String>(2);
-
- private Set<QName> dropElements;
- private List<Integer> droppingIndexes = new LinkedList<Integer>();
- private List<QName> appendedElements = new LinkedList<QName>();
- private List<Integer> appendedIndexes = new LinkedList<Integer>();
- private int currentDepth;
- private boolean attributesToElements;
-
- public OutTransformWriter(XMLStreamWriter writer,
- Map<String, String> outMap,
- Map<String, String> append,
- List<String> dropEls,
- boolean attributesToElements) {
- super(writer);
- elementsMap = new QNamesMap(outMap == null ? 0 : outMap.size());
- convertToQNamesMap(outMap, elementsMap, nsMap);
- convertToMapOfQNames(append, appendMap);
- dropElements = convertToSetOfQNames(dropEls);
- this.attributesToElements = attributesToElements;
- }
-
- @Override
- public void writeNamespace(String prefix, String uri) throws XMLStreamException {
- if (matchesDropped()) {
- return;
- }
- if (writtenUris.contains(uri)) {
- return;
- }
- String value = nsMap.get(uri);
- if (value != null && value.length() == 0) {
- return;
- }
- super.writeNamespace(prefix, value != null ? value : uri);
- }
-
- @Override
- public void writeStartElement(String prefix, String local, String uri) throws XMLStreamException {
- currentDepth++;
- QName currentQName = new QName(uri, local);
-
- QName appendQName = appendMap.get(currentQName);
- if (appendQName != null && !appendedElements.contains(appendQName)) {
- currentDepth++;
- String theprefix = uri.equals(appendQName.getNamespaceURI()) ? prefix : "";
- write(new QName(appendQName.getNamespaceURI(), appendQName.getLocalPart(), theprefix));
- if (theprefix.length() > 0) {
- super.writeNamespace(theprefix, uri);
- writtenUris.add(uri);
- }
- appendedElements.add(appendQName);
- appendedIndexes.add(currentDepth - 1);
- }
-
- if (dropElements.contains(currentQName)) {
- droppingIndexes.add(currentDepth - 1);
- return;
- }
- write(new QName(uri, local, prefix));
- }
-
- @Override
- public void writeEndElement() throws XMLStreamException {
- --currentDepth;
- if (indexRemoved(droppingIndexes)) {
- return;
- }
- super.writeEndElement();
- if (indexRemoved(appendedIndexes)) {
- super.writeEndElement();
- }
- }
-
- @Override
- public void writeCharacters(String text) throws XMLStreamException {
- if (matchesDropped()) {
- return;
- }
- super.writeCharacters(text);
- }
-
- private void write(QName qname) throws XMLStreamException {
- QName name = elementsMap.get(qname);
- if (name == null) {
- name = qname;
- }
- boolean writeNs = false;
- String prefix = "";
- if (name.getNamespaceURI().length() > 0) {
- if (qname.getPrefix().length() == 0) {
- prefix = findUniquePrefix();
- writeNs = true;
- } else {
- prefix = qname.getPrefix();
- prefixes.add(prefix);
- }
- prefixes.add(prefix);
- }
- super.writeStartElement(prefix, name.getLocalPart(), name.getNamespaceURI());
- if (writeNs) {
- this.writeNamespace(prefix, name.getNamespaceURI());
- }
- }
-
- private String findUniquePrefix() {
-
- int i = 0;
- while (true) {
- if (!prefixes.contains("ps" + ++i)) {
- return "ps" + i;
- }
- }
- }
-
- private boolean matchesDropped() {
- int size = droppingIndexes.size();
- if (size > 0 && droppingIndexes.get(size - 1) == currentDepth - 1) {
- return true;
- }
- return false;
- }
-
- private boolean indexRemoved(List<Integer> indexes) {
- int size = indexes.size();
- if (size > 0 && indexes.get(size - 1) == currentDepth) {
- indexes.remove(size - 1);
- return true;
- }
- return false;
- }
-
- @Override
- public NamespaceContext getNamespaceContext() {
- return new DelegatingNamespaceContext(super.getNamespaceContext(), nsMap);
- }
-
- @Override
- public void writeAttribute(String uri, String local, String value) throws XMLStreamException {
- if (!attributesToElements) {
- super.writeAttribute(uri, local, value);
- } else {
- writeAttributeAsElement(uri, local, value);
- }
- }
-
- @Override
- public void writeAttribute(String local, String value) throws XMLStreamException {
- if (!attributesToElements) {
- super.writeAttribute(local, value);
- } else {
- writeAttributeAsElement("", local, value);
- }
- }
-
- private void writeAttributeAsElement(String uri, String local, String value)
- throws XMLStreamException {
- this.writeStartElement(uri, local);
- this.writeCharacters(value);
- this.writeEndElement();
- }
- }
-
- private static class QNamesMap {
- private QName[] keys;
- private QName[] values;
- private int index;
-
- public QNamesMap(int size) {
- keys = new QName[size];
- values = new QName[size];
- }
-
- public void put(QName key, QName value) {
- keys[index] = key;
- values[index] = value;
- index++;
- }
-
- public QName get(QName key) {
- for (int i = 0; i < keys.length; i++) {
- if (keys[i].getNamespaceURI().equals(key.getNamespaceURI())) {
- if (keys[i].getLocalPart().equals(key.getLocalPart())) {
- return values[i];
- } else if ("*".equals(keys[i].getLocalPart())) {
- // assume it is something like {somens}* : *
- return "*".equals(values[i]) ? new QName(key.getLocalPart())
- : new QName(values[i].getNamespaceURI(), key.getLocalPart());
- }
- }
- }
- return null;
- }
+ protected XMLStreamWriter createTransformWriterIfNeeded(XMLStreamWriter writer,
+ OutputStream os) {
+ return TransformUtils.createTransformWriterIfNeeded(writer, os,
+ outElementsMap,
+ outDropElements,
+ outAppendMap,
+ attributesToElements);
}
- protected static class InTransformReader extends DepthXMLStreamReader {
-
- private static final String INTERN_NAMES = "org.codehaus.stax2.internNames";
- private static final String INTERN_NS = "org.codehaus.stax2.internNsUris";
-
- private QNamesMap inElementsMap;
- private Map<QName, QName> inAppendMap = new HashMap<QName, QName>(5);
- private Map<String, String> nsMap = new HashMap<String, String>(5);
- private QName currentQName;
- private QName previousQName;
- private int previousDepth = -1;
-
- public InTransformReader(XMLStreamReader reader,
- Map<String, String> inMap,
- Map<String, String> appendMap) {
- super(reader);
- inElementsMap = new QNamesMap(inMap == null ? 0 : inMap.size());
- convertToQNamesMap(inMap, inElementsMap, nsMap);
- convertToMapOfQNames(appendMap, inAppendMap);
- }
-
- public int next() throws XMLStreamException {
- if (currentQName != null) {
- return XMLStreamConstants.START_ELEMENT;
- } else if (previousDepth != -1 && previousDepth == getDepth() + 1) {
- previousDepth = -1;
- return XMLStreamConstants.END_ELEMENT;
- } else {
- return super.next();
- }
- }
-
- public Object getProperty(String name) throws IllegalArgumentException {
-
- if (INTERN_NAMES.equals(name) || INTERN_NS.equals(name)) {
- return Boolean.FALSE;
- }
- return super.getProperty(name);
- }
-
- public String getLocalName() {
- QName cQName = getCurrentName();
- if (cQName != null) {
- String name = cQName.getLocalPart();
- resetCurrentQName();
- return name;
- }
- return super.getLocalName();
- }
-
- private QName getCurrentName() {
- return currentQName != null ? currentQName
- : previousQName != null ? previousQName : null;
- }
-
- private void resetCurrentQName() {
- currentQName = previousQName;
- previousQName = null;
- }
-
- public NamespaceContext getNamespaceContext() {
- return new DelegatingNamespaceContext(super.getNamespaceContext(), nsMap);
- }
-
- public String getNamespaceURI() {
-
- QName theName = readCurrentElement();
- QName appendQName = inAppendMap.remove(theName);
- if (appendQName != null) {
- previousDepth = getDepth();
- previousQName = theName;
- currentQName = appendQName;
- return currentQName.getNamespaceURI();
- }
- QName expected = inElementsMap.get(theName);
- if (expected == null) {
- return theName.getNamespaceURI();
- }
- currentQName = expected;
- return currentQName.getNamespaceURI();
- }
-
- private QName readCurrentElement() {
- if (currentQName != null) {
- return currentQName;
- }
- String ns = super.getNamespaceURI();
- String name = super.getLocalName();
- return new QName(ns, name);
- }
- }
-
- private static class DelegatingNamespaceContext implements NamespaceContext {
-
- private NamespaceContext nc;
- private Map<String, String> nsMap;
-
- public DelegatingNamespaceContext(NamespaceContext nc, Map<String, String> nsMap) {
- this.nc = nc;
- this.nsMap = nsMap;
- }
-
- public String getNamespaceURI(String prefix) {
- return nc.getNamespaceURI(prefix);
- }
-
- public String getPrefix(String ns) {
- String value = nsMap.get(ns);
- if (value != null && value.length() == 0) {
- return null;
- }
- return value != null ? nc.getPrefix(value) : nc.getPrefix(ns);
- }
-
- public Iterator getPrefixes(String ns) {
- return nc.getPrefixes(ns);
- }
-
+ protected XMLStreamReader createTransformReaderIfNeeded(XMLStreamReader reader, InputStream is) {
+ return TransformUtils.createTransformReaderIfNeeded(reader, is,
+ inDropElements,
+ inElementsMap,
+ inAppendMap);
}
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java?rev=1070973&r1=1070972&r2=1070973&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java Tue Feb 15 17:07:08 2011
@@ -62,6 +62,7 @@ import org.apache.cxf.message.Attachment
import org.apache.cxf.message.Message;
import org.apache.cxf.staxutils.DepthXMLStreamReader;
import org.apache.cxf.staxutils.StaxUtils;
+import org.apache.cxf.staxutils.transform.TransformUtils;
@Produces({"application/xml", "application/*+xml", "text/xml" })
@Consumes({"application/xml", "application/*+xml", "text/xml" })
@@ -207,7 +208,7 @@ public class JAXBElementProvider extends
reader = createTransformReaderIfNeeded(reader, is);
if (InjectionUtils.isSupportedCollectionOrArray(type)) {
- return new JAXBCollectionWrapperReader(createNewReaderIfNeeded(reader, is));
+ return new JAXBCollectionWrapperReader(TransformUtils.createNewReaderIfNeeded(reader, is));
} else {
return reader;
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONUtils.java?rev=1070973&r1=1070972&r2=1070973&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONUtils.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONUtils.java Tue Feb 15 17:07:08 2011
@@ -41,6 +41,7 @@ import org.apache.cxf.common.WSDLConstan
import org.apache.cxf.common.util.StringUtils;
import org.apache.cxf.staxutils.DelegatingXMLStreamWriter;
import org.apache.cxf.staxutils.DepthXMLStreamReader;
+import org.apache.cxf.staxutils.transform.IgnoreNamespacesWriter;
import org.codehaus.jettison.AbstractXMLStreamWriter;
import org.codehaus.jettison.badgerfish.BadgerFishXMLInputFactory;
import org.codehaus.jettison.badgerfish.BadgerFishXMLOutputFactory;
@@ -118,7 +119,7 @@ public final class JSONUtils {
public static XMLStreamWriter createIgnoreNsWriterIfNeeded(XMLStreamWriter writer,
boolean ignoreNamespaces) {
- return ignoreNamespaces ? new IgnoreNsWriter(writer) : writer;
+ return ignoreNamespaces ? new IgnoreNamespacesWriter(writer) : writer;
}
private static String getKey(MappedNamespaceConvention convention, QName qname) throws Exception {
@@ -286,26 +287,5 @@ public final class JSONUtils {
}
- private static class IgnoreNsWriter extends DelegatingXMLStreamWriter {
-
- public IgnoreNsWriter(XMLStreamWriter writer) {
- super(writer);
- }
-
- public void writeStartElement(String prefix, String local, String uri) throws XMLStreamException {
- super.writeStartElement(local);
- }
-
- public void writeStartElement(String uri, String local) throws XMLStreamException {
- super.writeStartElement(local);
- }
-
- public void setPrefix(String pfx, String uri) throws XMLStreamException {
- // completed
- }
-
- public void setDefaultNamespace(String uri) throws XMLStreamException {
- // completed
- }
- }
+
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java?rev=1070973&r1=1070972&r2=1070973&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java Tue Feb 15 17:07:08 2011
@@ -70,6 +70,7 @@ import org.apache.cxf.common.i18n.Bundle
import org.apache.cxf.common.logging.LogUtils;
import org.apache.cxf.common.util.PackageUtils;
import org.apache.cxf.common.util.StringUtils;
+import org.apache.cxf.helpers.XMLUtils;
import org.apache.cxf.jaxrs.ext.MessageContext;
import org.apache.cxf.jaxrs.ext.MessageContextImpl;
import org.apache.cxf.jaxrs.ext.ProtocolHeaders;
@@ -1215,21 +1216,7 @@ public final class JAXRSUtils {
}
public static QName convertStringToQName(String name) {
- return convertStringToQName(name, "");
+ return XMLUtils.convertStringToQName(name, "");
}
- public static QName convertStringToQName(String name, String prefix) {
- int ind1 = name.indexOf('{');
- if (ind1 != 0) {
- return new QName(name);
- }
-
- int ind2 = name.indexOf('}');
- if (ind2 <= ind1 + 1 || ind2 >= name.length() - 1) {
- return null;
- }
- String ns = name.substring(ind1 + 1, ind2);
- String localName = name.substring(ind2 + 1);
- return new QName(ns, localName, prefix);
- }
}
Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java?rev=1070973&r1=1070972&r2=1070973&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java Tue Feb 15 17:07:08 2011
@@ -45,13 +45,17 @@ import org.apache.commons.httpclient.met
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.cxf.Bus;
+import org.apache.cxf.endpoint.Client;
import org.apache.cxf.feature.AbstractFeature;
+import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.helpers.IOUtils;
import org.apache.cxf.interceptor.FIStaxInInterceptor;
import org.apache.cxf.interceptor.FIStaxOutInterceptor;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.InterceptorProvider;
+import org.apache.cxf.interceptor.transform.TransformInInterceptor;
+import org.apache.cxf.interceptor.transform.TransformOutInterceptor;
import org.apache.cxf.io.CachedOutputStream;
import org.apache.cxf.jaxrs.client.ClientConfiguration;
import org.apache.cxf.jaxrs.client.JAXRSClientFactory;
@@ -151,6 +155,45 @@ public class JAXRSSoapBookTest extends A
}
@Test
+ public void testGetBookTransform() throws Exception {
+
+ String address = "http://localhost:" + PORT
+ + "/test/services/rest-transform/bookstore/books/123";
+ WebClient client = WebClient.create(address);
+ Response r = client.get();
+ String str = getStringFromInputStream((InputStream)r.getEntity());
+ assertTrue(str.contains("TheBook"));
+ }
+
+ @Test
+ public void testPostBookTransform() throws Exception {
+
+ String address = "http://localhost:" + PORT
+ + "/test/services/rest-transform/bookstore/books";
+
+ TransformOutInterceptor out = new TransformOutInterceptor();
+ out.setOutTransformElements(
+ Collections.singletonMap("{http://www.example.org/books}*",
+ "{http://www.example.org/super-books}*"));
+
+ TransformInInterceptor in = new TransformInInterceptor();
+ Map<String, String> map = new HashMap<String, String>();
+
+ // If Book2 didn't have {http://www.example.org/books}Book
+ // then we'd just do '"*" : "{http://www.example.org/books}*'
+ // but given that we have TheBook being returned, we need
+ map.put("TheBook", "{http://www.example.org/books}Book");
+ map.put("id", "{http://www.example.org/books}id");
+ in.setInTransformElements(map);
+
+ WebClient client = WebClient.create(address);
+ WebClient.getConfig(client).getInInterceptors().add(in);
+ WebClient.getConfig(client).getOutInterceptors().add(out);
+ Book2 book = client.accept("text/xml").post(new Book2(), Book2.class);
+ assertEquals(124L, book.getId());
+ }
+
+ @Test
public void testGetBookFastinfoset() throws Exception {
JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
@@ -630,6 +673,35 @@ public class JAXRSSoapBookTest extends A
}
@Test
+ public void testGetUnqualifiedBookSoap() throws Exception {
+ String wsdlAddress =
+ "http://localhost:" + PORT + "/test/services/soap-transform/bookservice?wsdl";
+ URL wsdlUrl = new URL(wsdlAddress);
+ BookSoapService service =
+ new BookSoapService(wsdlUrl,
+ new QName("http://books.com", "BookService"));
+ BookStoreJaxrsJaxws store = service.getBookPort();
+
+ TransformInInterceptor in = new TransformInInterceptor();
+ Map<String, String> mapIn = new HashMap<String, String>();
+ mapIn.put("*", "{http://jaxws.jaxrs.systest.cxf.apache.org/}*");
+ in.setInTransformElements(mapIn);
+
+ TransformOutInterceptor out = new TransformOutInterceptor();
+ Map<String, String> mapOut = new HashMap<String, String>();
+ mapOut.put("{http://jaxws.jaxrs.systest.cxf.apache.org/}*", "getBookRequest");
+ out.setOutTransformElements(mapOut);
+
+
+ Client cl = ClientProxy.getClient(store);
+ cl.getInInterceptors().add(in);
+ cl.getOutInterceptors().add(out);
+
+ Book book = store.getBook(new Long(123));
+ assertEquals("id is wrong", book.getId(), 123);
+ }
+
+ @Test
public void testServiceListingsAndWadl() throws Exception {
String listings =
getStringFromInputStream(getHttpInputStream("http://localhost:" + PORT + "/test/services"));
Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/jaxws/BookStoreSoapRestImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/jaxws/BookStoreSoapRestImpl.java?rev=1070973&r1=1070972&r2=1070973&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/jaxws/BookStoreSoapRestImpl.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/jaxws/BookStoreSoapRestImpl.java Tue Feb 15 17:07:08 2011
@@ -46,7 +46,7 @@ import org.apache.cxf.systest.jaxrs.Book
public class BookStoreSoapRestImpl implements BookStoreJaxrsJaxws {
private Map<Long, Book> books = new HashMap<Long, Book>();
-
+ private boolean ignoreJaxrsClient;
@Resource
private WebServiceContext jaxwsContext;
@Resource
@@ -60,12 +60,18 @@ public class BookStoreSoapRestImpl imple
init();
}
+ public void setIgnoreJaxrsClient(boolean ignore) {
+ this.ignoreJaxrsClient = ignore;
+ }
+
@PostConstruct
public void verifyWebClient() {
- if (webClient == null) {
- throw new RuntimeException();
+ if (!ignoreJaxrsClient) {
+ if (webClient == null) {
+ throw new RuntimeException();
+ }
+ WebClient.client(webClient).accept("application/xml");
}
- WebClient.client(webClient).accept("application/xml");
}
public Book getBook(Long id) throws BookNotFoundFault {
@@ -100,14 +106,17 @@ public class BookStoreSoapRestImpl imple
}
throw new WebApplicationException(builder.build());
}
-
- if (!invocationInProcess) {
- invocationInProcess = true;
- return webClient.getBook(id);
+
+ if (!ignoreJaxrsClient) {
+ if (!invocationInProcess) {
+ invocationInProcess = true;
+ return webClient.getBook(id);
+ }
+ invocationInProcess = false;
+ System.out.println(getContentType());
}
- invocationInProcess = false;
- System.out.println(getContentType());
+
return books.get(id);
}