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 Haeberlingimport java.util.ArrayList;
13f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport java.util.Collections;
14f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport java.util.HashMap;
15f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport java.util.Iterator;
16f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport java.util.List;
17f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport java.util.Map;
18f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport java.util.TreeMap;
19f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport java.util.regex.Pattern;
20f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
21f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport com.adobe.xmp.XMPConst;
22f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport com.adobe.xmp.XMPError;
23f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport com.adobe.xmp.XMPException;
24f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport com.adobe.xmp.XMPSchemaRegistry;
25f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport com.adobe.xmp.options.AliasOptions;
26f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport com.adobe.xmp.properties.XMPAliasInfo;
27f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
28f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
29f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling/**
30f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * The schema registry handles the namespaces, aliases and global options for the XMP Toolkit. There
31f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * is only one single instance used by the toolkit.
32f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling *
33f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @since 27.01.2006
34f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */
35f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingpublic final class XMPSchemaRegistryImpl implements XMPSchemaRegistry, XMPConst
36f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling{
37f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/** a map from a namespace URI to its registered prefix */
38f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	private Map namespaceToPrefixMap = new HashMap();
39f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
40f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/** a map from a prefix to the associated namespace URI */
41f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	private Map prefixToNamespaceMap = new HashMap();
42f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
43f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/** a map of all registered aliases.
44f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *  The map is a relationship from a qname to an <code>XMPAliasInfo</code>-object. */
45f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	private Map aliasMap = new HashMap();
46f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/** The pattern that must not be contained in simple properties */
47f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	private Pattern p = Pattern.compile("[/*?\\[\\]]");
48f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
49f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
50f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
51f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Performs the initialisation of the registry with the default namespaces, aliases and global
52f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * options.
53f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
54f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public XMPSchemaRegistryImpl()
55f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
56f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		try
57f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		{
58f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			registerStandardNamespaces();
59f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			registerStandardAliases();
60f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		}
61f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		catch (XMPException e)
62f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		{
63f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			throw new RuntimeException("The XMPSchemaRegistry cannot be initialized!");
64f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		}
65f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
66f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
67f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
68f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	// ---------------------------------------------------------------------------------------------
69f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	// Namespace Functions
70f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
71f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
72f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
73f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @see XMPSchemaRegistry#registerNamespace(String, String)
74f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
75f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public synchronized String registerNamespace(String namespaceURI, String suggestedPrefix)
76f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			throws XMPException
77f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
78f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		ParameterAsserts.assertSchemaNS(namespaceURI);
79f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		ParameterAsserts.assertPrefix(suggestedPrefix);
80f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
81f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		if (suggestedPrefix.charAt(suggestedPrefix.length() - 1) != ':')
82f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		{
83f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			suggestedPrefix += ':';
84f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		}
85f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
86f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		if (!Utils.isXMLNameNS(suggestedPrefix.substring(0,
87f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				suggestedPrefix.length() - 1)))
88f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		{
89f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			throw new XMPException("The prefix is a bad XML name", XMPError.BADXML);
90f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		}
91f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
92f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		String registeredPrefix = (String) namespaceToPrefixMap.get(namespaceURI);
93f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		String registeredNS = (String) prefixToNamespaceMap.get(suggestedPrefix);
94f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		if (registeredPrefix != null)
95f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		{
96f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			// Return the actual prefix
97f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			return registeredPrefix;
98f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		}
99f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		else
100f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		{
101f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			if (registeredNS != null)
102f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			{
103f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				// the namespace is new, but the prefix is already engaged,
104f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				// we generate a new prefix out of the suggested
105f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				String generatedPrefix = suggestedPrefix;
106f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				for (int i = 1; prefixToNamespaceMap.containsKey(generatedPrefix); i++)
107f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				{
108f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					generatedPrefix = suggestedPrefix
109f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling							.substring(0, suggestedPrefix.length() - 1)
110f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling							+ "_" + i + "_:";
111f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				}
112f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				suggestedPrefix = generatedPrefix;
113f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			}
114f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			prefixToNamespaceMap.put(suggestedPrefix, namespaceURI);
115f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			namespaceToPrefixMap.put(namespaceURI, suggestedPrefix);
116f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
117f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			// Return the suggested prefix
118f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			return suggestedPrefix;
119f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		}
120f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
121f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
122f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
123f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
124f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @see XMPSchemaRegistry#deleteNamespace(String)
125f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
126f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public synchronized void deleteNamespace(String namespaceURI)
127f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
128f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		String prefixToDelete = getNamespacePrefix(namespaceURI);
129f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		if (prefixToDelete != null)
130f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		{
131f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			namespaceToPrefixMap.remove(namespaceURI);
132f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			prefixToNamespaceMap.remove(prefixToDelete);
133f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		}
134f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
135f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
136f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
137f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
138f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @see XMPSchemaRegistry#getNamespacePrefix(String)
139f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
140f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public synchronized String getNamespacePrefix(String namespaceURI)
141f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
142f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return (String) namespaceToPrefixMap.get(namespaceURI);
143f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
144f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
145f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
146f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
147f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @see XMPSchemaRegistry#getNamespaceURI(String)
148f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
149f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public synchronized String getNamespaceURI(String namespacePrefix)
150f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
151f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		if (namespacePrefix != null  &&  !namespacePrefix.endsWith(":"))
152f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		{
153f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			namespacePrefix += ":";
154f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		}
155f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return (String) prefixToNamespaceMap.get(namespacePrefix);
156f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
157f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
158f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
159f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
160f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @see XMPSchemaRegistry#getNamespaces()
161f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
162f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public synchronized Map getNamespaces()
163f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
164f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return Collections.unmodifiableMap(new TreeMap(namespaceToPrefixMap));
165f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
166f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
167f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
168f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
169f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @see XMPSchemaRegistry#getPrefixes()
170f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
171f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public synchronized Map getPrefixes()
172f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
173f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return Collections.unmodifiableMap(new TreeMap(prefixToNamespaceMap));
174f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
175f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
176f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
177f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
178f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Register the standard namespaces of schemas and types that are included in the XMP
179f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Specification and some other Adobe private namespaces.
180f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Note: This method is not lock because only called by the constructor.
181f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
182f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @throws XMPException Forwards processing exceptions
183f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
184f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	private void registerStandardNamespaces() throws XMPException
185f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
186f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		// register standard namespaces
187f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_XML, "xml");
188f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_RDF, "rdf");
189f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_DC, "dc");
190f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_IPTCCORE, "Iptc4xmpCore");
191f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
192f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		// register Adobe standard namespaces
193f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_X, "x");
194f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_IX, "iX");
195f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
196f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_XMP, "xmp");
197f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_XMP_RIGHTS, "xmpRights");
198f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_XMP_MM, "xmpMM");
199f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_XMP_BJ, "xmpBJ");
200f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_XMP_NOTE, "xmpNote");
201f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
202f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_PDF, "pdf");
203f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_PDFX, "pdfx");
204f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_PDFX_ID, "pdfxid");
205f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_PDFA_SCHEMA, "pdfaSchema");
206f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_PDFA_PROPERTY, "pdfaProperty");
207f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_PDFA_TYPE, "pdfaType");
208f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_PDFA_FIELD, "pdfaField");
209f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_PDFA_ID, "pdfaid");
210f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_PDFA_EXTENSION, "pdfaExtension");
211f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_PHOTOSHOP, "photoshop");
212f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_PSALBUM, "album");
213f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_EXIF, "exif");
214f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_EXIF_AUX, "aux");
215f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_TIFF, "tiff");
216f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_PNG, "png");
217f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_JPEG, "jpeg");
218f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_JP2K, "jp2k");
219f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_CAMERARAW, "crs");
220f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_ADOBESTOCKPHOTO, "bmsp");
221f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_CREATOR_ATOM, "creatorAtom");
222f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_ASF, "asf");
223f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_WAV, "wav");
224f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
225f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		// register Adobe private namespaces
226f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_DM, "xmpDM");
227f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(NS_TRANSIENT, "xmpx");
228f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
229f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		// register Adobe standard type namespaces
230f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(TYPE_TEXT, "xmpT");
231f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(TYPE_PAGEDFILE, "xmpTPg");
232f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(TYPE_GRAPHICS, "xmpG");
233f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(TYPE_IMAGE, "xmpGImg");
234f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(TYPE_FONT, "stFNT");
235f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(TYPE_DIMENSIONS, "stDim");
236f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(TYPE_RESOURCEEVENT, "stEvt");
237f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(TYPE_RESOURCEREF, "stRef");
238f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(TYPE_ST_VERSION, "stVer");
239f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(TYPE_ST_JOB, "stJob");
240f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(TYPE_MANIFESTITEM, "stMfs");
241f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerNamespace(TYPE_IDENTIFIERQUAL, "xmpidq");
242f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
243f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
244f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
245f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
246f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	// ---------------------------------------------------------------------------------------------
247f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	// Alias Functions
248f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
249f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
250f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
251f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @see XMPSchemaRegistry#resolveAlias(String, String)
252f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
253f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public synchronized XMPAliasInfo resolveAlias(String aliasNS, String aliasProp)
254f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
255f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		String aliasPrefix = getNamespacePrefix(aliasNS);
256f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		if (aliasPrefix == null)
257f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		{
258f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			return null;
259f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		}
260f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
261f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return (XMPAliasInfo) aliasMap.get(aliasPrefix + aliasProp);
262f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
263f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
264f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
265f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
266f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @see XMPSchemaRegistry#findAlias(java.lang.String)
267f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
268f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public synchronized XMPAliasInfo findAlias(String qname)
269f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
270f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return (XMPAliasInfo) aliasMap.get(qname);
271f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
272f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
273f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
274f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
275f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @see XMPSchemaRegistry#findAliases(String)
276f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
277f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public synchronized XMPAliasInfo[] findAliases(String aliasNS)
278f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
279f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		String prefix = getNamespacePrefix(aliasNS);
280f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		List result = new ArrayList();
281f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		if (prefix != null)
282f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		{
283f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			for (Iterator it = aliasMap.keySet().iterator(); it.hasNext();)
284f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			{
285f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				String qname = (String) it.next();
286f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				if (qname.startsWith(prefix))
287f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				{
288f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					result.add(findAlias(qname));
289f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				}
290f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			}
291f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
292f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		}
293f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return (XMPAliasInfo[]) result.toArray(new XMPAliasInfo[result.size()]);
294f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
295f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
296f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
297f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
298f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Associates an alias name with an actual name.
299f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * <p>
300f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Define a alias mapping from one namespace/property to another. Both
301f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * property names must be simple names. An alias can be a direct mapping,
302f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * where the alias and actual have the same data type. It is also possible
303f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * to map a simple alias to an item in an array. This can either be to the
304f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * first item in the array, or to the 'x-default' item in an alt-text array.
305f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Multiple alias names may map to the same actual, as long as the forms
306f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * match. It is a no-op to reregister an alias in an identical fashion.
307f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Note: This method is not locking because only called by registerStandardAliases
308f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * which is only called by the constructor.
309f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Note2: The method is only package-private so that it can be tested with unittests
310f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
311f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param aliasNS
312f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            The namespace URI for the alias. Must not be null or the empty
313f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            string.
314f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param aliasProp
315f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            The name of the alias. Must be a simple name, not null or the
316f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            empty string and not a general path expression.
317f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param actualNS
318f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            The namespace URI for the actual. Must not be null or the
319f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            empty string.
320f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param actualProp
321f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            The name of the actual. Must be a simple name, not null or the
322f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            empty string and not a general path expression.
323f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param aliasForm
324f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            Provides options for aliases for simple aliases to array
325f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            items. This is needed to know what kind of array to create if
326f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            set for the first time via the simple alias. Pass
327f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            <code>XMP_NoOptions</code>, the default value, for all
328f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            direct aliases regardless of whether the actual data type is
329f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            an array or not (see {@link AliasOptions}).
330f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @throws XMPException
331f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *             for inconsistant aliases.
332f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
333f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	synchronized void registerAlias(String aliasNS, String aliasProp, final String actualNS,
334f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			final String actualProp, final AliasOptions aliasForm) throws XMPException
335f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
336f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		ParameterAsserts.assertSchemaNS(aliasNS);
337f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		ParameterAsserts.assertPropName(aliasProp);
338f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		ParameterAsserts.assertSchemaNS(actualNS);
339f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		ParameterAsserts.assertPropName(actualProp);
340f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
341f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		// Fix the alias options
342f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		final AliasOptions aliasOpts = aliasForm != null ?
343f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			new AliasOptions(XMPNodeUtils.verifySetOptions(
344f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				aliasForm.toPropertyOptions(), null).getOptions()) :
345f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			new AliasOptions();
346f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
347f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		if (p.matcher(aliasProp).find()  ||  p.matcher(actualProp).find())
348f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		{
349f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			throw new XMPException("Alias and actual property names must be simple",
350f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					XMPError.BADXPATH);
351f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		}
352f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
353f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		// check if both namespaces are registered
354f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		final String aliasPrefix = getNamespacePrefix(aliasNS);
355f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		final String actualPrefix = getNamespacePrefix(actualNS);
356f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		if (aliasPrefix == null)
357f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		{
358f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			throw new XMPException("Alias namespace is not registered", XMPError.BADSCHEMA);
359f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		}
360f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		else if (actualPrefix == null)
361f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		{
362f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			throw new XMPException("Actual namespace is not registered",
363f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				XMPError.BADSCHEMA);
364f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		}
365f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
366f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		String key = aliasPrefix + aliasProp;
367f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
368f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		// check if alias is already existing
369f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		if (aliasMap.containsKey(key))
370f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		{
371f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			throw new XMPException("Alias is already existing", XMPError.BADPARAM);
372f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		}
373f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		else if (aliasMap.containsKey(actualPrefix + actualProp))
374f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		{
375f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			throw new XMPException(
376f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					"Actual property is already an alias, use the base property",
377f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling					XMPError.BADPARAM);
378f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		}
379f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
380f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		XMPAliasInfo aliasInfo = new XMPAliasInfo()
381f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		{
382f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			/**
383f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			 * @see XMPAliasInfo#getNamespace()
384f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			 */
385f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			public String getNamespace()
386f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			{
387f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				return actualNS;
388f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			}
389f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
390f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			/**
391f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			 * @see XMPAliasInfo#getPrefix()
392f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			 */
393f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			public String getPrefix()
394f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			{
395f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				return actualPrefix;
396f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			}
397f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
398f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			/**
399f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			 * @see XMPAliasInfo#getPropName()
400f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			 */
401f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			public String getPropName()
402f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			{
403f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				return actualProp;
404f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			}
405f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
406f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			/**
407f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			 * @see XMPAliasInfo#getAliasForm()
408f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			 */
409f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			public AliasOptions getAliasForm()
410f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			{
411f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				return aliasOpts;
412f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			}
413f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
414f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			public String toString()
415f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			{
416f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling				return actualPrefix + actualProp + " NS(" + actualNS + "), FORM ("
417f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling						+ getAliasForm() + ")";
418f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling			}
419f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		};
420f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
421f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		aliasMap.put(key, aliasInfo);
422f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
423f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
424f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
425f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
426f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @see XMPSchemaRegistry#getAliases()
427f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
428f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public synchronized Map getAliases()
429f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
430f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return Collections.unmodifiableMap(new TreeMap(aliasMap));
431f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
432f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
433f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
434f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
435f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Register the standard aliases.
436f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Note: This method is not lock because only called by the constructor.
437f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
438f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @throws XMPException If the registrations of at least one alias fails.
439f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
440f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	private void registerStandardAliases() throws XMPException
441f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
442f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		AliasOptions aliasToArrayOrdered = new AliasOptions().setArrayOrdered(true);
443f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		AliasOptions aliasToArrayAltText = new AliasOptions().setArrayAltText(true);
444f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
445f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
446f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		// Aliases from XMP to DC.
447f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_XMP, "Author", NS_DC, "creator", aliasToArrayOrdered);
448f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_XMP, "Authors", NS_DC, "creator", null);
449f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_XMP, "Description", NS_DC, "description", null);
450f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_XMP, "Format", NS_DC, "format", null);
451f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_XMP, "Keywords", NS_DC, "subject", null);
452f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_XMP, "Locale", NS_DC, "language", null);
453f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_XMP, "Title", NS_DC, "title", null);
454f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_XMP_RIGHTS, "Copyright", NS_DC, "rights", null);
455f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
456f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		// Aliases from PDF to DC and XMP.
457f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_PDF, "Author", NS_DC, "creator", aliasToArrayOrdered);
458f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_PDF, "BaseURL", NS_XMP, "BaseURL", null);
459f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_PDF, "CreationDate", NS_XMP, "CreateDate", null);
460f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_PDF, "Creator", NS_XMP, "CreatorTool", null);
461f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_PDF, "ModDate", NS_XMP, "ModifyDate", null);
462f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_PDF, "Subject", NS_DC, "description", aliasToArrayAltText);
463f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_PDF, "Title", NS_DC, "title", aliasToArrayAltText);
464f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
465f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		// Aliases from PHOTOSHOP to DC and XMP.
466f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_PHOTOSHOP, "Author", NS_DC, "creator", aliasToArrayOrdered);
467f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_PHOTOSHOP, "Caption", NS_DC, "description", aliasToArrayAltText);
468f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_PHOTOSHOP, "Copyright", NS_DC, "rights", aliasToArrayAltText);
469f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_PHOTOSHOP, "Keywords", NS_DC, "subject", null);
470f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_PHOTOSHOP, "Marked", NS_XMP_RIGHTS, "Marked", null);
471f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_PHOTOSHOP, "Title", NS_DC, "title", aliasToArrayAltText);
472f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_PHOTOSHOP, "WebStatement", NS_XMP_RIGHTS, "WebStatement", null);
473f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
474f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		// Aliases from TIFF and EXIF to DC and XMP.
475f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_TIFF, "Artist", NS_DC, "creator", aliasToArrayOrdered);
476f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_TIFF, "Copyright", NS_DC, "rights", null);
477f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_TIFF, "DateTime", NS_XMP, "ModifyDate", null);
478f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_TIFF, "ImageDescription", NS_DC, "description", null);
479f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_TIFF, "Software", NS_XMP, "CreatorTool", null);
480f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
481f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		// Aliases from PNG (Acrobat ImageCapture) to DC and XMP.
482f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_PNG, "Author", NS_DC, "creator", aliasToArrayOrdered);
483f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_PNG, "Copyright", NS_DC, "rights", aliasToArrayAltText);
484f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_PNG, "CreationTime", NS_XMP, "CreateDate", null);
485f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_PNG, "Description", NS_DC, "description", aliasToArrayAltText);
486f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_PNG, "ModificationTime", NS_XMP, "ModifyDate", null);
487f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_PNG, "Software", NS_XMP, "CreatorTool", null);
488f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		registerAlias(NS_PNG, "Title", NS_DC, "title", aliasToArrayAltText);
489f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
490f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling}