This is an automated email from the ASF dual-hosted git repository. coheigea pushed a commit to branch 3.6.x-fixes in repository https://gitbox.apache.org/repos/asf/cxf.git
commit b19608caf837e8d3a99f0364236dd591792e5151 Author: Colm O hEigeartaigh <[email protected]> AuthorDate: Thu May 14 15:05:15 2026 +0100 Add vfs to URIResolver (#3113) (cherry picked from commit 6bd6b4fd923140c9cebdd83fb4294f8fb00e7c1f) (cherry picked from commit b01d947f5ae507cc3b050b55fe4a84dbc1d1c766) --- .../java/org/apache/cxf/resource/URIResolver.java | 2 +- .../org/apache/cxf/resource/URIResolverTest.java | 27 +++++++++++++ .../apache/cxf/resource/protocol/vfs/Handler.java | 47 ++++++++++++++++++++++ 3 files changed, 75 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/apache/cxf/resource/URIResolver.java b/core/src/main/java/org/apache/cxf/resource/URIResolver.java index f2c5e7a180c..a694fb1fe61 100644 --- a/core/src/main/java/org/apache/cxf/resource/URIResolver.java +++ b/core/src/main/java/org/apache/cxf/resource/URIResolver.java @@ -65,7 +65,7 @@ public class URIResolver implements AutoCloseable { "org.apache.cxf.resource.uriresolver.allowedSchemes"; private static final Set<String> DEFAULT_ALLOWED_URL_SCHEMES = Collections.unmodifiableSet( - new HashSet<>(Arrays.asList("file", "http", "https", "jar", "zip", "wsjar", "local", "classpath"))); + new HashSet<>(Arrays.asList("file", "http", "https", "jar", "zip", "wsjar", "local", "classpath", "vfs"))); private Map<String, LoadingByteArrayOutputStream> cache = new HashMap<>(); private File file; diff --git a/core/src/test/java/org/apache/cxf/resource/URIResolverTest.java b/core/src/test/java/org/apache/cxf/resource/URIResolverTest.java index adc21742a45..99e2b0c3d03 100644 --- a/core/src/test/java/org/apache/cxf/resource/URIResolverTest.java +++ b/core/src/test/java/org/apache/cxf/resource/URIResolverTest.java @@ -39,6 +39,8 @@ import static org.junit.Assert.fail; public class URIResolverTest { + private static final String TEST_PROTOCOL_HANDLER_PACKAGE = "org.apache.cxf.resource.protocol"; + private URIResolver uriResolver; private URL resourceURL = getClass().getResource("resources/helloworld.bpr"); @@ -231,6 +233,31 @@ public class URIResolverTest { } } + @Test + public void testVfsProtocolAllowedAndResolved() throws Exception { + String oldHandlers = System.getProperty("java.protocol.handler.pkgs"); + try { + if (oldHandlers == null || oldHandlers.isEmpty()) { + System.setProperty("java.protocol.handler.pkgs", TEST_PROTOCOL_HANDLER_PACKAGE); + } else if (!oldHandlers.contains(TEST_PROTOCOL_HANDLER_PACKAGE)) { + System.setProperty("java.protocol.handler.pkgs", oldHandlers + "|" + TEST_PROTOCOL_HANDLER_PACKAGE); + } + + URIResolver resolver = new URIResolver("vfs://test/path/schema.xsd"); + assertTrue(resolver.isResolved()); + assertNotNull(resolver.getInputStream()); + String content = IOUtils.toString(resolver.getInputStream()); + assertEquals("vfs-test-content", content); + resolver.close(); + } finally { + if (oldHandlers == null) { + System.clearProperty("java.protocol.handler.pkgs"); + } else { + System.setProperty("java.protocol.handler.pkgs", oldHandlers); + } + } + } + private void resolveWithCheckingClassloader(URIResolver resolver, String baseUriStr, String uriStr, Class<?> callingCls) throws InterruptedException { checkingThreadThrowable = null; diff --git a/core/src/test/java/org/apache/cxf/resource/protocol/vfs/Handler.java b/core/src/test/java/org/apache/cxf/resource/protocol/vfs/Handler.java new file mode 100644 index 00000000000..9728f9e475f --- /dev/null +++ b/core/src/test/java/org/apache/cxf/resource/protocol/vfs/Handler.java @@ -0,0 +1,47 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 + * + * http://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.apache.cxf.resource.protocol.vfs; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLStreamHandler; +import java.nio.charset.StandardCharsets; + +public class Handler extends URLStreamHandler { + private static final byte[] CONTENT = "vfs-test-content".getBytes(StandardCharsets.UTF_8); + + @Override + protected URLConnection openConnection(URL url) { + return new URLConnection(url) { + @Override + public void connect() { + // No-op: test URL handler has no external endpoint. + } + + @Override + public InputStream getInputStream() throws IOException { + connect(); + return new ByteArrayInputStream(CONTENT); + } + }; + } +}
