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 &quot;Internal
159f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *         Property&quot;, 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>&amp;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: &apos; not serialized as only outer qoutes are used
405f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		              	case '<':	buffer.append("&lt;"); continue;
406f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		              	case '>':	buffer.append("&gt;"); continue;
407f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		              	case '&':	buffer.append("&amp;"); continue;
408f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		              	case '"': 	buffer.append(forAttribute ? "&quot;" : "\""); 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}