Introduce Utility Method to Replace Default Table Name

Closes gh-2256
This commit is contained in:
Marcus Da Coregio
2023-03-08 15:40:21 -03:00
committed by Marcus Hert Da Coregio
parent ae05044c46
commit cf84ac7ec9
2 changed files with 124 additions and 0 deletions

View File

@@ -0,0 +1,53 @@
/*
* Copyright 2014-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.session.jdbc.util;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.Resource;
import org.springframework.session.jdbc.JdbcIndexedSessionRepository;
/**
* Utility class for schema files.
*
* @author Marcus da Coregio
* @since 3.1
*/
public final class JdbcSchemaUtils {
private JdbcSchemaUtils() {
}
/**
* Loads the content of the provided schema resource and replaces the
* {@link JdbcIndexedSessionRepository#DEFAULT_TABLE_NAME} by the provided table name.
* @param schemaResource the schema resource
* @param tableName the table name to replace
* @return the schema resource with the table name replaced
*/
public static Resource replaceDefaultTableName(Resource schemaResource, String tableName) throws IOException {
try (InputStream inputStream = schemaResource.getInputStream()) {
String schemaScript = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
String newSchema = schemaScript.replace(JdbcIndexedSessionRepository.DEFAULT_TABLE_NAME, tableName);
return new ByteArrayResource(newSchema.getBytes(StandardCharsets.UTF_8));
}
}
}

View File

@@ -0,0 +1,71 @@
/*
* Copyright 2014-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.session.jdbc.util;
import java.io.IOException;
import java.util.Arrays;
import java.util.stream.Stream;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link JdbcSchemaUtils}.
*
* @author Marcus da Coregio
*/
class JdbcSchemaUtilsTests {
@ParameterizedTest
@MethodSource("getCreateSchemaFiles")
void replaceCreateSchemaTableName(Resource schema) throws IOException {
Resource newTableNameSchema = JdbcSchemaUtils.replaceDefaultTableName(schema, "NEW_TABLE_NAME");
String schemaScript = new String(newTableNameSchema.getInputStream().readAllBytes());
assertThat(schemaScript).doesNotContain("SPRING_SESSION", "SPRING_SESSION_ATTRIBUTES", "SPRING_SESSION_IX1",
"SPRING_SESSION_IX2", "SPRING_SESSION_IX3");
assertThat(schemaScript).contains("NEW_TABLE_NAME", "NEW_TABLE_NAME_ATTRIBUTES", "NEW_TABLE_NAME_IX1",
"NEW_TABLE_NAME_IX2", "NEW_TABLE_NAME_IX3");
}
@ParameterizedTest
@MethodSource("getDropSchemaFiles")
void replaceDropSchemaTableName(Resource schema) throws IOException {
Resource newTableNameSchema = JdbcSchemaUtils.replaceDefaultTableName(schema, "NEW_TABLE_NAME");
String schemaScript = new String(newTableNameSchema.getInputStream().readAllBytes());
assertThat(schemaScript).doesNotContain("SPRING_SESSION", "SPRING_SESSION_ATTRIBUTES");
assertThat(schemaScript).contains("NEW_TABLE_NAME", "NEW_TABLE_NAME_ATTRIBUTES");
}
private static Stream<Resource> getCreateSchemaFiles() throws IOException {
return getSchemaFiles().filter((resource) -> !resource.getFilename().contains("drop"));
}
private static Stream<Resource> getDropSchemaFiles() throws IOException {
return getSchemaFiles().filter((resource) -> resource.getFilename().contains("drop"));
}
private static Stream<Resource> getSchemaFiles() throws IOException {
return Arrays.stream(new PathMatchingResourcePatternResolver()
.getResources("classpath*:org/springframework/session/jdbc/schema-*.sql"));
}
}