1 /* 2 * Copyright (c) 1998, 2014, 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 @SuppressWarnings("serial") // Same-version serialization only 44 public final 45 class Element implements DTDConstants, Serializable { 46 public int index; 47 public String name; 48 public boolean oStart; 49 public boolean oEnd; 50 public BitSet inclusions; 51 public BitSet exclusions; 52 public int type = ANY; 53 public ContentModel content; 54 public AttributeList atts; 55 56 /** 57 * A field to store user data. Mostly used to store 58 * style sheets. 59 */ 60 public Object data; 61 62 Element() { 63 } 64 65 /** 66 * Create a new element. 67 */ 68 Element(String name, int index) { 69 this.name = name; 70 this.index = index; 71 if (index > getMaxIndex()) { 72 AppContext.getAppContext().put(MAX_INDEX_KEY, index); 73 } 74 } 75 76 private static final Object MAX_INDEX_KEY = new Object(); 77 78 static int getMaxIndex() { 79 Integer value = (Integer) AppContext.getAppContext().get(MAX_INDEX_KEY); 80 return (value != null) 81 ? value.intValue() 82 : 0; 83 } 84 85 /** 86 * Get the name of the element. 87 */ 88 public String getName() { 89 return name; 90 } 91 92 /** 93 * Return true if the start tag can be omitted. 94 */ 95 public boolean omitStart() { 96 return oStart; 97 } 98 99 /** 100 * Return true if the end tag can be omitted. 101 */ 102 public boolean omitEnd() { 103 return oEnd; 104 } 105 106 /** 107 * Get type. 108 */ 109 public int getType() { 110 return type; 111 } 112 113 /** 114 * Get content model 115 */ 116 public ContentModel getContent() { 117 return content; 118 } 119 120 /** 121 * Get the attributes. 122 */ 123 public AttributeList getAttributes() { 124 return atts; 125 } 126 127 /** 128 * Get index. 129 */ 130 public int getIndex() { 131 return index; 132 } 133 134 /** 135 * Check if empty 136 */ 137 public boolean isEmpty() { 138 return type == EMPTY; 139 } 140 141 /** 142 * Convert to a string. 143 */ 144 public String toString() { 145 return name; 146 } 147 148 /** 149 * Get an attribute by name. 150 */ 151 public AttributeList getAttribute(String name) { 152 for (AttributeList a = atts ; a != null ; a = a.next) { 153 if (a.name.equals(name)) { 154 return a; 155 } 156 } 157 return null; 158 } 159 160 /** 161 * Get an attribute by value. 162 */ 163 public AttributeList getAttributeByValue(String name) { 164 for (AttributeList a = atts ; a != null ; a = a.next) { 165 if ((a.values != null) && a.values.contains(name)) { 166 return a; 167 } 168 } 169 return null; 170 } 171 172 173 static Hashtable<String, Integer> contentTypes = new Hashtable<String, Integer>(); 174 175 static { 176 contentTypes.put("CDATA", Integer.valueOf(CDATA)); 177 contentTypes.put("RCDATA", Integer.valueOf(RCDATA)); 178 contentTypes.put("EMPTY", Integer.valueOf(EMPTY)); 179 contentTypes.put("ANY", Integer.valueOf(ANY)); 180 } 181 182 public static int name2type(String nm) { 183 Integer val = contentTypes.get(nm); 184 return (val != null) ? val.intValue() : 0; 185 } 186 }