blob: fa974c4322eb704aeac1eef9b6e897789a1d2daf [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26package javax.imageio.metadata;
27
28import org.w3c.dom.Node;
29import java.lang.reflect.Method;
30
31/**
32 * An abstract class to be extended by objects that represent metadata
33 * (non-image data) associated with images and streams. Plug-ins
34 * represent metadata using opaque, plug-in specific objects. These
35 * objects, however, provide the ability to access their internal
36 * information as a tree of <code>IIOMetadataNode</code> objects that
37 * support the XML DOM interfaces as well as additional interfaces for
38 * storing non-textual data and retrieving information about legal
39 * data values. The format of such trees is plug-in dependent, but
40 * plug-ins may choose to support a plug-in neutral format described
41 * below. A single plug-in may support multiple metadata formats,
42 * whose names maybe determined by calling
43 * <code>getMetadataFormatNames</code>. The plug-in may also support
44 * a single special format, referred to as the "native" format, which
45 * is designed to encode its metadata losslessly. This format will
46 * typically be designed specifically to work with a specific file
47 * format, so that images may be loaded and saved in the same format
48 * with no loss of metadata, but may be less useful for transfering
49 * metadata between an <code>ImageReader</code> and an
50 * <code>ImageWriter</code> for different image formats. To convert
51 * between two native formats as losslessly as the image file formats
52 * will allow, an <code>ImageTranscoder</code> object must be used.
53 *
54 * @see javax.imageio.ImageReader#getImageMetadata
55 * @see javax.imageio.ImageReader#getStreamMetadata
56 * @see javax.imageio.ImageReader#readAll
57 * @see javax.imageio.ImageWriter#getDefaultStreamMetadata
58 * @see javax.imageio.ImageWriter#getDefaultImageMetadata
59 * @see javax.imageio.ImageWriter#write
60 * @see javax.imageio.ImageWriter#convertImageMetadata
61 * @see javax.imageio.ImageWriter#convertStreamMetadata
62 * @see javax.imageio.IIOImage
63 * @see javax.imageio.ImageTranscoder
64 *
65 */
66public abstract class IIOMetadata {
67
68 /**
69 * A boolean indicating whether the concrete subclass supports the
70 * standard metadata format, set via the constructor.
71 */
72 protected boolean standardFormatSupported;
73
74 /**
75 * The name of the native metadata format for this object,
76 * initialized to <code>null</code> and set via the constructor.
77 */
78 protected String nativeMetadataFormatName = null;
79
80 /**
81 * The name of the class implementing <code>IIOMetadataFormat</code>
82 * and representing the native metadata format, initialized to
83 * <code>null</code> and set via the constructor.
84 */
85 protected String nativeMetadataFormatClassName = null;
86
87 /**
88 * An array of names of formats, other than the standard and
89 * native formats, that are supported by this plug-in,
90 * initialized to <code>null</code> and set via the constructor.
91 */
92 protected String[] extraMetadataFormatNames = null;
93
94 /**
95 * An array of names of classes implementing <code>IIOMetadataFormat</code>
96 * and representing the metadata formats, other than the standard and
97 * native formats, that are supported by this plug-in,
98 * initialized to <code>null</code> and set via the constructor.
99 */
100 protected String[] extraMetadataFormatClassNames = null;
101
102 /**
103 * An <code>IIOMetadataController</code> that is suggested for use
104 * as the controller for this <code>IIOMetadata</code> object. It
105 * may be retrieved via <code>getDefaultController</code>. To
106 * install the default controller, call
107 * <code>setController(getDefaultController())</code>. This
108 * instance variable should be set by subclasses that choose to
109 * provide their own default controller, usually a GUI, for
110 * setting parameters.
111 *
112 * @see IIOMetadataController
113 * @see #getDefaultController
114 */
115 protected IIOMetadataController defaultController = null;
116
117 /**
118 * The <code>IIOMetadataController</code> that will be
119 * used to provide settings for this <code>IIOMetadata</code>
120 * object when the <code>activateController</code> method
121 * is called. This value overrides any default controller,
122 * even when <code>null</code>.
123 *
124 * @see IIOMetadataController
125 * @see #setController(IIOMetadataController)
126 * @see #hasController()
127 * @see #activateController()
128 */
129 protected IIOMetadataController controller = null;
130
131 /**
132 * Constructs an empty <code>IIOMetadata</code> object. The
133 * subclass is responsible for suppying values for all protected
134 * instance variables that will allow any non-overridden default
135 * implemtations of methods to satisfy their contracts. For example,
136 * <code>extraMetadataFormatNames</code> should not have length 0.
137 */
138 protected IIOMetadata() {}
139
140 /**
141 * Constructs an <code>IIOMetadata</code> object with the given
142 * format names and format class names, as well as a boolean
143 * indicating whether the standard format is supported.
144 *
145 * <p> This constructor does not attempt to check the class names
146 * for validity. Invalid class names may cause exceptions in
147 * subsequent calls to <code>getMetadataFormat</code>.
148 *
149 * @param standardMetadataFormatSupported <code>true</code> if
150 * this object can return or accept a DOM tree using the standard
151 * metadata format.
152 * @param nativeMetadataFormatName the name of the native metadata
153 * format, as a <code>String</code>, or <code>null</code> if there
154 * is no native format.
155 * @param nativeMetadataFormatClassName the name of the class of
156 * the native metadata format, or <code>null</code> if there is
157 * no native format.
158 * @param extraMetadataFormatNames an array of <code>String</code>s
159 * indicating additional formats supported by this object, or
160 * <code>null</code> if there are none.
161 * @param extraMetadataFormatClassNames an array of <code>String</code>s
162 * indicating the class names of any additional formats supported by
163 * this object, or <code>null</code> if there are none.
164 *
165 * @exception IllegalArgumentException if
166 * <code>extraMetadataFormatNames</code> has length 0.
167 * @exception IllegalArgumentException if
168 * <code>extraMetadataFormatNames</code> and
169 * <code>extraMetadataFormatClassNames</code> are neither both
170 * <code>null</code>, nor of the same length.
171 */
172 protected IIOMetadata(boolean standardMetadataFormatSupported,
173 String nativeMetadataFormatName,
174 String nativeMetadataFormatClassName,
175 String[] extraMetadataFormatNames,
176 String[] extraMetadataFormatClassNames) {
177 this.standardFormatSupported = standardMetadataFormatSupported;
178 this.nativeMetadataFormatName = nativeMetadataFormatName;
179 this.nativeMetadataFormatClassName = nativeMetadataFormatClassName;
180 if (extraMetadataFormatNames != null) {
181 if (extraMetadataFormatNames.length == 0) {
182 throw new IllegalArgumentException
183 ("extraMetadataFormatNames.length == 0!");
184 }
185 if (extraMetadataFormatClassNames == null) {
186 throw new IllegalArgumentException
187 ("extraMetadataFormatNames != null && extraMetadataFormatClassNames == null!");
188 }
189 if (extraMetadataFormatClassNames.length !=
190 extraMetadataFormatNames.length) {
191 throw new IllegalArgumentException
192 ("extraMetadataFormatClassNames.length != extraMetadataFormatNames.length!");
193 }
194 this.extraMetadataFormatNames =
195 (String[]) extraMetadataFormatNames.clone();
196 this.extraMetadataFormatClassNames =
197 (String[]) extraMetadataFormatClassNames.clone();
198 } else {
199 if (extraMetadataFormatClassNames != null) {
200 throw new IllegalArgumentException
201 ("extraMetadataFormatNames == null && extraMetadataFormatClassNames != null!");
202 }
203 }
204 }
205
206 /**
207 * Returns <code>true</code> if the standard metadata format is
208 * supported by <code>getMetadataFormat</code>,
209 * <code>getAsTree</code>, <code>setFromTree</code>, and
210 * <code>mergeTree</code>.
211 *
212 * <p> The default implementation returns the value of the
213 * <code>standardFormatSupported</code> instance variable.
214 *
215 * @return <code>true</code> if the standard metadata format
216 * is supported.
217 *
218 * @see #getAsTree
219 * @see #setFromTree
220 * @see #mergeTree
221 * @see #getMetadataFormat
222 */
223 public boolean isStandardMetadataFormatSupported() {
224 return standardFormatSupported;
225 }
226
227 /**
228 * Returns <code>true</code> if this object does not support the
229 * <code>mergeTree</code>, <code>setFromTree</code>, and
230 * <code>reset</code> methods.
231 *
232 * @return true if this <code>IIOMetadata</code> object cannot be
233 * modified.
234 */
235 public abstract boolean isReadOnly();
236
237 /**
238 * Returns the name of the "native" metadata format for this
239 * plug-in, which typically allows for lossless encoding and
240 * transmission of the metadata stored in the format handled by
241 * this plug-in. If no such format is supported,
242 * <code>null</code>will be returned.
243 *
244 * <p> The structure and contents of the "native" metadata format
245 * are defined by the plug-in that created this
246 * <code>IIOMetadata</code> object. Plug-ins for simple formats
247 * will usually create a dummy node for the root, and then a
248 * series of child nodes representing individual tags, chunks, or
249 * keyword/value pairs. A plug-in may choose whether or not to
250 * document its native format.
251 *
252 * <p> The default implementation returns the value of the
253 * <code>nativeMetadataFormatName</code> instance variable.
254 *
255 * @return the name of the native format, or <code>null</code>.
256 *
257 * @see #getExtraMetadataFormatNames
258 * @see #getMetadataFormatNames
259 */
260 public String getNativeMetadataFormatName() {
261 return nativeMetadataFormatName;
262 }
263
264 /**
265 * Returns an array of <code>String</code>s containing the names
266 * of additional metadata formats, other than the native and standard
267 * formats, recognized by this plug-in's
268 * <code>getAsTree</code>, <code>setFromTree</code>, and
269 * <code>mergeTree</code> methods. If there are no such additional
270 * formats, <code>null</code> is returned.
271 *
272 * <p> The default implementation returns a clone of the
273 * <code>extraMetadataFormatNames</code> instance variable.
274 *
275 * @return an array of <code>String</code>s with length at least
276 * 1, or <code>null</code>.
277 *
278 * @see #getAsTree
279 * @see #setFromTree
280 * @see #mergeTree
281 * @see #getNativeMetadataFormatName
282 * @see #getMetadataFormatNames
283 */
284 public String[] getExtraMetadataFormatNames() {
285 if (extraMetadataFormatNames == null) {
286 return null;
287 }
288 return (String[])extraMetadataFormatNames.clone();
289 }
290
291 /**
292 * Returns an array of <code>String</code>s containing the names
293 * of all metadata formats, including the native and standard
294 * formats, recognized by this plug-in's <code>getAsTree</code>,
295 * <code>setFromTree</code>, and <code>mergeTree</code> methods.
296 * If there are no such formats, <code>null</code> is returned.
297 *
298 * <p> The default implementation calls
299 * <code>getNativeMetadataFormatName</code>,
300 * <code>isStandardMetadataFormatSupported</code>, and
301 * <code>getExtraMetadataFormatNames</code> and returns the
302 * combined results.
303 *
304 * @return an array of <code>String</code>s.
305 *
306 * @see #getNativeMetadataFormatName
307 * @see #isStandardMetadataFormatSupported
308 * @see #getExtraMetadataFormatNames
309 */
310 public String[] getMetadataFormatNames() {
311 String nativeName = getNativeMetadataFormatName();
312 String standardName = isStandardMetadataFormatSupported() ?
313 IIOMetadataFormatImpl.standardMetadataFormatName : null;
314 String[] extraNames = getExtraMetadataFormatNames();
315
316 int numFormats = 0;
317 if (nativeName != null) {
318 ++numFormats;
319 }
320 if (standardName != null) {
321 ++numFormats;
322 }
323 if (extraNames != null) {
324 numFormats += extraNames.length;
325 }
326 if (numFormats == 0) {
327 return null;
328 }
329
330 String[] formats = new String[numFormats];
331 int index = 0;
332 if (nativeName != null) {
333 formats[index++] = nativeName;
334 }
335 if (standardName != null) {
336 formats[index++] = standardName;
337 }
338 if (extraNames != null) {
339 for (int i = 0; i < extraNames.length; i++) {
340 formats[index++] = extraNames[i];
341 }
342 }
343
344 return formats;
345 }
346
347 /**
348 * Returns an <code>IIOMetadataFormat</code> object describing the
349 * given metadata format, or <code>null</code> if no description
350 * is available. The supplied name must be one of those returned
351 * by <code>getMetadataFormatNames</code> (<i>i.e.</i>, either the
352 * native format name, the standard format name, or one of those
353 * returned by <code>getExtraMetadataFormatNames</code>).
354 *
355 * <p> The default implementation checks the name against the
356 * global standard metadata format name, and returns that format
357 * if it is supported. Otherwise, it checks against the native
358 * format names followed by any additional format names. If a
359 * match is found, it retrieves the name of the
360 * <code>IIOMetadataFormat</code> class from
361 * <code>nativeMetadataFormatClassName</code> or
362 * <code>extraMetadataFormatClassNames</code> as appropriate, and
363 * constructs an instance of that class using its
364 * <code>getInstance</code> method.
365 *
366 * @param formatName the desired metadata format.
367 *
368 * @return an <code>IIOMetadataFormat</code> object.
369 *
370 * @exception IllegalArgumentException if <code>formatName</code>
371 * is <code>null</code> or is not one of the names recognized by
372 * the plug-in.
373 * @exception IllegalStateException if the class corresponding to
374 * the format name cannot be loaded.
375 */
376 public IIOMetadataFormat getMetadataFormat(String formatName) {
377 if (formatName == null) {
378 throw new IllegalArgumentException("formatName == null!");
379 }
380 if (standardFormatSupported
381 && formatName.equals
382 (IIOMetadataFormatImpl.standardMetadataFormatName)) {
383 return IIOMetadataFormatImpl.getStandardFormatInstance();
384 }
385 String formatClassName = null;
386 if (formatName.equals(nativeMetadataFormatName)) {
387 formatClassName = nativeMetadataFormatClassName;
388 } else if (extraMetadataFormatNames != null) {
389 for (int i = 0; i < extraMetadataFormatNames.length; i++) {
390 if (formatName.equals(extraMetadataFormatNames[i])) {
391 formatClassName = extraMetadataFormatClassNames[i];
392 break; // out of for
393 }
394 }
395 }
396 if (formatClassName == null) {
397 throw new IllegalArgumentException("Unsupported format name");
398 }
399 try {
400 Class cls = null;
401 final Object o = this;
402
403 // firstly we try to use classloader used for loading
404 // the IIOMetadata implemantation for this plugin.
405 ClassLoader loader = (ClassLoader)
406 java.security.AccessController.doPrivileged(
407 new java.security.PrivilegedAction() {
408 public Object run() {
409 return o.getClass().getClassLoader();
410 }
411 });
412
413 try {
414 cls = Class.forName(formatClassName, true,
415 loader);
416 } catch (ClassNotFoundException e) {
417 // we failed to load IIOMetadataFormat class by
418 // using IIOMetadata classloader.Next try is to
419 // use thread context classloader.
420 loader = (ClassLoader)
421 java.security.AccessController.doPrivileged(
422 new java.security.PrivilegedAction() {
423 public Object run() {
424 return Thread.currentThread().getContextClassLoader();
425 }
426 });
427 try {
428 cls = Class.forName(formatClassName, true,
429 loader);
430 } catch (ClassNotFoundException e1) {
431 // finally we try to use system classloader in case
432 // if we failed to load IIOMetadataFormat implementation
433 // class above.
434 cls = Class.forName(formatClassName, true,
435 ClassLoader.getSystemClassLoader());
436 }
437 }
438
439 Method meth = cls.getMethod("getInstance");
440 return (IIOMetadataFormat) meth.invoke(null);
441 } catch (Exception e) {
442 RuntimeException ex =
443 new IllegalStateException ("Can't obtain format");
444 ex.initCause(e);
445 throw ex;
446 }
447
448 }
449
450 /**
451 * Returns an XML DOM <code>Node</code> object that represents the
452 * root of a tree of metadata contained within this object
453 * according to the conventions defined by a given metadata
454 * format.
455 *
456 * <p> The names of the available metadata formats may be queried
457 * using the <code>getMetadataFormatNames</code> method.
458 *
459 * @param formatName the desired metadata format.
460 *
461 * @return an XML DOM <code>Node</code> object forming the
462 * root of a tree.
463 *
464 * @exception IllegalArgumentException if <code>formatName</code>
465 * is <code>null</code> or is not one of the names returned by
466 * <code>getMetadataFormatNames</code>.
467 *
468 * @see #getMetadataFormatNames
469 * @see #setFromTree
470 * @see #mergeTree
471 */
472 public abstract Node getAsTree(String formatName);
473
474 /**
475 * Alters the internal state of this <code>IIOMetadata</code>
476 * object from a tree of XML DOM <code>Node</code>s whose syntax
477 * is defined by the given metadata format. The previous state is
478 * altered only as necessary to accomodate the nodes that are
479 * present in the given tree. If the tree structure or contents
480 * are invalid, an <code>IIOInvalidTreeException</code> will be
481 * thrown.
482 *
483 * <p> As the semantics of how a tree or subtree may be merged with
484 * another tree are completely format-specific, plug-in authors may
485 * implement this method in whatever manner is most appropriate for
486 * the format, including simply replacing all existing state with the
487 * contents of the given tree.
488 *
489 * @param formatName the desired metadata format.
490 * @param root an XML DOM <code>Node</code> object forming the
491 * root of a tree.
492 *
493 * @exception IllegalStateException if this object is read-only.
494 * @exception IllegalArgumentException if <code>formatName</code>
495 * is <code>null</code> or is not one of the names returned by
496 * <code>getMetadataFormatNames</code>.
497 * @exception IllegalArgumentException if <code>root</code> is
498 * <code>null</code>.
499 * @exception IIOInvalidTreeException if the tree cannot be parsed
500 * successfully using the rules of the given format.
501 *
502 * @see #getMetadataFormatNames
503 * @see #getAsTree
504 * @see #setFromTree
505 */
506 public abstract void mergeTree(String formatName, Node root)
507 throws IIOInvalidTreeException;
508
509 /**
510 * Returns an <code>IIOMetadataNode</code> representing the chroma
511 * information of the standard <code>javax_imageio_1.0</code>
512 * metadata format, or <code>null</code> if no such information is
513 * available. This method is intended to be called by the utility
514 * routine <code>getStandardTree</code>.
515 *
516 * <p> The default implementation returns <code>null</code>.
517 *
518 * <p> Subclasses should override this method to produce an
519 * appropriate subtree if they wish to support the standard
520 * metadata format.
521 *
522 * @return an <code>IIOMetadataNode</code>, or <code>null</code>.
523 *
524 * @see #getStandardTree
525 */
526 protected IIOMetadataNode getStandardChromaNode() {
527 return null;
528 }
529
530 /**
531 * Returns an <code>IIOMetadataNode</code> representing the
532 * compression information of the standard
533 * <code>javax_imageio_1.0</code> metadata format, or
534 * <code>null</code> if no such information is available. This
535 * method is intended to be called by the utility routine
536 * <code>getStandardTree</code>.
537 *
538 * <p> The default implementation returns <code>null</code>.
539 *
540 * <p> Subclasses should override this method to produce an
541 * appropriate subtree if they wish to support the standard
542 * metadata format.
543 *
544 * @return an <code>IIOMetadataNode</code>, or <code>null</code>.
545 *
546 * @see #getStandardTree
547 */
548 protected IIOMetadataNode getStandardCompressionNode() {
549 return null;
550 }
551
552 /**
553 * Returns an <code>IIOMetadataNode</code> representing the data
554 * format information of the standard
555 * <code>javax_imageio_1.0</code> metadata format, or
556 * <code>null</code> if no such information is available. This
557 * method is intended to be called by the utility routine
558 * <code>getStandardTree</code>.
559 *
560 * <p> The default implementation returns <code>null</code>.
561 *
562 * <p> Subclasses should override this method to produce an
563 * appropriate subtree if they wish to support the standard
564 * metadata format.
565 *
566 * @return an <code>IIOMetadataNode</code>, or <code>null</code>.
567 *
568 * @see #getStandardTree
569 */
570 protected IIOMetadataNode getStandardDataNode() {
571 return null;
572 }
573
574 /**
575 * Returns an <code>IIOMetadataNode</code> representing the
576 * dimension information of the standard
577 * <code>javax_imageio_1.0</code> metadata format, or
578 * <code>null</code> if no such information is available. This
579 * method is intended to be called by the utility routine
580 * <code>getStandardTree</code>.
581 *
582 * <p> The default implementation returns <code>null</code>.
583 *
584 * <p> Subclasses should override this method to produce an
585 * appropriate subtree if they wish to support the standard
586 * metadata format.
587 *
588 * @return an <code>IIOMetadataNode</code>, or <code>null</code>.
589 *
590 * @see #getStandardTree
591 */
592 protected IIOMetadataNode getStandardDimensionNode() {
593 return null;
594 }
595
596 /**
597 * Returns an <code>IIOMetadataNode</code> representing the document
598 * information of the standard <code>javax_imageio_1.0</code>
599 * metadata format, or <code>null</code> if no such information is
600 * available. This method is intended to be called by the utility
601 * routine <code>getStandardTree</code>.
602 *
603 * <p> The default implementation returns <code>null</code>.
604 *
605 * <p> Subclasses should override this method to produce an
606 * appropriate subtree if they wish to support the standard
607 * metadata format.
608 *
609 * @return an <code>IIOMetadataNode</code>, or <code>null</code>.
610 *
611 * @see #getStandardTree
612 */
613 protected IIOMetadataNode getStandardDocumentNode() {
614 return null;
615 }
616
617 /**
618 * Returns an <code>IIOMetadataNode</code> representing the textual
619 * information of the standard <code>javax_imageio_1.0</code>
620 * metadata format, or <code>null</code> if no such information is
621 * available. This method is intended to be called by the utility
622 * routine <code>getStandardTree</code>.
623 *
624 * <p> The default implementation returns <code>null</code>.
625 *
626 * <p> Subclasses should override this method to produce an
627 * appropriate subtree if they wish to support the standard
628 * metadata format.
629 *
630 * @return an <code>IIOMetadataNode</code>, or <code>null</code>.
631 *
632 * @see #getStandardTree
633 */
634 protected IIOMetadataNode getStandardTextNode() {
635 return null;
636 }
637
638 /**
639 * Returns an <code>IIOMetadataNode</code> representing the tiling
640 * information of the standard <code>javax_imageio_1.0</code>
641 * metadata format, or <code>null</code> if no such information is
642 * available. This method is intended to be called by the utility
643 * routine <code>getStandardTree</code>.
644 *
645 * <p> The default implementation returns <code>null</code>.
646 *
647 * <p> Subclasses should override this method to produce an
648 * appropriate subtree if they wish to support the standard
649 * metadata format.
650 *
651 * @return an <code>IIOMetadataNode</code>, or <code>null</code>.
652 *
653 * @see #getStandardTree
654 */
655 protected IIOMetadataNode getStandardTileNode() {
656 return null;
657 }
658
659 /**
660 * Returns an <code>IIOMetadataNode</code> representing the
661 * transparency information of the standard
662 * <code>javax_imageio_1.0</code> metadata format, or
663 * <code>null</code> if no such information is available. This
664 * method is intended to be called by the utility routine
665 * <code>getStandardTree</code>.
666 *
667 * <p> The default implementation returns <code>null</code>.
668 *
669 * <p> Subclasses should override this method to produce an
670 * appropriate subtree if they wish to support the standard
671 * metadata format.
672 *
673 * @return an <code>IIOMetadataNode</code>, or <code>null</code>.
674 */
675 protected IIOMetadataNode getStandardTransparencyNode() {
676 return null;
677 }
678
679 /**
680 * Appends a new node to an existing node, if the new node is
681 * non-<code>null</code>.
682 */
683 private void append(IIOMetadataNode root, IIOMetadataNode node) {
684 if (node != null) {
685 root.appendChild(node);
686 }
687 }
688
689 /**
690 * A utility method to return a tree of
691 * <code>IIOMetadataNode</code>s representing the metadata
692 * contained within this object according to the conventions of
693 * the standard <code>javax_imageio_1.0</code> metadata format.
694 *
695 * <p> This method calls the various <code>getStandard*Node</code>
696 * methods to supply each of the subtrees rooted at the children
697 * of the root node. If any of those methods returns
698 * <code>null</code>, the corresponding subtree will be omitted.
699 * If all of them return <code>null</code>, a tree consisting of a
700 * single root node will be returned.
701 *
702 * @return an <code>IIOMetadataNode</code> representing the root
703 * of a metadata tree in the <code>javax_imageio_1.0</code>
704 * format.
705 *
706 * @see #getStandardChromaNode
707 * @see #getStandardCompressionNode
708 * @see #getStandardDataNode
709 * @see #getStandardDimensionNode
710 * @see #getStandardDocumentNode
711 * @see #getStandardTextNode
712 * @see #getStandardTileNode
713 * @see #getStandardTransparencyNode
714 */
715 protected final IIOMetadataNode getStandardTree() {
716 IIOMetadataNode root = new IIOMetadataNode
717 (IIOMetadataFormatImpl.standardMetadataFormatName);
718 append(root, getStandardChromaNode());
719 append(root, getStandardCompressionNode());
720 append(root, getStandardDataNode());
721 append(root, getStandardDimensionNode());
722 append(root, getStandardDocumentNode());
723 append(root, getStandardTextNode());
724 append(root, getStandardTileNode());
725 append(root, getStandardTransparencyNode());
726 return root;
727 }
728
729 /**
730 * Sets the internal state of this <code>IIOMetadata</code> object
731 * from a tree of XML DOM <code>Node</code>s whose syntax is
732 * defined by the given metadata format. The previous state is
733 * discarded. If the tree's structure or contents are invalid, an
734 * <code>IIOInvalidTreeException</code> will be thrown.
735 *
736 * <p> The default implementation calls <code>reset</code>
737 * followed by <code>mergeTree(formatName, root)</code>.
738 *
739 * @param formatName the desired metadata format.
740 * @param root an XML DOM <code>Node</code> object forming the
741 * root of a tree.
742 *
743 * @exception IllegalStateException if this object is read-only.
744 * @exception IllegalArgumentException if <code>formatName</code>
745 * is <code>null</code> or is not one of the names returned by
746 * <code>getMetadataFormatNames</code>.
747 * @exception IllegalArgumentException if <code>root</code> is
748 * <code>null</code>.
749 * @exception IIOInvalidTreeException if the tree cannot be parsed
750 * successfully using the rules of the given format.
751 *
752 * @see #getMetadataFormatNames
753 * @see #getAsTree
754 * @see #mergeTree
755 */
756 public void setFromTree(String formatName, Node root)
757 throws IIOInvalidTreeException {
758 reset();
759 mergeTree(formatName, root);
760 }
761
762 /**
763 * Resets all the data stored in this object to default values,
764 * usually to the state this object was in immediately after
765 * construction, though the precise semantics are plug-in specific.
766 * Note that there are many possible default values, depending on
767 * how the object was created.
768 *
769 * @exception IllegalStateException if this object is read-only.
770 *
771 * @see javax.imageio.ImageReader#getStreamMetadata
772 * @see javax.imageio.ImageReader#getImageMetadata
773 * @see javax.imageio.ImageWriter#getDefaultStreamMetadata
774 * @see javax.imageio.ImageWriter#getDefaultImageMetadata
775 */
776 public abstract void reset();
777
778 /**
779 * Sets the <code>IIOMetadataController</code> to be used
780 * to provide settings for this <code>IIOMetadata</code>
781 * object when the <code>activateController</code> method
782 * is called, overriding any default controller. If the
783 * argument is <code>null</code>, no controller will be
784 * used, including any default. To restore the default, use
785 * <code>setController(getDefaultController())</code>.
786 *
787 * <p> The default implementation sets the <code>controller</code>
788 * instance variable to the supplied value.
789 *
790 * @param controller An appropriate
791 * <code>IIOMetadataController</code>, or <code>null</code>.
792 *
793 * @see IIOMetadataController
794 * @see #getController
795 * @see #getDefaultController
796 * @see #hasController
797 * @see #activateController()
798 */
799 public void setController(IIOMetadataController controller) {
800 this.controller = controller;
801 }
802
803 /**
804 * Returns whatever <code>IIOMetadataController</code> is currently
805 * installed. This could be the default if there is one,
806 * <code>null</code>, or the argument of the most recent call
807 * to <code>setController</code>.
808 *
809 * <p> The default implementation returns the value of the
810 * <code>controller</code> instance variable.
811 *
812 * @return the currently installed
813 * <code>IIOMetadataController</code>, or <code>null</code>.
814 *
815 * @see IIOMetadataController
816 * @see #setController
817 * @see #getDefaultController
818 * @see #hasController
819 * @see #activateController()
820 */
821 public IIOMetadataController getController() {
822 return controller;
823 }
824
825 /**
826 * Returns the default <code>IIOMetadataController</code>, if there
827 * is one, regardless of the currently installed controller. If
828 * there is no default controller, returns <code>null</code>.
829 *
830 * <p> The default implementation returns the value of the
831 * <code>defaultController</code> instance variable.
832 *
833 * @return the default <code>IIOMetadataController</code>, or
834 * <code>null</code>.
835 *
836 * @see IIOMetadataController
837 * @see #setController(IIOMetadataController)
838 * @see #getController
839 * @see #hasController
840 * @see #activateController()
841 */
842 public IIOMetadataController getDefaultController() {
843 return defaultController;
844 }
845
846 /**
847 * Returns <code>true</code> if there is a controller installed
848 * for this <code>IIOMetadata</code> object.
849 *
850 * <p> The default implementation returns <code>true</code> if the
851 * <code>getController</code> method returns a
852 * non-<code>null</code> value.
853 *
854 * @return <code>true</code> if a controller is installed.
855 *
856 * @see IIOMetadataController
857 * @see #setController(IIOMetadataController)
858 * @see #getController
859 * @see #getDefaultController
860 * @see #activateController()
861 */
862 public boolean hasController() {
863 return (getController() != null);
864 }
865
866 /**
867 * Activates the installed <code>IIOMetadataController</code> for
868 * this <code>IIOMetadata</code> object and returns the resulting
869 * value. When this method returns <code>true</code>, all values for this
870 * <code>IIOMetadata</code> object will be ready for the next write
871 * operation. If <code>false</code> is
872 * returned, no settings in this object will have been disturbed
873 * (<i>i.e.</i>, the user canceled the operation).
874 *
875 * <p> Ordinarily, the controller will be a GUI providing a user
876 * interface for a subclass of <code>IIOMetadata</code> for a
877 * particular plug-in. Controllers need not be GUIs, however.
878 *
879 * <p> The default implementation calls <code>getController</code>
880 * and the calls <code>activate</code> on the returned object if
881 * <code>hasController</code> returns <code>true</code>.
882 *
883 * @return <code>true</code> if the controller completed normally.
884 *
885 * @exception IllegalStateException if there is no controller
886 * currently installed.
887 *
888 * @see IIOMetadataController
889 * @see #setController(IIOMetadataController)
890 * @see #getController
891 * @see #getDefaultController
892 * @see #hasController
893 */
894 public boolean activateController() {
895 if (!hasController()) {
896 throw new IllegalStateException("hasController() == false!");
897 }
898 return getController().activate(this);
899 }
900}