You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ws.apache.org by ve...@apache.org on 2011/07/10 16:37:42 UTC
svn commit: r1144866 - in /webservices/commons/trunk/modules/axiom/modules:
axiom-api/src/main/java/org/apache/axiom/om/
axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/
axiom-dom/src/test/java/org/apache/axiom/om/impl/dom/
axiom-impl/src/main/j...
Author: veithen
Date: Sun Jul 10 14:37:41 2011
New Revision: 1144866
URL: http://svn.apache.org/viewvc?rev=1144866&view=rev
Log:
Partially resynchronized the code in the LLOM and DOOM implementations of SOAPHeader, so that they support the same set of methods. In particular, this should fix AXIOM-368.
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMContainer.java
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPHeaderImpl.java
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/test/java/org/apache/axiom/om/impl/dom/SOAPImplementationTest.java
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/SOAPHeaderImpl.java
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/test/java/org/apache/axiom/om/impl/llom/SOAPImplementationTest.java
Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMContainer.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMContainer.java?rev=1144866&r1=1144865&r2=1144866&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMContainer.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMContainer.java Sun Jul 10 14:37:41 2011
@@ -57,6 +57,7 @@ public interface OMContainer extends OMS
* @param elementQName The QName specifying namespace and local name to match.
* @return Returns an iterator of {@link OMElement} items that match the given QName
*/
+ // TODO: specify whether a null elementQName is allowed; LLOM and DOOM seem to have different behavior
Iterator getChildrenWithName(QName elementQName);
/**
Modified: webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPHeaderImpl.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPHeaderImpl.java?rev=1144866&r1=1144865&r2=1144866&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPHeaderImpl.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPHeaderImpl.java Sun Jul 10 14:37:41 2011
@@ -25,20 +25,205 @@ import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.OMNode;
import org.apache.axiom.om.OMXMLParserWrapper;
import org.apache.axiom.om.impl.OMNodeEx;
-import org.apache.axiom.om.impl.dom.ElementImpl;
+import org.apache.axiom.soap.RolePlayer;
+import org.apache.axiom.soap.SOAP12Constants;
+import org.apache.axiom.soap.SOAP12Version;
import org.apache.axiom.soap.SOAPConstants;
import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axiom.soap.SOAPFactory;
import org.apache.axiom.soap.SOAPHeader;
import org.apache.axiom.soap.SOAPHeaderBlock;
import org.apache.axiom.soap.SOAPProcessingException;
-import org.apache.axiom.soap.RolePlayer;
+import org.apache.axiom.soap.SOAPVersion;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.Iterator;
+import java.util.List;
+
+/**
+ * A local interface we can use to make "header checker" objects which can be used by
+ * HeaderIterators to filter results. This really SHOULD be done with anonymous classes:
+ * <p/>
+ * public void getHeadersByRole(final String role) {
+ * return new HeaderIterator() {
+ * public boolean checkHeader(SOAPHeaderBlock header) {
+ * ...
+ * if (role.equals(headerRole)) return true;
+ * return false;
+ * }
+ * }
+ * }
+ * <p/>
+ * ...but there appears to be some kind of weird problem with the JVM not correctly scoping the
+ * passed "role" value in a situation like the above. As such, we have to make Checker objects
+ * instead (sigh).
+ */
+interface Checker {
+ boolean checkHeader(SOAPHeaderBlock header);
+}
+
+/**
+ * A Checker to make sure headers match a given role. If the role we're looking for is null, then
+ * everything matches.
+ */
+class RoleChecker implements Checker {
+ String role;
+
+ public RoleChecker(String role) {
+ this.role = role;
+ }
+
+ public boolean checkHeader(SOAPHeaderBlock header) {
+ if (role == null) {
+ return true;
+ }
+ String thisRole = header.getRole();
+ return (role.equals(thisRole));
+ }
+}
+
+/**
+ * This Checker uses a RolePlayer to return the appropriate headers for that RolePlayer to process.
+ * Ignore "none", always "next", etc.
+ */
+class RolePlayerChecker implements Checker {
+ RolePlayer rolePlayer;
+
+ /** Optional namespace - if non-null we'll only return headers that match */
+ String namespace;
+
+ /**
+ * Constructor.
+ *
+ * @param rolePlayer the RolePlayer to check against. This can be null, in which
+ * case we assume we're the ultimate destination.
+ */
+ public RolePlayerChecker(RolePlayer rolePlayer) {
+ this.rolePlayer = rolePlayer;
+ }
+
+ public RolePlayerChecker(RolePlayer rolePlayer, String namespace) {
+ this.rolePlayer = rolePlayer;
+ this.namespace = namespace;
+ }
+
+ public boolean checkHeader(SOAPHeaderBlock header) {
+ // If we're filtering on namespace, check that first since the compare is simpler.
+ if (namespace != null) {
+ OMNamespace headerNamespace = header.getNamespace();
+ if (headerNamespace == null || !namespace.equals(headerNamespace.getNamespaceURI())) {
+ return false;
+ }
+ }
+
+ String role = header.getRole();
+ SOAPVersion version = header.getVersion();
+
+ // 1. If role is ultimatedest, go by what the rolePlayer says
+ if (role == null || role.equals("") ||
+ (version instanceof SOAP12Version &&
+ role.equals(SOAP12Constants.SOAP_ROLE_ULTIMATE_RECEIVER))) {
+ return (rolePlayer == null || rolePlayer.isUltimateDestination());
+ }
+
+ // 2. If role is next, always return true
+ if (role.equals(version.getNextRoleURI())) return true;
+
+ // 3. If role is none, always return false
+ if (version instanceof SOAP12Version &&
+ role.equals(SOAP12Constants.SOAP_ROLE_NONE)) {
+ return false;
+ }
+
+ // 4. Return t/f depending on match
+ List roles = (rolePlayer == null) ? null : rolePlayer.getRoles();
+ if (roles != null) {
+ for (Iterator i = roles.iterator(); i.hasNext();) {
+ String thisRole = (String) i.next();
+ if (thisRole.equals(role)) return true;
+ }
+ }
+
+ return false;
+ }
+}
+
+/** A Checker to see that we both match a given role AND are mustUnderstand=true */
+class MURoleChecker extends RoleChecker {
+ public MURoleChecker(String role) {
+ super(role);
+ }
+
+ public boolean checkHeader(SOAPHeaderBlock header) {
+ if (header.getMustUnderstand())
+ return super.checkHeader(header);
+ return false;
+ }
+}
public abstract class SOAPHeaderImpl extends SOAPElement implements SOAPHeader {
+
+ /** An Iterator which walks the header list as needed, potentially filtering as we traverse. */
+ class HeaderIterator implements Iterator {
+ SOAPHeaderBlock current;
+ boolean advance = false;
+ Checker checker;
+
+ public HeaderIterator() {
+ this(null);
+ }
+
+ public HeaderIterator(Checker checker) {
+ this.checker = checker;
+ current = (SOAPHeaderBlock) getFirstElement();
+ if (current != null) {
+ if (!checkHeader(current)) {
+ advance = true;
+ hasNext();
+ }
+ }
+ }
+
+ public void remove() {
+ }
+
+ public boolean checkHeader(SOAPHeaderBlock header) {
+ if (checker == null) return true;
+ return checker.checkHeader(header);
+ }
+
+ public boolean hasNext() {
+ if (!advance) {
+ return current != null;
+ }
+
+ advance = false;
+ OMNode sibling = current.getNextOMSibling();
+
+ while (sibling != null) {
+ if (sibling instanceof SOAPHeaderBlock) {
+ SOAPHeaderBlock possible = (SOAPHeaderBlock) sibling;
+ if (checkHeader(possible)) {
+ current = (SOAPHeaderBlock) sibling;
+ return true;
+ }
+ }
+ sibling = sibling.getNextOMSibling();
+ }
+
+ current = null;
+ return false;
+ }
+
+ public Object next() {
+ SOAPHeaderBlock ret = current;
+ if (ret != null) {
+ advance = true;
+ hasNext();
+ }
+ return ret;
+ }
+ }
/** @param envelope */
@@ -85,86 +270,21 @@ public abstract class SOAPHeaderImpl ext
protected abstract SOAPHeaderBlock createHeaderBlock(String localname, OMNamespace ns);
public Iterator getHeadersToProcess(RolePlayer rolePlayer) {
- return null; // TODO: Implement this!
+ return new HeaderIterator(new RolePlayerChecker(rolePlayer));
}
public Iterator getHeadersToProcess(RolePlayer rolePlayer, String namespace) {
- return null; // TODO: Implement this!
+ return new HeaderIterator(new RolePlayerChecker(rolePlayer, namespace));
}
- public Iterator examineHeaderBlocks(String paramRole) {
- /* Iterator headerBlocksIter = this.getChildren();
- ArrayList headersWithGivenActor = new ArrayList();
-
- if (paramRole == null || "".equals(paramRole)) {
- return returnAllSOAPHeaders(this.getChildren());
- }
-
- while (headerBlocksIter.hasNext()) {
- Object o = headerBlocksIter.next();
- if (o instanceof SOAPHeaderBlock) {
- SOAPHeaderBlock soapHeaderBlock = (SOAPHeaderBlock) o;
- String role = soapHeaderBlock.getRole();
- if ((role != null) && role.equalsIgnoreCase(paramRole)) {
- headersWithGivenActor.add(soapHeaderBlock);
- }
- }
- }
- return headersWithGivenActor.iterator();*/
-
- if (paramRole == null || paramRole.trim().length() == 0) {
- return examineAllHeaderBlocks();
- }
- Collection elements = new ArrayList();
- for (Iterator iter = examineAllHeaderBlocks(); iter.hasNext();) {
- SOAPHeaderBlock headerBlock = (SOAPHeaderBlock) iter.next();
- /*
- if (headerBlock.getRole() == null ||
- headerBlock.getRole().trim().length() == 0 ||
- headerBlock.getRole().equals(paramRole)) {
- elements.add(headerBlock);
- }
- */
- if (headerBlock.getRole() != null &&
- headerBlock.getRole().trim().length() > 0 &&
- headerBlock.getRole().equals(paramRole)) {
- elements.add(headerBlock);
- }
-
- }
- return elements.iterator();
- }
-
-// private Iterator returnAllSOAPHeaders(Iterator children) {
-// ArrayList headers = new ArrayList();
-// while (children.hasNext()) {
-// Object o = children.next();
-// if (o instanceof SOAPHeaderBlock) {
-// headers.add(o);
-// }
-// }
-//
-// return headers.iterator();
-//
-// }
+ public Iterator examineHeaderBlocks(String role) {
+ return new HeaderIterator(new RoleChecker(role));
+ }
public abstract Iterator extractHeaderBlocks(String role);
public Iterator examineMustUnderstandHeaderBlocks(String actor) {
- Iterator headerBlocksIter = this.getChildren();
- ArrayList mustUnderstandHeadersWithGivenActor = new ArrayList();
- while (headerBlocksIter.hasNext()) {
- Object o = headerBlocksIter.next();
- if (o instanceof SOAPHeaderBlock) {
- SOAPHeaderBlock soapHeaderBlock = (SOAPHeaderBlock) o;
- String role = soapHeaderBlock.getRole();
- boolean mustUnderstand = soapHeaderBlock.getMustUnderstand();
- if ((role != null) && role.equals(actor) && mustUnderstand) {
- mustUnderstandHeadersWithGivenActor.add(soapHeaderBlock);
- }
- }
- }
- return mustUnderstandHeadersWithGivenActor.iterator();
+ return new HeaderIterator(new MURoleChecker(actor));
}
public Iterator examineAllHeaderBlocks() {
@@ -172,9 +292,9 @@ public abstract class SOAPHeaderImpl ext
}
public Iterator extractAllHeaderBlocks() {
- Collection result = new ArrayList();
- for (Iterator iter = getChildrenWithName(null); iter.hasNext();) {
- ElementImpl headerBlock = (ElementImpl) iter.next();
+ List result = new ArrayList();
+ for (Iterator iter = getChildElements(); iter.hasNext();) {
+ OMElement headerBlock = (OMElement) iter.next();
iter.remove();
result.add(headerBlock);
}
Modified: webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/test/java/org/apache/axiom/om/impl/dom/SOAPImplementationTest.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/test/java/org/apache/axiom/om/impl/dom/SOAPImplementationTest.java?rev=1144866&r1=1144865&r2=1144866&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/test/java/org/apache/axiom/om/impl/dom/SOAPImplementationTest.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/test/java/org/apache/axiom/om/impl/dom/SOAPImplementationTest.java Sun Jul 10 14:37:41 2011
@@ -26,7 +26,6 @@ import org.apache.axiom.ts.SOAPTestSuite
import org.apache.axiom.ts.soap.factory.TestGetDefaultFaultEnvelope;
import org.apache.axiom.ts.soap.faultdetail.TestWSCommons202;
import org.apache.axiom.ts.soap.faulttext.TestSetLang;
-import org.apache.axiom.ts.soap.header.TestGetHeadersToProcessWithNamespace;
import org.apache.axiom.ts.soap12.fault.TestMoreChildrenAddition;
public class SOAPImplementationTest extends TestCase {
@@ -38,10 +37,6 @@ public class SOAPImplementationTest exte
// TODO: not sure if this is an issue in DOOM or if the test case is wrong
builder.exclude(TestMoreChildrenAddition.class);
- builder.exclude(TestGetHeadersToProcessWithNamespace.class);
- builder.exclude(org.apache.axiom.ts.soap11.header.TestGetHeadersToProcessWithParser.class);
- builder.exclude(org.apache.axiom.ts.soap12.header.TestGetHeadersToProcessWithParser.class);
-
// SOAPFaultText is currently unsupported in DOOM
builder.exclude(TestSetLang.class);
Modified: webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/SOAPHeaderImpl.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/SOAPHeaderImpl.java?rev=1144866&r1=1144865&r2=1144866&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/SOAPHeaderImpl.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/SOAPHeaderImpl.java Sun Jul 10 14:37:41 2011
@@ -284,13 +284,13 @@ public abstract class SOAPHeaderImpl ext
return new HeaderIterator(new RolePlayerChecker(rolePlayer, namespace));
}
- public Iterator examineHeaderBlocks(final String role) {
+ public Iterator examineHeaderBlocks(String role) {
return new HeaderIterator(new RoleChecker(role));
}
public abstract Iterator extractHeaderBlocks(String role);
- public Iterator examineMustUnderstandHeaderBlocks(final String actor) {
+ public Iterator examineMustUnderstandHeaderBlocks(String actor) {
return new HeaderIterator(new MURoleChecker(actor));
}
@@ -305,7 +305,13 @@ public abstract class SOAPHeaderImpl ext
}
public Iterator extractAllHeaderBlocks() {
- throw new UnsupportedOperationException(); // TODO implement this
+ List result = new ArrayList();
+ for (Iterator iter = getChildElements(); iter.hasNext();) {
+ OMElement headerBlock = (OMElement) iter.next();
+ iter.remove();
+ result.add(headerBlock);
+ }
+ return result.iterator();
}
public ArrayList getHeaderBlocksWithNSURI(String nsURI) {
Modified: webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/test/java/org/apache/axiom/om/impl/llom/SOAPImplementationTest.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/test/java/org/apache/axiom/om/impl/llom/SOAPImplementationTest.java?rev=1144866&r1=1144865&r2=1144866&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/test/java/org/apache/axiom/om/impl/llom/SOAPImplementationTest.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/test/java/org/apache/axiom/om/impl/llom/SOAPImplementationTest.java Sun Jul 10 14:37:41 2011
@@ -23,15 +23,10 @@ import junit.framework.TestSuite;
import org.apache.axiom.om.impl.llom.factory.OMLinkedListMetaFactory;
import org.apache.axiom.ts.SOAPTestSuiteBuilder;
-import org.apache.axiom.ts.soap.header.TestExtractAllHeaderBlocks;
public class SOAPImplementationTest extends TestCase {
public static TestSuite suite() {
SOAPTestSuiteBuilder builder = new SOAPTestSuiteBuilder(new OMLinkedListMetaFactory());
-
- // TODO: unsupported in LLOM
- builder.exclude(TestExtractAllHeaderBlocks.class);
-
return builder.build();
}
}