You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@abdera.apache.org by ve...@apache.org on 2012/08/19 09:49:20 UTC

svn commit: r1374702 - in /abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax: FOMBuilder.java FOMStAXFilter.java

Author: veithen
Date: Sun Aug 19 07:49:20 2012
New Revision: 1374702

URL: http://svn.apache.org/viewvc?rev=1374702&view=rev
Log:
Also move attribute filtering to FOMStAXFilter, so that FOMBuilder no longer needs to override StAXOMBuilder#processAttributes. Now, all filtering and transformation is done in FOMStAXFilter.

Modified:
    abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMBuilder.java
    abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMStAXFilter.java

Modified: abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMBuilder.java
URL: http://svn.apache.org/viewvc/abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMBuilder.java?rev=1374702&r1=1374701&r2=1374702&view=diff
==============================================================================
--- abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMBuilder.java (original)
+++ abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMBuilder.java Sun Aug 19 07:49:20 2012
@@ -20,7 +20,6 @@ package org.apache.abdera.parser.stax;
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamReader;
 
-import org.apache.abdera.filter.ParseFilter;
 import org.apache.abdera.model.Content;
 import org.apache.abdera.model.Document;
 import org.apache.abdera.model.Element;
@@ -32,12 +31,10 @@ import org.apache.axiom.om.OMContainer;
 import org.apache.axiom.om.OMDocument;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMException;
-import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMNode;
 import org.apache.axiom.om.impl.OMContainerEx;
 import org.apache.axiom.om.impl.OMNodeEx;
 import org.apache.axiom.om.impl.builder.StAXOMBuilder;
-import org.apache.axiom.om.impl.util.OMSerializerUtil;
 
 @SuppressWarnings( {"unchecked", "deprecation"})
 public class FOMBuilder extends StAXOMBuilder implements Constants {
@@ -105,14 +102,6 @@ public class FOMBuilder extends StAXOMBu
         return ctype;
     }
 
-    private boolean isAcceptableToParse(QName qname, boolean attribute) {
-        if (parserOptions == null)
-            return true;
-        ParseFilter filter = parserOptions.getParseFilter();
-        return (filter != null) ? (!attribute) ? filter.acceptable(qname) : filter.acceptable(parser.getName(), qname)
-            : true;
-    }
-
     /**
      * Method next.
      * 
@@ -142,30 +131,6 @@ public class FOMBuilder extends StAXOMBu
         return element;
     }
 
-    @Override
-    protected void processAttributes(OMElement node) {
-        int attribCount = parser.getAttributeCount();
-        for (int i = 0; i < attribCount; i++) {
-            QName attr = parser.getAttributeName(i);
-            if (isAcceptableToParse(attr, true)) {
-                String uri = parser.getAttributeNamespace(i);
-                String prefix = parser.getAttributePrefix(i);
-                OMNamespace namespace = null;
-                if (uri != null && uri.length() > 0) {
-                    namespace = node.findNamespace(uri, prefix);
-                    if (namespace == null) {
-                        if (prefix == null || "".equals(prefix)) {
-                            prefix = OMSerializerUtil.getNextNSPrefix();
-                        }
-                        namespace = node.declareNamespace(uri, prefix);
-                    }
-                }
-                String value = parser.getAttributeValue(i);
-                node.addAttribute(parser.getAttributeLocalName(i), value, namespace);
-            }
-        }
-    }
-
     public <T extends Element> Document<T> getFomDocument() {
         while (!indoc && !done) {
             next();

Modified: abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMStAXFilter.java
URL: http://svn.apache.org/viewvc/abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMStAXFilter.java?rev=1374702&r1=1374701&r2=1374702&view=diff
==============================================================================
--- abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMStAXFilter.java (original)
+++ abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMStAXFilter.java Sun Aug 19 07:49:20 2012
@@ -51,6 +51,8 @@ class FOMStAXFilter extends XMLStreamRea
     private int altEventType;
     private QName altQName;
     private String altText;
+    private int[] attributeMap;
+    private int attributeCount;
     
     FOMStAXFilter(XMLStreamReader parent, ParserOptions parserOptions) {
         super(parent);
@@ -61,6 +63,7 @@ class FOMStAXFilter extends XMLStreamRea
                 ignoreWhitespace = parseFilter.getIgnoreWhitespace();
                 ignoreComments = parseFilter.getIgnoreComments();
                 ignorePI = parseFilter.getIgnoreProcessingInstructions();
+                attributeMap = new int[8];
             }
         }
         resetEvent();
@@ -70,16 +73,9 @@ class FOMStAXFilter extends XMLStreamRea
         altEventType = -1;
         altQName = null;
         altText = null;
+        attributeCount = -1;
     }
     
-    private boolean isAcceptableToParse(QName qname, boolean attribute) {
-        if (parserOptions == null)
-            return true;
-        ParseFilter filter = parserOptions.getParseFilter();
-        return (filter != null) ? (!attribute) ? filter.acceptable(qname) : filter.acceptable(getName(), qname)
-            : true;
-    }
-
     private void translateQName() {
         if (parserOptions.isQNameAliasMappingEnabled()) {
             Map<QName,QName> map = parserOptions.getQNameAliasMap();
@@ -89,6 +85,25 @@ class FOMStAXFilter extends XMLStreamRea
         }
     }
     
+    private void mapAttributes() {
+        attributeCount = 0;
+        int orgAttCount = super.getAttributeCount();
+        if (orgAttCount > 0) {
+            QName elementQName = super.getName();
+            ParseFilter filter = parserOptions.getParseFilter();
+            for (int i=0; i<orgAttCount; i++) {
+                if (filter.acceptable(elementQName, super.getAttributeName(i))) {
+                    if (attributeCount == attributeMap.length) {
+                        int[] newAttributeMap = new int[attributeMap.length*2];
+                        System.arraycopy(attributeMap, 0, newAttributeMap, 0, attributeMap.length);
+                        attributeMap = newAttributeMap;
+                    }
+                    attributeMap[attributeCount++] = i;
+                }
+            }
+        }
+    }
+    
     @Override
     public int next() throws XMLStreamException {
         resetEvent();
@@ -120,11 +135,15 @@ class FOMStAXFilter extends XMLStreamRea
                         // shouldn't be that big of a problem
                         continue;
                     case START_ELEMENT:
-                        if (!isAcceptableToParse(getName(), false)) {
+                        ParseFilter filter = parserOptions.getParseFilter();
+                        if (filter != null && !filter.acceptable(super.getName())) {
                             depthInSkipElement = 1;
                             continue;
                         }
                         translateQName();
+                        if (attributeMap != null) {
+                            mapAttributes();
+                        }
                         break;
                     case END_ELEMENT:
                         translateQName();
@@ -189,4 +208,39 @@ class FOMStAXFilter extends XMLStreamRea
     public QName getName() {
         return altQName != null ? altQName : super.getName();
     }
+
+    @Override
+    public int getAttributeCount() {
+        return attributeCount != -1 ? attributeCount : super.getAttributeCount();
+    }
+
+    @Override
+    public String getAttributeNamespace(int index) {
+        return attributeCount != -1 ? super.getAttributeNamespace(attributeMap[index]) : super.getAttributeNamespace(index);
+    }
+
+    @Override
+    public String getAttributeLocalName(int index) {
+        return attributeCount != -1 ? super.getAttributeLocalName(attributeMap[index]) : super.getAttributeLocalName(index);
+    }
+
+    @Override
+    public String getAttributePrefix(int index) {
+        return attributeCount != -1 ? super.getAttributePrefix(attributeMap[index]) : super.getAttributePrefix(index);
+    }
+
+    @Override
+    public QName getAttributeName(int index) {
+        return attributeCount != -1 ? super.getAttributeName(attributeMap[index]) : super.getAttributeName(index);
+    }
+
+    @Override
+    public String getAttributeType(int index) {
+        return attributeCount != -1 ? super.getAttributeType(attributeMap[index]) : super.getAttributeType(index);
+    }
+
+    @Override
+    public String getAttributeValue(int index) {
+        return attributeCount != -1 ? super.getAttributeValue(attributeMap[index]) : super.getAttributeValue(index);
+    }
 }