XMPSchemaRegistryImpl.java revision f12f744843a67c910ec325fc6dfa73988f67b97c
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}