1 /* 2 * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package javax.swing.text.html.parser; 27 28 import java.util.Hashtable; 29 import java.util.BitSet; 30 import java.io.*; 31 import sun.awt.AppContext; 32 33 /** 34 * An element as described in a DTD using the ELEMENT construct. 35 * This is essential the description of a tag. It describes the 36 * type, content model, attributes, attribute types etc. It is used 37 * to correctly parse a document by the Parser. 38 * 39 * @see DTD 40 * @see AttributeList 41 * @author Arthur van Hoff 42 */ 43 public final 44 class Element implements DTDConstants, Serializable { 45 public int index; 46 public String name; 47 public boolean oStart; 48 public boolean oEnd; 49 public BitSet inclusions; 50 public BitSet exclusions; 51 public int type = ANY; 52 public ContentModel content; 53 public AttributeList atts; 54 55 /** 56 * A field to store user data. Mostly used to store 57 * style sheets. 58 */ 59 public Object data; 60 61 Element() { 62 } 63 64 /** 65 * Create a new element. 66 */ 67 Element(String name, int index) { 68 this.name = name; 69 this.index = index; 70 if (index > getMaxIndex()) { 71 AppContext.getAppContext().put(MAX_INDEX_KEY, index); 72 } 73 } 74 75 private static final Object MAX_INDEX_KEY = new Object(); 76 77 static int getMaxIndex() { 78 Integer value = (Integer) AppContext.getAppContext().get(MAX_INDEX_KEY); 79 return (value != null) 80 ? value.intValue() 81 : 0; 82 } 83 84 /** 85 * Get the name of the element. 86 */ 87 public String getName() { 88 return name; 89 } 90 91 /** 92 * Return true if the start tag can be omitted. 93 */ 94 public boolean omitStart() { 95 return oStart; 96 } 97 98 /** 99 * Return true if the end tag can be omitted. 100 */ 101 public boolean omitEnd() { 102 return oEnd; 103 } 104 105 /** 106 * Get type. 107 */ 108 public int getType() { 109 return type; 110 } 111 112 /** 113 * Get content model 114 */ 115 public ContentModel getContent() { 116 return content; 117 } 118 119 /** 120 * Get the attributes. 121 */ 122 public AttributeList getAttributes() { 123 return atts; 124 } 125 126 /** 127 * Get index. 128 */ 129 public int getIndex() { 130 return index; 131 } 132 133 /** 134 * Check if empty 135 */ 136 public boolean isEmpty() { 137 return type == EMPTY; 138 } 139 140 /** 141 * Convert to a string. 142 */ 143 public String toString() { 144 return name; 145 } 146 147 /** 148 * Get an attribute by name. 149 */ 150 public AttributeList getAttribute(String name) { 151 for (AttributeList a = atts ; a != null ; a = a.next) { 152 if (a.name.equals(name)) { 153 return a; 154 } 155 } 156 return null; 157 } 158 159 /** 160 * Get an attribute by value. 161 */ 162 public AttributeList getAttributeByValue(String name) { 163 for (AttributeList a = atts ; a != null ; a = a.next) { 164 if ((a.values != null) && a.values.contains(name)) { 165 return a; 166 } 167 } 168 return null; 169 } 170 171 172 static Hashtable<String, Integer> contentTypes = new Hashtable<String, Integer>(); 173 174 static { 175 contentTypes.put("CDATA", Integer.valueOf(CDATA)); 176 contentTypes.put("RCDATA", Integer.valueOf(RCDATA)); 177 contentTypes.put("EMPTY", Integer.valueOf(EMPTY)); 178 contentTypes.put("ANY", Integer.valueOf(ANY)); 179 } 180 181 public static int name2type(String nm) { 182 Integer val = contentTypes.get(nm); 183 return (val != null) ? val.intValue() : 0; 184 } 185 }