package server;
import java.io.File;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.ImageInputStream;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
/**
* @deprecated
*/
public class MetadataJSON {
// referenced
// http://johnbokma.com/java/obtaining-image-metadata.html
// changed from XML to JSON DOM tree
StringBuilder json = new StringBuilder();
public StringBuilder getJson() { return json; }
public MetadataJSON( String fileName ) {
try { readAndDisplayMetadata( fileName ); }
catch( Exception e ) { e.printStackTrace(); }
}
void readAndDisplayMetadata( String fileName ) {
try {
File file = new File( fileName );
ImageInputStream iis = ImageIO.createImageInputStream(file);
Iterator<ImageReader> readers = ImageIO.getImageReaders(iis);
if (readers.hasNext()) {
// pick the first available ImageReader
ImageReader reader = readers.next();
// attach source to the reader
reader.setInput(iis, true);
// read metadata of first image
IIOMetadata metadata = reader.getImageMetadata(0);
json.append( "{" );
String[] names = metadata.getMetadataFormatNames();
int length = names.length;
for (int i = 0; i < length; i++) {
if ( i>0 ) { json.append( ",\n" ); }
json.append( displayMetadata( metadata.getAsTree( names[i] )));
}
json.append( "}" );
}
} catch (Exception e) { e.printStackTrace(); }
}
String displayMetadata(Node root) {
return displayMetadata(root, 0);
}
void indent(StringBuilder sb, int level) {
for (int i = 0; i < level; i++)
sb.append( " " );
}
String displayMetadata(Node node, int level) {
// print open tag of element
StringBuilder sb = new StringBuilder();
//indent(sb, level);
sb.append( "\""+ node.getNodeName() +"\": [\n" );
indent(sb, level +1);
NamedNodeMap map = node.getAttributes();
if (map != null && map.getLength() != 0) {
// print attribute values
sb.append( "{ " );
int length = map.getLength();
for (int i = 0; i < length; i++) {
Node attr = map.item(i);
// Remove quotes from numbers
String val = "";
String nodeValue = attr.getNodeValue();
try {
Double.parseDouble(nodeValue);
if ( nodeValue.equals( "NaN" ) || nodeValue.equals( "Infinity" )) throw new NumberFormatException();
val = nodeValue;
} catch(NumberFormatException e) {
//System.out.println("wat? "+ nodeValue);
val = "\"" + nodeValue + "\"";
}
if ( i>0 ) { sb.append(", "); }
sb.append("\"" + attr.getNodeName() + "\": "+ val.replaceAll( "\\p{Cc}","" ));
}
sb.append( " }" );
} else { sb.append( "null" ); }
Node child = node.getFirstChild();
while (child != null) {
// print children recursively
sb.append( ",\n");
indent(sb, level +1);
sb.append( "{"+ displayMetadata(child, level + 1) +"}" );
child = child.getNextSibling();
}
sb.append("\n");
// print close tag of element
indent(sb, level);
sb.append("]");
return sb.toString();
}
}