1 /*
   2  * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24  /*
  25  * @test
  26  * @bug     8164931
  27  * @summary Test verifies that if we call ImageWriter.abort() in
  28  *          IIOWriteProgressListener.imageStarted() or
  29  *          IIOWriteProgressListener.imageProgress() are we
  30  *          calling IIOWriteProgressListener.readAborted() for all readers.
  31  * @run     main WriteAbortTest
  32  */
  33 import java.awt.image.BufferedImage;
  34 import java.io.File;
  35 import javax.imageio.ImageIO;
  36 import javax.imageio.stream.ImageInputStream;
  37 import java.awt.Color;
  38 import java.awt.Graphics2D;
  39 import java.nio.file.Files;
  40 import javax.imageio.ImageWriter;
  41 import javax.imageio.event.IIOWriteProgressListener;
  42 import javax.imageio.stream.ImageOutputStream;
  43 
  44 public class WriteAbortTest implements IIOWriteProgressListener {
  45 
  46     ImageWriter writer = null;
  47     ImageOutputStream ios = null;
  48     BufferedImage bimg = null;
  49     File file;
  50     boolean startAbort = false;
  51     boolean startAborted = false;
  52     boolean progressAbort = false;
  53     boolean progressAborted = false;
  54     Color srccolor = Color.red;
  55     int width = 100;
  56     int heght = 100;
  57 
  58     public WriteAbortTest(String format) throws Exception {
  59         try {
  60             System.out.println("Test for format " + format);
  61             bimg = new BufferedImage(width, heght,
  62                     BufferedImage.TYPE_INT_RGB);
  63 
  64             Graphics2D g = bimg.createGraphics();
  65             g.setColor(srccolor);
  66             g.fillRect(0, 0, width, heght);
  67             g.dispose();
  68 
  69             file = File.createTempFile("src_", "." + format, new File("."));
  70             ImageInputStream ios = ImageIO.createImageOutputStream(file);
  71 
  72             ImageWriter writer =
  73                     ImageIO.getImageWritersByFormatName(format).next();
  74 
  75             writer.setOutput(ios);
  76             writer.addIIOWriteProgressListener(this);
  77 
  78             // Abort writing in IIOWriteProgressListener.imageStarted().
  79             startAbort = true;
  80             writer.write(bimg);
  81             startAbort = false;
  82 
  83             // Abort writing in IIOWriteProgressListener.imageProgress().
  84             progressAbort = true;
  85             writer.write(bimg);
  86             progressAbort = false;
  87 
  88             ios.close();
  89             /*
  90              * All abort requests from imageStarted,imageProgress
  91              * from IIOWriteProgressListener should be reached
  92              * otherwise throw RuntimeException.
  93              */
  94             if (!(startAborted
  95                     && progressAborted)) {
  96                 throw new RuntimeException("All IIOWriteProgressListener abort"
  97                         + " requests are not processed for format "
  98                         + format);
  99             }
 100         } finally {
 101             Files.delete(file.toPath());
 102         }
 103     }
 104 
 105     /*
 106      * Abstract methods that we need to implement from
 107      * IIOWriteProgressListener, and relevant for this test case.
 108      */
 109     @Override
 110     public void imageStarted(ImageWriter source, int imageIndex) {
 111         System.out.println("imageStarted called");
 112         if (startAbort) {
 113             source.abort();
 114         }
 115     }
 116 
 117     @Override
 118     public void imageProgress(ImageWriter source, float percentageDone) {
 119         System.out.println("imageProgress called");
 120         if (progressAbort) {
 121             source.abort();
 122         }
 123     }
 124 
 125     @Override
 126     public void writeAborted(ImageWriter source) {
 127         System.out.println("writeAborted called");
 128         // Verify IIOWriteProgressListener.imageStarted() abort request.
 129         if (startAbort) {
 130             System.out.println("imageStarted aborted ");
 131             startAborted = true;
 132         }
 133 
 134         // Verify IIOWriteProgressListener.imageProgress() abort request.
 135         if (progressAbort) {
 136             System.out.println("imageProgress aborted ");
 137             progressAborted = true;
 138         }
 139     }
 140 
 141     public static void main(String args[]) throws Exception {
 142         final String[] formats = {"bmp", "png", "gif", "jpg", "tif"};
 143         for (String format : formats) {
 144             new WriteAbortTest(format);
 145         }
 146     }
 147 
 148     /*
 149      * Remaining abstract methods that we need to implement from
 150      * IIOWriteProgressListener, but not relevant for this test case.
 151      */
 152     @Override
 153     public void imageComplete(ImageWriter source) {
 154     }
 155 
 156     @Override
 157     public void thumbnailStarted(ImageWriter source, int imageIndex,
 158                                  int thumbnailIndex) {
 159     }
 160 
 161     @Override
 162     public void thumbnailProgress(ImageWriter source, float percentageDone) {
 163     }
 164 
 165     @Override
 166     public void thumbnailComplete(ImageWriter source) {
 167     }
 168 }
 169