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 &quot;option1 | option4&quot;.
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