From: <gun...@us...> - 2007-12-18 12:07:29
|
Revision: 5615 http://dcm4che.svn.sourceforge.net/dcm4che/?rev=5615&view=rev Author: gunterze Date: 2007-12-18 04:07:27 -0800 (Tue, 18 Dec 2007) Log Message: ----------- [#DCMEE-668] WADO frame level retrieve Modified Paths: -------------- dcm4chee/dcm4chee-arc/trunk/dcm4jboss-sar/src/java/org/dcm4chex/archive/codec/CodecCmd.java dcm4chee/dcm4chee-arc/trunk/dcm4jboss-sar/src/java/org/dcm4chex/archive/codec/DecompressCmd.java dcm4chee/dcm4chee-arc/trunk/dcm4jboss-sar/src/java/org/dcm4chex/archive/util/FileDataSource.java dcm4chee/dcm4chee-arc/trunk/dcm4jboss-wado/src/java/org/dcm4chex/wado/common/WADORequestObject.java dcm4chee/dcm4chee-arc/trunk/dcm4jboss-wado/src/java/org/dcm4chex/wado/mbean/WADOSupport.java dcm4chee/dcm4chee-arc/trunk/dcm4jboss-wado/src/java/org/dcm4chex/wado/web/BasicRequestObjectImpl.java dcm4chee/dcm4chee-arc/trunk/dcm4jboss-wado/src/java/org/dcm4chex/wado/web/WADORequestObjectImpl.java dcm4chee/dcm4chee-arc/trunk/dcm4jboss-wado/src/java/org/dcm4chex/wado/web/WADOServlet.java Modified: dcm4chee/dcm4chee-arc/trunk/dcm4jboss-sar/src/java/org/dcm4chex/archive/codec/CodecCmd.java =================================================================== --- dcm4chee/dcm4chee-arc/trunk/dcm4jboss-sar/src/java/org/dcm4chex/archive/codec/CodecCmd.java 2007-12-17 12:57:24 UTC (rev 5614) +++ dcm4chee/dcm4chee-arc/trunk/dcm4jboss-sar/src/java/org/dcm4chex/archive/codec/CodecCmd.java 2007-12-18 12:07:27 UTC (rev 5615) @@ -112,8 +112,6 @@ protected final int frameLength; - protected final int pixelDataLength; - protected final int bitsUsed; protected CodecCmd(Dataset ds) { @@ -127,7 +125,6 @@ this.pixelRepresentation = ds.getInt(Tags.PixelRepresentation, 0); this.planarConfiguration = ds.getInt(Tags.PlanarConfiguration, 0); this.frameLength = rows * columns * samples * bitsAllocated / 8; - this.pixelDataLength = frameLength * frames; } private boolean isOverlayInPixelData(Dataset ds) { @@ -139,8 +136,8 @@ return false; } - public final int getPixelDataLength() { - return pixelDataLength; + public int getPixelDataLength() { + return frames * frameLength; } protected BufferedImage createBufferedImage() { Modified: dcm4chee/dcm4chee-arc/trunk/dcm4jboss-sar/src/java/org/dcm4chex/archive/codec/DecompressCmd.java =================================================================== --- dcm4chee/dcm4chee-arc/trunk/dcm4jboss-sar/src/java/org/dcm4chex/archive/codec/DecompressCmd.java 2007-12-17 12:57:24 UTC (rev 5614) +++ dcm4chee/dcm4chee-arc/trunk/dcm4jboss-sar/src/java/org/dcm4chex/archive/codec/DecompressCmd.java 2007-12-18 12:07:27 UTC (rev 5615) @@ -92,6 +92,8 @@ private String tsuid; + private int[] simpleFrameList; + public static byte[] decompressFile(File inFile, File outFile, String outTS, int pxdataVR, byte[] buffer) throws Exception { log.info("M-READ file:" + inFile); @@ -178,9 +180,10 @@ ImageReaderFactory f = ImageReaderFactory.getInstance(); reader = f.getReaderForTransferSyntax(tsuid); bi = createBufferedImage(); - for (int i = 0; i < frames; ++i) { - log.debug("start decompression of frame #" + (i + 1)); - reader.setInput(itemStream(i)); + for (int i = 0, n = getNumberOfFrames(); i < n; ++i) { + int frame = simpleFrameList != null ? (simpleFrameList[i]-1) : i; + log.debug("start decompression of frame #" + (frame + 1)); + reader.setInput(itemStream(frame)); ImageReadParam param = reader.getDefaultReadParam(); param.setDestination(bi); bi = reader.read(0, param); @@ -188,7 +191,7 @@ // J2KImageReaderCodecLib.setInput() if (reader.getClass().getName().startsWith(J2KIMAGE_READER)) { reader.dispose(); - reader = i < frames - 1 ? f + reader = i < n - 1 ? f .getReaderForTransferSyntax(tsuid) : null; } else { reader.reset(); @@ -277,4 +280,15 @@ } } + public void setSimpleFrameList(int[] simpleFrameList) { + this.simpleFrameList = simpleFrameList; + } + + public int getPixelDataLength() { + return getNumberOfFrames() * frameLength; + } + + private int getNumberOfFrames() { + return simpleFrameList != null ? simpleFrameList.length : frames; + } } Modified: dcm4chee/dcm4chee-arc/trunk/dcm4jboss-sar/src/java/org/dcm4chex/archive/util/FileDataSource.java =================================================================== --- dcm4chee/dcm4chee-arc/trunk/dcm4jboss-sar/src/java/org/dcm4chex/archive/util/FileDataSource.java 2007-12-17 12:57:24 UTC (rev 5614) +++ dcm4chee/dcm4chee-arc/trunk/dcm4jboss-sar/src/java/org/dcm4chex/archive/util/FileDataSource.java 2007-12-18 12:07:27 UTC (rev 5615) @@ -47,6 +47,7 @@ import javax.imageio.stream.FileImageInputStream; import org.dcm4che.data.Dataset; +import org.dcm4che.data.DcmElement; import org.dcm4che.data.DcmEncodeParam; import org.dcm4che.data.DcmObjectFactory; import org.dcm4che.data.DcmParser; @@ -55,6 +56,7 @@ import org.dcm4che.dict.UIDs; import org.dcm4che.dict.VRs; import org.dcm4che.net.DataSource; +import org.dcm4che.util.UIDGenerator; import org.dcm4chex.archive.codec.DecompressCmd; import org.jboss.logging.Logger; @@ -65,7 +67,15 @@ */ public class FileDataSource implements DataSource { - private static final Logger log = Logger.getLogger(FileDataSource.class);; + private static final Logger log = Logger.getLogger(FileDataSource.class); + private static final Dataset EXTRACTED_FRAMES; + + static { //TODO final DCM code value not yet available + EXTRACTED_FRAMES = DcmObjectFactory.getInstance().newDataset(); + EXTRACTED_FRAMES.putLO(Tags.CodeValue, "121350"); + EXTRACTED_FRAMES.putSH(Tags.CodingSchemeDesignator, "99DCM4CHEE"); + EXTRACTED_FRAMES.putLO(Tags.CodeMeaning, "EXTRACTED FRAMES"); + } private final File file; private final Dataset mergeAttrs; private final byte[] buffer; @@ -74,6 +84,9 @@ private boolean writeFile = false; private boolean withoutPixeldata = false; private boolean excludePrivate = false; + private int[] simpleFrameList; + private int[] calculatedFrameList; + private Dataset contributingEquipment; public FileDataSource(File file, Dataset mergeAttrs, byte[] buffer) { this.file = file; @@ -110,29 +123,81 @@ this.withoutPixeldata = withoutPixelData; } - public boolean isExcludePrivate() { + public final boolean isExcludePrivate() { return excludePrivate; } - public void setExcludePrivate(boolean excludePrivate) { + public final void setExcludePrivate(boolean excludePrivate) { this.excludePrivate = excludePrivate; } - public File getFile() { + public final void setSimpleFrameList(int[] simpleFrameList) { + if (calculatedFrameList != null) { + if (calculatedFrameList != null) { + throw new IllegalStateException(); + } + if (simpleFrameList.length == 0) { + throw new IllegalArgumentException(); + } + for (int i = 0; i < simpleFrameList.length; i++) { + if (simpleFrameList[i] <= 0) { + throw new IllegalArgumentException(); + } + if (i != 0 && calculatedFrameList[i] + <= calculatedFrameList[i-1]) { + throw new IllegalArgumentException(); + } + } + } + this.simpleFrameList = simpleFrameList; + } + + public final void setCalculatedFrameList(int[] calculatedFrameList) { + if (calculatedFrameList != null) { + if (simpleFrameList != null) { + throw new IllegalStateException(); + } + if (calculatedFrameList.length == 0) { + throw new IllegalArgumentException(); + } + if (calculatedFrameList.length % 3 != 0) { + throw new IllegalArgumentException(); + } + for (int i = 0; i < calculatedFrameList.length; i++) { + if (calculatedFrameList[i] <= 0) { + throw new IllegalArgumentException(); + } + switch (i % 3) { + case 0: + if (i != 0 && calculatedFrameList[i] + <= calculatedFrameList[i-2]) { + throw new IllegalArgumentException(); + } + break; + case 1: + if (i != 0 && calculatedFrameList[i] + < calculatedFrameList[i-1]) { + throw new IllegalArgumentException(); + } + break; + } + } + } + this.calculatedFrameList = calculatedFrameList; + } + + public final void setContributingEquipment(Dataset contributingEquipment) { + this.contributingEquipment = contributingEquipment; + } + + public final File getFile() { return file; } - public Dataset getMergeAttrs() { + public final Dataset getMergeAttrs() { return mergeAttrs; } - /** - * - * @param out - * @param tsUID - * @param writeFile - * @throws IOException - */ public void writeTo(OutputStream out, String tsUID) throws IOException { log.info("M-READ file:" + file); @@ -148,6 +213,26 @@ parser.parseDataset(parser.getDcmDecodeParam(), -1); } ds.putAll(mergeAttrs); + int framesInFile = ds.getInt(Tags.NumberOfFrames, 1); + if (simpleFrameList != null) { + if (simpleFrameList[simpleFrameList.length - 1] > framesInFile) { + throw new RequestedFrameNumbersOutOfRangeException(); + } + } else if (calculatedFrameList != null) { + if (calculatedFrameList[0] > framesInFile) { + throw new RequestedFrameNumbersOutOfRangeException(); + } + simpleFrameList = calculateFrameList(framesInFile); + } + if (framesInFile == 1) { + simpleFrameList = null; + } + if (simpleFrameList != null) { + addSourceImageSeq(ds); + addContributingEquipmentSeq(ds); + adjustNumberOfFrames(ds); + replaceIUIDs(ds); + } String tsOrig = DecompressCmd.getTransferSyntax(ds); if (writeFile) { if (tsUID != null) { @@ -172,13 +257,13 @@ int len = parser.getReadLength(); if (len == -1 && !enc.encapsulated) { DecompressCmd cmd = new DecompressCmd(ds, tsOrig, parser); + cmd.setSimpleFrameList(simpleFrameList); len = cmd.getPixelDataLength(); log.debug("Dataset:\n"); log.debug(ds); write(ds, out, enc); - ds - .writeHeader(out, enc, Tags.PixelData, VRs.OW, - (len + 1) & ~1); + ds.writeHeader(out, enc, Tags.PixelData, VRs.OW, + (len + 1) & ~1); try { cmd.decompress(enc.byteOrder, out); } catch (IOException e) { @@ -196,14 +281,49 @@ ds.writeHeader(out, enc, Tags.PixelData, VRs.OB, len); parser.parseHeader(); int itemlen; - while (parser.getReadTag() == Tags.Item) { + if (simpleFrameList != null) { itemlen = parser.getReadLength(); - ds.writeHeader(out, enc, Tags.Item, VRs.NONE, itemlen); - copy(fiis, out, itemlen, buffer); + ds.writeHeader(out, enc, Tags.Item, VRs.NONE, 0); + fiis.skipBytes(itemlen); parser.parseHeader(); + for (int srcFrame = 1, destFrame = 0; + parser.getReadTag() == Tags.Item; srcFrame++) { + itemlen = parser.getReadLength(); + if (destFrame < simpleFrameList.length + && srcFrame == simpleFrameList[destFrame]) { + ds.writeHeader(out, enc, Tags.Item, VRs.NONE, itemlen); + copy(fiis, out, itemlen, buffer); + destFrame++; + } else { + fiis.skipBytes(itemlen); + } + parser.parseHeader(); + } + } else { + while (parser.getReadTag() == Tags.Item) { + itemlen = parser.getReadLength(); + ds.writeHeader(out, enc, Tags.Item, VRs.NONE, itemlen); + copy(fiis, out, itemlen, buffer); + parser.parseHeader(); + } } ds.writeHeader(out, enc, Tags.SeqDelimitationItem, VRs.NONE, 0); + } else if (simpleFrameList != null) { + int frameLength = len / framesInFile; + int newPixelDataLength = + frameLength * simpleFrameList.length; + ds.writeHeader(out, enc, Tags.PixelData, VRs.OW, + (newPixelDataLength+1)&~1); + long pixelDataPos = fiis.getStreamPosition(); + for (int i = 0; i < simpleFrameList.length; i++) { + fiis.seek(pixelDataPos + + frameLength * (simpleFrameList[i]-1)); + copy(fiis, out, frameLength, buffer); + } + if ((newPixelDataLength & 1) != 0) + out.write(0); + fiis.seek(pixelDataPos + len); } else { ds.writeHeader(out, enc, Tags.PixelData, VRs.OW, len); copy(fiis, out, len, buffer); @@ -218,7 +338,65 @@ } } } + + private void adjustNumberOfFrames(Dataset ds) { + ds.putIS(Tags.NumberOfFrames, simpleFrameList.length); + DcmElement src = ds.remove(Tags.PerFrameFunctionalGroupsSeq); + if (src != null) { + DcmElement dest = ds.putSQ(Tags.PerFrameFunctionalGroupsSeq); + for (int i = 0; i < simpleFrameList.length; i++) { + dest.addItem(src.getItem(simpleFrameList[i]-1)); + } + } + } + private void addContributingEquipmentSeq(Dataset ds) { + if (contributingEquipment != null) { + getOrPutSQ(ds, Tags.ContributingEquipmentSeq) + .addItem(contributingEquipment); + } + } + + private void addSourceImageSeq(Dataset ds) { + DcmElement seq = getOrPutSQ(ds, Tags.SourceImageSeq); + Dataset item = seq.addNewItem(); + item.putUI(Tags.RefSOPClassUID, ds.getString(Tags.SOPClassUID)); + item.putUI(Tags.RefSOPInstanceUID, ds.getString(Tags.SOPInstanceUID)); + item.putIS(Tags.RefFrameNumber, simpleFrameList); + item.putSQ(Tags.PurposeOfReferenceCodeSeq).addItem(EXTRACTED_FRAMES); + } + + private DcmElement getOrPutSQ(Dataset ds, int tag) { + DcmElement seq = ds.putSQ(Tags.SourceImageSeq); + return seq != null ? seq : ds.putSQ(Tags.SourceImageSeq); + } + + private void replaceIUIDs(Dataset ds) { + UIDGenerator uidgen = UIDGenerator.getInstance(); + ds.putUI(Tags.SOPInstanceUID, uidgen.createUID()); + ds.putUI(Tags.SeriesInstanceUID, uidgen.createUID()); + } + + private int[] calculateFrameList(int frames) { + int[] src = new int[frames]; + int length = 0; + addFrame: + for (int i = 0; i < calculatedFrameList.length;) { + for (int f = calculatedFrameList[i++], + last = calculatedFrameList[i++], + step = calculatedFrameList[i++]; + f <= last; f += step) { + if (f > frames) { + break addFrame; + } + src[length++] = f; + } + } + int[] dest = new int[length]; + System.arraycopy(src, 0, dest, 0, length); + return dest; + } + private void write(Dataset ds, OutputStream out, DcmEncodeParam enc) throws IOException { if (writeFile) { Modified: dcm4chee/dcm4chee-arc/trunk/dcm4jboss-wado/src/java/org/dcm4chex/wado/common/WADORequestObject.java =================================================================== --- dcm4chee/dcm4chee-arc/trunk/dcm4jboss-wado/src/java/org/dcm4chex/wado/common/WADORequestObject.java 2007-12-17 12:57:24 UTC (rev 5614) +++ dcm4chee/dcm4chee-arc/trunk/dcm4jboss-wado/src/java/org/dcm4chex/wado/common/WADORequestObject.java 2007-12-18 12:07:27 UTC (rev 5615) @@ -139,4 +139,10 @@ */ String getImageQuality(); + boolean isExcludePrivate(); + + String getSimpleFrameList(); + + String getCalculatedFrameList(); + } Modified: dcm4chee/dcm4chee-arc/trunk/dcm4jboss-wado/src/java/org/dcm4chex/wado/mbean/WADOSupport.java =================================================================== --- dcm4chee/dcm4chee-arc/trunk/dcm4jboss-wado/src/java/org/dcm4chex/wado/mbean/WADOSupport.java 2007-12-17 12:57:24 UTC (rev 5614) +++ dcm4chee/dcm4chee-arc/trunk/dcm4jboss-wado/src/java/org/dcm4chex/wado/mbean/WADOSupport.java 2007-12-18 12:07:27 UTC (rev 5615) @@ -109,6 +109,7 @@ import org.dcm4chex.wado.mbean.cache.WADOCache; import org.dcm4chex.wado.mbean.cache.WADOCacheImpl; import org.dcm4chex.wado.mbean.xml.DatasetXMLResponseObject; +import org.dcm4chex.wado.web.WADORequestObjectImpl; import org.jboss.mx.util.MBeanServerLocator; /** @@ -135,6 +136,19 @@ private static final String SUBJECT_CONTEXT_KEY = "javax.security.auth.Subject.container"; + private static final String ERROR_INVALID_SIMPLE_FRAME_LIST = + "Error: simpleFrameList parameter is invalid! Must be a comma " + + "separated list of positive integer strings in ascending order."; + + private static final String ERROR_INVALID_CALCULATED_FRAME_LIST = + "Error: calculatedFrameList parameter is invalid! Must be a comma " + + "separated list of triples of integer strings, defining " + + "non-overlapping ranges of frame numbers."; + + private static final String ERROR_SIMPLE_AND_CALCULATED_FRAME_LIST = + "Error: use of simpleFrameList and calculatedFrameList parameter" + + " are mutually exclusive."; + private static Logger log = Logger.getLogger(WADOService.class.getName()); private static final AuditLoggerFactory alf = AuditLoggerFactory @@ -454,6 +468,21 @@ return transferSyntax; } + private static int[] parseInts(String s) { + if (s == null) { + return null; + } + String[] ss = s.split(","); + if (ss.length == 0) { + throw new IllegalArgumentException(); + } + int[] frameList = new int[ss.length]; + for (int i = 0; i < frameList.length; i++) { + frameList[i] = Integer.parseInt(ss[i].trim()); + } + return frameList; + } + private WADOResponseObject getUpdatedInstance(WADORequestObject req, String transferSyntax) { String iuid = req.getObjectUID(); @@ -463,10 +492,29 @@ "getDatasourceOfInstance", new Object[] { iuid }, new String[] { String.class.getName() }); Dataset d = ds.getMergeAttrs(); - if (req.getRequestParams().containsKey("privateTags")) { - ds.setExcludePrivate("no".equalsIgnoreCase(((String[]) req - .getRequestParams().get("privateTags"))[0])); + ds.setExcludePrivate(req.isExcludePrivate()); + try { + ds.setSimpleFrameList(parseInts(req.getSimpleFrameList())); + } catch (IllegalArgumentException iae) { + return new WADOStreamResponseObjectImpl(null, + CONTENT_TYPE_DICOM, + HttpServletResponse.SC_BAD_REQUEST, + ERROR_INVALID_SIMPLE_FRAME_LIST); } + try { + ds.setCalculatedFrameList( + parseInts(req.getCalculatedFrameList())); + } catch (IllegalStateException ise) { + return new WADOStreamResponseObjectImpl(null, + CONTENT_TYPE_DICOM, + HttpServletResponse.SC_BAD_REQUEST, + ERROR_SIMPLE_AND_CALCULATED_FRAME_LIST); + } catch (IllegalArgumentException iae) { + return new WADOStreamResponseObjectImpl(null, + CONTENT_TYPE_DICOM, + HttpServletResponse.SC_BAD_REQUEST, + ERROR_INVALID_CALCULATED_FRAME_LIST); + } WADODatasourceResponseObjectImpl resp = new WADODatasourceResponseObjectImpl( ds, transferSyntax, CONTENT_TYPE_DICOM, HttpServletResponse.SC_OK, null); Modified: dcm4chee/dcm4chee-arc/trunk/dcm4jboss-wado/src/java/org/dcm4chex/wado/web/BasicRequestObjectImpl.java =================================================================== --- dcm4chee/dcm4chee-arc/trunk/dcm4jboss-wado/src/java/org/dcm4chex/wado/web/BasicRequestObjectImpl.java 2007-12-17 12:57:24 UTC (rev 5614) +++ dcm4chee/dcm4chee-arc/trunk/dcm4jboss-wado/src/java/org/dcm4chex/wado/web/BasicRequestObjectImpl.java 2007-12-18 12:07:27 UTC (rev 5615) @@ -63,18 +63,18 @@ private static Logger log = Logger.getLogger(WADOService.class.getName()); - private String reqType; - private Map headerMap; - private Map paramMap; - private List allowedContentTypes = null; + protected String reqType; + protected Map headerMap; + protected Map paramMap; + protected List allowedContentTypes = null; - private String reqURL; - private String errMsg; + protected String reqURL; + protected String errMsg; - private String remoteAddr; - private String remoteHost = null; - private String remoteUser; - private HttpServletRequest request; + protected String remoteAddr; + protected String remoteHost = null; + protected String remoteUser; + protected HttpServletRequest request; /** * Initialize an RequestObject with http request. Modified: dcm4chee/dcm4chee-arc/trunk/dcm4jboss-wado/src/java/org/dcm4chex/wado/web/WADORequestObjectImpl.java =================================================================== --- dcm4chee/dcm4chee-arc/trunk/dcm4jboss-wado/src/java/org/dcm4chex/wado/web/WADORequestObjectImpl.java 2007-12-17 12:57:24 UTC (rev 5614) +++ dcm4chee/dcm4chee-arc/trunk/dcm4jboss-wado/src/java/org/dcm4chex/wado/web/WADORequestObjectImpl.java 2007-12-18 12:07:27 UTC (rev 5615) @@ -42,7 +42,6 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.Map; import java.util.StringTokenizer; import javax.servlet.http.HttpServletRequest; @@ -111,7 +110,7 @@ private String imageQuality; - private List contentTypes = null; + private List contentTypes; /** * Creates a WADORequestObjectImpl instance configured with http request. @@ -332,7 +331,7 @@ return OK; } - /** +/** * Checks that the region string's value is valid. Throws * <code>IllegalArgumentException</code> if it isn't. * @@ -447,15 +446,26 @@ public String toString() { StringBuffer sb = new StringBuffer(); sb.append("WADO request:"); - Map mapParam = this.getRequestParams(); - Iterator iter = mapParam.keySet().iterator(); + Iterator iter = paramMap.keySet().iterator(); Object key; while (iter.hasNext()) { key = iter.next(); sb.append("&").append(key).append("=").append( - ((String[]) mapParam.get(key))[0]); + ((String[]) paramMap.get(key))[0]); } return sb.toString(); } + public boolean isExcludePrivate() { + return "no".equalsIgnoreCase(request.getParameter("privateTags")); + } + + public String getSimpleFrameList() { + return request.getParameter("simpleFrameList"); + } + + public String getCalculatedFrameList() { + return request.getParameter("calculatedFrameList"); + } + } Modified: dcm4chee/dcm4chee-arc/trunk/dcm4jboss-wado/src/java/org/dcm4chex/wado/web/WADOServlet.java =================================================================== --- dcm4chee/dcm4chee-arc/trunk/dcm4jboss-wado/src/java/org/dcm4chex/wado/web/WADOServlet.java 2007-12-17 12:57:24 UTC (rev 5614) +++ dcm4chee/dcm4chee-arc/trunk/dcm4jboss-wado/src/java/org/dcm4chex/wado/web/WADOServlet.java 2007-12-18 12:07:27 UTC (rev 5615) @@ -46,6 +46,7 @@ import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; +import org.dcm4chex.archive.util.RequestedFrameNumbersOutOfRangeException; import org.dcm4chex.wado.common.BasicRequestObject; import org.dcm4chex.wado.common.WADORequestObject; import org.dcm4chex.wado.common.WADOResponseObject; @@ -171,6 +172,9 @@ log.debug("respObject execute"); respObject.execute( response.getOutputStream() ); response.getOutputStream().close(); + } catch ( RequestedFrameNumbersOutOfRangeException e ) { + sendError(response, HttpServletResponse.SC_BAD_REQUEST, + "Error: Requested Frame Numbers Out of Range"); } catch ( Exception e ) { log.error("Exception while writing WADO response to client! reason:"+e.getMessage(), e ); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |