/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.config.spring.util; import org.mule.runtime.core.util.IOUtils; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import java.io.UnsupportedEncodingException; import org.springframework.core.io.AbstractResource; /** * Spring 2.x is picky about open/closed input streams, as it requires a closed stream (fully read resource) to enable automatic * validation detection (DTD or XSD). Otherwise, a caller has to specify the mode explicitly. * <p/> * Code relying on Spring 1.2.x behavior may now break with * {@link org.springframework.beans.factory.BeanDefinitionStoreException}. This class is called in to remedy this and should be * used instead of, e.g. {@link org.springframework.core.io.InputStreamResource}. * <p/> * The resource is fully stored in memory. */ public class CachedResource extends AbstractResource { private static final String DEFAULT_DESCRIPTION = "cached in-memory resource"; private final byte[] buffer; private final String description; public CachedResource(byte[] source) { this(source, null); } public CachedResource(String source, String encoding) throws UnsupportedEncodingException { this(source.trim().getBytes(encoding), DEFAULT_DESCRIPTION); } public CachedResource(byte[] source, String description) { this.buffer = source; this.description = description; } public CachedResource(Reader reader, String encoding) throws IOException { this(IOUtils.toByteArray(reader, encoding), DEFAULT_DESCRIPTION); } public String getDescription() { return (description == null) ? "" : description; } public InputStream getInputStream() throws IOException { // This HAS to be a new InputStream, otherwise SAX // parser breaks with 'Premature end of file at line -1" // This behavior is not observed with Spring pre-2.x return new ByteArrayInputStream(buffer); } }