1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 */ 18 /* 19 * $Id: DTMFilter.java 468653 2006-10-28 07:07:05Z minchau $ 20 */ 21 package org.apache.xml.dtm; 22 23 /** 24 * Simple filter for doing node tests. Note the semantics of this are 25 * somewhat different that the DOM's NodeFilter. 26 */ 27 public interface DTMFilter 28 { 29 30 // Constants for whatToShow. These are used to set the node type that will 31 // be traversed. These values may be ORed together before being passed to 32 // the DTMIterator. 33 34 /** 35 * Show all <code>Nodes</code>. 36 */ 37 public static final int SHOW_ALL = 0xFFFFFFFF; 38 39 /** 40 * Show <code>Element</code> nodes. 41 */ 42 public static final int SHOW_ELEMENT = 0x00000001; 43 44 /** 45 * Show <code>Attr</code> nodes. This is meaningful only when creating an 46 * iterator or tree-walker with an attribute node as its 47 * <code>root</code>; in this case, it means that the attribute node 48 * will appear in the first position of the iteration or traversal. 49 * Since attributes are never children of other nodes, they do not 50 * appear when traversing over the main document tree. 51 */ 52 public static final int SHOW_ATTRIBUTE = 0x00000002; 53 54 /** 55 * Show <code>Text</code> nodes. 56 */ 57 public static final int SHOW_TEXT = 0x00000004; 58 59 /** 60 * Show <code>CDATASection</code> nodes. 61 */ 62 public static final int SHOW_CDATA_SECTION = 0x00000008; 63 64 /** 65 * Show <code>EntityReference</code> nodes. Note that if Entity References 66 * have been fully expanded while the tree was being constructed, these 67 * nodes will not appear and this mask has no effect. 68 */ 69 public static final int SHOW_ENTITY_REFERENCE = 0x00000010; 70 71 /** 72 * Show <code>Entity</code> nodes. This is meaningful only when creating 73 * an iterator or tree-walker with an<code> Entity</code> node as its 74 * <code>root</code>; in this case, it means that the <code>Entity</code> 75 * node will appear in the first position of the traversal. Since 76 * entities are not part of the document tree, they do not appear when 77 * traversing over the main document tree. 78 */ 79 public static final int SHOW_ENTITY = 0x00000020; 80 81 /** 82 * Show <code>ProcessingInstruction</code> nodes. 83 */ 84 public static final int SHOW_PROCESSING_INSTRUCTION = 0x00000040; 85 86 /** 87 * Show <code>Comment</code> nodes. 88 */ 89 public static final int SHOW_COMMENT = 0x00000080; 90 91 /** 92 * Show <code>Document</code> nodes. (Of course, as with Attributes 93 * and such, this is meaningful only when the iteration root is the 94 * Document itself, since Document has no parent.) 95 */ 96 public static final int SHOW_DOCUMENT = 0x00000100; 97 98 /** 99 * Show <code>DocumentType</code> nodes. 100 */ 101 public static final int SHOW_DOCUMENT_TYPE = 0x00000200; 102 103 /** 104 * Show <code>DocumentFragment</code> nodes. (Of course, as with 105 * Attributes and such, this is meaningful only when the iteration 106 * root is the Document itself, since DocumentFragment has no parent.) 107 */ 108 public static final int SHOW_DOCUMENT_FRAGMENT = 0x00000400; 109 110 /** 111 * Show <code>Notation</code> nodes. This is meaningful only when creating 112 * an iterator or tree-walker with a <code>Notation</code> node as its 113 * <code>root</code>; in this case, it means that the 114 * <code>Notation</code> node will appear in the first position of the 115 * traversal. Since notations are not part of the document tree, they do 116 * not appear when traversing over the main document tree. 117 */ 118 public static final int SHOW_NOTATION = 0x00000800; 119 120 /** 121 122 * This bit instructs the iterator to show namespace nodes, which 123 * are modeled by DTM but not by the DOM. Make sure this does not 124 * conflict with {@link org.w3c.dom.traversal.NodeFilter}. 125 * <p> 126 * %REVIEW% Might be safer to start from higher bits and work down, 127 * to leave room for the DOM to expand its set of constants... Or, 128 * possibly, to create a DTM-specific field for these additional bits. 129 */ 130 public static final int SHOW_NAMESPACE = 0x00001000; 131 132 /** 133 * Special bit for filters implementing match patterns starting with 134 * a function. Make sure this does not conflict with 135 * {@link org.w3c.dom.traversal.NodeFilter}. 136 * <p> 137 * %REVIEW% Might be safer to start from higher bits and work down, 138 * to leave room for the DOM to expand its set of constants... Or, 139 * possibly, to create a DTM-specific field for these additional bits. 140 */ 141 public static final int SHOW_BYFUNCTION = 0x00010000; 142 143 /** 144 * Test whether a specified node is visible in the logical view of a 145 * <code>DTMIterator</code>. Normally, this function 146 * will be called by the implementation of <code>DTMIterator</code>; 147 * it is not normally called directly from 148 * user code. 149 * 150 * @param nodeHandle int Handle of the node. 151 * @param whatToShow one of SHOW_XXX values. 152 * @return one of FILTER_ACCEPT, FILTER_REJECT, or FILTER_SKIP. 153 */ acceptNode(int nodeHandle, int whatToShow)154 public short acceptNode(int nodeHandle, int whatToShow); 155 156 /** 157 * Test whether a specified node is visible in the logical view of a 158 * <code>DTMIterator</code>. Normally, this function 159 * will be called by the implementation of <code>DTMIterator</code>; 160 * it is not normally called directly from 161 * user code. 162 * <p> 163 * TODO: Should this be setNameMatch(expandedName) followed by accept()? 164 * Or will we really be testing a different name at every invocation? 165 * 166 * <p>%REVIEW% Under what circumstances will this be used? The cases 167 * I've considered are just as easy and just about as efficient if 168 * the name test is performed in the DTMIterator... -- Joe</p> 169 * 170 * <p>%REVIEW% Should that 0xFFFF have a mnemonic assigned to it? 171 * Also: This representation is assuming the expanded name is indeed 172 * split into high/low 16-bit halfwords. If we ever change the 173 * balance between namespace and localname bits (eg because we 174 * decide there are many more localnames than namespaces, which is 175 * fairly likely), this is going to break. It might be safer to 176 * encapsulate the details with a makeExpandedName method and make 177 * that responsible for setting up the wildcard version as well.</p> 178 * 179 * @param nodeHandle int Handle of the node. 180 * @param whatToShow one of SHOW_XXX values. 181 * @param expandedName a value defining the exanded name as defined in 182 * the DTM interface. Wild cards will be defined 183 * by 0xFFFF in the namespace and/or localname 184 * portion of the expandedName. 185 * @return one of FILTER_ACCEPT, FILTER_REJECT, or FILTER_SKIP. */ acceptNode(int nodeHandle, int whatToShow, int expandedName)186 public short acceptNode(int nodeHandle, int whatToShow, int expandedName); 187 188 } 189