/*
* JBoss, Home of Professional Open Source
* Copyright 2009, Red Hat Middleware LLC, and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* 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.shrinkwrap.api;
import java.util.Collection;
import java.util.regex.Pattern;
import javax.annotation.processing.Filer;
Factory class for the creation of new Filter
instances. Filter instances using this shorthand class will be created using the ClassLoader
associated with the default Domain
's Configuration
. Author: Aslak Knutsen Version: $Revision: $
/**
* Factory class for the creation of new {@link Filter} instances. Filter instances using this shorthand class will be
* created using the {@link ClassLoader} associated with the default {@link Domain}'s {@link Configuration}.
*
*
* @author <a href="mailto:aslak@conduct.no">Aslak Knutsen</a>
* @version $Revision: $
*/
public final class Filters {
// -------------------------------------------------------------------------------------||
// Class Members ----------------------------------------------------------------------||
// -------------------------------------------------------------------------------------||
private static final String IMPL_CLASS_NAME_INCLUDE_ALL_PATHS = "org.jboss.shrinkwrap.impl.base.filter.IncludeAllPaths";
private static final String IMPL_CLASS_NAME_INCLUDE_REGEXP_PATHS = "org.jboss.shrinkwrap.impl.base.filter.IncludeRegExpPaths";
private static final String IMPL_CLASS_NAME_EXCLUDE_REGEXP_PATHS = "org.jboss.shrinkwrap.impl.base.filter.ExcludeRegExpPaths";
private static final String IMPL_CLASS_NAME_INCLUDE_PATHS = "org.jboss.shrinkwrap.impl.base.filter.IncludePaths";
private static final String IMPL_CLASS_NAME_EXCLUDE_PATHS = "org.jboss.shrinkwrap.impl.base.filter.ExcludePaths";
Filter
that includes all ArchivePath
s. Only meant to be used internally. Returns: A Filter
that always return true
/**
* {@link Filter} that includes all {@link ArchivePath}s.
*
* Only meant to be used internally.
*
* @return A {@link Filter} that always return true
*/
public static Filter<ArchivePath> includeAll() {
return getFilterInstance(IMPL_CLASS_NAME_INCLUDE_ALL_PATHS, new Class<?>[] {}, new Object[] {});
}
Params: - regexp –
The expression to include
Returns: A Regular Expression based include Filter
/**
* {@link Filer} that include all {@link ArchivePath}s that match the given Regular Expression {@link Pattern}.
*
* @param regexp
* The expression to include
* @return A Regular Expression based include {@link Filter}
*/
public static Filter<ArchivePath> include(String regexp) {
return getFilterInstance(IMPL_CLASS_NAME_INCLUDE_REGEXP_PATHS, new Class<?>[] { String.class },
new Object[] { regexp });
}
Params: - regexp –
The expression to exclude
Returns: A Regular Expression based exclude Filter
/**
* {@link Filter} that exclude all {@link ArchivePath}s that match a given Regular Expression {@link Pattern}.
*
* @param regexp
* The expression to exclude
* @return A Regular Expression based exclude {@link Filter}
*/
public static Filter<ArchivePath> exclude(final String regexp) {
return getFilterInstance(IMPL_CLASS_NAME_EXCLUDE_REGEXP_PATHS, new Class<?>[] { String.class },
new Object[] { regexp });
}
Filer
that include all ArchivePath
s that match the given List of paths.. Params: - paths –
The paths to included
Returns: A Path list based include Filter
/**
* {@link Filer} that include all {@link ArchivePath}s that match the given List of paths..
*
* @param paths
* The paths to included
* @return A Path list based include {@link Filter}
*/
public static Filter<ArchivePath> includePaths(final String... paths) {
return getFilterInstance(IMPL_CLASS_NAME_INCLUDE_PATHS, new Class<?>[] { String[].class },
new Object[] { paths });
}
Filer
that include all ArchivePath
s that match the given List of paths.. Params: - paths –
The paths to included
Returns: A Path list based include Filter
/**
* {@link Filer} that include all {@link ArchivePath}s that match the given List of paths..
*
* @param paths
* The paths to included
* @return A Path list based include {@link Filter}
*/
public static Filter<ArchivePath> includePaths(final Collection<String> paths) {
return getFilterInstance(IMPL_CLASS_NAME_INCLUDE_PATHS, new Class<?>[] { Collection.class },
new Object[] { paths });
}
Filter
that exclude all ArchivePath
s that match the given List of paths. Params: - paths –
The paths to exclude
Returns: A Path list based exclude Filter
/**
* {@link Filter} that exclude all {@link ArchivePath}s that match the given List of paths.
*
* @param paths
* The paths to exclude
* @return A Path list based exclude {@link Filter}
*/
public static Filter<ArchivePath> excludePaths(final String... paths) {
return getFilterInstance(IMPL_CLASS_NAME_EXCLUDE_PATHS, new Class<?>[] { String[].class },
new Object[] { paths });
}
Filter
that exclude all ArchivePath
s that match the given List of paths. Params: - paths –
The paths to exclude
Returns: A Path list based exclude Filter
/**
* {@link Filter} that exclude all {@link ArchivePath}s that match the given List of paths.
*
* @param paths
* The paths to exclude
* @return A Path list based exclude {@link Filter}
*/
public static Filter<ArchivePath> excludePaths(final Collection<String> paths) {
return getFilterInstance(IMPL_CLASS_NAME_EXCLUDE_PATHS, new Class<?>[] { Collection.class },
new Object[] { paths });
}
Params: - packages –
To be included
Returns:
/**
* {@link Filter} that includes listed {@link Package}.
*
* @param packages
* To be included
* @return
*/
public static Filter<ArchivePath> exclude(Package... packages) {
return createRegExpFilter(IMPL_CLASS_NAME_EXCLUDE_REGEXP_PATHS, packages);
}
Params: - packages –
To be excluded
Returns:
/**
* {@link Filter} that excludes listed {@link Package}.
*
* @param packages
* To be excluded
* @return
*/
public static Filter<ArchivePath> include(Package... packages) {
return createRegExpFilter(IMPL_CLASS_NAME_INCLUDE_REGEXP_PATHS, packages);
}
private static Filter<ArchivePath> createRegExpFilter(String filterClassName, Package... packages) {
StringBuilder classExpression = new StringBuilder();
for (Package pack : packages) {
classExpression.append("|");
classExpression.append("(.*" + pack.getName().replaceAll("\\.", "\\.") + ".*)");
}
classExpression.deleteCharAt(0);
return getFilterInstance(filterClassName, new Class<?>[] { String.class },
new Object[] { classExpression.toString() });
}
Params: - classes –
To be included
Returns:
/**
* {@link Filter} that includes listed {@link Class}.
*
* @param classes
* To be included
* @return
*/
public static Filter<ArchivePath> include(Class<?>... classes) {
return createRegExpFilter(IMPL_CLASS_NAME_INCLUDE_REGEXP_PATHS, classes);
}
Params: - classes –
To be excluded
Returns:
/**
* {@link Filter} that excludes listed {@link Class}.
*
* @param classes
* To be excluded
* @return
*/
public static Filter<ArchivePath> exclude(Class<?>... classes) {
return createRegExpFilter(IMPL_CLASS_NAME_EXCLUDE_REGEXP_PATHS, classes);
}
private static Filter<ArchivePath> createRegExpFilter(String regExpFilterImplName, Class<?>... classes) {
StringBuilder classExpression = new StringBuilder();
for (Class<?> clazz : classes) {
classExpression.append("|");
classExpression.append("(.*" + clazz.getName().replaceAll("\\.", "\\.") + "\\.class)");
}
classExpression.deleteCharAt(0);
return getFilterInstance(regExpFilterImplName, new Class<?>[] { String.class },
new Object[] { classExpression.toString() });
}
Creates a new Filter
instance using the given impl class name, constructor arguments and type Params: - filterClassName –
- ctorTypes –
- ctorArguments –
Returns:
/**
* Creates a new {@link Filter} instance using the given impl class name, constructor arguments and type
*
* @param filterClassName
* @param ctorTypes
* @param ctorArguments
* @return
*/
@SuppressWarnings("unchecked")
private static Filter<ArchivePath> getFilterInstance(final String filterClassName, final Class<?>[] ctorTypes,
final Object[] ctorArguments) {
// Precondition checks
assert filterClassName != null && filterClassName.length() > 0 : "Filter class name must be specified";
assert ctorTypes != null : "Construction types must be specified";
assert ctorArguments != null : "Construction arguments must be specified";
assert ctorTypes.length == ctorArguments.length : "The number of ctor arguments and their types must match";
// Find the filter impl class in the configured CLs
final Class<Filter<ArchivePath>> filterClass;
try {
filterClass = (Class<Filter<ArchivePath>>) ClassLoaderSearchUtil.findClassFromClassLoaders(filterClassName,
ShrinkWrap.getDefaultDomain().getConfiguration().getClassLoaders());
} catch (final ClassNotFoundException cnfe) {
throw new IllegalStateException("Could not find filter implementation class " + filterClassName
+ " in any of the configured CLs", cnfe);
}
// Make the new instance
return SecurityActions.newInstance(filterClass, ctorTypes, ctorArguments, Filter.class);
}
// -------------------------------------------------------------------------------------||
// Constructor ------------------------------------------------------------------------||
// -------------------------------------------------------------------------------------||
No instantiation
/**
* No instantiation
*/
private Filters() {
}
}