📄 xmputils.java
字号:
// =================================================================================================// ADOBE SYSTEMS INCORPORATED// Copyright 2006-2007 Adobe Systems Incorporated// All Rights Reserved//// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms// of the Adobe license agreement accompanying it.// =================================================================================================package com.adobe.xmp;import com.adobe.xmp.impl.Base64;import com.adobe.xmp.impl.ISO8601Converter;import com.adobe.xmp.impl.XMPUtilsImpl;import com.adobe.xmp.options.PropertyOptions;/** * Utility methods for XMP. I included only those that are different from the * Java default conversion utilities. * * @since 21.02.2006 */public class XMPUtils{ /** Private constructor */ private XMPUtils() { // EMPTY } /** * Create a single edit string from an array of strings. * * @param xmp * The XMP object containing the array to be catenated. * @param schemaNS * The schema namespace URI for the array. Must not be null or * the empty string. * @param arrayName * The name of the array. May be a general path expression, must * not be null or the empty string. Each item in the array must * be a simple string value. * @param separator * The string to be used to separate the items in the catenated * string. Defaults to "; ", ASCII semicolon and space * (U+003B, U+0020). * @param quotes * The characters to be used as quotes around array items that * contain a separator. Defaults to '"' * @param allowCommas * Option flag to control the catenation. * @return Returns the string containing the catenated array items. * @throws XMPException Forwards the Exceptions from the metadata processing */ public static String catenateArrayItems(XMPMeta xmp, String schemaNS, String arrayName, String separator, String quotes, boolean allowCommas) throws XMPException { return XMPUtilsImpl .catenateArrayItems(xmp, schemaNS, arrayName, separator, quotes, allowCommas); } /** * Separate a single edit string into an array of strings. * * @param xmp * The XMP object containing the array to be updated. * @param schemaNS * The schema namespace URI for the array. Must not be null or * the empty string. * @param arrayName * The name of the array. May be a general path expression, must * not be null or the empty string. Each item in the array must * be a simple string value. * @param catedStr * The string to be separated into the array items. * @param arrayOptions Option flags to control the separation. * @param preserveCommas Flag if commas shall be preserved * @throws XMPException Forwards the Exceptions from the metadata processing */ public static void separateArrayItems(XMPMeta xmp, String schemaNS, String arrayName, String catedStr, PropertyOptions arrayOptions, boolean preserveCommas) throws XMPException { XMPUtilsImpl.separateArrayItems(xmp, schemaNS, arrayName, catedStr, arrayOptions, preserveCommas); } /** * Remove multiple properties from an XMP object. * * RemoveProperties was created to support the File Info dialog's Delete * button, and has been been generalized somewhat from those specific needs. * It operates in one of three main modes depending on the schemaNS and * propName parameters: * * <ul> * <li> Non-empty <code>schemaNS</code> and <code>propName</code> - The named property is * removed if it is an external property, or if the * flag <code>doAllProperties</code> option is true. It does not matter whether the * named property is an actual property or an alias. * * <li> Non-empty <code>schemaNS</code> and empty <code>propName</code> - The all external * properties in the named schema are removed. Internal properties are also * removed if the flag <code>doAllProperties</code> option is set. In addition, * aliases from the named schema will be removed if the flag <code>includeAliases</code> * option is set. * * <li> Empty <code>schemaNS</code> and empty <code>propName</code> - All external properties in * all schema are removed. Internal properties are also removed if the * flag <code>doAllProperties</code> option is passed. Aliases are implicitly handled * because the associated actuals are internal if the alias is. * </ul> * * It is an error to pass an empty <code>schemaNS</code> and non-empty <code>propName</code>. * * @param xmp * The XMP object containing the properties to be removed. * * @param schemaNS * Optional schema namespace URI for the properties to be * removed. * * @param propName * Optional path expression for the property to be removed. * * @param doAllProperties Option flag to control the deletion: do internal properties in * addition to external properties. * * @param includeAliases Option flag to control the deletion: * Include aliases in the "named schema" case above. * <em>Note:</em> Currently not supported. * @throws XMPException Forwards the Exceptions from the metadata processing */ public static void removeProperties(XMPMeta xmp, String schemaNS, String propName, boolean doAllProperties, boolean includeAliases) throws XMPException { XMPUtilsImpl.removeProperties(xmp, schemaNS, propName, doAllProperties, includeAliases); } /** * Alias without the new option <code>deleteEmptyValues</code>. * @param source The source XMP object. * @param dest The destination XMP object. * @param doAllProperties Do internal properties in addition to external properties. * @param replaceOldValues Replace the values of existing properties. * @throws XMPException Forwards the Exceptions from the metadata processing */ public static void appendProperties(XMPMeta source, XMPMeta dest, boolean doAllProperties, boolean replaceOldValues) throws XMPException { appendProperties(source, dest, doAllProperties, replaceOldValues, false); } /** * <p>Append properties from one XMP object to another. * * <p>XMPUtils#appendProperties was created to support the File Info dialog's Append button, and * has been been generalized somewhat from those specific needs. It appends information from one * XMP object (source) to another (dest). The default operation is to append only external * properties that do not already exist in the destination. The flag * <code>doAllProperties</code> can be used to operate on all properties, external and internal. * The flag <code>replaceOldValues</code> option can be used to replace the values * of existing properties. The notion of external * versus internal applies only to top level properties. The keep-or-replace-old notion applies * within structs and arrays as described below. * <ul> * <li>If <code>replaceOldValues</code> is true then the processing is restricted to the top * level properties. The processed properties from the source (according to * <code>doAllProperties</code>) are propagated to the destination, * replacing any existing values.Properties in the destination that are not in the source * are left alone. * * <li>If <code>replaceOldValues</code> is not passed then the processing is more complicated. * Top level properties are added to the destination if they do not already exist. * If they do exist but differ in form (simple/struct/array) then the destination is left alone. * If the forms match, simple properties are left unchanged while structs and arrays are merged. * * <li>If <code>deleteEmptyValues</code> is passed then an empty value in the source XMP causes * the corresponding destination XMP property to be deleted. The default is to treat empty * values the same as non-empty values. An empty value is any of a simple empty string, an array * with no items, or a struct with no fields. Qualifiers are ignored. * </ul> * * <p>The detailed behavior is defined by the following pseudo-code: * <blockquote> * <pre> * appendProperties ( sourceXMP, destXMP, doAllProperties, * replaceOldValues, deleteEmptyValues ): * for all source schema (top level namespaces): * for all top level properties in sourceSchema: * if doAllProperties or prop is external: * appendSubtree ( sourceNode, destSchema, replaceOldValues, deleteEmptyValues ) * * appendSubtree ( sourceNode, destParent, replaceOldValues, deleteEmptyValues ): * if deleteEmptyValues and source value is empty: * delete the corresponding child from destParent * else if sourceNode not in destParent (by name): * copy sourceNode's subtree to destParent * else if replaceOld: * delete subtree from destParent * copy sourceNode's subtree to destParent * else: * // Already exists in dest and not replacing, merge structs and arrays * if sourceNode and destNode forms differ: * return, leave the destNode alone * else if form is a struct: * for each field in sourceNode: * AppendSubtree ( sourceNode.field, destNode, replaceOldValues ) * else if form is an alt-text array: * copy new items by "xml:lang" value into the destination * else if form is an array: * copy new items by value into the destination, ignoring order and duplicates * </pre> * </blockquote> * * <p><em>Note:</em> appendProperties can be expensive if replaceOldValues is not passed and * the XMP contains large arrays. The array item checking described above is n-squared. * Each source item is checked to see if it already exists in the destination, * without regard to order or duplicates. * <p>Simple items are compared by value and "xml:lang" qualifier, other qualifiers are ignored. * Structs are recursively compared by field names, without regard to field order. Arrays are * compared by recursively comparing all items. * * @param source The source XMP object. * @param dest The destination XMP object. * @param doAllProperties Do internal properties in addition to external properties. * @param replaceOldValues Replace the values of existing properties. * @param deleteEmptyValues Delete destination values if source property is empty. * @throws XMPException Forwards the Exceptions from the metadata processing */ public static void appendProperties(XMPMeta source, XMPMeta dest, boolean doAllProperties, boolean replaceOldValues, boolean deleteEmptyValues) throws XMPException { XMPUtilsImpl.appendProperties(source, dest, doAllProperties, replaceOldValues, deleteEmptyValues); } /** * Convert from string to Boolean. * * @param value * The string representation of the Boolean. * @return The appropriate boolean value for the string. The checked values * for <code>true</code> and <code>false</code> are: * <ul>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -