/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.test.runner.api; import static com.google.common.base.Preconditions.checkNotNull; import static java.io.File.pathSeparator; import com.google.common.collect.Lists; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Uses java system properties to get the classpath {@link URL}s. * * @since 4.0 */ public class ClassPathUrlProvider { protected final transient Logger logger = LoggerFactory.getLogger(this.getClass()); private final List<URL> urls; /** * Creates an instance of the provider that uses system properties to get the classpath {@link URL}s. */ public ClassPathUrlProvider() { this(new ArrayList<>()); } /** * Creates an instance of the provided with a list of {@link URL}s to be appended in addition to the classpath ones. * * @param urls {@link URL}s to be added to the ones already in classpath, not null or empty. */ public ClassPathUrlProvider(List<URL> urls) { checkNotNull(urls, "urls cannot be null"); this.urls = readUrlsFromSystemProperties(); this.urls.addAll(urls); } /** * @return Gets the urls from the {@code sun.boot.class.path} and {@code java.class.path} and {@code surefire.test.class.path} * system properties. */ private List<URL> readUrlsFromSystemProperties() { final Set<URL> urls = new LinkedHashSet<>(); addUrlsFromSystemProperty(urls, "java.class.path"); addUrlsFromSystemProperty(urls, "sun.boot.class.path"); addUrlsFromSystemProperty(urls, "surefire.test.class.path"); if (logger.isDebugEnabled()) { StringBuilder builder = new StringBuilder("ClassPath:"); urls.stream().forEach(url -> builder.append(pathSeparator).append(url)); logger.debug(builder.toString()); } return Lists.newArrayList(urls); } public List<URL> getURLs() { return this.urls; } protected void addUrlsFromSystemProperty(final Collection<URL> urls, final String propertyName) { String property = System.getProperty(propertyName); if (property != null) { for (String file : property.split(pathSeparator)) { try { urls.add(new File(file).toURI().toURL()); } catch (MalformedURLException e) { throw new IllegalArgumentException("Cannot create a URL from file path: " + file, e); } } } } }