Skip to content

Commit

Permalink
Introduce Resource::getContentAsString
Browse files Browse the repository at this point in the history
This commit introduces the getContentAsString method to Resource,
returning the string contents of the resource.

Closes spring-projectsgh-24651
  • Loading branch information
derrick-anderson authored and poutsma committed Feb 14, 2023
1 parent 18896ac commit 4da2499
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,10 @@
import java.net.URLConnection;
import java.nio.channels.FileChannel;
import java.nio.channels.ReadableByteChannel;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.jar.JarEntry;

Expand Down Expand Up @@ -320,6 +323,39 @@ protected void customizeConnection(URLConnection con) throws IOException {
protected void customizeConnection(HttpURLConnection con) throws IOException {
}

/**
* This implementation returns the contents of a file as a string using the
* system default Charset. Provided the resource exists and the context has
* access to it, the contents will be returned as a single string with line
* feed characters retained.
* @return the contents of the requested file as a {@code String}.
* @throws FileNotFoundException in the event the file path is invalid.
* @throws IOException if the file can not be read or cannot be serialzied.
*/
@Override
public String getContentAsString() throws IOException {

if( !exists() ) {
throw new FileNotFoundException(getDescription() + " cannot be found.");
}
if ( !isReadable() ) {
throw new IOException(getDescription() + " cannot be opened for reading.");
}
return new String(Files.readAllBytes(Paths.get(getFile().getAbsolutePath())), Charset.defaultCharset());
}

@Override
public String getContentAsString(Charset charset) throws IOException {

if( !exists() ) {
throw new FileNotFoundException(getDescription() + " cannot be found.");
}
if ( !isReadable() ) {
throw new IOException(getDescription() + " cannot be opened for reading.");
}
return new String(Files.readAllBytes(Paths.get(getFile().getAbsolutePath())), charset);

}

/**
* Inner delegate class, avoiding a hard JBoss VFS API dependency at runtime.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,14 @@
package org.springframework.core.io;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.charset.Charset;

import org.springframework.lang.Nullable;

Expand Down Expand Up @@ -176,4 +178,41 @@ default ReadableByteChannel readableChannel() throws IOException {
*/
String getDescription();

/**
* Return a {@link ReadableByteChannel}.
* <p>It is expected that each call creates a <i>fresh</i> channel.
* <p>The default implementation returns {@link Channels#newChannel(InputStream)}
* with the result of {@link #getInputStream()}.
* @return the byte channel for the underlying resource (must not be {@code null})
* @throws java.io.FileNotFoundException if the underlying resource doesn't exist
* @throws IOException if the content channel could not be opened
* @since 5.0
* @see #getInputStream()
*/

/**
* Returns the contents of a file as a string using the system default Charset.
* <p>The default implementation returns a {@link Object#toString()} representation of the resource.
* @return the contents of the requested file as a {@code String}.
* @throws FileNotFoundException in the event the file path is invalid.
* @throws IOException if the file can not be read or cannot be accessed.
* @since 5.2.5
*/
default String getContentAsString() throws IOException{
return toString();
}

/**
* Returns the contents of a file as a string using the specified Charset.
* <p>The default implementation returns a {@link Object#toString()} representation of the resource.
* @param charset the {@code Charset} to use to deserialize the content. Defaults to system default.
* @return the contents of the requested file as a {@code String}.
* @throws FileNotFoundException in the event the file path is invalid.
* @throws IOException if the file can not be read or cannot be accessed.
* @since 5.2.5
*/
default String getContentAsString(Charset charset) throws IOException{
return toString();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -456,4 +456,25 @@ public String getDescription() {

}

@Test
void getContentAsString_givenValidFile_ShouldReturnFileContent() throws IOException {
String expectedString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<!DOCTYPE properties SYSTEM \"http://java.sun.com/dtd/properties.dtd\">\n"
+ "<properties version=\"1.0\">\n"
+ "\t<entry key=\"foo\">bar</entry>\n"
+ "</properties>";

String fileDirString =
new ClassPathResource("org/springframework/core/io/example.xml").getContentAsString();
assertThat(fileDirString).isNotBlank();
assertThat(fileDirString).isEqualTo(expectedString);
}

@Test
void getContentAsString_givenAnInvalidFile_ShouldThrowFileNotFoundException(){
assertThatExceptionOfType(FileNotFoundException.class)
.isThrownBy(new ClassPathResource("nonExistantFile")::getContentAsString);

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,4 @@
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties version="1.0">
<entry key="foo">bar</entry>
</properties>

</properties>

0 comments on commit 4da2499

Please sign in to comment.