001/*
002  Copyright 2010-2016 Boxfuse GmbH
003  <p/>
004  Licensed under the Apache License, Version 2.0 (the "License");
005  you may not use this file except in compliance with the License.
006  You may obtain a copy of the License at
007  <p/>
008  http://www.apache.org/licenses/LICENSE-2.0
009  <p/>
010  Unless required by applicable law or agreed to in writing, software
011  distributed under the License is distributed on an "AS IS" BASIS,
012  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013  See the License for the specific language governing permissions and
014  limitations under the License.
015 */
016package io.avaje.classpath.scanner.internal.scanner.classpath.jboss;
017
018import io.avaje.classpath.scanner.core.ClassPathScanException;
019import io.avaje.classpath.scanner.internal.scanner.classpath.UrlResolver;
020
021import java.lang.reflect.Method;
022import java.net.URL;
023
024/**
025 * Resolves JBoss VFS v2 URLs into standard Java URLs.
026 */
027public class JBossVFSv2UrlResolver implements UrlResolver {
028  public URL toStandardJavaUrl(URL url) {
029    try {
030      Class<?> vfsClass = Class.forName("org.jboss.virtual.VFS");
031      Class<?> vfsUtilsClass = Class.forName("org.jboss.virtual.VFSUtils");
032      Class<?> virtualFileClass = Class.forName("org.jboss.virtual.VirtualFile");
033
034      Method getRootMethod = vfsClass.getMethod("getRoot", URL.class);
035      Method getRealURLMethod = vfsUtilsClass.getMethod("getRealURL", virtualFileClass);
036
037      Object root = getRootMethod.invoke(null, url);
038      return (URL) getRealURLMethod.invoke(null, root);
039    } catch (Exception e) {
040      throw new ClassPathScanException("JBoss VFS v2 call failed", e);
041    }
042  }
043}