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/10/02 12:40:26 UTC
svn commit: r1178174 - in
/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom:
om/DOMCompatibilityTest.java om/MethodCollisionTestCase.java
om/MethodSignature.java soap/DOMCompatibilityTest.java
Author: veithen
Date: Sun Oct 2 10:40:26 2011
New Revision: 1178174
URL: http://svn.apache.org/viewvc?rev=1178174&view=rev
Log:
AXIOM-363: Automatically check for collisions between the Axiom API and DOM.
Added:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/DOMCompatibilityTest.java (with props)
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/MethodCollisionTestCase.java (with props)
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/MethodSignature.java (with props)
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/soap/DOMCompatibilityTest.java (with props)
Added: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/DOMCompatibilityTest.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/DOMCompatibilityTest.java?rev=1178174&view=auto
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/DOMCompatibilityTest.java (added)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/DOMCompatibilityTest.java Sun Oct 2 10:40:26 2011
@@ -0,0 +1,67 @@
+/*
+ * 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.axiom.om;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.CDATASection;
+import org.w3c.dom.Comment;
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentType;
+import org.w3c.dom.Element;
+import org.w3c.dom.EntityReference;
+import org.w3c.dom.ProcessingInstruction;
+import org.w3c.dom.Text;
+
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Checks that there are no collisions between the Axiom object model interfaces and DOM.
+ * <p>
+ * A fundamental design constraint of the Axiom API is that there must be no collisions between
+ * Axiom methods and DOM methods, so that it is possible to create an Axiom implementation that also
+ * implements DOM. Note however that Axiom may define methods with the same signature as DOM
+ * methods, provided that they have the same behavior. This is e.g. the case for
+ * {@link OMElement#getNamespaceURI()} and {@link OMElement#getLocalName()}.
+ */
+public class DOMCompatibilityTest extends TestCase {
+ public static TestSuite suite() {
+ TestSuite suite = new TestSuite();
+ // Note: All exceptions are methods that are known to have the same behavior in Axiom
+ // and DOM. In these cases, method collisions are allowed.
+ suite.addTest(new MethodCollisionTestCase(OMAttribute.class, Attr.class,
+ new MethodSignature[] { new MethodSignature("getNamespaceURI", new Class[0]),
+ new MethodSignature("getLocalName", new Class[0]) }));
+ suite.addTest(new MethodCollisionTestCase(OMComment.class, Comment.class));
+ suite.addTest(new MethodCollisionTestCase(OMDocType.class, DocumentType.class));
+ suite.addTest(new MethodCollisionTestCase(OMDocument.class, Document.class));
+ suite.addTest(new MethodCollisionTestCase(OMProcessingInstruction.class, ProcessingInstruction.class,
+ new MethodSignature[] { new MethodSignature("getTarget", new Class[0]) }));
+ suite.addTest(new MethodCollisionTestCase(OMElement.class, Element.class,
+ new MethodSignature[] { new MethodSignature("getNamespaceURI", new Class[0]),
+ new MethodSignature("getLocalName", new Class[0]) }));
+ suite.addTest(new MethodCollisionTestCase(OMSourcedElement.class, Element.class,
+ new MethodSignature[] { new MethodSignature("getNamespaceURI", new Class[0]),
+ new MethodSignature("getLocalName", new Class[0]) }));
+ suite.addTest(new MethodCollisionTestCase(OMText.class, Text.class));
+ suite.addTest(new MethodCollisionTestCase(OMText.class, CDATASection.class));
+ suite.addTest(new MethodCollisionTestCase(OMText.class, EntityReference.class));
+ return suite;
+ }
+}
Propchange: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/DOMCompatibilityTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/MethodCollisionTestCase.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/MethodCollisionTestCase.java?rev=1178174&view=auto
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/MethodCollisionTestCase.java (added)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/MethodCollisionTestCase.java Sun Oct 2 10:40:26 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.axiom.om;
+
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+public class MethodCollisionTestCase extends TestCase {
+ private final Class omInterface;
+ private final Class domInterface;
+ private final MethodSignature[] exceptions;
+
+ public MethodCollisionTestCase(Class omInterface, Class domInterface, MethodSignature[] exceptions) {
+ this.omInterface = omInterface;
+ this.domInterface = domInterface;
+ this.exceptions = exceptions;
+ setName(omInterface.getName() + " <-> " + domInterface.getName());
+ }
+
+ public MethodCollisionTestCase(Class omInterface, Class domInterface) {
+ this(omInterface, domInterface, null);
+ }
+
+ private Set/*<MethodSignature>*/ getMethodSignatures(Class iface) {
+ Set result = new HashSet();
+ Method[] methods = iface.getMethods();
+ for (int i=0; i<methods.length; i++) {
+ result.add(new MethodSignature(methods[i]));
+ }
+ return result;
+ }
+
+ protected void runTest() throws Throwable {
+ Set signatures = getMethodSignatures(omInterface);
+ signatures.retainAll(getMethodSignatures(domInterface));
+ if (exceptions != null) {
+ signatures.removeAll(Arrays.asList(exceptions));
+ }
+ if (!signatures.isEmpty()) {
+ fail("Method collision detected for the following methods: " + signatures);
+ }
+ }
+}
Propchange: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/MethodCollisionTestCase.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/MethodSignature.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/MethodSignature.java?rev=1178174&view=auto
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/MethodSignature.java (added)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/MethodSignature.java Sun Oct 2 10:40:26 2011
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.om;
+
+import java.lang.reflect.Method;
+import java.util.Arrays;
+
+public class MethodSignature {
+ // Note: Although the JVM considers the return type as part of the signature,
+ // the Java compiler does not.
+ private final String name;
+ private final Class[] parameterTypes;
+
+ public MethodSignature(String name, Class[] parameterTypes) {
+ this.name = name;
+ this.parameterTypes = parameterTypes;
+ }
+
+ public MethodSignature(Method method) {
+ name = method.getName();
+ parameterTypes = method.getParameterTypes();
+ }
+
+ public boolean equals(Object obj) {
+ if (obj instanceof MethodSignature) {
+ MethodSignature other = (MethodSignature)obj;
+ return other.name.equals(name) && Arrays.equals(other.parameterTypes, parameterTypes);
+ } else {
+ return false;
+ }
+ }
+
+ public int hashCode() {
+ int hashCode = name.hashCode();
+ for (int i=0; i<parameterTypes.length; i++) {
+ hashCode = 31*hashCode + parameterTypes[i].hashCode();
+ }
+ return hashCode;
+ }
+
+ public String toString() {
+ StringBuilder buffer = new StringBuilder();
+ buffer.append(name);
+ buffer.append('(');
+ for (int i=0; i<parameterTypes.length; i++) {
+ if (i>0) {
+ buffer.append(", ");
+ }
+ buffer.append(parameterTypes[i].getName());
+ }
+ buffer.append(')');
+ return buffer.toString();
+ }
+}
\ No newline at end of file
Propchange: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/MethodSignature.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/soap/DOMCompatibilityTest.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/soap/DOMCompatibilityTest.java?rev=1178174&view=auto
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/soap/DOMCompatibilityTest.java (added)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/soap/DOMCompatibilityTest.java Sun Oct 2 10:40:26 2011
@@ -0,0 +1,66 @@
+/*
+ * 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.axiom.soap;
+
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.apache.axiom.om.MethodCollisionTestCase;
+import org.apache.axiom.om.MethodSignature;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * Checks that there are no collisions between the SOAP object model interfaces and DOM.
+ *
+ * @see org.apache.axiom.om.DOMCompatibilityTest
+ */
+public class DOMCompatibilityTest extends TestCase {
+ public static TestSuite suite() {
+ TestSuite suite = new TestSuite();
+
+ // These methods are known to have the same behavior in Axiom and DOM:
+ MethodSignature[] elementExceptions = new MethodSignature[] {
+ new MethodSignature("getNamespaceURI", new Class[0]),
+ new MethodSignature("getLocalName", new Class[0]) };
+
+ suite.addTest(new MethodCollisionTestCase(SOAPBody.class, Element.class, elementExceptions));
+ suite.addTest(new MethodCollisionTestCase(SOAPEnvelope.class, Element.class, elementExceptions));
+ suite.addTest(new MethodCollisionTestCase(SOAPFault.class, Element.class, elementExceptions));
+ suite.addTest(new MethodCollisionTestCase(SOAPFaultCode.class, Element.class, elementExceptions));
+ suite.addTest(new MethodCollisionTestCase(SOAPFaultDetail.class, Element.class, elementExceptions));
+
+ // The getNodeValue and setNodeValue methods are real collisions that will be fixed in Axiom 1.3; see AXIOM-363
+ suite.addTest(new MethodCollisionTestCase(SOAPFaultNode.class, Element.class, new MethodSignature[] {
+ new MethodSignature("getNamespaceURI", new Class[0]),
+ new MethodSignature("getLocalName", new Class[0]),
+ new MethodSignature("getNodeValue", new Class[0]),
+ new MethodSignature("setNodeValue", new Class[] { String.class }) }));
+
+ suite.addTest(new MethodCollisionTestCase(SOAPFaultReason.class, Element.class, elementExceptions));
+ suite.addTest(new MethodCollisionTestCase(SOAPFaultRole.class, Element.class, elementExceptions));
+ suite.addTest(new MethodCollisionTestCase(SOAPFaultSubCode.class, Element.class, elementExceptions));
+ suite.addTest(new MethodCollisionTestCase(SOAPFaultText.class, Element.class, elementExceptions));
+ suite.addTest(new MethodCollisionTestCase(SOAPFaultValue.class, Element.class, elementExceptions));
+ suite.addTest(new MethodCollisionTestCase(SOAPHeader.class, Element.class, elementExceptions));
+ suite.addTest(new MethodCollisionTestCase(SOAPHeaderBlock.class, Element.class, elementExceptions));
+ suite.addTest(new MethodCollisionTestCase(SOAPMessage.class, Document.class, elementExceptions));
+ return suite;
+ }
+}
Propchange: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/soap/DOMCompatibilityTest.java
------------------------------------------------------------------------------
svn:eol-style = native