/* * JBoss, Home of Professional Open Source. * Copyright 2014 Red Hat, Inc., and individual contributors * as indicated by the @author tags. * * Licensed 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.jboss.modules; import org.jboss.modules.filter.ClassFilter; import org.jboss.modules.filter.ClassFilters; import org.jboss.modules.filter.PathFilter; import org.jboss.modules.filter.PathFilters; import org.jboss.modules.test.BarImpl; import org.jboss.modules.test.QuxBar; import org.jboss.modules.test.QuxFoo; import org.jboss.modules.test.QuxImpl; import org.jboss.modules.util.ModulesTestBase; import org.jboss.modules.util.TestResourceLoader; import org.junit.Test; import static org.jboss.modules.DependencySpec.createLocalDependencySpec; import static org.jboss.modules.DependencySpec.createModuleDependencySpec; import static org.jboss.modules.ResourceLoaderSpec.createResourceLoaderSpec; import static org.jboss.modules.util.TestResourceLoader.TestResourceLoaderBuilder; /** * [MODULES-69] Allow for OSGi style Class Filtering * * @author Thomas.Diesler@jboss.com * @since 28-Apr-2011 */ public class ClassFilteringTest extends ModulesTestBase { @Test public void testClassFilter() throws Exception { final ModuleIdentifier identifierA = ModuleIdentifier.create(getClass().getSimpleName()); ModuleSpec.Builder specBuilderA = ModuleSpec.build(identifierA); // Export-Package: com.acme.foo; include:="Qux*,BarImpl";exclude:=QuxImpl String packagePath = QuxBar.class.getPackage().getName().replace('.', '/'); PathFilter inA = PathFilters.match(packagePath + "/Qux*.class"); PathFilter inB = PathFilters.match(packagePath + "/BarImpl.class"); PathFilter exA = PathFilters.match(packagePath + "/QuxImpl.class"); //A class is only visible if it is: // Matched with an entry in the included list, and // Not matched with an entry in the excluded list. PathFilter in = PathFilters.any(inA, inB); PathFilter ex = PathFilters.not(PathFilters.any(exA)); final PathFilter filter = PathFilters.all(in, ex); ClassFilter classImportFilter = ClassFilters.acceptAll(); ClassFilter classExportFilter = ClassFilters.fromResourcePathFilter(filter); specBuilderA.addResourceRoot(createResourceLoaderSpec(getTestResourceLoader())); PathFilter importFilter = PathFilters.acceptAll(); PathFilter exportFilter = PathFilters.acceptAll(); PathFilter resourceImportFilter = PathFilters.acceptAll(); PathFilter resourceExportFilter = PathFilters.acceptAll(); specBuilderA.addDependency(createLocalDependencySpec(importFilter, exportFilter, resourceImportFilter, resourceExportFilter, classImportFilter, classExportFilter)); addModuleSpec(specBuilderA.create()); ModuleIdentifier identifierB = ModuleIdentifier.create("moduleB"); ModuleSpec.Builder specBuilderB = ModuleSpec.build(identifierB); specBuilderB.addDependency(createModuleDependencySpec(identifierA)); addModuleSpec(specBuilderB.create()); assertLoadClass(identifierA, QuxFoo.class.getName()); assertLoadClass(identifierA, QuxBar.class.getName()); assertLoadClass(identifierA, QuxImpl.class.getName()); assertLoadClass(identifierA, BarImpl.class.getName()); assertLoadClass(identifierB, QuxFoo.class.getName()); assertLoadClass(identifierB, QuxBar.class.getName()); assertLoadClassFail(identifierB, QuxImpl.class.getName()); assertLoadClass(identifierB, BarImpl.class.getName()); } private TestResourceLoader getTestResourceLoader() throws Exception { TestResourceLoaderBuilder builder = new TestResourceLoaderBuilder(); builder.addClasses(QuxBar.class, QuxFoo.class, QuxImpl.class, BarImpl.class); return builder.create(); } }