/* * 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.runtime.module.embedded.internal.classloading; import static org.apache.commons.lang3.builder.ToStringBuilder.reflectionToString; import static org.apache.commons.lang3.builder.ToStringStyle.MULTI_LINE_STYLE; import java.util.Arrays; import java.util.Set; /** * Determines if a given class or resource is exported in a plugin classloader */ // TODO MULE-11882 - Consolidate classloading isolation public class ClassLoaderFilter { private static final String EMPTY_PACKAGE = ""; private static final char RESOURCE_SEPARATOR = '/'; public static final String CLASS_PACKAGE_SPLIT_REGEX = "\\."; public static final String RESOURCE_PACKAGE_SPLIT_REGEX = "/"; private final Set<String> bootPackages; public ClassLoaderFilter(Set<String> bootPackages) { this.bootPackages = bootPackages; } public boolean exportsClass(String name) { return isExportedBootPackage(name, CLASS_PACKAGE_SPLIT_REGEX); } public boolean exportsResource(String name) { return isExportedBootPackage(name, RESOURCE_PACKAGE_SPLIT_REGEX); } private boolean isExportedBootPackage(String name, String splitRegex) { boolean exported = false; final String[] splitName = name.split(splitRegex); final String[] packages = Arrays.copyOf(splitName, splitName.length - 1); String candidatePackage = ""; for (String currentPackage : packages) { if (candidatePackage.length() != 0) { candidatePackage += "."; } candidatePackage += currentPackage; if (bootPackages.contains(candidatePackage)) { exported = true; break; } } return exported; } @Override public String toString() { return reflectionToString(this, MULTI_LINE_STYLE); } }