001/*
002 * $RCSfile: DataEntryURLBox.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:32 $
043 * $State: Exp $
044 */
045package com.github.jaiimageio.jpeg2000.impl;
046
047import javax.imageio.metadata.IIOInvalidTreeException;
048import javax.imageio.metadata.IIOMetadataNode;
049
050import org.w3c.dom.Node;
051import org.w3c.dom.NodeList;
052
053/** This class is defined to represent a Data Entry URL Box of JPEG JP2
054 *  file format.  A Data Entry URL Box has a length, and a fixed type
055 *  of "url ".  Its content are a one-byte version, a three-byte flags and
056 *  a URL pertains to the UUID List box within its UUID Info superbox.
057 */
058public class DataEntryURLBox extends Box {
059    /** Cache the element names for this box's xml definition */
060    private static String[] elementNames = {"Version", "Flags", "URL"};
061
062    /** This method will be called by the getNativeNodeForSimpleBox of the
063     *  class Box to get the element names.
064     */
065    public static String[] getElementNames() {
066        return elementNames;
067    }
068
069    /** The element values. */
070    private byte version;
071    private byte[] flags;
072    private String url;
073
074    /** Constructs a <code>DataEntryURLBox</code> from its content data. */
075    public DataEntryURLBox(byte[] data) {
076        super(8 + data.length, 0x75726C20, data);
077    }
078
079    /** Constructs a <code>DataEntryURLBox</code> from its data elements. */
080    public DataEntryURLBox(byte version, byte[] flags, String url) {
081        super(12 + url.length(), 0x75726C20, null);
082        this.version = version;
083        this.flags = flags;
084        this.url = url;
085    }
086
087    /** Constructs a <code>DataEntryURLBox</code> from a Node. */
088    public DataEntryURLBox(Node node) throws IIOInvalidTreeException {
089        super(node);
090        NodeList children = node.getChildNodes();
091
092        for (int i = 0; i < children.getLength(); i++) {
093            Node child = children.item(i);
094            String name = child.getNodeName();
095
096            if ("Version".equals(name)) {
097                version = Box.getByteElementValue(child);
098            }
099
100            if ("Flags".equals(name)) {
101                flags = Box.getByteArrayElementValue(child);
102            }
103
104            if ("URL".equals(name)) {
105                url = Box.getStringElementValue(child);
106            }
107        }
108    }
109
110    /** Parses the content of this box from its content byte array. */
111    protected void parse(byte[] data) {
112        version = data[0];
113        flags = new byte[3];
114        flags[0] = data[1];
115        flags[1] = data[2];
116        flags[2] = data[3];
117
118        url = new String(data, 4, data.length - 4);
119    }
120
121    /** Creates an <code>IIOMetadataNode</code> from this data entry URL
122     *  box.  The format of this node is defined in the XML dtd and xsd
123     *  for the JP2 image file.
124     */
125    public IIOMetadataNode getNativeNode() {
126        return getNativeNodeForSimpleBox();
127    }
128
129    /** Returns the <code>Version</code> data element. */
130    public byte getVersion() {
131        return version;
132    }
133
134    /** Returns the <code>Flags</code> data element. */
135    public byte[] getFlags() {
136        return flags;
137    }
138
139    /** Returns the <code>URL</code> data element. */
140    public String getURL() {
141        return url;
142    }
143
144    protected void compose() {
145        if (data != null)
146            return;
147        data = new byte[4 + url.length()];
148
149        data[0] = version;
150        data[1] = flags[0];
151        data[2] = flags[1];
152        data[3] = flags[2];
153        System.arraycopy(url.getBytes(), 0, data, 4, url.length());
154    }
155}