org.ajax4jsf.resource.ScriptRenderer.java Source code

Java tutorial

Introduction

Here is the source code for org.ajax4jsf.resource.ScriptRenderer.java

Source

/**
 * 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;
    }
}