ro.isdc.wro.cache.CacheValue Maven / Gradle / Ivy
/**
* Copyright Alex Objelean
*/
package ro.isdc.wro.cache;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.zip.GZIPOutputStream;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ro.isdc.wro.WroRuntimeException;
import ro.isdc.wro.config.Context;
/**
* Entry holding a resource content along with its associated hash.
*
* @author Alex Objelean
*/
@SuppressWarnings("serial")
public final class CacheValue
implements Serializable {
private static final Logger LOG = LoggerFactory.getLogger(CacheValue.class);
private String rawContent;
private byte[] gzippedContent;
private String hash;
private CacheValue(final String rawContent, final String hash) {
this.rawContent = rawContent;
this.hash = hash;
//the trade-off between the memory and processing time
if (Context.get().getConfig().isCacheGzippedContent()) {
gzippedContent = computeGzippedContent(rawContent);
}
}
private byte[] computeGzippedContent(final String content) {
LOG.debug("Gzipping the content....");
try {
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final OutputStream os = new GZIPOutputStream(new BufferedOutputStream(baos));
IOUtils.copy(new ByteArrayInputStream(content.getBytes(Context.get().getConfig().getEncoding())), os);
os.close();
return baos.toByteArray();
} catch (final IOException e) {
throw WroRuntimeException.wrap(e, "Problem while computing gzipped content").logError();
}
};
/**
* Factory method.
*
* @return {@link CacheValue} based on supplied values.
*/
public static final CacheValue valueOf(final String rawContent, final String hash) {
return new CacheValue(rawContent, hash);
}
/**
* @return the content
*/
public String getRawContent() {
return this.rawContent;
}
/**
* @param rawContent the content to set
*/
public void setRawContent(final String rawContent) {
this.rawContent = rawContent;
}
/**
* @return the hash
*/
public String getHash() {
return this.hash;
}
/**
* @param hash the hash to set
*/
public void setHash(final String hash) {
this.hash = hash;
}
/**
* @return the gzippedContent
*/
public byte[] getGzippedContent() {
return this.gzippedContent == null ? computeGzippedContent(rawContent) : gzippedContent;
}
/**
* Used by unit test to prove that gzipped content is cached only when required.
*/
byte[] getGzippedContentInternal() {
return this.gzippedContent;
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
return "hash: " + hash;
}
}