1f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling//=================================================================================================
2f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling//ADOBE SYSTEMS INCORPORATED
3f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling//Copyright 2006-2007 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;
11f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
12f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport java.io.InputStream;
13f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport java.io.OutputStream;
14f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
15f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport com.adobe.xmp.impl.XMPMetaImpl;
16f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport com.adobe.xmp.impl.XMPMetaParser;
17f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport com.adobe.xmp.impl.XMPSchemaRegistryImpl;
18f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport com.adobe.xmp.impl.XMPSerializerHelper;
19f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport com.adobe.xmp.options.ParseOptions;
20f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport com.adobe.xmp.options.SerializeOptions;
21f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
22f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
23f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling/**
24f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Creates <code>XMPMeta</code>-instances from an <code>InputStream</code>
25f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling *
26f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @since 30.01.2006
27f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */
28f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingpublic final class XMPMetaFactory
29f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling{
30f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/** The singleton instance of the <code>XMPSchemaRegistry</code>. */
31f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	private static XMPSchemaRegistry schema = new XMPSchemaRegistryImpl();
32f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/** cache for version info */
33f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	private static XMPVersionInfo versionInfo = null;
34f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
35f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
36f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Hides public constructor
37f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
38f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	private XMPMetaFactory()
39f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
40f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		// EMPTY
41f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
42f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
43f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
44f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
45f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns the singleton instance of the <code>XMPSchemaRegistry</code>.
46f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
47f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public static XMPSchemaRegistry getSchemaRegistry()
48f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
49f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return schema;
50f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
51f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
52f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
53f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
54f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns an empty <code>XMPMeta</code>-object.
55f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
56f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public static XMPMeta create()
57f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
58f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return new XMPMetaImpl();
59f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
60f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
61f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
62f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
63f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Parsing with default options.
64f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @see XMPMetaFactory#parse(InputStream, ParseOptions)
65f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
66f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param in an <code>InputStream</code>
67f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns the <code>XMPMeta</code>-object created from the input.
68f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @throws XMPException If the file is not well-formed XML or if the parsing fails.
69f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
70f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public static XMPMeta parse(InputStream in) throws XMPException
71f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
72f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return parse(in, null);
73f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
74f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
75f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
76f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
77f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * These functions support parsing serialized RDF into an XMP object, and serailizing an XMP
78f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * object into RDF. The input for parsing may be any valid Unicode
79f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * encoding. ISO Latin-1 is also recognized, but its use is strongly discouraged. Serialization
80f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * is always as UTF-8.
81f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * <p>
82f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * <code>parseFromBuffer()</code> parses RDF from an <code>InputStream</code>. The encoding
83f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * is recognized automatically.
84f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
85f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param in an <code>InputStream</code>
86f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param options Options controlling the parsing.<br>
87f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *        The available options are:
88f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *        <ul>
89f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *        <li> XMP_REQUIRE_XMPMETA - The &lt;x:xmpmeta&gt; XML element is required around
90f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *        <tt>&lt;rdf:RDF&gt;</tt>.
91f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *        <li> XMP_STRICT_ALIASING - Do not reconcile alias differences, throw an exception.
92f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *        </ul>
93f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *        <em>Note:</em>The XMP_STRICT_ALIASING option is not yet implemented.
94f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns the <code>XMPMeta</code>-object created from the input.
95f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @throws XMPException If the file is not well-formed XML or if the parsing fails.
96f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
97f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public static XMPMeta parse(InputStream in, ParseOptions options)
98f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			throws XMPException
99f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
100f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return XMPMetaParser.parse(in, options);
101f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
102f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
103f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
104f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
105f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Parsing with default options.
106f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @see XMPMetaFactory#parse(InputStream)
107f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
108f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param packet a String contain an XMP-file.
109f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns the <code>XMPMeta</code>-object created from the input.
110f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @throws XMPException If the file is not well-formed XML or if the parsing fails.
111f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
112f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public static XMPMeta parseFromString(String packet) throws XMPException
113f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
114f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return parseFromString(packet, null);
115f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
116f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
117f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
118f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
119f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Creates an <code>XMPMeta</code>-object from a string.
120f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @see XMPMetaFactory#parseFromString(String, ParseOptions)
121f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
122f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param packet a String contain an XMP-file.
123f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param options Options controlling the parsing.
124f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns the <code>XMPMeta</code>-object created from the input.
125f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @throws XMPException If the file is not well-formed XML or if the parsing fails.
126f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
127f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public static XMPMeta parseFromString(String packet, ParseOptions options)
128f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			throws XMPException
129f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
130f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return XMPMetaParser.parse(packet, options);
131f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
132f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
133f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
134f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
135f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Parsing with default options.
136f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @see XMPMetaFactory#parseFromBuffer(byte[], ParseOptions)
137f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
138f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param buffer a String contain an XMP-file.
139f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns the <code>XMPMeta</code>-object created from the input.
140f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @throws XMPException If the file is not well-formed XML or if the parsing fails.
141f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
142f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public static XMPMeta parseFromBuffer(byte[] buffer) throws XMPException
143f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
144f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return parseFromBuffer(buffer, null);
145f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
146f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
147f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
148f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
149f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Creates an <code>XMPMeta</code>-object from a byte-buffer.
150f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @see XMPMetaFactory#parse(InputStream, ParseOptions)
151f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
152f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param buffer a String contain an XMP-file.
153f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param options Options controlling the parsing.
154f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns the <code>XMPMeta</code>-object created from the input.
155f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @throws XMPException If the file is not well-formed XML or if the parsing fails.
156f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
157f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public static XMPMeta parseFromBuffer(byte[] buffer,
158f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		ParseOptions options) throws XMPException
159f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
160f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return XMPMetaParser.parse(buffer, options);
161f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
162f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
163f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
164f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
165f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Serializes an <code>XMPMeta</code>-object as RDF into an <code>OutputStream</code>
166f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * with default options.
167f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
168f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param xmp a metadata object
169f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param out an <code>OutputStream</code> to write the serialized RDF to.
170f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @throws XMPException on serializsation errors.
171f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
172f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public static void serialize(XMPMeta xmp, OutputStream out) throws XMPException
173f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
174f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		serialize(xmp, out, null);
175f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
176f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
177f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
178f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
179f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Serializes an <code>XMPMeta</code>-object as RDF into an <code>OutputStream</code>.
180f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
181f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param xmp a metadata object
182f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param options Options to control the serialization (see {@link SerializeOptions}).
183f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param out an <code>OutputStream</code> to write the serialized RDF to.
184f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @throws XMPException on serializsation errors.
185f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
186f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public static void serialize(XMPMeta xmp, OutputStream out, SerializeOptions options)
187f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			throws XMPException
188f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
189f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		assertImplementation(xmp);
190f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		XMPSerializerHelper.serialize((XMPMetaImpl) xmp, out, options);
191f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
192f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
193f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
194f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
195f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Serializes an <code>XMPMeta</code>-object as RDF into a byte buffer.
196f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
197f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param xmp a metadata object
198f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param options Options to control the serialization (see {@link SerializeOptions}).
199f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns a byte buffer containing the serialized RDF.
200f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @throws XMPException on serializsation errors.
201f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
202f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public static byte[] serializeToBuffer(XMPMeta xmp, SerializeOptions options)
203f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			throws XMPException
204f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
205f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		assertImplementation(xmp);
206f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return XMPSerializerHelper.serializeToBuffer((XMPMetaImpl) xmp, options);
207f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
208f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
209f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
210f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
211f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Serializes an <code>XMPMeta</code>-object as RDF into a string. <em>Note:</em> Encoding
212f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * is ignored when serializing to a string.
213f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
214f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param xmp a metadata object
215f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param options Options to control the serialization (see {@link SerializeOptions}).
216f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns a string containing the serialized RDF.
217f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @throws XMPException on serializsation errors.
218f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
219f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public static String serializeToString(XMPMeta xmp, SerializeOptions options)
220f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			throws XMPException
221f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
222f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		assertImplementation(xmp);
223f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return XMPSerializerHelper.serializeToString((XMPMetaImpl) xmp, options);
224f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
225f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
226f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
227f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
228f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param xmp Asserts that xmp is compatible to <code>XMPMetaImpl</code>.s
229f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
230f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	private static void assertImplementation(XMPMeta xmp)
231f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
232f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		if (!(xmp instanceof XMPMetaImpl))
233f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		{
234f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			throw new UnsupportedOperationException("The serializing service works only" +
235f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				"with the XMPMeta implementation of this library");
236f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		}
237f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
238f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
239f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
240f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
241f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Resets the schema registry to its original state (creates a new one).
242f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Be careful this might break all existing XMPMeta-objects and should be used
243f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * only for testing purpurses.
244f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
245f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public static void reset()
246f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
247f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		schema = new XMPSchemaRegistryImpl();
248f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
249f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
250f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
251f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
252f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Obtain version information. The XMPVersionInfo singleton is created the first time
253f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * its requested.
254f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
255f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns the version information.
256f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
257f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public static synchronized XMPVersionInfo getVersionInfo()
258f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
259f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		if (versionInfo == null)
260f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		{
261f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			try
262f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			{
263f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				final int major = 5;
264f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				final int minor = 1;
265f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				final int micro = 0;
266f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				final int engBuild = 3;
267f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				final boolean debug = false;
268f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
269f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				// Adobe XMP Core 5.0-jc001 DEBUG-<branch>.<changelist>, 2009 Jan 28 15:22:38-CET
270f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				final String message = "Adobe XMP Core 5.1.0-jc003";
271f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
272f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
273f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				versionInfo = new XMPVersionInfo()
274f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				{
275f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					public int getMajor()
276f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					{
277f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling						return major;
278f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					}
279f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
280f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					public int getMinor()
281f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					{
282f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling						return minor;
283f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					}
284f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
285f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					public int getMicro()
286f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					{
287f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling						return micro;
288f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					}
289f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
290f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					public boolean isDebug()
291f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					{
292f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling						return debug;
293f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					}
294f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
295f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					public int getBuild()
296f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					{
297f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling						return engBuild;
298f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					}
299f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
300f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					public String getMessage()
301f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					{
302f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling						return message;
303f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					}
304f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
305f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					public String toString()
306f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					{
307f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling						return message;
308f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					}
309f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				};
310f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
311f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			}
312f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			catch (Throwable e)
313f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			{
314f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				// EMTPY, severe error would be detected during the tests
315f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				System.out.println(e);
316f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			}
317f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		}
318f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return versionInfo;
319f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
320f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling}
321