pixelmed
JPEGLosslessMetadata.java
Go to the documentation of this file.
1 /* Copyright (c) 2015, David A. Clunie DBA Pixelmed Publishing. All rights reserved. */
2 
3 package com.pixelmed.imageio;
4 
5 // follow the pattern described in "http://docs.oracle.com/javase/1.5.0/docs/guide/imageio/spec/extending.fm3.html"
6 
7 import org.w3c.dom.*;
8 import javax.xml.parsers.*; // Package name may change in J2SDK 1.4
9 
10 import java.util.ArrayList;
11 import java.util.Iterator;
12 import java.util.List;
13 import javax.imageio.metadata.IIOInvalidTreeException;
14 import javax.imageio.metadata.IIOMetadata;
15 import javax.imageio.metadata.IIOMetadataFormat;
16 import javax.imageio.metadata.IIOMetadataNode;
17 
18 public class JPEGLosslessMetadata extends IIOMetadata {
19 
20  private static final String identString = "@(#) $Header: /userland/cvs/codec/com/pixelmed/imageio/JPEGLosslessMetadata.java,v 1.2 2015/10/19 15:34:42 dclunie Exp $";
21 
22  static final String nativeMetadataFormatName = "com.pixelmed.imageio.JPEGLosslessMetadata_0.1";
23  static final String nativeMetadataFormatClassName = "com.pixelmed.imageio.JPEGLosslessMetadata";
24 
25  // Keyword/value pairs
26  List keywords = new ArrayList();
27  List values = new ArrayList();
28 
30  super(
31  false/*standardMetadataFormatSupported*/,
32  nativeMetadataFormatName,
33  nativeMetadataFormatClassName,
34  null/*extraMetadataFormatNames*/,
35  null/*extraMetadataFormatClassNames*/);
36  }
37 
38  public IIOMetadataFormat getMetadataFormat(String formatName) {
39  if (!formatName.equals(nativeMetadataFormatName)) {
40  throw new IllegalArgumentException("Bad format name!");
41  }
43  }
44 
45  public Node getAsTree(String formatName) {
46  if (!formatName.equals(nativeMetadataFormatName)) {
47  throw new IllegalArgumentException("Bad format name!");
48  }
49 
50  // Create a root node
51  IIOMetadataNode root = new IIOMetadataNode(nativeMetadataFormatName);
52 
53  // Add a child to the root node for each keyword/value pair
54  Iterator keywordIter = keywords.iterator();
55  Iterator valueIter = values.iterator();
56  while (keywordIter.hasNext()) {
57  IIOMetadataNode node = new IIOMetadataNode("KeywordValuePair");
58  node.setAttribute("keyword", (String)keywordIter.next());
59  node.setAttribute("value", (String)valueIter.next());
60  root.appendChild(node);
61  }
62 
63  return root;
64  }
65 
66  public boolean isReadOnly() {
67  return true; // since no writer plug-in
68  }
69 
70  public void reset() {
71  this.keywords = new ArrayList();
72  this.values = new ArrayList();
73  }
74 
75  public void mergeTree(String formatName, Node root) throws IIOInvalidTreeException {
76  if (!formatName.equals(nativeMetadataFormatName)) {
77  throw new IllegalArgumentException("Bad format name!");
78  }
79 
80  Node node = root;
81  if (!node.getNodeName().equals(nativeMetadataFormatName)) {
82  throw new IIOInvalidTreeException("Root must be " + nativeMetadataFormatName,node);
83  }
84  node = node.getFirstChild();
85  while (node != null) {
86  if (!node.getNodeName().equals("KeywordValuePair")) {
87  throw new IIOInvalidTreeException("Node name not KeywordValuePair!",node);
88  }
89  NamedNodeMap attributes = node.getAttributes();
90  Node keywordNode = attributes.getNamedItem("keyword");
91  Node valueNode = attributes.getNamedItem("value");
92  if (keywordNode == null || valueNode == null) {
93  throw new IIOInvalidTreeException("Keyword or value missing!",node);
94  }
95 
96  // Store keyword and value
97  keywords.add((String)keywordNode.getNodeValue());
98  values.add((String)valueNode.getNodeValue());
99 
100  // Move to the next sibling
101  node = node.getNextSibling();
102  }
103  }
104 }
105 
IIOMetadataFormat getMetadataFormat(String formatName)
void mergeTree(String formatName, Node root)