This is an automated email from the ASF dual-hosted git repository.
zhaojinchao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 86cb133e6cf Fix the JDBCRepositorySQL fails to load when using a Fat
Jar. (#25784) (#25809)
86cb133e6cf is described below
commit 86cb133e6cf3c67533d6a9afa07f4d21eb10e3f1
Author: Cong Hu <[email protected]>
AuthorDate: Mon May 22 18:50:59 2023 +0800
Fix the JDBCRepositorySQL fails to load when using a Fat Jar. (#25784)
(#25809)
* Fix the JDBCRepositorySQL fails to load when using a Fat Jar. (#25784)
* retrigger checks
* retrigger checks
* Modified the code as per the suggestion.
* Modified the code as per the suggestion.
---
.../jdbc/sql/JDBCRepositorySQLLoader.java | 85 +++++++++++++---------
1 file changed, 50 insertions(+), 35 deletions(-)
diff --git
a/mode/type/standalone/repository/provider/jdbc/src/main/java/org/apache/shardingsphere/mode/repository/standalone/jdbc/sql/JDBCRepositorySQLLoader.java
b/mode/type/standalone/repository/provider/jdbc/src/main/java/org/apache/shardingsphere/mode/repository/standalone/jdbc/sql/JDBCRepositorySQLLoader.java
index fd5bb782e4c..de891dc3af2 100644
---
a/mode/type/standalone/repository/provider/jdbc/src/main/java/org/apache/shardingsphere/mode/repository/standalone/jdbc/sql/JDBCRepositorySQLLoader.java
+++
b/mode/type/standalone/repository/provider/jdbc/src/main/java/org/apache/shardingsphere/mode/repository/standalone/jdbc/sql/JDBCRepositorySQLLoader.java
@@ -23,9 +23,9 @@ import lombok.SneakyThrows;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
-import java.io.File;
import java.io.IOException;
import java.io.InputStream;
+import java.net.JarURLConnection;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.FileVisitResult;
@@ -49,6 +49,16 @@ public final class JDBCRepositorySQLLoader {
private static final String FILE_EXTENSION = ".xml";
+ private static final String URL_PROTOCOL_JAR = "jar";
+
+ private static final String URL_PROTOCOL_WAR = "war";
+
+ private static final String URL_PROTOCOL_ZIP = "zip";
+
+ private static final String URL_PROTOCOL_WSJAR = "wsjar";
+
+ private static final String URL_PROTOCOL_VFSZIP = "vfszip";
+
/**
* Load JDBC repository SQL.
*
@@ -57,49 +67,54 @@ public final class JDBCRepositorySQLLoader {
*/
@SneakyThrows({JAXBException.class, IOException.class,
URISyntaxException.class})
public static JDBCRepositorySQL load(final String type) {
- File file = new
File(JDBCRepositorySQLLoader.class.getProtectionDomain().getCodeSource().getLocation().getPath());
- return file.isFile() ? loadFromJar(file, type) :
loadFromDirectory(type);
- }
-
- private static JDBCRepositorySQL loadFromDirectory(final String type)
throws URISyntaxException, IOException {
- Enumeration<URL> urls =
Thread.currentThread().getContextClassLoader().getResources(ROOT_DIRECTORY);
- if (null == urls) {
+ Enumeration<URL> resources =
Thread.currentThread().getContextClassLoader().getResources(ROOT_DIRECTORY);
+ if (null == resources) {
return null;
}
+ JDBCRepositorySQL result = null;
+ while (resources.hasMoreElements()) {
+ URL resource = resources.nextElement();
+ result = isJarURL(resource) ? loadFromJar(resource, type) :
loadFromDirectory(resource, type);
+ if (null != result && Objects.equals(result.isDefault(), false)) {
+ break;
+ }
+ }
+ return result;
+ }
+
+ private static boolean isJarURL(final URL url) {
+ String protocol = url.getProtocol();
+ return URL_PROTOCOL_JAR.equals(protocol) ||
URL_PROTOCOL_WAR.equals(protocol) || URL_PROTOCOL_ZIP.equals(protocol)
+ || URL_PROTOCOL_VFSZIP.equals(protocol) ||
URL_PROTOCOL_WSJAR.equals(protocol);
+ }
+
+ private static JDBCRepositorySQL loadFromDirectory(final URL url, final
String type) throws URISyntaxException, IOException {
final JDBCRepositorySQL[] result = new JDBCRepositorySQL[1];
- final boolean[] gotIt = new boolean[1];
- while (urls.hasMoreElements()) {
- URL url = urls.nextElement();
- Files.walkFileTree(Paths.get(url.toURI()), new
SimpleFileVisitor<Path>() {
-
- @SneakyThrows(JAXBException.class)
- @Override
- public FileVisitResult visitFile(final Path file, final
BasicFileAttributes attributes) throws IOException {
- if (file.toString().endsWith(FILE_EXTENSION)) {
- JDBCRepositorySQL provider = (JDBCRepositorySQL)
JAXBContext.newInstance(JDBCRepositorySQL.class).createUnmarshaller()
-
.unmarshal(Files.newInputStream(file.toFile().toPath()));
- if (Objects.equals(provider.isDefault(), true)) {
- result[0] = provider;
- }
- if (Objects.equals(provider.getType(), type)) {
- result[0] = provider;
- gotIt[0] = true;
- return FileVisitResult.TERMINATE;
- }
+ Files.walkFileTree(Paths.get(url.toURI()), new
SimpleFileVisitor<Path>() {
+
+ @SneakyThrows(JAXBException.class)
+ @Override
+ public FileVisitResult visitFile(final Path file, final
BasicFileAttributes attributes) throws IOException {
+ if (file.toString().endsWith(FILE_EXTENSION)) {
+ JDBCRepositorySQL provider = (JDBCRepositorySQL)
JAXBContext.newInstance(JDBCRepositorySQL.class).createUnmarshaller()
+
.unmarshal(Files.newInputStream(file.toFile().toPath()));
+ if (provider.isDefault()) {
+ result[0] = provider;
+ }
+ if (Objects.equals(provider.getType(), type)) {
+ result[0] = provider;
+ return FileVisitResult.TERMINATE;
}
- return FileVisitResult.CONTINUE;
}
- });
- if (gotIt[0]) {
- return result[0];
+ return FileVisitResult.CONTINUE;
}
- }
+ });
return result[0];
}
- private static JDBCRepositorySQL loadFromJar(final File file, final String
type) throws JAXBException, IOException {
+ private static JDBCRepositorySQL loadFromJar(final URL url, final String
type) throws JAXBException, IOException {
JDBCRepositorySQL defaultProvider = null;
- try (JarFile jar = new JarFile(file)) {
+ try (JarFile jar = ((JarURLConnection)
url.openConnection()).getJarFile()) {
Enumeration<JarEntry> entries = jar.entries();
while (entries.hasMoreElements()) {
String name = entries.nextElement().getName();
@@ -108,7 +123,7 @@ public final class JDBCRepositorySQLLoader {
}
final InputStream inputStream =
Thread.currentThread().getContextClassLoader().getResourceAsStream(name);
JDBCRepositorySQL provider = (JDBCRepositorySQL)
JAXBContext.newInstance(JDBCRepositorySQL.class).createUnmarshaller().unmarshal(inputStream);
- if (Objects.equals(provider.isDefault(), true)) {
+ if (provider.isDefault()) {
defaultProvider = provider;
}
if (Objects.equals(provider.getType(), type)) {