1// =================================================================================================
2// ADOBE SYSTEMS INCORPORATED
3// Copyright 2006 Adobe Systems Incorporated
4// All Rights Reserved
5//
6// NOTICE:  Adobe permits you to use, modify, and distribute this file in accordance with the terms
7// of the Adobe license agreement accompanying it.
8// =================================================================================================
9
10package com.adobe.xmp;
11
12import java.util.Calendar;
13
14import com.adobe.xmp.options.IteratorOptions;
15import com.adobe.xmp.options.ParseOptions;
16import com.adobe.xmp.options.PropertyOptions;
17import com.adobe.xmp.properties.XMPProperty;
18
19
20/**
21 * This class represents the set of XMP metadata as a DOM representation. It has methods to read and
22 * modify all kinds of properties, create an iterator over all properties and serialize the metadata
23 * to a String, byte-array or <code>OutputStream</code>.
24 *
25 * @since 20.01.2006
26 */
27public interface XMPMeta extends Cloneable
28{
29	// ---------------------------------------------------------------------------------------------
30	// Basic property manipulation functions
31
32	/**
33	 * The property value getter-methods all take a property specification: the first two parameters
34	 * are always the top level namespace URI (the &quot;schema&quot; namespace) and the basic name
35	 * of the property being referenced. See the introductory discussion of path expression usage
36	 * for more information.
37	 * <p>
38	 * All of the functions return an object inherited from <code>PropertyBase</code> or
39	 * <code>null</code> if the property does not exists. The result object contains the value of
40	 * the property and option flags describing the property. Arrays and the non-leaf levels of
41	 * nodes do not have values.
42	 * <p>
43	 * See {@link PropertyOptions} for detailed information about the options.
44	 * <p>
45	 * This is the simplest property getter, mainly for top level simple properties or after using
46	 * the path composition functions in XMPPathFactory.
47	 *
48	 * @param schemaNS The namespace URI for the property. May be <code>null</code> or the empty
49	 *        string if the first component of the propName path contains a namespace prefix. The
50	 *        URI must be for a registered namespace.
51	 * @param propName The name of the property. May be a general path expression, must not be
52	 *        <code>null</code> or the empty string. Using a namespace prefix on the first
53	 *        component is optional. If present without a schemaNS value then the prefix specifies
54	 *        the namespace. The prefix must be for a registered namespace. If both a schemaNS URI
55	 *        and propName prefix are present, they must be corresponding parts of a registered
56	 *        namespace.
57	 * @return Returns a <code>XMPProperty</code> containing the value and the options or
58	 *         <code>null</code> if the property does not exist.
59	 * @throws XMPException Wraps all errors and exceptions that may occur.
60	 */
61	XMPProperty getProperty(String schemaNS, String propName) throws XMPException;
62
63
64	/**
65	 * Provides access to items within an array. The index is passed as an integer, you need not
66	 * worry about the path string syntax for array items, convert a loop index to a string, etc.
67	 *
68	 * @param schemaNS The namespace URI for the array. Has the same usage as in getProperty.
69	 * @param arrayName The name of the array. May be a general path expression, must not be
70	 *        <code>null</code> or the empty string. Has the same namespace prefix usage as
71	 *        propName in <code>getProperty()</code>.
72	 * @param itemIndex The index of the desired item. Arrays in XMP are indexed from 1. The
73	 *        constant {@link XMPConst#ARRAY_LAST_ITEM} always refers to the last existing array
74	 *        item.
75	 * @return Returns a <code>XMPProperty</code> containing the value and the options or
76	 *         <code>null</code> if the property does not exist.
77	 * @throws XMPException Wraps all errors and exceptions that may occur.
78	 */
79	XMPProperty getArrayItem(String schemaNS, String arrayName, int itemIndex) throws XMPException;
80
81
82	/**
83	 * Returns the number of items in the array.
84	 *
85	 * @param schemaNS The namespace URI for the array. Has the same usage as in getProperty.
86	 * @param arrayName The name of the array. May be a general path expression, must not be
87	 *        <code>null</code> or the empty string. Has the same namespace prefix usage as
88	 *        propName in <code>getProperty()</code>.
89	 * @return Returns the number of items in the array.
90	 * @throws XMPException Wraps all errors and exceptions that may occur.
91	 */
92	int countArrayItems(String schemaNS, String arrayName) throws XMPException;
93
94
95	/**
96	 * Provides access to fields within a nested structure. The namespace for the field is passed as
97	 * a URI, you need not worry about the path string syntax.
98	 * <p>
99	 * The names of fields should be XML qualified names, that is within an XML namespace. The path
100	 * syntax for a qualified name uses the namespace prefix. This is unreliable since the prefix is
101	 * never guaranteed. The URI is the formal name, the prefix is just a local shorthand in a given
102	 * sequence of XML text.
103	 *
104	 * @param schemaNS The namespace URI for the struct. Has the same usage as in getProperty.
105	 * @param structName The name of the struct. May be a general path expression, must not be
106	 *        <code>null</code> or the empty string. Has the same namespace prefix usage as
107	 *        propName in <code>getProperty()</code>.
108	 * @param fieldNS The namespace URI for the field. Has the same URI and prefix usage as the
109	 *        schemaNS parameter.
110	 * @param fieldName The name of the field. Must be a single XML name, must not be
111	 *        <code>null</code> or the empty string. Has the same namespace prefix usage as the
112	 *        structName parameter.
113	 * @return Returns a <code>XMPProperty</code> containing the value and the options or
114	 *         <code>null</code> if the property does not exist. Arrays and non-leaf levels of
115	 *         structs do not have values.
116	 * @throws XMPException Wraps all errors and exceptions that may occur.
117	 */
118	XMPProperty getStructField(
119		String schemaNS,
120		String structName,
121		String fieldNS,
122		String fieldName) throws XMPException;
123
124
125	/**
126	 * Provides access to a qualifier attached to a property. The namespace for the qualifier is
127	 * passed as a URI, you need not worry about the path string syntax. In many regards qualifiers
128	 * are like struct fields. See the introductory discussion of qualified properties for more
129	 * information.
130	 * <p>
131	 * The names of qualifiers should be XML qualified names, that is within an XML namespace. The
132	 * path syntax for a qualified name uses the namespace prefix. This is unreliable since the
133	 * prefix is never guaranteed. The URI is the formal name, the prefix is just a local shorthand
134	 * in a given sequence of XML text.
135	 * <p>
136	 * <em>Note:</em> Qualifiers are only supported for simple leaf properties at this time.
137	 *
138	 * @param schemaNS The namespace URI for the struct. Has the same usage as in getProperty.
139	 * @param propName The name of the property to which the qualifier is attached. May be a general
140	 *        path expression, must not be <code>null</code> or the empty string. Has the same
141	 *        namespace prefix usage as in <code>getProperty()</code>.
142	 * @param qualNS The namespace URI for the qualifier. Has the same URI and prefix usage as the
143	 *        schemaNS parameter.
144	 * @param qualName The name of the qualifier. Must be a single XML name, must not be
145	 *        <code>null</code> or the empty string. Has the same namespace prefix usage as the
146	 *        propName parameter.
147	 * @return Returns a <code>XMPProperty</code> containing the value and the options of the
148	 *         qualifier or <code>null</code> if the property does not exist. The name of the
149	 *         qualifier must be a single XML name, must not be <code>null</code> or the empty
150	 *         string. Has the same namespace prefix usage as the propName parameter.
151	 *         <p>
152	 *         The value of the qualifier is only set if it has one (Arrays and non-leaf levels of
153	 *         structs do not have values).
154	 * @throws XMPException Wraps all errors and exceptions that may occur.
155	 */
156	XMPProperty getQualifier(
157		String schemaNS,
158		String propName,
159		String qualNS,
160		String qualName) throws XMPException;
161
162
163
164	// ---------------------------------------------------------------------------------------------
165	// Functions for setting property values
166
167	/**
168	 * The property value <code>setters</code> all take a property specification, their
169	 * differences are in the form of this. The first two parameters are always the top level
170	 * namespace URI (the <code>schema</code> namespace) and the basic name of the property being
171	 * referenced. See the introductory discussion of path expression usage for more information.
172	 * <p>
173	 * All of the functions take a string value for the property and option flags describing the
174	 * property. The value must be Unicode in UTF-8 encoding. Arrays and non-leaf levels of structs
175	 * do not have values. Empty arrays and structs may be created using appropriate option flags.
176	 * All levels of structs that is assigned implicitly are created if necessary. appendArayItem
177	 * implicitly creates the named array if necessary.
178	 * <p>
179	 * See {@link PropertyOptions} for detailed information about the options.
180	 * <p>
181	 * This is the simplest property setter, mainly for top level simple properties or after using
182	 * the path composition functions in {@link XMPPathFactory}.
183	 *
184	 * @param schemaNS The namespace URI for the property. Has the same usage as in getProperty.
185	 * @param propName The name of the property.
186	 * 				   Has the same usage as in <code>getProperty()</code>.
187	 * @param propValue the value for the property (only leaf properties have a value).
188	 *        Arrays and non-leaf levels of structs do not have values.
189	 *        Must be <code>null</code> if the value is not relevant.<br/>
190	 *        The value is automatically detected: Boolean, Integer, Long, Double, XMPDateTime and
191	 *        byte[] are handled, on all other <code>toString()</code> is called.
192	 *
193	 * @param options Option flags describing the property. See the earlier description.
194	 * @throws XMPException Wraps all errors and exceptions that may occur.
195	 */
196	void setProperty(
197		String schemaNS,
198		String propName,
199		Object propValue,
200		PropertyOptions options) throws XMPException;
201
202
203	/**
204	 * @see XMPMeta#setProperty(String, String, Object, PropertyOptions)
205	 *
206	 * @param schemaNS The namespace URI
207	 * @param propName The name of the property
208	 * @param propValue the value for the property
209	 * @throws XMPException Wraps all errors and exceptions
210	 */
211	void setProperty(
212			String schemaNS,
213			String propName,
214			Object propValue) throws XMPException;
215
216
217	/**
218	 * Replaces an item within an array. The index is passed as an integer, you need not worry about
219	 * the path string syntax for array items, convert a loop index to a string, etc. The array
220	 * passed must already exist. In normal usage the selected array item is modified. A new item is
221	 * automatically appended if the index is the array size plus 1.
222	 *
223	 * @param schemaNS The namespace URI for the array. Has the same usage as in getProperty.
224	 * @param arrayName The name of the array. May be a general path expression, must not be
225	 *        <code>null</code> or the empty string. Has the same namespace prefix usage as
226	 *        propName in getProperty.
227	 * @param itemIndex The index of the desired item. Arrays in XMP are indexed from 1. To address
228	 *        the last existing item, use {@link XMPMeta#countArrayItems(String, String)} to find
229	 *        out the length of the array.
230	 * @param itemValue the new value of the array item. Has the same usage as propValue in
231	 *        <code>setProperty()</code>.
232	 * @param options the set options for the item.
233	 * @throws XMPException Wraps all errors and exceptions that may occur.
234	 */
235	void setArrayItem(
236		String schemaNS,
237		String arrayName,
238		int itemIndex,
239		String itemValue,
240		PropertyOptions options) throws XMPException;
241
242
243	/**
244	 * @see XMPMeta#setArrayItem(String, String, int, String, PropertyOptions)
245	 *
246	 * @param schemaNS The namespace URI
247	 * @param arrayName The name of the array
248	 * @param itemIndex The index to insert the new item
249	 * @param itemValue the new value of the array item
250	 * @throws XMPException Wraps all errors and exceptions
251	 */
252	void setArrayItem(
253			String schemaNS,
254			String arrayName,
255			int itemIndex,
256			String itemValue) throws XMPException;
257
258
259	/**
260	 * Inserts an item into an array previous to the given index. The index is passed as an integer,
261	 * you need not worry about the path string syntax for array items, convert a loop index to a
262	 * string, etc. The array passed must already exist. In normal usage the selected array item is
263	 * modified. A new item is automatically appended if the index is the array size plus 1.
264	 *
265	 * @param schemaNS The namespace URI for the array. Has the same usage as in getProperty.
266	 * @param arrayName The name of the array. May be a general path expression, must not be
267	 *        <code>null</code> or the empty string. Has the same namespace prefix usage as
268	 *        propName in getProperty.
269	 * @param itemIndex The index to insert the new item. Arrays in XMP are indexed from 1. Use
270	 * 		  <code>XMPConst.ARRAY_LAST_ITEM</code> to append items.
271	 * @param itemValue the new value of the array item. Has the same usage as
272	 *        propValue in <code>setProperty()</code>.
273	 * @param options the set options that decide about the kind of the node.
274 	 * @throws XMPException Wraps all errors and exceptions that may occur.
275 	 */
276	void insertArrayItem(
277		String schemaNS,
278		String arrayName,
279		int itemIndex,
280		String itemValue,
281		PropertyOptions options) throws XMPException;
282
283
284	/**
285	 * @see XMPMeta#insertArrayItem(String, String, int, String, PropertyOptions)
286	 *
287	 * @param schemaNS The namespace URI for the array
288	 * @param arrayName The name of the array
289	 * @param itemIndex The index to insert the new item
290	 * @param itemValue the value of the array item
291	 * @throws XMPException Wraps all errors and exceptions
292	 */
293	void insertArrayItem(
294			String schemaNS,
295			String arrayName,
296			int itemIndex,
297			String itemValue) throws XMPException;
298
299
300	/**
301	 * Simplifies the construction of an array by not requiring that you pre-create an empty array.
302	 * The array that is assigned is created automatically if it does not yet exist. Each call to
303	 * appendArrayItem() appends an item to the array. The corresponding parameters have the same
304	 * use as setArrayItem(). The arrayOptions parameter is used to specify what kind of array. If
305	 * the array exists, it must have the specified form.
306	 *
307	 * @param schemaNS The namespace URI for the array. Has the same usage as in getProperty.
308	 * @param arrayName The name of the array. May be a general path expression, must not be null or
309	 *        the empty string. Has the same namespace prefix usage as propPath in getProperty.
310	 * @param arrayOptions Option flags describing the array form. The only valid options are
311	 *        <ul>
312	 *        <li> {@link PropertyOptions#ARRAY},
313	 *        <li> {@link PropertyOptions#ARRAY_ORDERED},
314	 *        <li> {@link PropertyOptions#ARRAY_ALTERNATE} or
315	 *        <li> {@link PropertyOptions#ARRAY_ALT_TEXT}.
316	 *        </ul>
317	 *        <em>Note:</em> the array options only need to be provided if the array is not
318	 *        already existing, otherwise you can set them to <code>null</code> or use
319	 *        {@link XMPMeta#appendArrayItem(String, String, String)}.
320	 * @param itemValue the value of the array item. Has the same usage as propValue in getProperty.
321	 * @param itemOptions Option flags describing the item to append ({@link PropertyOptions})
322	 * @throws XMPException Wraps all errors and exceptions that may occur.
323	 */
324	void appendArrayItem(
325		String schemaNS,
326		String arrayName,
327		PropertyOptions arrayOptions,
328		String itemValue,
329		PropertyOptions itemOptions) throws XMPException;
330
331
332	/**
333	 * @see XMPMeta#appendArrayItem(String, String, PropertyOptions, String, PropertyOptions)
334	 *
335	 * @param schemaNS The namespace URI for the array
336	 * @param arrayName The name of the array
337	 * @param itemValue the value of the array item
338	 * @throws XMPException Wraps all errors and exceptions
339	 */
340	void appendArrayItem(
341			String schemaNS,
342			String arrayName,
343			String itemValue) throws XMPException;
344
345
346	/**
347	 * Provides access to fields within a nested structure. The namespace for the field is passed as
348	 * a URI, you need not worry about the path string syntax. The names of fields should be XML
349	 * qualified names, that is within an XML namespace. The path syntax for a qualified name uses
350	 * the namespace prefix, which is unreliable because the prefix is never guaranteed. The URI is
351	 * the formal name, the prefix is just a local shorthand in a given sequence of XML text.
352	 *
353	 * @param schemaNS The namespace URI for the struct. Has the same usage as in getProperty.
354	 * @param structName The name of the struct. May be a general path expression, must not be null
355	 *        or the empty string. Has the same namespace prefix usage as propName in getProperty.
356	 * @param fieldNS The namespace URI for the field. Has the same URI and prefix usage as the
357	 *        schemaNS parameter.
358	 * @param fieldName The name of the field. Must be a single XML name, must not be null or the
359	 *        empty string. Has the same namespace prefix usage as the structName parameter.
360	 * @param fieldValue the value of thefield, if the field has a value.
361	 *        Has the same usage as propValue in getProperty.
362	 * @param options Option flags describing the field. See the earlier description.
363	 * @throws XMPException Wraps all errors and exceptions that may occur.
364	 */
365	void setStructField(
366		String schemaNS,
367		String structName,
368		String fieldNS,
369		String fieldName,
370		String fieldValue,
371		PropertyOptions options) throws XMPException;
372
373
374	/**
375	 * @see XMPMeta#setStructField(String, String, String, String, String, PropertyOptions)
376	 *
377	 * @param schemaNS The namespace URI for the struct
378	 * @param structName The name of the struct
379	 * @param fieldNS The namespace URI for the field
380	 * @param fieldName The name of the field
381	 * @param fieldValue the value of the field
382	 * @throws XMPException Wraps all errors and exceptions
383	 */
384	void setStructField(
385			String schemaNS,
386			String structName,
387			String fieldNS,
388			String fieldName,
389			String fieldValue) throws XMPException;
390
391
392	/**
393	 * Provides access to a qualifier attached to a property. The namespace for the qualifier is
394	 * passed as a URI, you need not worry about the path string syntax. In many regards qualifiers
395	 * are like struct fields. See the introductory discussion of qualified properties for more
396	 * information. The names of qualifiers should be XML qualified names, that is within an XML
397	 * namespace. The path syntax for a qualified name uses the namespace prefix, which is
398	 * unreliable because the prefix is never guaranteed. The URI is the formal name, the prefix is
399	 * just a local shorthand in a given sequence of XML text. The property the qualifier
400	 * will be attached has to exist.
401	 *
402	 * @param schemaNS The namespace URI for the struct. Has the same usage as in getProperty.
403	 * @param propName The name of the property to which the qualifier is attached. Has the same
404	 *        usage as in getProperty.
405	 * @param qualNS The namespace URI for the qualifier. Has the same URI and prefix usage as the
406	 *        schemaNS parameter.
407	 * @param qualName The name of the qualifier. Must be a single XML name, must not be
408	 *        <code>null</code> or the empty string. Has the same namespace prefix usage as the
409	 *        propName parameter.
410	 * @param qualValue A pointer to the <code>null</code> terminated UTF-8 string that is the
411	 *        value of the qualifier, if the qualifier has a value. Has the same usage as propValue
412	 *        in getProperty.
413	 * @param options Option flags describing the qualifier. See the earlier description.
414	 * @throws XMPException Wraps all errors and exceptions that may occur.
415	 */
416	void setQualifier(
417		String schemaNS,
418		String propName,
419		String qualNS,
420		String qualName,
421		String qualValue,
422		PropertyOptions options) throws XMPException;
423
424
425	/**
426	 * @see XMPMeta#setQualifier(String, String, String, String, String, PropertyOptions)
427	 *
428	 * @param schemaNS The namespace URI for the struct
429	 * @param propName The name of the property to which the qualifier is attached
430	 * @param qualNS The namespace URI for the qualifier
431	 * @param qualName The name of the qualifier
432	 * @param qualValue the value of the qualifier
433	 * @throws XMPException Wraps all errors and exceptions
434	 */
435	void setQualifier(
436			String schemaNS,
437			String propName,
438			String qualNS,
439			String qualName,
440			String qualValue) throws XMPException;
441
442
443
444	// ---------------------------------------------------------------------------------------------
445	// Functions for deleting and detecting properties. These should be obvious from the
446	// descriptions of the getters and setters.
447
448	/**
449	 * Deletes the given XMP subtree rooted at the given property. It is not an error if the
450	 * property does not exist.
451	 *
452	 * @param schemaNS The namespace URI for the property. Has the same usage as in
453	 *        <code>getProperty()</code>.
454	 * @param propName The name of the property. Has the same usage as in getProperty.
455	 */
456	void deleteProperty(String schemaNS, String propName);
457
458
459	/**
460	 * Deletes the given XMP subtree rooted at the given array item. It is not an error if the array
461	 * item does not exist.
462	 *
463	 * @param schemaNS The namespace URI for the array. Has the same usage as in getProperty.
464	 * @param arrayName The name of the array. May be a general path expression, must not be
465	 *        <code>null</code> or the empty string. Has the same namespace prefix usage as
466	 *        propName in <code>getProperty()</code>.
467	 * @param itemIndex The index of the desired item. Arrays in XMP are indexed from 1. The
468	 *        constant <code>XMPConst.ARRAY_LAST_ITEM</code> always refers to the last
469	 *        existing array item.
470	 */
471	void deleteArrayItem(String schemaNS, String arrayName, int itemIndex);
472
473
474	/**
475	 * Deletes the given XMP subtree rooted at the given struct field. It is not an error if the
476	 * field does not exist.
477	 *
478	 * @param schemaNS The namespace URI for the struct. Has the same usage as in
479	 *        <code>getProperty()</code>.
480	 * @param structName The name of the struct. May be a general path expression, must not be
481	 *        <code>null</code> or the empty string. Has the same namespace prefix usage as
482	 *        propName in getProperty.
483	 * @param fieldNS The namespace URI for the field. Has the same URI and prefix usage as the
484	 *        schemaNS parameter.
485	 * @param fieldName The name of the field. Must be a single XML name, must not be
486	 *        <code>null</code> or the empty string. Has the same namespace prefix usage as the
487	 *        structName parameter.
488	 */
489	void deleteStructField(String schemaNS, String structName, String fieldNS, String fieldName);
490
491
492	/**
493	 * Deletes the given XMP subtree rooted at the given qualifier. It is not an error if the
494	 * qualifier does not exist.
495	 *
496	 * @param schemaNS The namespace URI for the struct. Has the same usage as in
497	 *        <code>getProperty()</code>.
498	 * @param propName The name of the property to which the qualifier is attached. Has the same
499	 *        usage as in getProperty.
500	 * @param qualNS The namespace URI for the qualifier. Has the same URI and prefix usage as the
501	 *        schemaNS parameter.
502	 * @param qualName The name of the qualifier. Must be a single XML name, must not be
503	 *        <code>null</code> or the empty string. Has the same namespace prefix usage as the
504	 *        propName parameter.
505	 */
506	void deleteQualifier(String schemaNS, String propName, String qualNS, String qualName);
507
508
509	/**
510	 * Returns whether the property exists.
511	 *
512	 * @param schemaNS The namespace URI for the property. Has the same usage as in
513	 *        <code>getProperty()</code>.
514	 * @param propName The name of the property.
515	 * 		  Has the same usage as in <code>getProperty()</code>.
516	 * @return Returns true if the property exists.
517	 */
518	boolean doesPropertyExist(String schemaNS, String propName);
519
520
521	/**
522	 * Tells if the array item exists.
523	 *
524	 * @param schemaNS The namespace URI for the array. Has the same usage as in
525	 *        <code>getProperty()</code>.
526	 * @param arrayName The name of the array. May be a general path expression, must not be
527	 *        <code>null</code> or the empty string. Has the same namespace prefix usage as
528	 *        propName in <code>getProperty()</code>.
529	 * @param itemIndex The index of the desired item. Arrays in XMP are indexed from 1. The
530	 *        constant <code>XMPConst.ARRAY_LAST_ITEM</code> always refers to the last
531	 *        existing array item.
532	 * @return Returns <code>true</code> if the array exists, <code>false</code> otherwise.
533	 */
534	boolean doesArrayItemExist(String schemaNS, String arrayName, int itemIndex);
535
536
537	/**
538	 * DoesStructFieldExist tells if the struct field exists.
539	 *
540	 * @param schemaNS The namespace URI for the struct. Has the same usage as in
541	 *        <code>getProperty()</code>.
542	 * @param structName The name of the struct. May be a general path expression, must not be
543	 *        <code>null</code> or the empty string. Has the same namespace prefix usage as
544	 *        propName in <code>getProperty()</code>.
545	 * @param fieldNS The namespace URI for the field. Has the same URI and prefix usage as the
546	 *        schemaNS parameter.
547	 * @param fieldName The name of the field. Must be a single XML name, must not be
548	 *        <code>null</code> or the empty string. Has the same namespace prefix usage as the
549	 *        structName parameter.
550	 * @return Returns true if the field exists.
551	 */
552	boolean doesStructFieldExist(
553		String schemaNS,
554		String structName,
555		String fieldNS,
556		String fieldName);
557
558
559	/**
560	 * DoesQualifierExist tells if the qualifier exists.
561	 *
562	 * @param schemaNS The namespace URI for the struct. Has the same usage as in
563	 *        <code>getProperty()</code>.
564	 * @param propName The name of the property to which the qualifier is attached. Has the same
565	 *        usage as in <code>getProperty()</code>.
566	 * @param qualNS The namespace URI for the qualifier. Has the same URI and prefix usage as the
567	 *        schemaNS parameter.
568	 * @param qualName The name of the qualifier. Must be a single XML name, must not be
569	 *        <code>null</code> or the empty string. Has the same namespace prefix usage as the
570	 *        propName parameter.
571	 * @return Returns true if the qualifier exists.
572	 */
573	boolean doesQualifierExist(String schemaNS, String propName, String qualNS, String qualName);
574
575
576	// ---------------------------------------------------------------------------------------------
577	// Specialized Get and Set functions
578
579	/**
580	 * These functions provide convenient support for localized text properties, including a number
581	 * of special and obscure aspects. Localized text properties are stored in alt-text arrays. They
582	 * allow multiple concurrent localizations of a property value, for example a document title or
583	 * copyright in several languages. The most important aspect of these functions is that they
584	 * select an appropriate array item based on one or two RFC 3066 language tags. One of these
585	 * languages, the "specific" language, is preferred and selected if there is an exact match. For
586	 * many languages it is also possible to define a "generic" language that may be used if there
587	 * is no specific language match. The generic language must be a valid RFC 3066 primary subtag,
588	 * or the empty string. For example, a specific language of "en-US" should be used in the US,
589	 * and a specific language of "en-UK" should be used in England. It is also appropriate to use
590	 * "en" as the generic language in each case. If a US document goes to England, the "en-US"
591	 * title is selected by using the "en" generic language and the "en-UK" specific language. It is
592	 * considered poor practice, but allowed, to pass a specific language that is just an RFC 3066
593	 * primary tag. For example "en" is not a good specific language, it should only be used as a
594	 * generic language. Passing "i" or "x" as the generic language is also considered poor practice
595	 * but allowed. Advice from the W3C about the use of RFC 3066 language tags can be found at:
596	 * http://www.w3.org/International/articles/language-tags/
597	 * <p>
598	 * <em>Note:</em> RFC 3066 language tags must be treated in a case insensitive manner. The XMP
599	 * Toolkit does this by normalizing their capitalization:
600	 * <ul>
601	 * <li> The primary subtag is lower case, the suggested practice of ISO 639.
602	 * <li> All 2 letter secondary subtags are upper case, the suggested practice of ISO 3166.
603	 * <li> All other subtags are lower case. The XMP specification defines an artificial language,
604	 * <li>"x-default", that is used to explicitly denote a default item in an alt-text array.
605	 * </ul>
606	 * The XMP toolkit normalizes alt-text arrays such that the x-default item is the first item.
607	 * The SetLocalizedText function has several special features related to the x-default item, see
608	 * its description for details. The selection of the array item is the same for GetLocalizedText
609	 * and SetLocalizedText:
610	 * <ul>
611	 * <li> Look for an exact match with the specific language.
612	 * <li> If a generic language is given, look for a partial match.
613	 * <li> Look for an x-default item.
614	 * <li> Choose the first item.
615	 * </ul>
616	 * A partial match with the generic language is where the start of the item's language matches
617	 * the generic string and the next character is '-'. An exact match is also recognized as a
618	 * degenerate case. It is fine to pass x-default as the specific language. In this case,
619	 * selection of an x-default item is an exact match by the first rule, not a selection by the
620	 * 3rd rule. The last 2 rules are fallbacks used when the specific and generic languages fail to
621	 * produce a match. <code>getLocalizedText</code> returns information about a selected item in
622	 * an alt-text array. The array item is selected according to the rules given above.
623	 *
624	 * <em>Note:</em> In a future version of this API a method
625	 * 		using Java <code>java.lang.Locale</code> will be added.
626	 *
627	 * @param schemaNS The namespace URI for the alt-text array. Has the same usage as in
628	 *        <code>getProperty()</code>.
629	 * @param altTextName The name of the alt-text array. May be a general path expression, must not
630	 *        be <code>null</code> or the empty string. Has the same namespace prefix usage as
631	 *        propName in <code>getProperty()</code>.
632	 * @param genericLang The name of the generic language as an RFC 3066 primary subtag. May be
633	 *        <code>null</code> or the empty string if no generic language is wanted.
634	 * @param specificLang The name of the specific language as an RFC 3066 tag. Must not be
635	 *        <code>null</code> or the empty string.
636	 * @return Returns an <code>XMPProperty</code> containing the value, the actual language and
637	 * 		   the options if an appropriate alternate collection item exists, <code>null</code>
638	 * 		  if the property.
639	 *         does not exist.
640	 * @throws XMPException Wraps all errors and exceptions that may occur.
641	 */
642	XMPProperty getLocalizedText(
643		String schemaNS,
644		String altTextName,
645		String genericLang,
646		String specificLang) throws XMPException;
647
648
649	/**
650	 * Modifies the value of a selected item in an alt-text array. Creates an appropriate array item
651	 * if necessary, and handles special cases for the x-default item. If the selected item is from
652	 * a match with the specific language, the value of that item is modified. If the existing value
653	 * of that item matches the existing value of the x-default item, the x-default item is also
654	 * modified. If the array only has 1 existing item (which is not x-default), an x-default item
655	 * is added with the given value. If the selected item is from a match with the generic language
656	 * and there are no other generic matches, the value of that item is modified. If the existing
657	 * value of that item matches the existing value of the x-default item, the x-default item is
658	 * also modified. If the array only has 1 existing item (which is not x-default), an x-default
659	 * item is added with the given value. If the selected item is from a partial match with the
660	 * generic language and there are other partial matches, a new item is created for the specific
661	 * language. The x-default item is not modified. If the selected item is from the last 2 rules
662	 * then a new item is created for the specific language. If the array only had an x-default
663	 * item, the x-default item is also modified. If the array was empty, items are created for the
664	 * specific language and x-default.
665	 *
666	 * <em>Note:</em> In a future version of this API a method
667	 * 		using Java <code>java.lang.Locale</code> will be added.
668	 *
669	 *
670	 * @param schemaNS The namespace URI for the alt-text array. Has the same usage as in
671	 *        <code>getProperty()</code>.
672	 * @param altTextName The name of the alt-text array. May be a general path expression, must not
673	 *        be <code>null</code> or the empty string. Has the same namespace prefix usage as
674	 *        propName in <code>getProperty()</code>.
675	 * @param genericLang The name of the generic language as an RFC 3066 primary subtag. May be
676	 *        <code>null</code> or the empty string if no generic language is wanted.
677	 * @param specificLang The name of the specific language as an RFC 3066 tag. Must not be
678	 *        <code>null</code> or the empty string.
679	 * @param itemValue A pointer to the <code>null</code> terminated UTF-8 string that is the new
680	 *        value for the appropriate array item.
681	 * @param options Option flags, none are defined at present.
682	 * @throws XMPException Wraps all errors and exceptions that may occur.
683	 */
684	void setLocalizedText(
685		String schemaNS,
686		String altTextName,
687		String genericLang,
688		String specificLang,
689		String itemValue,
690		PropertyOptions options) throws XMPException;
691
692
693	/**
694	 * @see XMPMeta#setLocalizedText(String, String, String, String, String, PropertyOptions)
695	 *
696	 * @param schemaNS The namespace URI for the alt-text array
697	 * @param altTextName The name of the alt-text array
698	 * @param genericLang The name of the generic language
699	 * @param specificLang The name of the specific language
700	 * @param itemValue the new value for the appropriate array item
701	 * @throws XMPException Wraps all errors and exceptions
702	 */
703	void setLocalizedText(
704			String schemaNS,
705			String altTextName,
706			String genericLang,
707			String specificLang,
708			String itemValue) throws XMPException;
709
710
711
712	// ---------------------------------------------------------------------------------------------
713	// Functions accessing properties as binary values.
714
715
716	/**
717	 * These are very similar to <code>getProperty()</code> and <code>SetProperty()</code> above,
718	 * but the value is returned or provided in a literal form instead of as a UTF-8 string.
719	 * The path composition functions in <code>XMPPathFactory</code> may be used to compose an path
720	 * expression for fields in nested structures, items in arrays, or qualifiers.
721	 *
722	 * @param  schemaNS The namespace URI for the property. Has the same usage as in
723	 *         <code>getProperty()</code>.
724	 * @param  propName The name of the property.
725	 * 		   Has the same usage as in <code>getProperty()</code>.
726	 * @return Returns a <code>Boolean</code> value or <code>null</code>
727	 * 		   if the property does not exist.
728	 * @throws XMPException Wraps all exceptions that may occur,
729	 * 		   especially conversion errors.
730	 */
731	Boolean getPropertyBoolean(String schemaNS, String propName) throws XMPException;
732
733
734	/**
735	 * Convenience method to retrieve the literal value of a property.
736	 *
737	 * @param  schemaNS The namespace URI for the property. Has the same usage as in
738	 *         <code>getProperty()</code>.
739	 * @param  propName The name of the property.
740	 * 		   Has the same usage as in <code>getProperty()</code>.
741	 * @return Returns an <code>Integer</code> value or <code>null</code>
742	 * 		   if the property does not exist.
743	 * @throws XMPException Wraps all exceptions that may occur,
744	 * 		   especially conversion errors.
745	 */
746	Integer getPropertyInteger(String schemaNS, String propName) throws XMPException;
747
748
749	/**
750	 * Convenience method to retrieve the literal value of a property.
751	 *
752	 * @param  schemaNS The namespace URI for the property. Has the same usage as in
753	 *         <code>getProperty()</code>.
754	 * @param  propName The name of the property.
755	 * 		   Has the same usage as in <code>getProperty()</code>.
756	 * @return Returns a <code>Long</code> value or <code>null</code>
757	 * 		   if the property does not exist.
758	 * @throws XMPException Wraps all exceptions that may occur,
759	 * 		   especially conversion errors.
760	 */
761	Long getPropertyLong(String schemaNS, String propName) throws XMPException;
762
763
764	/**
765	 * Convenience method to retrieve the literal value of a property.
766	 *
767	 * @param  schemaNS The namespace URI for the property. Has the same usage as in
768	 *         <code>getProperty()</code>.
769	 * @param  propName The name of the property.
770	 * 		   Has the same usage as in <code>getProperty()</code>.
771	 * @return Returns a <code>Double</code> value or <code>null</code>
772	 * 		   if the property does not exist.
773	 * @throws XMPException Wraps all exceptions that may occur,
774	 * 		   especially conversion errors.
775	 */
776	Double getPropertyDouble(String schemaNS, String propName) throws XMPException;
777
778
779	/**
780	 * Convenience method to retrieve the literal value of a property.
781	 *
782	 * @param  schemaNS The namespace URI for the property. Has the same usage as in
783	 *         <code>getProperty()</code>.
784	 * @param  propName The name of the property.
785	 * 		   Has the same usage as in <code>getProperty()</code>.
786	 * @return Returns a <code>XMPDateTime</code>-object or <code>null</code>
787	 * 		   if the property does not exist.
788	 * @throws XMPException Wraps all exceptions that may occur,
789	 * 		   especially conversion errors.
790	 */
791	XMPDateTime getPropertyDate(String schemaNS, String propName) throws XMPException;
792
793
794	/**
795	 * Convenience method to retrieve the literal value of a property.
796	 *
797	 * @param  schemaNS The namespace URI for the property. Has the same usage as in
798	 *         <code>getProperty()</code>.
799	 * @param  propName The name of the property.
800	 * 		   Has the same usage as in <code>getProperty()</code>.
801	 * @return Returns a Java <code>Calendar</code>-object or <code>null</code>
802	 * 		   if the property does not exist.
803	 * @throws XMPException Wraps all exceptions that may occur,
804	 * 		   especially conversion errors.
805	 */
806	Calendar getPropertyCalendar(String schemaNS, String propName) throws XMPException;
807
808
809	/**
810	 * Convenience method to retrieve the literal value of a property.
811	 *
812	 * @param  schemaNS The namespace URI for the property. Has the same usage as in
813	 *         <code>getProperty()</code>.
814	 * @param  propName The name of the property.
815	 * 		   Has the same usage as in <code>getProperty()</code>.
816	 * @return Returns a <code>byte[]</code>-array contained the decoded base64 value
817	 * 		   or <code>null</code> if the property does not exist.
818	 * @throws XMPException Wraps all exceptions that may occur,
819	 * 		   especially conversion errors.
820	 */
821	byte[] getPropertyBase64(String schemaNS, String propName) throws XMPException;
822
823
824	/**
825	 * Convenience method to retrieve the literal value of a property.
826	 * <em>Note:</em> There is no <code>setPropertyString()</code>,
827	 * because <code>setProperty()</code> sets a string value.
828	 *
829	 * @param  schemaNS The namespace URI for the property. Has the same usage as in
830	 *         <code>getProperty()</code>.
831	 * @param  propName The name of the property.
832	 * 		   Has the same usage as in <code>getProperty()</code>.
833	 * @return Returns a <code>String</code> value or <code>null</code>
834	 * 		   if the property does not exist.
835	 * @throws XMPException Wraps all exceptions that may occur,
836	 * 		   especially conversion errors.
837	 */
838	String getPropertyString(String schemaNS, String propName) throws XMPException;
839
840
841	/**
842	 * Convenience method to set a property to a literal <code>boolean</code> value.
843	 *
844	 * @param  schemaNS The namespace URI for the property. Has the same usage as in
845	 *         <code>setProperty()</code>.
846	 * @param  propName The name of the property.
847	 * 		   Has the same usage as in <code>getProperty()</code>.
848	 * @param  propValue the literal property value as <code>boolean</code>.
849	 * @param  options options of the property to set (optional).
850	 * @throws XMPException Wraps all exceptions that may occur.
851	 */
852	void setPropertyBoolean(
853		String schemaNS,
854		String propName,
855		boolean propValue,
856		PropertyOptions options) throws XMPException;
857
858
859	/**
860	 * @see XMPMeta#setPropertyBoolean(String, String, boolean, PropertyOptions)
861	 *
862	 * @param  schemaNS The namespace URI for the property
863	 * @param  propName The name of the property
864	 * @param  propValue the literal property value as <code>boolean</code>
865	 * @throws XMPException Wraps all exceptions
866	 */
867	void setPropertyBoolean(
868			String schemaNS,
869			String propName,
870			boolean propValue) throws XMPException;
871
872
873	/**
874	 * Convenience method to set a property to a literal <code>int</code> value.
875	 *
876	 * @param  schemaNS The namespace URI for the property. Has the same usage as in
877	 *         <code>setProperty()</code>.
878	 * @param  propName The name of the property.
879	 * 		   Has the same usage as in <code>getProperty()</code>.
880	 * @param  propValue the literal property value as <code>int</code>.
881	 * @param  options options of the property to set (optional).
882	 * @throws XMPException Wraps all exceptions that may occur.
883	 */
884	void setPropertyInteger(
885		String schemaNS,
886		String propName,
887		int propValue,
888		PropertyOptions options) throws XMPException;
889
890
891	/**
892	 * @see XMPMeta#setPropertyInteger(String, String, int, PropertyOptions)
893	 *
894	 * @param  schemaNS The namespace URI for the property
895	 * @param  propName The name of the property
896	 * @param  propValue the literal property value as <code>int</code>
897	 * @throws XMPException Wraps all exceptions
898	 */
899	void setPropertyInteger(
900			String schemaNS,
901			String propName,
902			int propValue) throws XMPException;
903
904
905	/**
906	 * Convenience method to set a property to a literal <code>long</code> value.
907	 *
908	 * @param  schemaNS The namespace URI for the property. Has the same usage as in
909	 *         <code>setProperty()</code>.
910	 * @param  propName The name of the property.
911	 * 		   Has the same usage as in <code>getProperty()</code>.
912	 * @param  propValue the literal property value as <code>long</code>.
913	 * @param  options options of the property to set (optional).
914	 * @throws XMPException Wraps all exceptions that may occur.
915	 */
916	void setPropertyLong(
917		String schemaNS,
918		String propName,
919		long propValue,
920		PropertyOptions options) throws XMPException;
921
922
923	/**
924	 * @see XMPMeta#setPropertyLong(String, String, long, PropertyOptions)
925	 *
926	 * @param  schemaNS The namespace URI for the property
927	 * @param  propName The name of the property
928	 * @param  propValue the literal property value as <code>long</code>
929	 * @throws XMPException Wraps all exceptions
930	 */
931	void setPropertyLong(
932			String schemaNS,
933			String propName,
934			long propValue) throws XMPException;
935
936
937	/**
938	 * Convenience method to set a property to a literal <code>double</code> value.
939	 *
940	 * @param  schemaNS The namespace URI for the property. Has the same usage as in
941	 *         <code>setProperty()</code>.
942	 * @param  propName The name of the property.
943	 * 		   Has the same usage as in <code>getProperty()</code>.
944	 * @param  propValue the literal property value as <code>double</code>.
945	 * @param  options options of the property to set (optional).
946	 * @throws XMPException Wraps all exceptions that may occur.
947	 */
948	void setPropertyDouble(
949		String schemaNS,
950		String propName,
951		double propValue,
952		PropertyOptions options) throws XMPException;
953
954
955	/**
956	 * @see XMPMeta#setPropertyDouble(String, String, double, PropertyOptions)
957	 *
958	 * @param  schemaNS The namespace URI for the property
959	 * @param  propName The name of the property
960	 * @param  propValue the literal property value as <code>double</code>
961	 * @throws XMPException Wraps all exceptions
962	 */
963	void setPropertyDouble(
964			String schemaNS,
965			String propName,
966			double propValue) throws XMPException;
967
968
969	/**
970	 * Convenience method to set a property with an XMPDateTime-object,
971	 * which is serialized to an ISO8601 date.
972	 *
973	 * @param  schemaNS The namespace URI for the property. Has the same usage as in
974	 *         <code>setProperty()</code>.
975	 * @param  propName The name of the property.
976	 * 		   Has the same usage as in <code>getProperty()</code>.
977	 * @param  propValue the property value as <code>XMPDateTime</code>.
978	 * @param  options options of the property to set (optional).
979	 * @throws XMPException Wraps all exceptions that may occur.
980	 */
981	void setPropertyDate(
982		String schemaNS,
983		String propName,
984		XMPDateTime propValue,
985		PropertyOptions options) throws XMPException;
986
987
988	/**
989	 * @see XMPMeta#setPropertyDate(String, String, XMPDateTime, PropertyOptions)
990	 *
991	 * @param  schemaNS The namespace URI for the property
992	 * @param  propName The name of the property
993	 * @param  propValue the property value as <code>XMPDateTime</code>
994	 * @throws XMPException Wraps all exceptions
995	 */
996	void setPropertyDate(
997			String schemaNS,
998			String propName,
999			XMPDateTime propValue) throws XMPException;
1000
1001
1002	/**
1003	 * Convenience method to set a property with a Java Calendar-object,
1004	 * which is serialized to an ISO8601 date.
1005	 *
1006	 * @param  schemaNS The namespace URI for the property. Has the same usage as in
1007	 *         <code>setProperty()</code>.
1008	 * @param  propName The name of the property.
1009	 * 		   Has the same usage as in <code>getProperty()</code>.
1010	 * @param  propValue the property value as Java <code>Calendar</code>.
1011	 * @param  options options of the property to set (optional).
1012	 * @throws XMPException Wraps all exceptions that may occur.
1013	 */
1014	void setPropertyCalendar(
1015		String schemaNS,
1016		String propName,
1017		Calendar propValue,
1018		PropertyOptions options) throws XMPException;
1019
1020
1021	/**
1022	 * @see XMPMeta#setPropertyCalendar(String, String, Calendar, PropertyOptions)
1023	 *
1024	 * @param  schemaNS The namespace URI for the property
1025	 * @param  propName The name of the property
1026	 * @param  propValue the property value as <code>Calendar</code>
1027	 * @throws XMPException Wraps all exceptions
1028	 */
1029	void setPropertyCalendar(
1030			String schemaNS,
1031			String propName,
1032			Calendar propValue) throws XMPException;
1033
1034
1035	/**
1036	 * Convenience method to set a property from a binary <code>byte[]</code>-array,
1037	 * which is serialized as base64-string.
1038	 *
1039	 * @param  schemaNS The namespace URI for the property. Has the same usage as in
1040	 *         <code>setProperty()</code>.
1041	 * @param  propName The name of the property.
1042	 * 		   Has the same usage as in <code>getProperty()</code>.
1043	 * @param  propValue the literal property value as byte array.
1044	 * @param  options options of the property to set (optional).
1045	 * @throws XMPException Wraps all exceptions that may occur.
1046	 */
1047	void setPropertyBase64(
1048		String schemaNS,
1049		String propName,
1050		byte[] propValue,
1051		PropertyOptions options) throws XMPException;
1052
1053
1054	/**
1055	 * @see XMPMeta#setPropertyBase64(String, String, byte[], PropertyOptions)
1056	 *
1057	 * @param  schemaNS The namespace URI for the property
1058	 * @param  propName The name of the property
1059	 * @param  propValue the literal property value as byte array
1060	 * @throws XMPException Wraps all exceptions
1061	 */
1062	void setPropertyBase64(
1063			String schemaNS,
1064			String propName,
1065			byte[] propValue) throws XMPException;
1066
1067
1068	/**
1069	 * Constructs an iterator for the properties within this XMP object.
1070	 *
1071	 * @return Returns an <code>XMPIterator</code>.
1072	 * @see XMPMeta#iterator(String, String, IteratorOptions)
1073	 * @throws XMPException Wraps all errors and exceptions that may occur.
1074	 */
1075	XMPIterator iterator() throws XMPException;
1076
1077
1078	/**
1079	 * Constructs an iterator for the properties within this XMP object using some options.
1080	 *
1081	 * @param options Option flags to control the iteration.
1082	 * @return Returns an <code>XMPIterator</code>.
1083	 * @see XMPMeta#iterator(String, String, IteratorOptions)
1084	 * @throws XMPException Wraps all errors and exceptions that may occur.
1085	 */
1086	XMPIterator iterator(IteratorOptions options) throws XMPException;
1087
1088
1089	/**
1090	 * Construct an iterator for the properties within an XMP object. The general operation of an
1091	 * XMP object iterator was. According to the parameters it iterates the entire data tree,
1092	 * properties within a specific schema, or a subtree rooted at a specific node.
1093	 *
1094	 * @param schemaNS Optional schema namespace URI to restrict the iteration. Omitted (visit all
1095	 *        schema) by passing <code>null</code> or empty String.
1096	 * @param propName Optional property name to restrict the iteration. May be an arbitrary path
1097	 *        expression. Omitted (visit all properties) by passing <code>null</code> or empty
1098	 *        String. If no schema URI is given, it is ignored.
1099	 * @param options Option flags to control the iteration. See {@link IteratorOptions} for
1100	 *        details.
1101	 * @return Returns an <code>XMPIterator</code> for this <code>XMPMeta</code>-object
1102	 *         considering the given options.
1103	 * @throws XMPException Wraps all errors and exceptions that may occur.
1104	 */
1105	XMPIterator iterator(
1106		String schemaNS,
1107		String propName,
1108		IteratorOptions options) throws XMPException;
1109
1110
1111	/**
1112	 * This correlates to the about-attribute,
1113	 * returns the empty String if no name is set.
1114	 *
1115	 * @return Returns the name of the XMP object.
1116	 */
1117	String getObjectName();
1118
1119
1120	/**
1121	 * @param name Sets the name of the XMP object.
1122	 */
1123	void setObjectName(String name);
1124
1125
1126	/**
1127	 * @return Returns the unparsed content of the &lt;?xpacket&gt; processing instruction.
1128	 * 		This contains normally the attribute-like elements 'begin="&lt;BOM&gt;"
1129	 *		id="W5M0MpCehiHzreSzNTczkc9d"' and possibly the deprecated elements 'bytes="1234"' or
1130	 * 		'encoding="XXX"'. If the parsed packet has not been wrapped into an xpacket,
1131	 * 		<code>null</code> is returned.
1132	 */
1133	String getPacketHeader();
1134
1135
1136	/**
1137	 * Clones the complete metadata tree.
1138	 *
1139	 * @return Returns a deep copy of this instance.
1140	 */
1141	Object clone();
1142
1143
1144	/**
1145	 * Sorts the complete datamodel according to the following rules:
1146	 * <ul>
1147	 * 		<li>Schema nodes are sorted by prefix.
1148	 * 		<li>Properties at top level and within structs are sorted by full name, that is
1149	 * 			prefix + local name.
1150	 * 		<li>Array items are not sorted, even if they have no certain order such as bags.
1151	 * 		<li>Qualifier are sorted, with the exception of "xml:lang" and/or "rdf:type"
1152	 * 			that stay at the top of the list in that order.
1153	 * </ul>
1154	 */
1155	void sort();
1156
1157
1158	/**
1159	 * Perform the normalization as a separate parsing step.
1160	 * Normally it is done during parsing, unless the parsing option
1161	 * {@link ParseOptions#OMIT_NORMALIZATION} is set to <code>true</code>.
1162	 * <em>Note:</em> It does no harm to call this method to an already normalized xmp object.
1163	 * It was a PDF/A requirement to get hand on the unnormalized <code>XMPMeta</code> object.
1164	 *
1165	 * @param options optional parsing options.
1166 	 * @throws XMPException Wraps all errors and exceptions that may occur.
1167	 */
1168	void normalize(ParseOptions options) throws XMPException;
1169
1170
1171	/**
1172	 * Renders this node and the tree unter this node in a human readable form.
1173	 * @return Returns a multiline string containing the dump.
1174	 */
1175	String dumpObject();
1176}