File: JPEGLosslessMetadata.java

package info (click to toggle)
pixelmed-codec 20200328-6
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 432 kB
  • sloc: java: 2,855; makefile: 249; sh: 1
file content (105 lines) | stat: -rw-r--r-- 3,546 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/* Copyright (c) 2015, David A. Clunie DBA Pixelmed Publishing. All rights reserved. */

package com.pixelmed.imageio;

// follow the pattern described in "http://docs.oracle.com/javase/1.5.0/docs/guide/imageio/spec/extending.fm3.html"

import org.w3c.dom.*;
import javax.xml.parsers.*; // Package name may change in J2SDK 1.4

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.imageio.metadata.IIOInvalidTreeException;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.metadata.IIOMetadataFormat;
import javax.imageio.metadata.IIOMetadataNode;

public class JPEGLosslessMetadata extends IIOMetadata {

	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 $";

	static final String nativeMetadataFormatName = "com.pixelmed.imageio.JPEGLosslessMetadata_0.1";
	static final String nativeMetadataFormatClassName = "com.pixelmed.imageio.JPEGLosslessMetadata";
	
	// Keyword/value pairs
	List keywords = new ArrayList();
	List values = new ArrayList();

	public JPEGLosslessMetadata() {
		super(
			  false/*standardMetadataFormatSupported*/,
			  nativeMetadataFormatName,
			  nativeMetadataFormatClassName,
			  null/*extraMetadataFormatNames*/,
			  null/*extraMetadataFormatClassNames*/);
	}
	
	public IIOMetadataFormat getMetadataFormat(String formatName) {
		if (!formatName.equals(nativeMetadataFormatName)) {
			throw new IllegalArgumentException("Bad format name!");
		}
		return JPEGLosslessMetadataFormat.getDefaultInstance();
	}
	
	public Node getAsTree(String formatName) {
		if (!formatName.equals(nativeMetadataFormatName)) {
			throw new IllegalArgumentException("Bad format name!");
		}
		
		// Create a root node
		IIOMetadataNode root = new IIOMetadataNode(nativeMetadataFormatName);
		
		// Add a child to the root node for each keyword/value pair
		Iterator keywordIter = keywords.iterator();
		Iterator valueIter = values.iterator();
		while (keywordIter.hasNext()) {
			IIOMetadataNode node = new IIOMetadataNode("KeywordValuePair");
			node.setAttribute("keyword", (String)keywordIter.next());
			node.setAttribute("value", (String)valueIter.next());
			root.appendChild(node);
		}
		
		return root;
	}
	
	public boolean isReadOnly() {
		return true;	// since no writer plug-in
	}
	
	public void reset() {
		this.keywords = new ArrayList();
		this.values = new ArrayList();
	}
	
	public void mergeTree(String formatName, Node root) throws IIOInvalidTreeException {
		if (!formatName.equals(nativeMetadataFormatName)) {
			throw new IllegalArgumentException("Bad format name!");
		}
		
		Node node = root;
		if (!node.getNodeName().equals(nativeMetadataFormatName)) {
			throw new IIOInvalidTreeException("Root must be " + nativeMetadataFormatName,node);
		}
		node = node.getFirstChild();
		while (node != null) {
			if (!node.getNodeName().equals("KeywordValuePair")) {
				throw new IIOInvalidTreeException("Node name not KeywordValuePair!",node);
			}
			NamedNodeMap attributes = node.getAttributes();
			Node keywordNode = attributes.getNamedItem("keyword");
			Node valueNode = attributes.getNamedItem("value");
			if (keywordNode == null || valueNode == null) {
				throw new IIOInvalidTreeException("Keyword or value missing!",node);
			}
			
			// Store keyword and value
			keywords.add((String)keywordNode.getNodeValue());
			values.add((String)valueNode.getNodeValue());
			
			// Move to the next sibling
			node = node.getNextSibling();
		}
	}
}