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 2022/03/12 21:51:57 UTC

[ws-axiom] branch master updated: Disallow defining abstract methods in mixins

This is an automated email from the ASF dual-hosted git repository.

veithen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git


The following commit(s) were added to refs/heads/master by this push:
     new bf87e12  Disallow defining abstract methods in mixins
bf87e12 is described below

commit bf87e1215ffa2d825d51baad79789309b5d0559b
Author: Andreas Veithen <an...@gmail.com>
AuthorDate: Sat Mar 12 21:51:44 2022 +0000

    Disallow defining abstract methods in mixins
---
 .../weaver/mixin/clazz/MixinClassVisitor.java      | 11 +++++++
 .../org/apache/axiom/weaver/noabstract/Iface.java  |  9 ++---
 .../apache/axiom/weaver/noabstract/IfaceMixin.java | 10 +++---
 .../weaver/noabstract/NoAbstractMethodTest.java    | 38 +++++++++-------------
 .../axiom/weaver/noabstract/package-info.java      | 13 +++-----
 .../java/org/apache/axiom/core/CoreElement.java    |  4 +++
 .../axiom/core/impl/mixin/CoreElementMixin.java    |  4 ---
 .../core/impl/mixin/CoreNSAwareElementMixin.java   |  2 ++
 .../core/impl/mixin/CoreNSUnawareElementMixin.java |  2 ++
 .../java/org/apache/axiom/dom/DOMParentNode.java   |  2 +-
 .../axiom/dom/impl/mixin/DOMAttributeMixin.java    |  1 +
 .../dom/impl/mixin/DOMDocumentFragmentMixin.java   |  1 +
 .../axiom/dom/impl/mixin/DOMDocumentMixin.java     |  1 +
 .../dom/impl/mixin/DOMNSAwareElementMixin.java     |  1 +
 .../dom/impl/mixin/DOMNSUnawareElementMixin.java   |  1 +
 .../axiom/dom/impl/mixin/DOMParentNodeMixin.java   |  2 --
 .../om/impl/intf/AxiomNamedInformationItem.java    |  2 ++
 .../axiom/om/impl/mixin/AxiomAttributeMixin.java   |  3 +-
 .../axiom/om/impl/mixin/AxiomElementMixin.java     |  3 +-
 .../impl/mixin/AxiomNamedInformationItemMixin.java |  2 --
 .../axiom/soap/impl/intf/AxiomSOAPElement.java     |  3 ++
 .../soap/impl/mixin/AxiomSOAP11EnvelopeMixin.java  |  1 +
 .../soap/impl/mixin/AxiomSOAP11FaultCodeMixin.java |  1 +
 .../impl/mixin/AxiomSOAP11FaultReasonMixin.java    |  1 +
 .../soap/impl/mixin/AxiomSOAP12EnvelopeMixin.java  |  1 +
 .../mixin/AxiomSOAP12FaultClassifierMixin.java     |  1 +
 .../soap/impl/mixin/AxiomSOAP12FaultNodeMixin.java |  1 +
 .../impl/mixin/AxiomSOAP12FaultReasonMixin.java    |  1 +
 .../soap/impl/mixin/AxiomSOAP12FaultTextMixin.java |  1 +
 .../impl/mixin/AxiomSOAP12FaultValueMixin.java     |  1 +
 .../axiom/soap/impl/mixin/AxiomSOAPBodyMixin.java  |  1 +
 .../soap/impl/mixin/AxiomSOAPElementMixin.java     |  2 --
 .../soap/impl/mixin/AxiomSOAPFaultDetailMixin.java |  1 +
 .../axiom/soap/impl/mixin/AxiomSOAPFaultMixin.java |  1 +
 .../soap/impl/mixin/AxiomSOAPFaultRoleMixin.java   |  1 +
 .../soap/impl/mixin/AxiomSOAPHeaderBlockMixin.java |  1 +
 .../soap/impl/mixin/AxiomSOAPHeaderMixin.java      |  1 +
 37 files changed, 76 insertions(+), 56 deletions(-)

diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/clazz/MixinClassVisitor.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/clazz/MixinClassVisitor.java
index 419741f..47555ab 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/clazz/MixinClassVisitor.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/clazz/MixinClassVisitor.java
@@ -121,6 +121,17 @@ final class MixinClassVisitor extends ClassVisitor {
         MethodNode method =
                 new MethodNode(Opcodes.ASM9, access, name, descriptor, signature, exceptions);
         Function<String, Remapper> remapperFactory = this.remapperFactory;
+        if ((access & Opcodes.ACC_ABSTRACT) != 0) {
+            // An abstract method defined by a mixin could only be implemented by another mixin.
+            // There are two problems with that:
+            // - Development tools would not be able to determine that a method in one mixin
+            //   overrides a method in another mixin.
+            // - If the method is not public, then the classes the two mixins are applied to must
+            //   be in the same package, but that's not necessarily the case.
+            // Instead of declaring an abstract method in a mixin, that method should be declared
+            // by an interface.
+            throw new MixinFactoryException("Found an abstract method in mixin " + className);
+        }
         MethodBody body =
                 new MethodBody() {
                     @Override
diff --git a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/DOMParentNode.java b/axiom-weaver/src/test/java/org/apache/axiom/weaver/noabstract/Iface.java
similarity index 81%
copy from mixins/dom-mixins/src/main/java/org/apache/axiom/dom/DOMParentNode.java
copy to axiom-weaver/src/test/java/org/apache/axiom/weaver/noabstract/Iface.java
index 52a0150..436cb7e 100644
--- a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/DOMParentNode.java
+++ b/axiom-weaver/src/test/java/org/apache/axiom/weaver/noabstract/Iface.java
@@ -16,11 +16,6 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.dom;
+package org.apache.axiom.weaver.noabstract;
 
-import org.apache.axiom.core.CoreParentNode;
-import org.w3c.dom.NodeList;
-
-public interface DOMParentNode extends DOMNode, NodeList, CoreParentNode {
-
-}
+public interface Iface {}
diff --git a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/DOMParentNode.java b/axiom-weaver/src/test/java/org/apache/axiom/weaver/noabstract/IfaceMixin.java
similarity index 81%
copy from mixins/dom-mixins/src/main/java/org/apache/axiom/dom/DOMParentNode.java
copy to axiom-weaver/src/test/java/org/apache/axiom/weaver/noabstract/IfaceMixin.java
index 52a0150..4ac95e4 100644
--- a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/DOMParentNode.java
+++ b/axiom-weaver/src/test/java/org/apache/axiom/weaver/noabstract/IfaceMixin.java
@@ -16,11 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.dom;
+package org.apache.axiom.weaver.noabstract;
 
-import org.apache.axiom.core.CoreParentNode;
-import org.w3c.dom.NodeList;
-
-public interface DOMParentNode extends DOMNode, NodeList, CoreParentNode {
+import org.apache.axiom.weaver.annotation.Mixin;
 
+@Mixin
+public abstract class IfaceMixin implements Iface {
+    abstract void abstractMethod();
 }
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultNodeMixin.java b/axiom-weaver/src/test/java/org/apache/axiom/weaver/noabstract/NoAbstractMethodTest.java
similarity index 52%
copy from mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultNodeMixin.java
copy to axiom-weaver/src/test/java/org/apache/axiom/weaver/noabstract/NoAbstractMethodTest.java
index bd5ecd4..5bb1c48 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultNodeMixin.java
+++ b/axiom-weaver/src/test/java/org/apache/axiom/weaver/noabstract/NoAbstractMethodTest.java
@@ -16,31 +16,23 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.soap.impl.mixin;
+package org.apache.axiom.weaver.noabstract;
 
-import org.apache.axiom.core.CoreNode;
-import org.apache.axiom.om.OMElement;
-import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12FaultNode;
-import org.apache.axiom.weaver.annotation.Mixin;
+import static org.junit.Assert.assertThrows;
 
-@Mixin
-public abstract class AxiomSOAP12FaultNodeMixin implements AxiomSOAP12FaultNode {
-    @Override
-    public final Class<? extends CoreNode> coreGetNodeClass() {
-        return AxiomSOAP12FaultNode.class;
-    }
-
-    public final boolean isChildElementAllowed(OMElement child) {
-        return false;
-    }
-
-    @Override
-    public final void setFaultNodeValue(String uri) {
-        setText(uri);
-    }
+import org.apache.axiom.weaver.SimpleImplementationClassNameMapper;
+import org.apache.axiom.weaver.Weaver;
+import org.apache.axiom.weaver.innerclass.InnerClassTest;
+import org.apache.axiom.weaver.mixin.clazz.MixinFactoryException;
+import org.junit.Test;
 
-    @Override
-    public final String getFaultNodeValue() {
-        return getText();
+public class NoAbstractMethodTest {
+    @Test
+    public void testMixinWithAbstractMethod() {
+        ClassLoader cl = InnerClassTest.class.getClassLoader();
+        Weaver weaver = new Weaver(cl, new SimpleImplementationClassNameMapper("impl"));
+        assertThrows(
+                MixinFactoryException.class,
+                () -> weaver.loadWeavablePackage("org.apache.axiom.weaver.noabstract"));
     }
 }
diff --git a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/DOMParentNode.java b/axiom-weaver/src/test/java/org/apache/axiom/weaver/noabstract/package-info.java
similarity index 81%
copy from mixins/dom-mixins/src/main/java/org/apache/axiom/dom/DOMParentNode.java
copy to axiom-weaver/src/test/java/org/apache/axiom/weaver/noabstract/package-info.java
index 52a0150..9d8316b 100644
--- a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/DOMParentNode.java
+++ b/axiom-weaver/src/test/java/org/apache/axiom/weaver/noabstract/package-info.java
@@ -16,11 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.dom;
-
-import org.apache.axiom.core.CoreParentNode;
-import org.w3c.dom.NodeList;
-
-public interface DOMParentNode extends DOMNode, NodeList, CoreParentNode {
-
-}
+@org.apache.axiom.weaver.annotation.WeavablePackage(
+        mixins = {
+            IfaceMixin.class,
+        })
+package org.apache.axiom.weaver.noabstract;
diff --git a/mixins/core-mixins/src/main/java/org/apache/axiom/core/CoreElement.java b/mixins/core-mixins/src/main/java/org/apache/axiom/core/CoreElement.java
index 620b3c7..89313f2 100644
--- a/mixins/core-mixins/src/main/java/org/apache/axiom/core/CoreElement.java
+++ b/mixins/core-mixins/src/main/java/org/apache/axiom/core/CoreElement.java
@@ -142,4 +142,8 @@ public interface CoreElement extends CoreChildNode, CoreMixedContentContainer, C
     void corePromote(CoreElement newElement, Semantics semantics) throws CoreModelException;
 
     void internalSetFirstAttribute(CoreAttribute firstAttribute);
+
+    String getImplicitNamespaceURI(String prefix);
+
+    String getImplicitPrefix(String namespaceURI);
 }
diff --git a/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/mixin/CoreElementMixin.java b/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/mixin/CoreElementMixin.java
index 3814f0f..1821441 100644
--- a/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/mixin/CoreElementMixin.java
+++ b/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/mixin/CoreElementMixin.java
@@ -158,8 +158,6 @@ public abstract class CoreElementMixin implements CoreElement {
         return AttributeIterator.create(this, type, mapper, semantics);
     }
 
-    public abstract String getImplicitNamespaceURI(String prefix);
-
     @Override
     public final String coreLookupNamespaceURI(String prefix, Semantics semantics)
             throws CoreModelException {
@@ -189,8 +187,6 @@ public abstract class CoreElementMixin implements CoreElement {
         }
     }
 
-    public abstract String getImplicitPrefix(String namespaceURI);
-
     @Override
     public final String coreLookupPrefix(String namespaceURI, Semantics semantics)
             throws CoreModelException {
diff --git a/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/mixin/CoreNSAwareElementMixin.java b/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/mixin/CoreNSAwareElementMixin.java
index bf99399..adabde3 100644
--- a/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/mixin/CoreNSAwareElementMixin.java
+++ b/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/mixin/CoreNSAwareElementMixin.java
@@ -33,10 +33,12 @@ public abstract class CoreNSAwareElementMixin implements CoreNSAwareElement {
         return NodeType.NS_AWARE_ELEMENT;
     }
 
+    @Override
     public final String getImplicitNamespaceURI(String prefix) {
         return prefix.equals(coreGetPrefix()) ? coreGetNamespaceURI() : null;
     }
 
+    @Override
     public final String getImplicitPrefix(String namespaceURI) {
         return namespaceURI.equals(coreGetNamespaceURI()) ? coreGetPrefix() : null;
     }
diff --git a/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/mixin/CoreNSUnawareElementMixin.java b/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/mixin/CoreNSUnawareElementMixin.java
index 144aa59..58d363a 100644
--- a/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/mixin/CoreNSUnawareElementMixin.java
+++ b/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/mixin/CoreNSUnawareElementMixin.java
@@ -33,10 +33,12 @@ public abstract class CoreNSUnawareElementMixin implements CoreNSUnawareElement
         return NodeType.NS_UNAWARE_ELEMENT;
     }
 
+    @Override
     public final String getImplicitNamespaceURI(String prefix) {
         return null;
     }
 
+    @Override
     public final String getImplicitPrefix(String namespaceURI) {
         return null;
     }
diff --git a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/DOMParentNode.java b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/DOMParentNode.java
index 52a0150..905d409 100644
--- a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/DOMParentNode.java
+++ b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/DOMParentNode.java
@@ -22,5 +22,5 @@ import org.apache.axiom.core.CoreParentNode;
 import org.w3c.dom.NodeList;
 
 public interface DOMParentNode extends DOMNode, NodeList, CoreParentNode {
-
+    void normalize(DOMConfigurationImpl config);
 }
diff --git a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMAttributeMixin.java b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMAttributeMixin.java
index 7979a1e..b595ead 100644
--- a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMAttributeMixin.java
+++ b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMAttributeMixin.java
@@ -118,6 +118,7 @@ public abstract class DOMAttributeMixin implements DOMAttribute {
         throw new UnsupportedOperationException();
     }
 
+    @Override
     public final void normalize(DOMConfigurationImpl config) {
     }
 }
diff --git a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMDocumentFragmentMixin.java b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMDocumentFragmentMixin.java
index 1389080..278080a 100644
--- a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMDocumentFragmentMixin.java
+++ b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMDocumentFragmentMixin.java
@@ -112,6 +112,7 @@ public abstract class DOMDocumentFragmentMixin implements DOMDocumentFragment {
         }
     }
 
+    @Override
     public final void normalize(DOMConfigurationImpl config) {
     }
 }
diff --git a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMDocumentMixin.java b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMDocumentMixin.java
index 7e92d2f..b4f4d09 100644
--- a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMDocumentMixin.java
+++ b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMDocumentMixin.java
@@ -473,6 +473,7 @@ public abstract class DOMDocumentMixin implements DOMDocument {
         this.strictErrorChecking = strictErrorChecking;
     }
 
+    @Override
     public final void normalize(DOMConfigurationImpl config) {
     }
 
diff --git a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMNSAwareElementMixin.java b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMNSAwareElementMixin.java
index 2f06f53..8f68afb 100644
--- a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMNSAwareElementMixin.java
+++ b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMNSAwareElementMixin.java
@@ -25,6 +25,7 @@ import org.apache.axiom.weaver.annotation.Mixin;
 
 @Mixin
 public abstract class DOMNSAwareElementMixin implements DOMNSAwareElement {
+    @Override
     public final void normalize(DOMConfigurationImpl config) {
         // TODO: this should not rely on the Axiom API
         if (config.isEnabled(DOMConfigurationImpl.NAMESPACES)) {
diff --git a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMNSUnawareElementMixin.java b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMNSUnawareElementMixin.java
index a78401a..f6c85ca 100644
--- a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMNSUnawareElementMixin.java
+++ b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMNSUnawareElementMixin.java
@@ -24,6 +24,7 @@ import org.apache.axiom.weaver.annotation.Mixin;;
 
 @Mixin
 public abstract class DOMNSUnawareElementMixin implements DOMNSUnawareElement {
+    @Override
     public final void normalize(DOMConfigurationImpl config) {
     }
 }
diff --git a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMParentNodeMixin.java b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMParentNodeMixin.java
index 8503d9b..998b665 100644
--- a/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMParentNodeMixin.java
+++ b/mixins/dom-mixins/src/main/java/org/apache/axiom/dom/impl/mixin/DOMParentNodeMixin.java
@@ -114,8 +114,6 @@ public abstract class DOMParentNodeMixin implements DOMParentNode {
         }
     }
 
-    public abstract void normalize(DOMConfigurationImpl config);
-
     private void checkNewChild(Node newChild) {
         if (newChild instanceof DOMNode) {
             DOMNode newDomChild = (DOMNode)newChild;
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/intf/AxiomNamedInformationItem.java b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/intf/AxiomNamedInformationItem.java
index 5c7121f..2d54815 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/intf/AxiomNamedInformationItem.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/intf/AxiomNamedInformationItem.java
@@ -35,4 +35,6 @@ public interface AxiomNamedInformationItem
     OMNamespace defaultGetNamespace();
 
     QName defaultGetQName();
+
+    void beforeSetLocalName();
 }
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomAttributeMixin.java b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomAttributeMixin.java
index abd6648..c74bfdf 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomAttributeMixin.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomAttributeMixin.java
@@ -35,7 +35,8 @@ public abstract class AxiomAttributeMixin implements AxiomAttribute {
         return (OMElement) coreGetOwnerElement();
     }
 
-    final void beforeSetLocalName() {}
+    @Override
+    public void beforeSetLocalName() {}
 
     @Override
     public final void setNamespace(OMNamespace namespace, boolean decl) {
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomElementMixin.java b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomElementMixin.java
index 1d5e80e..42bb60b 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomElementMixin.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomElementMixin.java
@@ -82,7 +82,8 @@ public abstract class AxiomElementMixin implements AxiomElement {
         internalSetNamespace(generateNSDecl ? NSUtil.handleNamespace(this, ns, false, true) : ns);
     }
 
-    final void beforeSetLocalName() {
+    @Override
+    public final void beforeSetLocalName() {
         forceExpand();
     }
 
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomNamedInformationItemMixin.java b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomNamedInformationItemMixin.java
index bf8b78d..0a97b95 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomNamedInformationItemMixin.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomNamedInformationItemMixin.java
@@ -106,8 +106,6 @@ public abstract class AxiomNamedInformationItemMixin implements AxiomNamedInform
         return namespace;
     }
 
-    abstract void beforeSetLocalName();
-
     @Override
     public final void setLocalName(String localName) {
         beforeSetLocalName();
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/intf/AxiomSOAPElement.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/intf/AxiomSOAPElement.java
index aa141ac..140efa1 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/intf/AxiomSOAPElement.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/intf/AxiomSOAPElement.java
@@ -18,8 +18,11 @@
  */
 package org.apache.axiom.soap.impl.intf;
 
+import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.impl.intf.AxiomElement;
 
 public interface AxiomSOAPElement extends AxiomElement {
     SOAPHelper getSOAPHelper();
+
+    boolean isChildElementAllowed(OMElement child);
 }
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP11EnvelopeMixin.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP11EnvelopeMixin.java
index db50ace..0666fb4 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP11EnvelopeMixin.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP11EnvelopeMixin.java
@@ -33,6 +33,7 @@ public abstract class AxiomSOAP11EnvelopeMixin implements AxiomSOAP11Envelope {
         return AxiomSOAP11Envelope.class;
     }
 
+    @Override
     public final boolean isChildElementAllowed(OMElement child) {
         return !(child instanceof AxiomSOAPElement)
                 || child instanceof SOAPHeader
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP11FaultCodeMixin.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP11FaultCodeMixin.java
index 8193d3c..5190aea 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP11FaultCodeMixin.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP11FaultCodeMixin.java
@@ -29,6 +29,7 @@ import org.apache.axiom.weaver.annotation.Mixin;
 
 @Mixin
 public abstract class AxiomSOAP11FaultCodeMixin implements AxiomSOAP11FaultCode {
+    @Override
     public final boolean isChildElementAllowed(OMElement child) {
         return false;
     }
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP11FaultReasonMixin.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP11FaultReasonMixin.java
index cbb10c7..a9e9d69 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP11FaultReasonMixin.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP11FaultReasonMixin.java
@@ -35,6 +35,7 @@ public abstract class AxiomSOAP11FaultReasonMixin implements AxiomSOAP11FaultRea
         return AxiomSOAP11FaultReason.class;
     }
 
+    @Override
     public final boolean isChildElementAllowed(OMElement child) {
         return false;
     }
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12EnvelopeMixin.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12EnvelopeMixin.java
index 51e46ff..6a1f521 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12EnvelopeMixin.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12EnvelopeMixin.java
@@ -32,6 +32,7 @@ public abstract class AxiomSOAP12EnvelopeMixin implements AxiomSOAP12Envelope {
         return AxiomSOAP12Envelope.class;
     }
 
+    @Override
     public final boolean isChildElementAllowed(OMElement child) {
         return child instanceof SOAPHeader || child instanceof SOAPBody;
     }
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultClassifierMixin.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultClassifierMixin.java
index 90b5f9b..daf262b 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultClassifierMixin.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultClassifierMixin.java
@@ -34,6 +34,7 @@ public abstract class AxiomSOAP12FaultClassifierMixin implements AxiomSOAP12Faul
     private static final Sequence sequence =
             new Sequence(SOAPFaultValue.class, SOAPFaultSubCode.class);
 
+    @Override
     public final boolean isChildElementAllowed(OMElement child) {
         return child instanceof SOAPFaultValue || child instanceof SOAPFaultSubCode;
     }
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultNodeMixin.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultNodeMixin.java
index bd5ecd4..4c3bd5f 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultNodeMixin.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultNodeMixin.java
@@ -30,6 +30,7 @@ public abstract class AxiomSOAP12FaultNodeMixin implements AxiomSOAP12FaultNode
         return AxiomSOAP12FaultNode.class;
     }
 
+    @Override
     public final boolean isChildElementAllowed(OMElement child) {
         return false;
     }
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultReasonMixin.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultReasonMixin.java
index be4c143..3cad761 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultReasonMixin.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultReasonMixin.java
@@ -37,6 +37,7 @@ public abstract class AxiomSOAP12FaultReasonMixin implements AxiomSOAP12FaultRea
         return AxiomSOAP12FaultReason.class;
     }
 
+    @Override
     public final boolean isChildElementAllowed(OMElement child) {
         return child instanceof SOAPFaultText;
     }
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultTextMixin.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultTextMixin.java
index e874015..07efb6a 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultTextMixin.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultTextMixin.java
@@ -45,6 +45,7 @@ public abstract class AxiomSOAP12FaultTextMixin implements AxiomSOAP12FaultText
         return AxiomSOAP12FaultText.class;
     }
 
+    @Override
     public final boolean isChildElementAllowed(OMElement child) {
         return false;
     }
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultValueMixin.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultValueMixin.java
index 898a505..261b2da 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultValueMixin.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultValueMixin.java
@@ -25,6 +25,7 @@ import org.apache.axiom.weaver.annotation.Mixin;
 
 @Mixin
 public abstract class AxiomSOAP12FaultValueMixin implements AxiomSOAP12FaultValue {
+    @Override
     public final boolean isChildElementAllowed(OMElement child) {
         return false;
     }
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPBodyMixin.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPBodyMixin.java
index 953aeac..908f67a 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPBodyMixin.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPBodyMixin.java
@@ -29,6 +29,7 @@ import org.apache.axiom.weaver.annotation.Mixin;
 
 @Mixin
 public abstract class AxiomSOAPBodyMixin implements AxiomSOAPBody {
+    @Override
     public final boolean isChildElementAllowed(OMElement child) {
         return !(child instanceof AxiomSOAPElement) || child instanceof SOAPFault;
     }
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPElementMixin.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPElementMixin.java
index 8547a58..7a040e3 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPElementMixin.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPElementMixin.java
@@ -54,6 +54,4 @@ public abstract class AxiomSOAPElementMixin implements AxiomSOAPElement {
             }
         }
     }
-
-    public abstract boolean isChildElementAllowed(OMElement child);
 }
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPFaultDetailMixin.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPFaultDetailMixin.java
index 823220e..6285aa3 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPFaultDetailMixin.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPFaultDetailMixin.java
@@ -27,6 +27,7 @@ import org.apache.axiom.weaver.annotation.Mixin;
 
 @Mixin
 public abstract class AxiomSOAPFaultDetailMixin implements AxiomSOAPFaultDetail {
+    @Override
     public final boolean isChildElementAllowed(OMElement child) {
         return !(child instanceof AxiomSOAPElement);
     }
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPFaultMixin.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPFaultMixin.java
index ef951db..9562110 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPFaultMixin.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPFaultMixin.java
@@ -37,6 +37,7 @@ import org.apache.axiom.weaver.annotation.Mixin;
 
 @Mixin
 public abstract class AxiomSOAPFaultMixin implements AxiomSOAPFault {
+    @Override
     public final boolean isChildElementAllowed(OMElement child) {
         return child instanceof SOAPFaultCode
                 || child instanceof SOAPFaultDetail
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPFaultRoleMixin.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPFaultRoleMixin.java
index b32bcf7..7c34649 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPFaultRoleMixin.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPFaultRoleMixin.java
@@ -24,6 +24,7 @@ import org.apache.axiom.weaver.annotation.Mixin;
 
 @Mixin
 public abstract class AxiomSOAPFaultRoleMixin implements AxiomSOAPFaultRole {
+    @Override
     public final boolean isChildElementAllowed(OMElement child) {
         return false;
     }
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPHeaderBlockMixin.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPHeaderBlockMixin.java
index 6b84035..7fd6f45 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPHeaderBlockMixin.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPHeaderBlockMixin.java
@@ -36,6 +36,7 @@ import org.apache.axiom.weaver.annotation.Mixin;
 public abstract class AxiomSOAPHeaderBlockMixin implements AxiomSOAPHeaderBlock {
     private boolean processed;
 
+    @Override
     public final boolean isChildElementAllowed(OMElement child) {
         return true;
     }
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPHeaderMixin.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPHeaderMixin.java
index 7e35348..4109680 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPHeaderMixin.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPHeaderMixin.java
@@ -44,6 +44,7 @@ import org.apache.axiom.weaver.annotation.Mixin;
 
 @Mixin
 public abstract class AxiomSOAPHeaderMixin implements AxiomSOAPHeader {
+    @Override
     public final boolean isChildElementAllowed(OMElement child) {
         return child instanceof SOAPHeaderBlock;
     }