public InputStream parse() { resolveKeepGeneratedDirectory(); StreamCharBuffer streamBuffer = new StreamCharBuffer(1024); StreamByteBuffer byteOutputBuffer = new StreamByteBuffer(1024, StreamByteBuffer.ReadMode.RETAIN_AFTER_READING); try { streamBuffer.connectTo( new OutputStreamWriter(byteOutputBuffer.getOutputStream(), GROOVY_SOURCE_CHAR_ENCODING), true); } catch (UnsupportedEncodingException e) { throw new RuntimeException("Grails cannot run unless your environment supports UTF-8!"); } File keepGeneratedFile = null; Writer keepGeneratedWriter = null; if (keepGeneratedDirectory != null) { keepGeneratedFile = new File(keepGeneratedDirectory, className); try { keepGeneratedWriter = new OutputStreamWriter( new FileOutputStream(keepGeneratedFile), GROOVY_SOURCE_CHAR_ENCODING); } catch (IOException e) { LOG.warn( "Cannot open keepgenerated file for writing. File's absolute path is '" + keepGeneratedFile.getAbsolutePath() + "'"); keepGeneratedFile = null; } streamBuffer.connectTo(keepGeneratedWriter, true); } Writer target = streamBuffer.getWriter(); try { generateGsp(target, false); if (LOG.isDebugEnabled()) { if (keepGeneratedFile != null) { LOG.debug("Compiled GSP into Groovy code. Source is in " + keepGeneratedFile); } else { LOG.debug( "Configure " + CONFIG_PROPERTY_GSP_KEEPGENERATED_DIR + " property to view generated source."); } } return byteOutputBuffer.getInputStream(); } finally { SpringIOUtils.closeQuietly(keepGeneratedWriter); } }