Advertisement
Guest User

Untitled

a guest
Mar 29th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.78 KB | None | 0 0
  1. /*
  2. * Copyright (c) 2017 United States Government as represented by the Administrator of the
  3. * National Aeronautics and Space Administration. All Rights Reserved.
  4. */
  5.  
  6. package gov.nasa.worldwind.globe;
  7.  
  8. import java.io.BufferedInputStream;
  9. import java.io.IOException;
  10. import java.io.InputStream;
  11. import java.net.URL;
  12. import java.net.URLConnection;
  13. import java.nio.ByteBuffer;
  14. import java.nio.ByteOrder;
  15. import java.nio.ShortBuffer;
  16.  
  17. import gov.nasa.worldwind.formats.tiff.Subfile;
  18. import gov.nasa.worldwind.formats.tiff.Tiff;
  19. import gov.nasa.worldwind.render.ImageSource;
  20. import gov.nasa.worldwind.util.Logger;
  21. import gov.nasa.worldwind.util.Retriever;
  22. import gov.nasa.worldwind.util.SynchronizedPool;
  23. import gov.nasa.worldwind.util.WWUtil;
  24.  
  25. public class ElevationRetriever extends Retriever<ImageSource, Void, ShortBuffer> {
  26.  
  27. protected SynchronizedPool<byte[]> pageBuffers = new SynchronizedPool<>();
  28.  
  29. protected SynchronizedPool<ByteBuffer> tiffData = new SynchronizedPool<>();
  30.  
  31. protected int defaultPageBufferSize = 1024 * 16;
  32.  
  33. protected int defaultTiffDataSize = 132000;
  34.  
  35. public ElevationRetriever(int maxSimultaneousRetrievals) {
  36. super(maxSimultaneousRetrievals);
  37. for (int i = 0; i < maxSimultaneousRetrievals; i++) {
  38. pageBuffers.release(new byte[this.defaultPageBufferSize]);
  39. tiffData.release(ByteBuffer.allocate(this.defaultTiffDataSize));
  40. }
  41. }
  42.  
  43. @Override
  44. protected void retrieveAsync(ImageSource key, Void unused, Callback<ImageSource, Void, ShortBuffer> callback) {
  45. try {
  46. ShortBuffer buffer = this.decodeCoverage(key);
  47.  
  48. if (buffer != null) {
  49. callback.retrievalSucceeded(this, key, unused, buffer);
  50. } else {
  51. callback.retrievalFailed(this, key, null); // failed but no exception
  52. }
  53. } catch (Throwable logged) {
  54. callback.retrievalFailed(this, key, logged); // failed with exception
  55. }
  56. }
  57.  
  58. protected ShortBuffer decodeCoverage(ImageSource imageSource) throws IOException {
  59. if (imageSource.isUrl()) {
  60. return this.decodeUrl(imageSource.asUrl());
  61. }
  62.  
  63. return this.decodeUnrecognized(imageSource);
  64. }
  65.  
  66. protected ShortBuffer decodeUrl(String urlString) throws IOException {
  67. // TODO establish a file caching service for remote resources
  68. // TODO retry absent resources, they are currently handled but suppressed entirely after the first failure
  69. // TODO configurable connect and read timeouts
  70.  
  71. InputStream stream = null;
  72. try {
  73. URLConnection conn = new URL(urlString).openConnection();
  74. conn.setConnectTimeout(3000);
  75. conn.setReadTimeout(30000);
  76.  
  77. stream = new BufferedInputStream(conn.getInputStream());
  78. String contentType = conn.getContentType();
  79. if (contentType.equalsIgnoreCase("application/bil16")) {
  80. return this.readBil16Data(stream);
  81. } else if (contentType.equalsIgnoreCase("image/tiff")) {
  82. return this.readTiffData(stream);
  83. } else {
  84. // TODO error message
  85. return null;
  86. }
  87. } finally {
  88. WWUtil.closeSilently(stream);
  89. }
  90. }
  91.  
  92. protected ShortBuffer decodeUnrecognized(ImageSource imageSource) {
  93. Logger.log(Logger.WARN, "Unrecognized image source \'" + imageSource + "\'");
  94. return null;
  95. }
  96.  
  97. protected ShortBuffer readTiffData(InputStream stream) throws IOException {
  98. byte[] page = this.pageBuffers.acquire();
  99. if (page == null) {
  100. page = new byte[this.defaultPageBufferSize];
  101. }
  102. ByteBuffer tiffBuffer = this.tiffData.acquire();
  103. if (tiffBuffer == null) {
  104. tiffBuffer = ByteBuffer.allocate(this.defaultTiffDataSize);
  105. }
  106. tiffBuffer.clear();
  107. ByteBuffer buffer = this.bufferStream(stream, tiffBuffer, page);
  108. Tiff tiff = new Tiff(buffer);
  109. Subfile subfile = tiff.getSubfiles().get(0);
  110. // check that the format of the subfile matches our supported data types
  111. if (subfile.getSampleFormat()[0] == 2 &&
  112. subfile.getBitsPerSample()[0] == 16 &&
  113. subfile.getSamplesPerPixel() == 1) {
  114. int dataSize = subfile.getDataSize();
  115. ByteBuffer result = subfile.getData(ByteBuffer.allocate(dataSize));
  116. result.clear();
  117. this.pageBuffers.release(page);
  118. this.tiffData.release(buffer);
  119. return result.asShortBuffer();
  120. } else {
  121. // TODO error message
  122. return null;
  123. }
  124. }
  125.  
  126. protected ShortBuffer readBil16Data(InputStream stream) throws IOException {
  127. byte[] page = this.pageBuffers.acquire();
  128. if (page == null) {
  129. page = new byte[this.defaultPageBufferSize];
  130. }
  131. ShortBuffer result = this.bufferStream(stream, ByteBuffer.allocate(page.length), page).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer();
  132. this.pageBuffers.release(page);
  133. return result;
  134. }
  135.  
  136. protected ByteBuffer bufferStream(InputStream stream, ByteBuffer buffer, byte[] page) throws IOException {
  137. if (stream == null) {
  138. // TODO error message
  139. }
  140.  
  141. if (buffer == null) {
  142. // TODO error message
  143. }
  144.  
  145. if (page == null) {
  146. // TODO error message
  147. }
  148.  
  149. int readCount;
  150. while ((readCount = stream.read(page, 0, page.length)) != -1) {
  151. if (readCount > buffer.remaining()) {
  152. ByteBuffer newBuffer = ByteBuffer.allocate(buffer.capacity() + page.length);
  153. newBuffer.put((ByteBuffer) buffer.flip());
  154. buffer = newBuffer;
  155. }
  156.  
  157. buffer.put(page, 0, readCount);
  158. }
  159.  
  160. buffer.flip();
  161.  
  162. return buffer;
  163. }
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement