Bug 1599851

Summary: [GSS](6.4.z) URL.getContent() returns VirtualFile instead of ImageProducer
Product: [JBoss] JBoss Enterprise Application Platform 6 Reporter: Brad Maxwell <bmaxwell>
Component: VFSAssignee: jboss-set
Status: CLOSED CURRENTRELEASE QA Contact: Peter Mackay <pmackay>
Severity: unspecified Docs Contact:
Priority: unspecified    
Version: 6.4.20CC: david.lloyd, dcihak, pmackay, rstancel
Target Milestone: CR1   
Target Release: EAP 6.4.21   
Hardware: Unspecified   
OS: Unspecified   
Whiteboard:
Fixed In Version: Doc Type: If docs needed, set a value
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2019-08-19 12:44:55 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Bug Depends On:    
Bug Blocks: 1567790, 1602959, 1606334    
Attachments:
Description Flags
JBAS-9399.war none

Description Brad Maxwell 2018-07-10 18:17:14 UTC
Here are an example class and a jsp to reproduce the problem:
{code:title=LoadImageTest.java|borderStyle=solid}
package example.loadimage.fail;
import java.awt.Image;
import java.beans.SimpleBeanInfo;
public class LoadImageTest extends SimpleBeanInfo {
	public Image image;

	public LoadImageTest(){
		image = loadImage2("icon.png");
	}
	public static void main(String[] args) {
		LoadImageTest test = new LoadImageTest();
		System.out.println("Is image null? " + (test.image == null));
	}
	// Note: This method was pulled out of the JDK src file for SimpleBeanInfo.java.
	// This allows for easier debugging, you can actually see the local variables.
	public java.awt.Image loadImage2(final String resourceName) {
		try {
			final Class c = getClass();
			java.awt.image.ImageProducer ip = (java.awt.image.ImageProducer)
			java.security.AccessController.doPrivileged(
			new java.security.PrivilegedAction() {
				public Object run() {
					java.net.URL url;
					if ((url = c.getResource(resourceName)) == null) {
						return null;
					} else {
						try {
							return url.getContent();
						} catch (java.io.IOException ioe) {
							return null;
						}
					}
				}
			});
			if (ip == null)
			return null;
			java.awt.Toolkit tk = java.awt.Toolkit.getDefaultToolkit();
			return tk.createImage(ip);
		} catch (Exception ex) {
			// will end up here because the PrivilegedAction returns something that cannot be cast
			// to an ImageProducer when this is run in JBoss AS 6.0.0.FINAL. In JBoss the returned
			// object will be a VirtualFile instead of an ImageProducer.
			return null;
		}
	}
}
{code} 
{code:html}
<%@page import=" example.loadimage.fail.LoadImageTest"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
out.print("Testing<br />");
LoadImageTest test = new LoadImageTest();
out.print("Is test.image null? " + (test.image == null) + "<br />");
%>
</body>
</html>
{code}

Comment 1 Brad Maxwell 2018-07-10 18:17:42 UTC
Workaround:

Read the content directly such as with ImageIO.read(url.openStream().getSource() 

{code}
import java.awt.Image;
import javax.imageio.ImageIO;
import java.io.InputStream;
import java.beans.SimpleBeanInfo;

            URL url = Thread.currentThread().getContextClassLoader().getResource(resourceName);
            InputStream is = null;
            try {
               is = url.openStream();
               return ImageIO.read(is).getSource();
            } catch(Exception e) {
               e.printStackTrace();
               return null;
            } finally {
               try { is.close(); } catch(Exception e) { } 
            }
{code}

Comment 2 Brad Maxwell 2018-07-10 18:19:49 UTC
Created attachment 1457891 [details]
JBAS-9399.war