Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
public class RemoteImage extends Image {
  /**  */
  final IModel<String> urlModel;

  /**
   * @param id
   * @param urlModel 
   */
  public RemoteImage(String id, IModel<String> urlModel) {
    super(id);
    this.urlModel = urlModel;
  }

  /**
   * @see org.apache.wicket.markup.html.image.Image#getImageResource()
   */
  @Override
  protected Resource getImageResource() {
    return new DynamicImageResource() {
      @Override
      protected byte[] getImageData() {
        try {
          URL url = new URL(urlModel.getObject());
          HttpURLConnection uc = (HttpURLConnection) url.openConnection();
          try {
            final int size;
    
            InputStream inputStream;
            {
              int tmp = uc.getContentLength();
          
              if (tmp < 0) {
                inputStream = new BufferedInputStream(uc.getInputStream());
                inputStream.mark(Integer.MAX_VALUE);
                while (0 <= inputStream.read()) {
                  // read
                }
                inputStream.reset();
                size = inputStream.available();
              } else {
                size = tmp;
                inputStream = uc.getInputStream();
              }
            }
        
            int filled = 0;
            byte[] imageData = new byte[size];
            do {
              byte[] tmpData = new byte[size-filled];
              int read = uc.getInputStream()inputStream.read(tmpData);
              System.arraycopy(tmpData, 0, imageData, filled, read);
              filled += read;
            } while (filled < size);
            return imageData;
          } finally {
            uc.getInputStream().close();
            uc.disconnect();
          }
        } catch (IOException e) {
          Utils.errorLog(RemoteImage.class, "Failed to load remote image", e);
        } 

        return new byte[] {};
      }

      @Override
      protected void setHeaders(WebResponse response) {
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
      }
    };
  }
}