blob: 57a6a06471b5c95a90754e62a55519754194826c [file] [log] [blame]
/*
* Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Oracle nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package j2dbench.tests.iio;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.imageio.spi.IIORegistry;
import javax.imageio.spi.ImageInputStreamSpi;
import javax.imageio.stream.FileCacheImageInputStream;
import javax.imageio.stream.FileImageInputStream;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.MemoryCacheImageInputStream;
import j2dbench.Group;
import j2dbench.Option;
import j2dbench.Result;
import j2dbench.TestEnvironment;
abstract class InputTests extends IIOTests {
protected static final int INPUT_FILE = 1;
protected static final int INPUT_URL = 2;
protected static final int INPUT_ARRAY = 3;
protected static final int INPUT_FILECHANNEL = 4;
protected static ImageInputStreamSpi fileChannelIISSpi;
static {
if (hasImageIO) {
ImageIO.scanForPlugins();
IIORegistry registry = IIORegistry.getDefaultInstance();
java.util.Iterator spis =
registry.getServiceProviders(ImageInputStreamSpi.class, false);
while (spis.hasNext()) {
ImageInputStreamSpi spi = (ImageInputStreamSpi)spis.next();
String klass = spi.getClass().getName();
if (klass.endsWith("ChannelImageInputStreamSpi")) {
fileChannelIISSpi = spi;
break;
}
}
}
}
protected static Group inputRoot;
protected static Group inputOptRoot;
protected static Group generalOptRoot;
protected static Group.EnableSet generalSourceRoot;
protected static Option sourceFileOpt;
protected static Option sourceUrlOpt;
protected static Option sourceByteArrayOpt;
protected static Group imageioGeneralOptRoot;
protected static Option sourceFileChannelOpt;
protected static Option useCacheTog;
public static void init() {
inputRoot = new Group(iioRoot, "input", "Input Benchmarks");
inputRoot.setTabbed();
// Options
inputOptRoot = new Group(inputRoot, "opts", "Options");
// General Options
generalOptRoot = new Group(inputOptRoot,
"general", "General Options");
generalSourceRoot = new Group.EnableSet(generalOptRoot,
"source", "Sources");
sourceFileOpt = new InputType("file", "File", INPUT_FILE);
sourceUrlOpt = new InputType("url", "URL", INPUT_URL);
sourceByteArrayOpt = new InputType("byteArray", "byte[]", INPUT_ARRAY);
if (hasImageIO) {
// Image I/O Options
imageioGeneralOptRoot = new Group(inputOptRoot,
"imageio", "Image I/O Options");
if (fileChannelIISSpi != null) {
sourceFileChannelOpt =
new InputType("fileChannel", "FileChannel",
INPUT_FILECHANNEL);
}
useCacheTog = new Option.Toggle(imageioGeneralOptRoot, "useCache",
"ImageIO.setUseCache()",
Option.Toggle.Off);
}
InputImageTests.init();
if (hasImageIO) {
InputStreamTests.init();
}
}
protected InputTests(Group parent, String nodeName, String description) {
super(parent, nodeName, description);
}
protected static class InputType extends Option.Enable {
private int type;
public InputType(String nodeName, String description, int type) {
super(generalSourceRoot, nodeName, description, false);
this.type = type;
}
public int getType() {
return type;
}
public String getAbbreviatedModifierDescription(Object value) {
return getModifierValueName(value);
}
public String getModifierValueName(Object val) {
return getNodeName();
}
}
protected static abstract class Context {
int size;
Object input;
int inputType;
InputStream origStream;
Context(TestEnvironment env, Result result) {
size = env.getIntValue(sizeList);
if (hasImageIO) {
if (env.getModifier(useCacheTog) != null) {
ImageIO.setUseCache(env.isEnabled(useCacheTog));
}
}
InputType t = (InputType)env.getModifier(generalSourceRoot);
inputType = t.getType();
}
void initInput() {
if ((inputType == INPUT_FILE) ||
(inputType == INPUT_URL) ||
(inputType == INPUT_FILECHANNEL))
{
try {
// REMIND: this approach will fail for GIF on pre-1.6 VM's
// (since earlier releases do not include a
// GIFImageWriter in the core JDK)
File inputfile = File.createTempFile("iio", ".tmp");
inputfile.deleteOnExit();
initContents(inputfile);
if (inputType == INPUT_FILE) {
input = inputfile;
} else if (inputType == INPUT_FILECHANNEL) {
input = inputfile;
} else { // inputType == INPUT_URL
try {
input = inputfile.toURI().toURL();
} catch (Exception e) {
System.err.println("error creating URL");
}
}
} catch (IOException e) {
System.err.println("error creating image file");
e.printStackTrace();
}
} else {
ByteArrayOutputStream out;
try {
out = new ByteArrayOutputStream();
initContents(out);
} catch (IOException e) {
System.err.println("error creating image array");
e.printStackTrace();
return;
}
input = out.toByteArray();
}
}
abstract void initContents(File f) throws IOException;
abstract void initContents(OutputStream out) throws IOException;
ImageInputStream createImageInputStream() throws IOException {
ImageInputStream iis;
BufferedInputStream bis;
switch (inputType) {
case INPUT_FILE:
iis = new FileImageInputStream((File)input);
break;
case INPUT_URL:
origStream = ((URL)input).openStream();
bis = new BufferedInputStream(origStream);
if (ImageIO.getUseCache()) {
iis = new FileCacheImageInputStream(bis, null);
} else {
iis = new MemoryCacheImageInputStream(bis);
}
break;
case INPUT_ARRAY:
origStream = new ByteArrayInputStream((byte[])input);
bis = new BufferedInputStream(origStream);
if (ImageIO.getUseCache()) {
iis = new FileCacheImageInputStream(bis, null);
} else {
iis = new MemoryCacheImageInputStream(bis);
}
break;
case INPUT_FILECHANNEL:
FileInputStream fis = new FileInputStream((File)input);
origStream = fis;
java.nio.channels.FileChannel fc = fis.getChannel();
iis = fileChannelIISSpi.createInputStreamInstance(fc, false,
null);
break;
default:
iis = null;
break;
}
return iis;
}
void closeOriginalStream() throws IOException {
if (origStream != null) {
origStream.close();
origStream = null;
}
}
void cleanup(TestEnvironment env) {
}
}
}