001: /*
002: * $RCSfile: TIFFStreamMetadata.java,v $
003: *
004: *
005: * Copyright (c) 2005 Sun Microsystems, Inc. All Rights Reserved.
006: *
007: * Redistribution and use in source and binary forms, with or without
008: * modification, are permitted provided that the following conditions
009: * are met:
010: *
011: * - Redistribution of source code must retain the above copyright
012: * notice, this list of conditions and the following disclaimer.
013: *
014: * - Redistribution in binary form must reproduce the above copyright
015: * notice, this list of conditions and the following disclaimer in
016: * the documentation and/or other materials provided with the
017: * distribution.
018: *
019: * Neither the name of Sun Microsystems, Inc. or the names of
020: * contributors may be used to endorse or promote products derived
021: * from this software without specific prior written permission.
022: *
023: * This software is provided "AS IS," without a warranty of any
024: * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
025: * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
026: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
027: * EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
028: * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
029: * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
030: * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
031: * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
032: * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
033: * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
034: * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
035: * POSSIBILITY OF SUCH DAMAGES.
036: *
037: * You acknowledge that this software is not designed or intended for
038: * use in the design, construction, operation or maintenance of any
039: * nuclear facility.
040: *
041: * $Revision: 1.1 $
042: * $Date: 2005/02/11 05:01:50 $
043: * $State: Exp $
044: */
045: package com.sun.media.imageioimpl.plugins.tiff;
046:
047: import java.nio.ByteOrder;
048: import javax.imageio.metadata.IIOMetadata;
049: import javax.imageio.metadata.IIOMetadataNode;
050: import javax.imageio.metadata.IIOInvalidTreeException;
051: import org.w3c.dom.NamedNodeMap;
052: import org.w3c.dom.Node;
053:
054: public class TIFFStreamMetadata extends IIOMetadata {
055:
056: // package scope
057: static final String nativeMetadataFormatName = "com_sun_media_imageio_plugins_tiff_stream_1.0";
058:
059: static final String nativeMetadataFormatClassName = "com.sun.media.imageioimpl.plugins.tiff.TIFFStreamMetadataFormat";
060:
061: private static final String bigEndianString = ByteOrder.BIG_ENDIAN
062: .toString();
063: private static final String littleEndianString = ByteOrder.LITTLE_ENDIAN
064: .toString();
065:
066: public ByteOrder byteOrder = ByteOrder.BIG_ENDIAN;
067:
068: public TIFFStreamMetadata() {
069: super (false, nativeMetadataFormatName,
070: nativeMetadataFormatClassName, null, null);
071: }
072:
073: public boolean isReadOnly() {
074: return false;
075: }
076:
077: // Shorthand for throwing an IIOInvalidTreeException
078: private static void fatal(Node node, String reason)
079: throws IIOInvalidTreeException {
080: throw new IIOInvalidTreeException(reason, node);
081: }
082:
083: public Node getAsTree(String formatName) {
084: IIOMetadataNode root = new IIOMetadataNode(
085: nativeMetadataFormatName);
086:
087: IIOMetadataNode byteOrderNode = new IIOMetadataNode("ByteOrder");
088: byteOrderNode.setAttribute("value", byteOrder.toString());
089:
090: root.appendChild(byteOrderNode);
091: return root;
092: }
093:
094: // public void setFromTree(String formatName, Node root) {
095: // }
096:
097: private void mergeNativeTree(Node root)
098: throws IIOInvalidTreeException {
099: Node node = root;
100: if (!node.getNodeName().equals(nativeMetadataFormatName)) {
101: fatal(node, "Root must be " + nativeMetadataFormatName);
102: }
103:
104: node = node.getFirstChild();
105: if (node == null || !node.getNodeName().equals("ByteOrder")) {
106: fatal(node, "Root must have \"ByteOrder\" child");
107: }
108:
109: NamedNodeMap attrs = node.getAttributes();
110: String order = (String) attrs.getNamedItem("value")
111: .getNodeValue();
112:
113: if (order == null) {
114: fatal(node,
115: "ByteOrder node must have a \"value\" attribute");
116: }
117: if (order.equals(bigEndianString)) {
118: this .byteOrder = ByteOrder.BIG_ENDIAN;
119: } else if (order.equals(littleEndianString)) {
120: this .byteOrder = ByteOrder.LITTLE_ENDIAN;
121: } else {
122: fatal(node,
123: "Incorrect value for ByteOrder \"value\" attribute");
124: }
125: }
126:
127: public void mergeTree(String formatName, Node root)
128: throws IIOInvalidTreeException {
129: if (formatName.equals(nativeMetadataFormatName)) {
130: if (root == null) {
131: throw new IllegalArgumentException("root == null!");
132: }
133: mergeNativeTree(root);
134: } else {
135: throw new IllegalArgumentException(
136: "Not a recognized format!");
137: }
138: }
139:
140: public void reset() {
141: this.byteOrder = ByteOrder.BIG_ENDIAN;
142: }
143: }
|