From 8a368ab0ceba5f29632281122ba7212798b7b5e1 Mon Sep 17 00:00:00 2001 From: Roger Leigh Date: Fri, 2 Dec 2016 14:23:33 +0000 Subject: [PATCH 1/2] OMEXMLReader: Handle BinData in non-Pixels elements such as Mask The reader made the assumption that BinData was only found inside Pixels. However, it's also contained within Mask, and the reader was stripping out all BinData content when initially reading the OME-XML (it pre-processes it with a custom SAX parser before creating the MetadataStore). This change makes the stripping selective, so it only occurs for BinData elements contained within Pixels. --- .../src/loci/formats/in/OMEXMLReader.java | 51 +++++++++++-------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/components/formats-bsd/src/loci/formats/in/OMEXMLReader.java b/components/formats-bsd/src/loci/formats/in/OMEXMLReader.java index 46b179fea6e..0bd6669dbe3 100644 --- a/components/formats-bsd/src/loci/formats/in/OMEXMLReader.java +++ b/components/formats-bsd/src/loci/formats/in/OMEXMLReader.java @@ -338,47 +338,53 @@ class OMEXMLHandler extends BaseHandler { private final StringBuilder xmlBuffer; private String currentQName; private Locator locator; + private boolean inPixels; public OMEXMLHandler() { xmlBuffer = new StringBuilder(); + inPixels = false; } @Override public void characters(char[] ch, int start, int length) { - if (currentQName.indexOf("BinData") < 0) { + if (currentQName.indexOf("BinData") < 0 || inPixels == false) { xmlBuffer.append(new String(ch, start, length)); } } @Override public void endElement(String uri, String localName, String qName) { + if (qName.indexOf("Pixels") != -1) { + inPixels = false; + } + xmlBuffer.append(""); } @Override - public void startElement(String ur, String localName, String qName, + public void startElement(String uri, String localName, String qName, Attributes attributes) { currentQName = qName; - if (qName.indexOf("BinData") == -1) { + if (qName.indexOf("Pixels") != -1) { + inPixels = true; + } + + if (qName.indexOf("BinData") != -1 && inPixels == true) { + binData.add( + new BinData(locator.getLineNumber(), locator.getColumnNumber())); + String compress = attributes.getValue("Compression"); + compression.add(compress == null ? "" : compress); + xmlBuffer.append("<"); xmlBuffer.append(qName); for (int i=0; i"); - } - else { - binData.add( - new BinData(locator.getLineNumber(), locator.getColumnNumber())); - String compress = attributes.getValue("Compression"); - compression.add(compress == null ? "" : compress); - + } else { xmlBuffer.append("<"); xmlBuffer.append(qName); for (int i=0; i Date: Mon, 5 Dec 2016 16:11:21 +0000 Subject: [PATCH 2/2] OMEXMLReader: Simplify conditionals --- components/formats-bsd/src/loci/formats/in/OMEXMLReader.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/formats-bsd/src/loci/formats/in/OMEXMLReader.java b/components/formats-bsd/src/loci/formats/in/OMEXMLReader.java index 0bd6669dbe3..8151f264561 100644 --- a/components/formats-bsd/src/loci/formats/in/OMEXMLReader.java +++ b/components/formats-bsd/src/loci/formats/in/OMEXMLReader.java @@ -347,7 +347,7 @@ public OMEXMLHandler() { @Override public void characters(char[] ch, int start, int length) { - if (currentQName.indexOf("BinData") < 0 || inPixels == false) { + if (!inPixels || currentQName.indexOf("BinData") < 0) { xmlBuffer.append(new String(ch, start, length)); } } @@ -373,7 +373,7 @@ public void startElement(String uri, String localName, String qName, inPixels = true; } - if (qName.indexOf("BinData") != -1 && inPixels == true) { + if (inPixels && qName.indexOf("BinData") != -1) { binData.add( new BinData(locator.getLineNumber(), locator.getColumnNumber())); String compress = attributes.getValue("Compression");