/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.xslt.functions.portal; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import net.sf.saxon.expr.XPathContext; import net.sf.saxon.om.Item; import net.sf.saxon.om.SequenceIterator; import net.sf.saxon.trans.XPathException; import net.sf.saxon.value.SequenceType; import com.enonic.esl.util.Base64Util; import com.enonic.cms.core.content.image.ImageUtil; import com.enonic.cms.core.xslt.functions.AbstractXsltFunctionCall; final class CreateImagePlaceholderFunction extends AbstractPortalFunction { private final static String IMAGE_FORMAT = "png"; private final class Call extends AbstractXsltFunctionCall { @Override protected Item call( final XPathContext context, final SequenceIterator[] args ) throws XPathException { final int width = toSingleInteger( args[0] ).intValue(); final int height = toSingleInteger( args[1] ).intValue(); try { final String value = createImageSrc( width, height, IMAGE_FORMAT ); return createValue( value ); } catch ( final Exception e ) { throw new XPathException( e ); } } private String createImageSrc( final int width, final int height, final String format ) throws Exception { final BufferedImage image = createImage( width, height ); final byte[] bytes = writeToBytes( image, format ); final StringBuilder str = new StringBuilder(); str.append( "data:image/" + format + ";base64," ); str.append( Base64Util.encode( bytes ) ); return str.toString(); } private BufferedImage createImage( final int width, final int height ) { return new BufferedImage( width, height, BufferedImage.TYPE_INT_ARGB ); } private byte[] writeToBytes( final BufferedImage image, final String format ) throws Exception { final ByteArrayOutputStream out = new ByteArrayOutputStream(); ImageUtil.writeImage( image, format, out ); out.close(); return out.toByteArray(); } } public CreateImagePlaceholderFunction() { super( "createImagePlaceholder" ); setMinimumNumberOfArguments( 2 ); setMaximumNumberOfArguments( 2 ); setResultType( SequenceType.SINGLE_STRING ); } @Override protected AbstractXsltFunctionCall createCall() { return new Call(); } }