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.options; 11f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 12f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport java.util.HashMap; 13f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport java.util.Map; 14f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 15f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport com.adobe.xmp.XMPError; 16f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport com.adobe.xmp.XMPException; 17f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 18f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling/** 19f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * The base class for a collection of 32 flag bits. Individual flags are defined as enum value bit 20f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * masks. Inheriting classes add convenience accessor methods. 21f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * 22f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @since 24.01.2006 23f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 24f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingpublic abstract class Options 25f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling{ 26f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** the internal int containing all options */ 27f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling private int options = 0; 28f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** a map containing the bit names */ 29f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling private Map optionNames = null; 30f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 31f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 32f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 33f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * The default constructor. 34f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 35f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public Options() 36f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 37f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling // EMTPY 38f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 39f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 40f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 41f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 42f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Constructor with the options bit mask. 43f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * 44f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param options the options bit mask 45f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @throws XMPException If the options are not correct 46f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 47f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public Options(int options) throws XMPException 48f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 49f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling assertOptionsValid(options); 50f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling setOptions(options); 51f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 52f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 53f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 54f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 55f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Resets the options. 56f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 57f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public void clear() 58f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 59f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling options = 0; 60f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 61f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 62f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 63f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 64f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param optionBits an option bitmask 65f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return Returns true, if this object is equal to the given options. 66f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 67f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public boolean isExactly(int optionBits) 68f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 69f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return getOptions() == optionBits; 70f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 71f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 72f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 73f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 74f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param optionBits an option bitmask 75f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return Returns true, if this object contains all given options. 76f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 77f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public boolean containsAllOptions(int optionBits) 78f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 79f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return (getOptions() & optionBits) == optionBits; 80f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 81f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 82f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 83f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 84f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param optionBits an option bitmask 85f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return Returns true, if this object contain at least one of the given options. 86f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 87f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public boolean containsOneOf(int optionBits) 88f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 89f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return ((getOptions()) & optionBits) != 0; 90f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 91f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 92f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 93f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 94f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param optionBit the binary bit or bits that are requested 95f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return Returns if <emp>all</emp> of the requested bits are set or not. 96f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 97f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling protected boolean getOption(int optionBit) 98f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 99f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return (options & optionBit) != 0; 100f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 101f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 102f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 103f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 104f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param optionBits the binary bit or bits that shall be set to the given value 105f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param value the boolean value to set 106f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 107f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public void setOption(int optionBits, boolean value) 108f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 109f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling options = value ? options | optionBits : options & ~optionBits; 110f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 111f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 112f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 113f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 114f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Is friendly to access it during the tests. 115f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return Returns the options. 116f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 117f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public int getOptions() 118f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 119f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return options; 120f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 121f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 122f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 123f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 124f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param options The options to set. 125f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @throws XMPException 126f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 127f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public void setOptions(int options) throws XMPException 128f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 129f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling assertOptionsValid(options); 130f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling this.options = options; 131f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 132f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 133f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 134f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 135f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @see Object#equals(Object) 136f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 137f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public boolean equals(Object obj) 138f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 139f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return getOptions() == ((Options) obj).getOptions(); 140f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 141f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 142f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 143f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 144f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @see java.lang.Object#hashCode() 145f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 146f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public int hashCode() 147f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 148f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return getOptions(); 149f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 150f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 151f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 152f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 153f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Creates a human readable string from the set options. <em>Note:</em> This method is quite 154f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * expensive and should only be used within tests or as 155f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return Returns a String listing all options that are set to <code>true</code> by their name, 156f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * like "option1 | option4". 157f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 158f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public String getOptionsString() 159f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 160f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if (options != 0) 161f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 162f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling StringBuffer sb = new StringBuffer(); 163f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling int theBits = options; 164f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling while (theBits != 0) 165f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 166f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling int oneLessBit = theBits & (theBits - 1); // clear rightmost one bit 167f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling int singleBit = theBits ^ oneLessBit; 168f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling String bitName = getOptionName(singleBit); 169f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling sb.append(bitName); 170f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if (oneLessBit != 0) 171f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 172f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling sb.append(" | "); 173f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 174f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling theBits = oneLessBit; 175f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 176f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return sb.toString(); 177f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 178f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling else 179f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 180f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return "<none>"; 181f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 182f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 183f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 184f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 185f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 186f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return Returns the options as hex bitmask. 187f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 188f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public String toString() 189f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 190f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return "0x" + Integer.toHexString(options); 191f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 192f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 193f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 194f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 195f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * To be implemeted by inheritants. 196f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return Returns a bit mask where all valid option bits are set. 197f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 198f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling protected abstract int getValidOptions(); 199f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 200f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 201f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 202f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * To be implemeted by inheritants. 203f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param option a single, valid option bit. 204f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return Returns a human readable name for an option bit. 205f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 206f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling protected abstract String defineOptionName(int option); 207f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 208f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 209f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 210f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * The inheriting option class can do additional checks on the options. 211f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * <em>Note:</em> For performance reasons this method is only called 212f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * when setting bitmasks directly. 213f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * When get- and set-methods are used, this method must be called manually, 214f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * normally only when the Options-object has been created from a client 215f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * (it has to be made public therefore). 216f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * 217f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param options the bitmask to check. 218f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @throws XMPException Thrown if the options are not consistent. 219f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 220f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling protected void assertConsistency(int options) throws XMPException 221f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 222f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling // empty, no checks 223f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 224f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 225f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 226f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 227f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Checks options before they are set. 228f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * First it is checked if only defined options are used, 229f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * second the additional {@link Options#assertConsistency(int)}-method is called. 230f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * 231f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param options the options to check 232f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @throws XMPException Thrown if the options are invalid. 233f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 234f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling private void assertOptionsValid(int options) throws XMPException 235f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 236f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling int invalidOptions = options & ~getValidOptions(); 237f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if (invalidOptions == 0) 238f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 239f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling assertConsistency(options); 240f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 241f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling else 242f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 243f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling throw new XMPException("The option bit(s) 0x" + Integer.toHexString(invalidOptions) 244f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling + " are invalid!", XMPError.BADOPTIONS); 245f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 246f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 247f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 248f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 249f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 250f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 251f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Looks up or asks the inherited class for the name of an option bit. 252f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Its save that there is only one valid option handed into the method. 253f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param option a single option bit 254f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return Returns the option name or undefined. 255f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 256f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling private String getOptionName(int option) 257f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 258f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling Map optionsNames = procureOptionNames(); 259f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 260f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling Integer key = new Integer(option); 261f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling String result = (String) optionsNames.get(key); 262f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if (result == null) 263f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 264f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling result = defineOptionName(option); 265f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if (result != null) 266f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 267f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling optionsNames.put(key, result); 268f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 269f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling else 270f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 271f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling result = "<option name not defined>"; 272f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 273f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 274f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 275f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return result; 276f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 277f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 278f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 279f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 280f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return Returns the optionNames map and creates it if required. 281f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 282f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling private Map procureOptionNames() 283f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 284f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if (optionNames == null) 285f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 286f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling optionNames = new HashMap(); 287f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 288f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return optionNames; 289f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 290f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling} 291