/**
* License Agreement.
*
* Rich Faces - Natural Ajax for Java Server Faces (JSF)
*
* Copyright (C) 2007 Exadel, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1 as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package org.ajax4jsf.resource;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.ajax4jsf.Messages;
import org.ajax4jsf.javascript.JSMin;
import org.ajax4jsf.resource.InternetResource;
import org.ajax4jsf.resource.ResourceContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author asmirnov@exadel.com (latest modification by $Author: alexsmirnov $)
* @version $Revision: 1.1.2.1 $ $Date: 2007/01/09 18:57:04 $
*
*/
public class ScriptRenderer extends CompressedScriptRenderer {
private static final String COMPRESS_SCRIPTS_PARAMETER = "org.ajax4jsf.COMPRESS_SCRIPT";
private static final Log _log = LogFactory.getLog(ScriptRenderer.class);
/* (non-Javadoc)
* @see org.ajax4jsf.resource.BaseResourceRenderer#send(org.ajax4jsf.resource.InternetResource, org.ajax4jsf.resource.ResourceContext)
*/
public int send(InternetResource base, ResourceContext context) throws IOException {
InputStream in = base.getResourceAsStream(context);
if (null == in) {
String message = Messages.getMessage(
Messages.NO_INPUT_STREAM_ERROR, base.getKey());
throw new IOException(message);
}
OutputStream out = context.getOutputStream();
// Compress JavaScript output by JSMin ( true by default )
if( ! "false".equalsIgnoreCase(context.getInitParameter(COMPRESS_SCRIPTS_PARAMETER))){
CountingOutputStream countingStream = new CountingOutputStream(out);
JSMin jsmin = new JSMin(in,countingStream);
try {
jsmin.jsmin();
} catch (Exception e) {
_log.error("Error send script to client for resource "+base.getKey(), e);
} finally {
in.close();
countingStream.flush();
countingStream.close();
}
int written = countingStream.getWritten();
if(_log.isDebugEnabled()){
_log.debug("Send "+written+" bytes to client for JavaScript resource "+base.getKey());
}
return written;
} else {
return sendStream(in, out);
}
}
}
class CountingOutputStream extends OutputStream {
private OutputStream outputStream;
private int written = 0;
CountingOutputStream(OutputStream outputStream) {
super();
this.outputStream = outputStream;
}
public void close() throws IOException {
outputStream.close();
}
public void flush() throws IOException {
outputStream.flush();
}
public void write(byte[] b, int off, int len) throws IOException {
outputStream.write(b, off, len);
written += len;
}
public void write(byte[] b) throws IOException {
outputStream.write(b);
written += b.length;
}
public void write(int b) throws IOException {
outputStream.write(b);
written++;
}
int getWritten() {
return written;
}
}