Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 369567

Summary: Error passing an object from an extension function to a JavaScript Script
Product: z_Archived Reporter: Alessio Pollero <alessio.pollero>
Component: BIRTAssignee: Birt-ReportEngine-inbox <Birt-ReportEngine-inbox>
Status: NEW --- QA Contact:
Severity: major    
Priority: P3 CC: alessio.pollero
Version: unspecified   
Target Milestone: ---   
Hardware: PC   
OS: Windows 7   
Whiteboard:

Description Alessio Pollero CLA 2012-01-24 13:29:20 EST
Build Identifier: Version: 3.7.1 Build id: M20110909-1335

I have created a birt extension functions plugin like the following : http://code.google.com/a/eclipselabs.org/p/birt-functions-lib/, inside the library i have implemented a function that get a company image from the file system with this code : 


private class getCompanyLogo implements IScriptFunctionExecutor {

		@Override
		public Object execute(Object[] arguments, IScriptFunctionContext context)
				throws BirtException {
			// Argument : ReportContext
			if(arguments.length > 0) {
				Object rcArgument = arguments[0];
				if ( !(rcArgument instanceof IReportContext) ) 
			        throw new BirtException("Report Context object is not instance of IReportContext in " + this.getClass().getSimpleName() );
			        
				IReportContext reportContext = (IReportContext) rcArgument;
				//Get Report Name
				java.io.File report = new java.io.File(reportContext.getReportRunnable().getReportName());    
				java.net.URL uLogo = reportContext.getResource("CompanyLogo.png");
				java.io.File file = null;
				//If exist get the Company image from resource
				if(uLogo != null)
					file = new java.io.File(uLogo.getFile());
				
				//Try to get CompanyLogo image from the current folder
				java.io.File f = new java.io.File("CompanyLogo.png");
				if(f.exists())
					file = f;
				
				//Try to get the CompanyLogo from report related file
				String path = report.getPath();
				String[] name = report.getName().split("\\.");
				f = new java.io.File( ((path != null) ? path : "") + ((name.length > 0) ? name[0] : "") );
				if(f.exists())
					file = f;
				
				if(file != null && file.exists()) {
					try {
						java.awt.image.BufferedImage img = javax.imageio.ImageIO.read(file);
						return img;
					} catch (java.io.IOException e) {
						throw new BirtException(String.format("Error loading Company Logo image : %s!",e.getMessage()));
					}
				}
			} else 
				throw new BirtException("No arguments for function getCompanyLogo(), you must pass ReportContext !");
			
			return null;
		}


When i call this function from a report Script(OnCreate of a Dynamic image):

importPackage(Packages.java.io);
importPackage(Packages.java.lang);
importPackage(Packages.java.net);
importPackage(Packages.javax.imageio);


var img = MyFunctions.getCompanyLogo(reportContext);
var bas = new ByteArrayOutputStream();
ImageIO.write(img, "png", bas);
this.data = bas.toByteArray();


i get the following error and i don't know why ... Looking in debug mode of the report the object BufferedImage is correclty passed by the function..

StackTrace of the error : 


Description	Resource	Path	Location	Type
org.eclipse.birt.report.engine.api.EngineException: There are errors evaluating script "importPackage(Packages.java.io);
importPackage(Packages.java.lang);
importPackage(Packages.java.net);
importPackage(Packages.javax.imageio);


var img = UakariFunctions.getCompanyLogo(reportContext);
var bas = new ByteArrayOutputStream();
ImageIO.write(img, "png", bas);
this.data = bas.toByteArray();":
TypeError: Cannot find default value for object. (/report/page-setup/simple-master-page[@id="2"]/page-header/grid[@id="642"]/row[@id="644"]/cell[@id="671"]/image[@id="674"]/method[@name="onRender"]#7) (Element ID:674)
	at org.eclipse.birt.report.engine.script.internal.ScriptExecutor.addException(ScriptExecutor.java:244)
	at org.eclipse.birt.report.engine.script.internal.ImageScriptExecutor.handleOnRender(ImageScriptExecutor.java:99)
	at org.eclipse.birt.report.engine.script.internal.OnRenderScriptVisitor.visitImageItem(OnRenderScriptVisitor.java:125)
	at org.eclipse.birt.report.engine.ir.ImageItemDesign.accept(ImageItemDesign.java:94)
	at org.eclipse.birt.report.engine.script.internal.OnRenderScriptVisitor.onRender(OnRenderScriptVisitor.java:73)
	at org.eclipse.birt.report.engine.presentation.LocalizedContentVisitor.handleOnRender(LocalizedContentVisitor.java:1228)
	at org.eclipse.birt.report.engine.presentation.LocalizedContentVisitor.localizeImage(LocalizedContentVisitor.java:694)
	at org.eclipse.birt.report.engine.presentation.LocalizedContentVisitor.localize(LocalizedContentVisitor.java:165)
	at org.eclipse.birt.report.engine.internal.executor.l18n.LocalizedReportItemExecutor.execute(LocalizedReportItemExecutor.java:37)
	at org.eclipse.birt.report.engine.executor.ReportExecutorUtil.executeAll(ReportExecutorUtil.java:87)
	at org.eclipse.birt.report.engine.executor.ReportExecutorUtil.executeAll(ReportExecutorUtil.java:92)
	at org.eclipse.birt.report.engine.executor.ReportExecutorUtil.executeAll(ReportExecutorUtil.java:92)
	at org.eclipse.birt.report.engine.executor.ReportExecutorUtil.executeAll(ReportExecutorUtil.java:92)
	at org.eclipse.birt.report.engine.executor.ReportExecutorUtil.executeAll(ReportExecutorUtil.java:92)
	at org.eclipse.birt.report.engine.executor.ReportExecutorUtil.executeMasterPage(ReportExecutorUtil.java:71)
	at org.eclipse.birt.report.engine.layout.html.HTMLPageLM.start(HTMLPageLM.java:147)
	at org.eclipse.birt.report.engine.layout.html.HTMLPageLM.layout(HTMLPageLM.java:91)
	at org.eclipse.birt.report.engine.layout.html.HTMLReportLayoutEngine.layout(HTMLReportLayoutEngine.java:100)
	at org.eclipse.birt.report.engine.api.impl.RunAndRenderTask.doRun(RunAndRenderTask.java:180)
	at org.eclipse.birt.report.engine.api.impl.RunAndRenderTask.run(RunAndRenderTask.java:77)
	at org.eclipse.birt.report.service.ReportEngineService.runAndRenderReport(ReportEngineService.java:929)
	at org.eclipse.birt.report.service.BirtViewerReportService.runAndRenderReport(BirtViewerReportService.java:973)
	at org.eclipse.birt.report.service.actionhandler.BirtGetPageAllActionHandler.__execute(BirtGetPageAllActionHandler.java:131)
	at org.eclipse.birt.report.service.actionhandler.AbstractBaseActionHandler.execute(AbstractBaseActionHandler.java:90)
	at org.eclipse.birt.report.soapengine.processor.AbstractBaseDocumentProcessor.__executeAction(AbstractBaseDocumentProcessor.java:47)
	at org.eclipse.birt.report.soapengine.processor.AbstractBaseComponentProcessor.executeAction(AbstractBaseComponentProcessor.java:143)
	at org.eclipse.birt.report.soapengine.processor.BirtDocumentProcessor.handleGetPageAll(BirtDocumentProcessor.java:183)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.eclipse.birt.report.soapengine.processor.AbstractBaseComponentProcessor.process(AbstractBaseComponentProcessor.java:112)
	at org.eclipse.birt.report.soapengine.endpoint.BirtSoapBindingImpl.getUpdatedObjects(BirtSoapBindingImpl.java:66)
	at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.axis.providers.java.RPCProvider.invokeMethod(RPCProvider.java:397)
	at org.apache.axis.providers.java.RPCProvider.processMessage(RPCProvider.java:186)
	at org.apache.axis.providers.java.JavaProvider.invoke(JavaProvider.java:323)
	at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
	at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
	at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
	at org.apache.axis.handlers.soap.SOAPService.invoke(SOAPService.java:454)
	at org.apache.axis.server.AxisServer.invoke(AxisServer.java:281)
	at org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:699)
	at org.eclipse.birt.report.servlet.BirtSoapMessageDispatcherServlet.doPost(BirtSoapMessageDispatcherServlet.java:265)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
	at org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:327)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
	at org.eclipse.birt.report.servlet.BirtSoapMessageDispatcherServlet.service(BirtSoapMessageDispatcherServlet.java:122)
	at org.eclipse.equinox.http.registry.internal.ServletManager$ServletWrapper.service(ServletManager.java:180)
	at org.eclipse.equinox.http.servlet.internal.ServletRegistration.service(ServletRegistration.java:61)
	at org.eclipse.equinox.http.servlet.internal.ProxyServlet.processAlias(ProxyServlet.java:126)
	at org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:60)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
	at org.eclipse.equinox.http.jetty.internal.HttpServerManager$InternalHttpServiceServlet.service(HttpServerManager.java:317)
	at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390)
	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
	at org.mortbay.jetty.Server.handle(Server.java:326)
	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
	at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:939)
	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
	at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: org.eclipse.birt.core.exception.CoreException: There are errors evaluating script "importPackage(Packages.java.io);
importPackage(Packages.java.lang);
importPackage(Packages.java.net);
importPackage(Packages.javax.imageio);


var img = MyFunctions.getCompanyLogo(reportContext);
var bas = new ByteArrayOutputStream();
ImageIO.write(img, "png", bas);
this.data = bas.toByteArray();":
TypeError: Cannot find default value for object. (/report/page-setup/simple-master-page[@id="2"]/page-header/grid[@id="642"]/row[@id="644"]/cell[@id="671"]/image[@id="674"]/method[@name="onRender"]#7)
	at org.eclipse.birt.report.engine.javascript.JavascriptEngine.evaluate(JavascriptEngine.java:295)
	at org.eclipse.birt.core.script.ScriptContext.evaluate(ScriptContext.java:154)
	at org.eclipse.birt.report.engine.executor.ExecutionContext.evaluate(ExecutionContext.java:780)
	at org.eclipse.birt.report.engine.executor.ExecutionContext.evaluate(ExecutionContext.java:709)
	at org.eclipse.birt.report.engine.script.internal.ScriptExecutor.handleScriptInternal(ScriptExecutor.java:117)
	at org.eclipse.birt.report.engine.script.internal.ScriptExecutor.handleScript(ScriptExecutor.java:104)
	at org.eclipse.birt.report.engine.script.internal.ImageScriptExecutor.handleOnRender(ImageScriptExecutor.java:90)
	... 67 more
Caused by: org.mozilla.javascript.EcmaError: TypeError: Cannot find default value for object. (/report/page-setup/simple-master-page[@id="2"]/page-header/grid[@id="642"]/row[@id="644"]/cell[@id="671"]/image[@id="674"]/method[@name="onRender"]#7)
	at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3654)
	at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3632)
	at org.mozilla.javascript.ScriptRuntime.typeError(ScriptRuntime.java:3660)
	at org.mozilla.javascript.ScriptRuntime.typeError1(ScriptRuntime.java:3672)
	at org.mozilla.javascript.ScriptableObject.getDefaultValue(ScriptableObject.java:781)
	at org.mozilla.javascript.ScriptableObject.getDefaultValue(ScriptableObject.java:700)
	at org.mozilla.javascript.ScriptRuntime.toString(ScriptRuntime.java:724)
	at org.mozilla.javascript.ScriptRuntime.notFunctionError(ScriptRuntime.java:3741)
	at org.mozilla.javascript.ScriptRuntime.getPropFunctionAndThisHelper(ScriptRuntime.java:2247)
	at org.mozilla.javascript.ScriptRuntime.getPropFunctionAndThis(ScriptRuntime.java:2214)
	at org.mozilla.javascript.gen.c604._c0(/report/page-setup/simple-master-page[@id="2"]/page-header/grid[@id="642"]/row[@id="644"]/cell[@id="671"]/image[@id="674"]/method[@name="onRender"]:7)
	at org.mozilla.javascript.gen.c604.call(/report/page-setup/simple-master-page[@id="2"]/page-header/grid[@id="642"]/row[@id="644"]/cell[@id="671"]/image[@id="674"]/method[@name="onRender"])
	at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:398)
	at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3065)
	at org.mozilla.javascript.gen.c604.call(/report/page-setup/simple-master-page[@id="2"]/page-header/grid[@id="642"]/row[@id="644"]/cell[@id="671"]/image[@id="674"]/method[@name="onRender"])
	at org.mozilla.javascript.gen.c604.exec(/report/page-setup/simple-master-page[@id="2"]/page-header/grid[@id="642"]/row[@id="644"]/cell[@id="671"]/image[@id="674"]/method[@name="onRender"])
	at org.eclipse.birt.report.engine.javascript.JavascriptEngine.evaluate(JavascriptEngine.java:290)
	

Reproducible: Always