Download af filer

14523719_sHvis du har genereret en fil, f.eks. en Excel eller PDF fil og ønsker at brugeren kan downloade den fra en XPages, så kan det nemt gøres med denne lille Download class.

Her et simplificeret eksempel, først en lille java bean der kan læse en fil fra disken og downloade den hos brugeren:

import org.apache.commons.io.FileUtils;
import dk.xpages.Download;

class MyBean implements Serializable {
	public void download() {
		byte[] myFile = FileUtils.readFileToByteArray("c:\temp\file.txt");
		Download download = new Download();
		try {
			download.save(getByteArray(), getFilename());
		}
	}
}

På en XPages kan download linket laves således:

<xp:link escape="true" text="Download">
	<xp:eventHandler event="onclick" submit="true" refreshMode="complete">
		<xp:this.action><![CDATA[#{javascript:myBean.download();}]]></xp:this.action>
	</xp:eventHandler>
</xp:link>

Links

Java.policy

21454543_sJava.policy filen på Domino serveren afgøre hvilke rettigheder dine java programmer kører med. Default settings er desværre meget restriktive – og du kan derfor ikke:

  • Libraries som Log4J, JUnit eller Java Logging
  • Lave kode der bruger Reflection til at f.eks. at læse private fields eller bruge dynamic classloading

Der findes et par løsninger:

  • Lav din kode i jar filer og gem det i Ext folderen på serveren. Her får de automatisk full access. Dette er dog for omstændigt at gøre for din egen kode – og kan give problemer hvis du har behov for forskellige version af jar filerne til dine forskellige applikationer.
  • Kør det som en OSGi plugin
  • Ændre i java.policy filen. Absolut anbefalet.
  • Lav simpel kode der ikke benytter de færdige frameworks eller smarte features i Java, f.eks. nogle af Reflection metoderne. Æv – jeg hader begrænsninger!

Du ser allerhelst at din admin tilføjer denne linie til /jvm/lib/security/java.policy filen:

permission java.security.AllPermission;

Ellers må du være mere specifik, f.eks:

permission java.lang.RuntimePermission "setContextClassLoader"; 
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";

Bemærk at filen overskrives ved opgradering af Domino serveren – derfor bør ændringer laves i en ny fil kaldet java.pol (det er specificeret i java.security filen)

Links

Grafer med Dojo

20659789_sMed Dojo kan du nemt laver grafer på din XPage. Dvs. det har dog voldt mig nogle problemer i det mange af de eksempler jeg fandt på nettet ikke umiddelbart virkede i XPages. Så hermed et simpelt lille eksempel med ‘hardcodet’ data som der virker – og nederst et par links til en god Dojo graf guide.

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" dojoParseOnLoad="true" dojoTheme="true">
	<xp:this.resources>
		<xp:dojoModule name="dojox.charting.Chart2D"></xp:dojoModule>
		<xp:dojoModule name="dojox.charting.themes.Claro"></xp:dojoModule>
	</xp:this.resources>
	<h1>Nice graph</h1>
	<xp:scriptBlock>
		<xp:this.value>
		var chartData = [
			{y: 1978, text: "Blue Widget"},
			{y: 1669, text: "Brown Widget"},
			{y: 2017, text: "Green Widget"},
			{y: 1545, text: "Purple Widget"},
			{y: 339, text: "Red Widget"},
			{y: 1067, text:	"Yellow Widget"}
		];
		drawChart = function() {
			var chart = new dojox.charting.Chart2D("#{id:chartNode}");
			chart.setTheme(dojox.charting.themes.Claro);
			chart.addPlot( "default", {
				type: "Pie",
				radius:200,
				fontColor:"black",
				labelOffset: -20
			});
			chart.addSeries("Number of Orders", chartData);
			chart.render();
		};

		XSP.addOnLoad(drawChart);
		</xp:this.value>
	</xp:scriptBlock>
	<div id="chartNode" style="width: 900px; height: 450px; " ></div>
</xp:view>

Links

Test med JUnit

11796400_sJUnit er et genialt Testing framework der understøtter TDD (Test Driven Design). Jeg har desværre ikke kunnet få det til at virke i Domino Designer. Når jeg opretter en ny ‘JUnit Test Case’ fra Package Explorer menuen og efterfølgende kører den med ‘Run As, JUnit Test‘ så får jeg en ‘Class not found ..’ fejl. Æv – det havde ellers være nemt …

I stedet for, så kører jeg nu mine JUnit test fra en XPage – og det virker perfekt:

  • Først kopierer jeg to jar filer ind i ‘Jar’ folderen i min database: junit.jar og hamcrest-core.jar
  • Hvis du få security problemer, så skal der rettes i java.policy filen (typisk: C:\domino\jvm\lib\security\java.policy). Tilføj denne linje:
    grant { permission java.security.AllPermission; };

    Det får du sikkert ikke lov til i produktion – men du tester alligevel kun lokalt eller på en Devleopment server.

  • Til at kører mine test klasser, har jeg lavet min egen ‘Runner’ – dvs. en klasse der kan starte JUnit runneren fra en XPage og efterfølgende præsentere resultatet i html. Koden kan downloades her.
  • Det hele kaldes fra et computet field på en XPages
<xp:text escape="false" id="computedField1">
		<xp:this.value><![CDATA[${javascript:
runner = new dk.xpages.utils.JUnitRunner();
//Run test or TestSuite
runner.runTest( "test.dk.xpages.TestSuite" );
runner.getHtml();
}]]></xp:this.value>
</xp:text>

Links