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;
11f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
12f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport java.util.Map;
13f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
14f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport com.adobe.xmp.properties.XMPAliasInfo;
15f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
16f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling/**
17f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * The schema registry keeps track of all namespaces and aliases used in the XMP
18f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * metadata. At initialisation time, the default namespaces and default aliases
19f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * are automatically registered. <b>Namespaces</b> must be registered before
20f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * used in namespace URI parameters or path expressions. Within the XMP Toolkit
21f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * the registered namespace URIs and prefixes must be unique. Additional
22f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * namespaces encountered when parsing RDF are automatically registered. The
23f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * namespace URI should always end in an XML name separator such as '/' or '#'.
24f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * This is because some forms of RDF shorthand catenate a namespace URI with an
25f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * element name to form a new URI.
26f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * <p>
27f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * <b>Aliases</b> in XMP serve the same purpose as Windows file shortcuts,
28f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Macintosh file aliases, or UNIX file symbolic links. The aliases are simply
29f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * multiple names for the same property. One distinction of XMP aliases is that
30f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * they are ordered, there is an alias name pointing to an actual name. The
31f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * primary significance of the actual name is that it is the preferred name for
32f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * output, generally the most widely recognized name.
33f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * <p>
34f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * The names that can be aliased in XMP are restricted. The alias must be a top
35f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * level property name, not a field within a structure or an element within an
36f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * array. The actual may be a top level property name, the first element within
37f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * a top level array, or the default element in an alt-text array. This does not
38f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * mean the alias can only be a simple property. It is OK to alias a top level
39f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * structure or array to an identical top level structure or array, or to the
40f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * first item of an array of structures.
41f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling *
42f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @since 27.01.2006
43f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */
44f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingpublic interface XMPSchemaRegistry
45f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling{
46f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	// ---------------------------------------------------------------------------------------------
47f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	// Namespace Functions
48f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
49f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
50f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Register a namespace URI with a suggested prefix. It is not an error if
51f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * the URI is already registered, no matter what the prefix is. If the URI
52f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * is not registered but the suggested prefix is in use, a unique prefix is
53f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * created from the suggested one. The actual registeed prefix is always
54f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * returned. The function result tells if the registered prefix is the
55f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * suggested one.
56f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * <p>
57f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Note: No checking is presently done on either the URI or the prefix.
58f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
59f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param namespaceURI
60f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            The URI for the namespace. Must be a valid XML URI.
61f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param suggestedPrefix
62f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            The suggested prefix to be used if the URI is not yet
63f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            registered. Must be a valid XML name.
64f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns the registered prefix for this URI, is equal to the
65f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *         suggestedPrefix if the namespace hasn't been registered before,
66f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *         otherwise the existing prefix.
67f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @throws XMPException If the parameters are not accordingly set
68f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
69f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	String registerNamespace(String namespaceURI, String suggestedPrefix) throws XMPException;
70f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
71f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
72f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
73f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Obtain the prefix for a registered namespace URI.
74f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * <p>
75f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * It is not an error if the namespace URI is not registered. The output
76f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * namespacePrefix string is not modified if the namespace URI is not
77f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * registered.
78f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
79f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param namespaceURI
80f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            The URI for the namespace. Must not be null or the empty
81f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            string.
82f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns true if the namespace URI is registered.
83f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
84f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	String getNamespacePrefix(String namespaceURI);
85f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
86f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
87f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
88f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Obtain the URI for a registered namespace prefix.
89f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * <p>
90f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * It is not an error if the namespace prefix is not registered. The output
91f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * namespaceURI string is not modified if the namespace prefix is not
92f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * registered.
93f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
94f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param namespacePrefix
95f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            The prefix for the namespace. Must not be null or the empty
96f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            string.
97f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns the URI registered for this prefix.
98f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
99f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	String getNamespaceURI(String namespacePrefix);
100f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
101f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
102f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
103f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns the registered prefix/namespace-pairs as map, where the keys are the
104f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *         namespaces and the values are the prefixes.
105f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
106f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	Map getNamespaces();
107f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
108f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
109f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
110f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns the registered namespace/prefix-pairs as map, where the keys are the
111f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *         prefixes and the values are the namespaces.
112f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
113f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	Map getPrefixes();
114f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
115f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
116f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
117f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Deletes a namespace from the registry.
118f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * <p>
119f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Does nothing if the URI is not registered, or if the namespaceURI
120f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * parameter is null or the empty string.
121f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * <p>
122f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Note: Not yet implemented.
123f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
124f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param namespaceURI
125f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            The URI for the namespace.
126f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
127f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	void deleteNamespace(String namespaceURI);
128f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
129f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
130f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
131f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
132f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
133f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	// ---------------------------------------------------------------------------------------------
134f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	// Alias Functions
135f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
136f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
137f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
138f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Determines if a name is an alias, and what it is aliased to.
139f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
140f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param aliasNS
141f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            The namespace URI of the alias. Must not be <code>null</code> or the empty
142f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            string.
143f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param aliasProp
144f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            The name of the alias. May be an arbitrary path expression
145f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            path, must not be <code>null</code> or the empty string.
146f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns the <code>XMPAliasInfo</code> for the given alias namespace and property or
147f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * 		<code>null</code> if there is no such alias.
148f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
149f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	XMPAliasInfo resolveAlias(String aliasNS, String aliasProp);
150f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
151f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
152f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
153f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Collects all aliases that are contained in the provided namespace.
154f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * If nothing is found, an empty array is returned.
155f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
156f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param aliasNS a schema namespace URI
157f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns all alias infos from aliases that are contained in the provided namespace.
158f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
159f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	XMPAliasInfo[] findAliases(String aliasNS);
160f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
161f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
162f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
163f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Searches for registered aliases.
164f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
165f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param qname
166f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            an XML conform qname
167f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns if an alias definition for the given qname to another
168f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *         schema and property is registered.
169f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
170f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	XMPAliasInfo findAlias(String qname);
171f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
172f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
173f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
174f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns the registered aliases as map, where the key is the "qname" (prefix and name)
175f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * and the value an <code>XMPAliasInfo</code>-object.
176f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
177f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	Map getAliases();
178f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
179f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
180f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling}