1f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling// ================================================================================================= 2f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling// ADOBE SYSTEMS INCORPORATED 3f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling// Copyright 2006 Adobe Systems Incorporated 4f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling// All Rights Reserved 5f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling// 6f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms 7f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling// of the Adobe license agreement accompanying it. 8f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling// ================================================================================================= 9f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 10f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingpackage com.adobe.xmp.impl; 11f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 12f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 13f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport com.adobe.xmp.XMPConst; 14f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 15f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 16f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling/** 17f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Utility functions for the XMPToolkit implementation. 18f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * 19f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @since 06.06.2006 20f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 21f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingpublic class Utils implements XMPConst 22f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling{ 23f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** segments of a UUID */ 24f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public static final int UUID_SEGMENT_COUNT = 4; 25f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** length of a UUID */ 26f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public static final int UUID_LENGTH = 32 + UUID_SEGMENT_COUNT; 27f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** table of XML name start chars (<= 0xFF) */ 28f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling private static boolean[] xmlNameStartChars; 29f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** table of XML name chars (<= 0xFF) */ 30f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling private static boolean[] xmlNameChars; 31f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** init char tables */ 32f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling static 33f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 34f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling initCharTables(); 35f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 36f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 37f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 38f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 39f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Private constructor 40f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 41f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling private Utils() 42f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 43f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling // EMPTY 44f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 45f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 46f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 47f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 48f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Normalize an xml:lang value so that comparisons are effectively case 49f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * insensitive as required by RFC 3066 (which superceeds RFC 1766). The 50f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * normalization rules: 51f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * <ul> 52f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * <li> The primary subtag is lower case, the suggested practice of ISO 639. 53f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * <li> All 2 letter secondary subtags are upper case, the suggested 54f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * practice of ISO 3166. 55f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * <li> All other subtags are lower case. 56f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * </ul> 57f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * 58f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param value 59f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * raw value 60f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return Returns the normalized value. 61f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 62f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public static String normalizeLangValue(String value) 63f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 64f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling // don't normalize x-default 65f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if (XMPConst.X_DEFAULT.equals(value)) 66f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 67f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return value; 68f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 69f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 70f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling int subTag = 1; 71f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling StringBuffer buffer = new StringBuffer(); 72f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 73f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling for (int i = 0; i < value.length(); i++) 74f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 75f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling switch (value.charAt(i)) 76f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 77f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling case '-': 78f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling case '_': 79f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling // move to next subtag and convert underscore to hyphen 80f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling buffer.append('-'); 81f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling subTag++; 82f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling break; 83f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling case ' ': 84f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling // remove spaces 85f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling break; 86f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling default: 87f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling // convert second subtag to uppercase, all other to lowercase 88f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if (subTag != 2) 89f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 90f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling buffer.append(Character.toLowerCase(value.charAt(i))); 91f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 92f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling else 93f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 94f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling buffer.append(Character.toUpperCase(value.charAt(i))); 95f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 96f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 97f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 98f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 99f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return buffer.toString(); 100f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 101f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 102f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 103f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 104f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Split the name and value parts for field and qualifier selectors: 105f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * <ul> 106f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * <li>[qualName="value"] - An element in an array of structs, chosen by a 107f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * field value. 108f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * <li>[?qualName="value"] - An element in an array, chosen by a qualifier 109f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * value. 110f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * </ul> 111f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * The value portion is a string quoted by ''' or '"'. The value may contain 112f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * any character including a doubled quoting character. The value may be 113f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * empty. <em>Note:</em> It is assumed that the expression is formal 114f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * correct 115f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * 116f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param selector 117f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * the selector 118f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return Returns an array where the first entry contains the name and the 119f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * second the value. 120f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 121f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling static String[] splitNameAndValue(String selector) 122f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 123f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling // get the name 124f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling int eq = selector.indexOf('='); 125f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling int pos = 1; 126f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if (selector.charAt(pos) == '?') 127f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 128f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling pos++; 129f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 130f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling String name = selector.substring(pos, eq); 131f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 132f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling // get the value 133f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling pos = eq + 1; 134f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling char quote = selector.charAt(pos); 135f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling pos++; 136f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling int end = selector.length() - 2; // quote and ] 137f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling StringBuffer value = new StringBuffer(end - eq); 138f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling while (pos < end) 139f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 140f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling value.append(selector.charAt(pos)); 141f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling pos++; 142f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if (selector.charAt(pos) == quote) 143f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 144f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling // skip one quote in value 145f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling pos++; 146f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 147f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 148f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return new String[] { name, value.toString() }; 149f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 150f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 151f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 152f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 153f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * 154f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param schema 155f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * a schema namespace 156f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param prop 157f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * an XMP Property 158f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return Returns true if the property is defined as "Internal 159f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Property", see XMP Specification. 160f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 161f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling static boolean isInternalProperty(String schema, String prop) 162f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 163f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling boolean isInternal = false; 164f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 165f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if (NS_DC.equals(schema)) 166f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 167f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if ("dc:format".equals(prop) || "dc:language".equals(prop)) 168f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 169f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling isInternal = true; 170f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 171f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 172f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling else if (NS_XMP.equals(schema)) 173f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 174f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if ("xmp:BaseURL".equals(prop) || "xmp:CreatorTool".equals(prop) 175f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling || "xmp:Format".equals(prop) || "xmp:Locale".equals(prop) 176f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling || "xmp:MetadataDate".equals(prop) || "xmp:ModifyDate".equals(prop)) 177f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 178f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling isInternal = true; 179f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 180f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 181f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling else if (NS_PDF.equals(schema)) 182f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 183f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if ("pdf:BaseURL".equals(prop) || "pdf:Creator".equals(prop) 184f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling || "pdf:ModDate".equals(prop) || "pdf:PDFVersion".equals(prop) 185f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling || "pdf:Producer".equals(prop)) 186f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 187f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling isInternal = true; 188f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 189f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 190f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling else if (NS_TIFF.equals(schema)) 191f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 192f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling isInternal = true; 193f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if ("tiff:ImageDescription".equals(prop) || "tiff:Artist".equals(prop) 194f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling || "tiff:Copyright".equals(prop)) 195f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 196f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling isInternal = false; 197f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 198f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 199f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling else if (NS_EXIF.equals(schema)) 200f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 201f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling isInternal = true; 202f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if ("exif:UserComment".equals(prop)) 203f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 204f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling isInternal = false; 205f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 206f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 207f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling else if (NS_EXIF_AUX.equals(schema)) 208f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 209f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling isInternal = true; 210f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 211f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling else if (NS_PHOTOSHOP.equals(schema)) 212f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 213f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if ("photoshop:ICCProfile".equals(prop)) 214f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 215f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling isInternal = true; 216f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 217f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 218f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling else if (NS_CAMERARAW.equals(schema)) 219f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 220f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if ("crs:Version".equals(prop) || "crs:RawFileName".equals(prop) 221f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling || "crs:ToneCurveName".equals(prop)) 222f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 223f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling isInternal = true; 224f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 225f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 226f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling else if (NS_ADOBESTOCKPHOTO.equals(schema)) 227f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 228f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling isInternal = true; 229f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 230f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling else if (NS_XMP_MM.equals(schema)) 231f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 232f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling isInternal = true; 233f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 234f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling else if (TYPE_TEXT.equals(schema)) 235f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 236f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling isInternal = true; 237f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 238f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling else if (TYPE_PAGEDFILE.equals(schema)) 239f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 240f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling isInternal = true; 241f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 242f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling else if (TYPE_GRAPHICS.equals(schema)) 243f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 244f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling isInternal = true; 245f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 246f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling else if (TYPE_IMAGE.equals(schema)) 247f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 248f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling isInternal = true; 249f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 250f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling else if (TYPE_FONT.equals(schema)) 251f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 252f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling isInternal = true; 253f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 254f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 255f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return isInternal; 256f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 257f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 258f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 259f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 260f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Check some requirements for an UUID: 261f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * <ul> 262f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * <li>Length of the UUID is 32</li> 263f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * <li>The Delimiter count is 4 and all the 4 delimiter are on their right 264f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * position (8,13,18,23)</li> 265f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * </ul> 266f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * 267f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * 268f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param uuid uuid to test 269f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return true - this is a well formed UUID, false - UUID has not the expected format 270f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 271f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 272f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling static boolean checkUUIDFormat(String uuid) 273f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 274f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling boolean result = true; 275f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling int delimCnt = 0; 276f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling int delimPos = 0; 277f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 278f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if (uuid == null) 279f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 280f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return false; 281f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 282f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 283f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling for (delimPos = 0; delimPos < uuid.length(); delimPos++) 284f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 285f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if (uuid.charAt(delimPos) == '-') 286f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 287f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling delimCnt++; 288f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling result = result && 289f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling (delimPos == 8 || delimPos == 13 || delimPos == 18 || delimPos == 23); 290f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 291f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 292f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 293f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return result && UUID_SEGMENT_COUNT == delimCnt && UUID_LENGTH == delimPos; 294f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 295f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 296f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 297f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 298f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Simple check for valid XMLNames. Within ASCII range<br> 299f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6]<br> 300f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * are accepted, above all characters (which is not entirely 301f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * correct according to the XML Spec. 302f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * 303f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param name an XML Name 304f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return Return <code>true</code> if the name is correct. 305f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 306f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public static boolean isXMLName(String name) 307f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 308f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if (name.length() > 0 && !isNameStartChar(name.charAt(0))) 309f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 310f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return false; 311f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 312f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling for (int i = 1; i < name.length(); i++) 313f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 314f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if (!isNameChar(name.charAt(i))) 315f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 316f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return false; 317f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 318f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 319f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return true; 320f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 321f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 322f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 323f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 324f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Checks if the value is a legal "unqualified" XML name, as 325f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * defined in the XML Namespaces proposed recommendation. 326f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * These are XML names, except that they must not contain a colon. 327f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param name the value to check 328f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return Returns true if the name is a valid "unqualified" XML name. 329f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 330f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public static boolean isXMLNameNS(String name) 331f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 332f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if (name.length() > 0 && (!isNameStartChar(name.charAt(0)) || name.charAt(0) == ':')) 333f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 334f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return false; 335f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 336f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling for (int i = 1; i < name.length(); i++) 337f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 338f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if (!isNameChar(name.charAt(i)) || name.charAt(i) == ':') 339f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 340f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return false; 341f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 342f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 343f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return true; 344f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 345f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 346f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 347f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 348f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param c a char 349f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return Returns true if the char is an ASCII control char. 350f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 351f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling static boolean isControlChar(char c) 352f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 353f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return (c <= 0x1F || c == 0x7F) && 354f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling c != 0x09 && c != 0x0A && c != 0x0D; 355f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 356f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 357f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 358f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 359f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Serializes the node value in XML encoding. Its used for tag bodies and 360f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * attributes.<br> 361f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * <em>Note:</em> The attribute is always limited by quotes, 362f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * thats why <code>&apos;</code> is never serialized.<br> 363f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * <em>Note:</em> Control chars are written unescaped, but if the user uses others than tab, LF 364f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * and CR the resulting XML will become invalid. 365f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param value a string 366f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param forAttribute flag if string is attribute value (need to additional escape quotes) 367f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param escapeWhitespaces Decides if LF, CR and TAB are escaped. 368f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return Returns the value ready for XML output. 369f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 370f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public static String escapeXML(String value, boolean forAttribute, boolean escapeWhitespaces) 371f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 372f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling // quick check if character are contained that need special treatment 373f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling boolean needsEscaping = false; 374f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling for (int i = 0; i < value.length (); i++) 375f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 376f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling char c = value.charAt (i); 377f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if ( 378f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling c == '<' || c == '>' || c == '&' || // XML chars 379f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling (escapeWhitespaces && (c == '\t' || c == '\n' || c == '\r')) || 380f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling (forAttribute && c == '"')) 381f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 382f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling needsEscaping = true; 383f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling break; 384f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 385f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 386f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 387f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if (!needsEscaping) 388f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 389f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling // fast path 390f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return value; 391f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 392f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling else 393f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 394f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling // slow path with escaping 395f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling StringBuffer buffer = new StringBuffer(value.length() * 4 / 3); 396f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling for (int i = 0; i < value.length (); i++) 397f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 398f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling char c = value.charAt (i); 399f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if (!(escapeWhitespaces && (c == '\t' || c == '\n' || c == '\r'))) 400f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 401f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling switch (c) 402f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 403f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling // we do what "Canonical XML" expects 404f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling // AUDIT: ' not serialized as only outer qoutes are used 405f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling case '<': buffer.append("<"); continue; 406f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling case '>': buffer.append(">"); continue; 407f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling case '&': buffer.append("&"); continue; 408f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling case '"': buffer.append(forAttribute ? """ : "\""); continue; 409f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling default: buffer.append(c); continue; 410f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 411f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 412f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling else 413f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 414f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling // write control chars escaped, 415f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling // if there are others than tab, LF and CR the xml will become invalid. 416f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling buffer.append("&#x"); 417f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling buffer.append(Integer.toHexString(c).toUpperCase()); 418f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling buffer.append(';'); 419f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 420f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 421f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return buffer.toString(); 422f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 423f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 424f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 425f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 426f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 427f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Replaces the ASCII control chars with a space. 428f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * 429f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param value 430f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * a node value 431f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return Returns the cleaned up value 432f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 433f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling static String removeControlChars(String value) 434f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 435f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling StringBuffer buffer = new StringBuffer(value); 436f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling for (int i = 0; i < buffer.length(); i++) 437f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 438f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if (isControlChar(buffer.charAt(i))) 439f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 440f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling buffer.setCharAt(i, ' '); 441f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 442f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 443f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return buffer.toString(); 444f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 445f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 446f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 447f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 448f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Simple check if a character is a valid XML start name char. 449f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Within ASCII range<br> 450f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6]<br> 451f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * are accepted, above all characters (which is not entirely 452f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * correct according to the XML Spec) 453f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * 454f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param ch a character 455f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return Returns true if the character is a valid first char of an XML name. 456f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 457f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling private static boolean isNameStartChar(char ch) 458f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 459f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return ch > 0xFF || xmlNameStartChars[ch]; 460f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 461f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 462f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 463f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 464f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Simple check if a character is a valid XML name char 465f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * (every char except the first one). 466f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Within ASCII range<br> 467f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6]<br> 468f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * are accepted, above all characters (which is not entirely 469f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * correct according to the XML Spec) 470f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * 471f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param ch a character 472f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return Returns true if the character is a valid char of an XML name. 473f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 474f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling private static boolean isNameChar(char ch) 475f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 476f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return ch > 0xFF || xmlNameChars[ch]; 477f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 478f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 479f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 480f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 481f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Initializes the char tables for later use. 482f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 483f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling private static void initCharTables() 484f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 485f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling xmlNameChars = new boolean[0x0100]; 486f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling xmlNameStartChars = new boolean[0x0100]; 487f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 488f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling for (char ch = 0; ch < xmlNameChars.length; ch++) 489f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 490f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling xmlNameStartChars[ch] = 491f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling ('a' <= ch && ch <= 'z') || 492f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling ('A' <= ch && ch <= 'Z') || 493f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling ch == ':' || 494f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling ch == '_' || 495f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling (0xC0 <= ch && ch <= 0xD6) || 496f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling (0xD8 <= ch && ch <= 0xF6); 497f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 498f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling xmlNameChars[ch] = 499f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling ('a' <= ch && ch <= 'z') || 500f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling ('A' <= ch && ch <= 'Z') || 501f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling ('0' <= ch && ch <= '9') || 502f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling ch == ':' || 503f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling ch == '_' || 504f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling ch == '-' || 505f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling ch == '.' || 506f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling ch == 0xB7 || 507f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling (0xC0 <= ch && ch <= 0xD6) || 508f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling (0xD8 <= ch && ch <= 0xF6); 509f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 510f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 511f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling}