Skip to content

Commit

Permalink
Add support for exclusion filters to BeansXml
Browse files Browse the repository at this point in the history
+ update of IsolationDisabledTest with exclude filters
  • Loading branch information
Ron Smeral committed Mar 22, 2014
1 parent 2cbed4c commit 4d0e224
Show file tree
Hide file tree
Showing 4 changed files with 198 additions and 8 deletions.
Expand Up @@ -14,6 +14,7 @@
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.jboss.shrinkwrap.impl.BeansXml;
import org.jboss.shrinkwrap.impl.BeansXml.BeanDiscoveryMode;
import org.jboss.shrinkwrap.impl.BeansXml.Exclude;
import org.jboss.weld.environment.se.test.arquillian.WeldSEClassPath;
import org.junit.After;
import static org.junit.Assert.*;
Expand All @@ -39,7 +40,10 @@ public static Archive<?> getDeployment() {
.addAsManifestResource(new BeansXml(BeanDiscoveryMode.ALL)
.interceptors(ZoomInterceptor.class)
.decorators(CameraDecorator.class)
.alternatives(RangefinderCamera.class), "beans.xml")
.alternatives(RangefinderCamera.class)
.excludeFilters(
Exclude.exact(PinholeCamera.class).ifClassAvailable(DSLR.class)
), "beans.xml")
.addClasses(ZoomInterceptor.class, CameraDecorator.class, RangefinderCamera.class);

JavaArchive archive02 = ShrinkWrap.create(BeanArchive.class)
Expand Down Expand Up @@ -78,6 +82,11 @@ public void testAlternative(BeanManager bm) {
assertTrue(cameras.contains(RangefinderCamera.class));
assertEquals(2, cameras.size());
}

@Test
public void testExcludeFilters(BeanManager bm) {
assertFalse(getBeanClasses(bm, Camera.class).contains(PinholeCamera.class));
}

private Set<Class<?>> getBeanClasses(BeanManager bm, Type beanType, Annotation... annotations) {
Set<Class<?>> classes = new HashSet<Class<?>>();
Expand Down
@@ -1,6 +1,7 @@
package org.jboss.shrinkwrap.api;

import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.jboss.shrinkwrap.impl.BeansXml;

/**
* A CDI specific extension to Shrinkwrap to ease Weld testing.
Expand Down Expand Up @@ -38,4 +39,12 @@ public interface BeanArchive extends JavaArchive {
* @return
*/
BeanArchive stereotype(Class<?>... classes);

/**
* Adds an exclude filter to beans.xml.
*
* @param excludes
* @return
*/
BeanArchive exclude(BeansXml.Exclude... excludes);
}
Expand Up @@ -73,6 +73,11 @@ public BeanArchive stereotype(Class<?>... classes) {
return covarientReturn();
}

public BeanArchive exclude(BeansXml.Exclude... excludes) {
descriptor.excludeFilters(excludes);
return covarientReturn();
}

@Override
protected BeanArchive covarientReturn() {
return (BeanArchive) super.covarientReturn();
Expand Down
181 changes: 174 additions & 7 deletions tests-common/src/main/java/org/jboss/shrinkwrap/impl/BeansXml.java
Expand Up @@ -11,7 +11,7 @@

public class BeansXml implements Asset {

public static final BeansXml SUPPRESSOR = new BeansXml(Collections.<Class<?>> emptyList(), Collections.<Class<?>> emptyList(), Collections.<Class<?>> emptyList(), Collections.<Class<?>> emptyList()) {
public static final BeansXml SUPPRESSOR = new BeansXml(Collections.<Class<?>> emptyList(), Collections.<Class<?>> emptyList(), Collections.<Class<?>> emptyList(), Collections.<Class<?>> emptyList(), Collections.<Exclude> emptyList()) {
@Override
public BeanDiscoveryMode getBeanDiscoveryMode() {
return BeanDiscoveryMode.NONE;
Expand All @@ -31,31 +31,167 @@ private BeanDiscoveryMode(String value) {

private static final String CLOSING_TAG_PREFIX = "</";
private static final String OPENING_TAG_PREFIX = "<";
private static final String TAG_SUFFIX_NEW_LINE = ">\n";
private static final String TAG_SUFFIX = ">";
private static final String TAG_SUFFIX_NEW_LINE = ">\n";
private static final String TAG_SUFFIX_SELF_CLOSE_NEW_LINE = " />\n";
private static final String ALTERNATIVES_ELEMENT_NAME = "alternatives";
private static final String CLASS = "class";

private static final String SCAN_ELEMENT_NAME = "scan";
private static final String EXCLUDE_ELEMENT_NAME = "exclude";
private static final String IF_SYSTEM_PROPERTY_ELEMENT_NAME = "if-system-property";
private static final String IF_CLASS_AVAILABLE_ELEMENT_NAME = "if-class-available";
private static final String IF_CLASS_NOT_AVAILABLE_ELEMENT_NAME = "if-class-not-available";
private static final String NAME_ATTRIBUTE_NAME = "name";
private static final String VALUE_ATTRIBUTE_NAME = "value";

private final List<Class<?>> alternatives;
private final List<Class<?>> interceptors;
private final List<Class<?>> decorators;
private final List<Class<?>> stereotypes;
private final List<Exclude> excludeFilters;

private BeanDiscoveryMode mode = BeanDiscoveryMode.ALL;

public static class Exclude {

private final String classFilter;
private final List<Condition> conditions;

private Exclude(String classFilter) {
this.classFilter = classFilter;
conditions = new ArrayList<Condition>();
}

public static Exclude match(String classFilter) {
return new Exclude(classFilter);
}

public static Exclude exact(Class<?> clazz) {
return new Exclude(clazz.getName());
}

public Exclude ifSystemProperty(String name) {
conditions.add(new IfSystemProperty(name, null));
return this;
}

public Exclude ifSystemProperty(String name, String value) {
conditions.add(new IfSystemProperty(name, value));
return this;
}

public Exclude ifClassAvailable(Class<?> clazz) {
return ifClassAvailable(clazz.getName());
}

public Exclude ifClassAvailable(String className) {
conditions.add(new IfClassAvailable(className));
return this;
}

public Exclude ifClassNotAvailable(Class<?> clazz) {
return ifClassNotAvailable(clazz.getName());
}

public Exclude ifClassNotAvailable(String className) {
conditions.add(new IfClassNotAvailable(className));
return this;
}

public String getClassFilter() {
return this.classFilter;
}

public List<Condition> getConditions() {
return this.conditions;
}

private static class Condition {
private final String nameParam;
private final String tagName;

public Condition(String tagName, String nameParam) {
this.tagName = tagName;
this.nameParam = nameParam;
}

public String getName() {
return this.nameParam;
}

public String getTagName() {
return this.tagName;
}

@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(OPENING_TAG_PREFIX).append(getTagName());
appendAttribute(NAME_ATTRIBUTE_NAME, getName(), sb);
sb.append(TAG_SUFFIX_SELF_CLOSE_NEW_LINE);
return sb.toString();
}

}

private static class IfSystemProperty extends Condition {

private final String value;

public IfSystemProperty(String name, String value) {
super(IF_SYSTEM_PROPERTY_ELEMENT_NAME, name);
this.value = value;
}

public String getValue() {
return this.value;
}

@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(OPENING_TAG_PREFIX).append(getTagName());
appendAttribute(NAME_ATTRIBUTE_NAME, getName(), sb);
appendAttribute(VALUE_ATTRIBUTE_NAME, getValue(), sb);
sb.append(TAG_SUFFIX_SELF_CLOSE_NEW_LINE);
return sb.toString();
}

}

private static class IfClassAvailable extends Condition {

public IfClassAvailable(String className) {
super(IF_CLASS_AVAILABLE_ELEMENT_NAME, className);
}

}

private static class IfClassNotAvailable extends Condition {

public IfClassNotAvailable(String className) {
super(IF_CLASS_NOT_AVAILABLE_ELEMENT_NAME, className);
}
}

}

public BeansXml() {
this(new ArrayList<Class<?>>(), new ArrayList<Class<?>>(), new ArrayList<Class<?>>(), new ArrayList<Class<?>>());
this(new ArrayList<Class<?>>(), new ArrayList<Class<?>>(), new ArrayList<Class<?>>(), new ArrayList<Class<?>>(), new ArrayList<Exclude>());
}

public BeansXml(BeanDiscoveryMode mode) {
this();
setBeanDiscoveryMode(mode);
}

private BeansXml(List<Class<?>> alternatives, List<Class<?>> interceptors, List<Class<?>> decorators, List<Class<?>> stereotypes) {
private BeansXml(List<Class<?>> alternatives, List<Class<?>> interceptors, List<Class<?>> decorators, List<Class<?>> stereotypes, List<Exclude> excludeFilters) {
this.alternatives = alternatives;
this.interceptors = interceptors;
this.decorators = decorators;
this.stereotypes = stereotypes;
this.excludeFilters = excludeFilters;
}

public BeansXml alternatives(Class<?>... alternatives) {
Expand All @@ -78,6 +214,11 @@ public BeansXml stereotype(Class<?>... stereotypes) {
return this;
}

public BeansXml excludeFilters(Exclude... filters) {
this.excludeFilters.addAll(Arrays.asList(filters));
return this;
}

public BeanDiscoveryMode getBeanDiscoveryMode() {
return mode;
}
Expand All @@ -91,6 +232,7 @@ public InputStream openStream() {
xml.append("<beans version=\"1.1\" bean-discovery-mode=\"");
xml.append(getBeanDiscoveryMode().value);
xml.append("\">\n");
appendExcludeFilters(excludeFilters, xml);
appendAlternatives(alternatives, stereotypes, xml);
appendSection("interceptors", CLASS, interceptors, xml);
appendSection("decorators", CLASS, decorators, xml);
Expand All @@ -99,7 +241,32 @@ public InputStream openStream() {
return new ByteArrayInputStream(xml.toString().getBytes());
}

private void appendAlternatives(List<Class<?>> alternatives, List<Class<?>> stereotypes, StringBuilder xml) {
private void appendExcludeFilters(List<Exclude> filters, StringBuilder xml) {
if (filters.size() > 0) {
xml.append(OPENING_TAG_PREFIX).append(SCAN_ELEMENT_NAME).append(TAG_SUFFIX_NEW_LINE);
for(Exclude ex : filters) {
xml.append(OPENING_TAG_PREFIX).append(EXCLUDE_ELEMENT_NAME);
appendAttribute(NAME_ATTRIBUTE_NAME, ex.getClassFilter(), xml);
List<Exclude.Condition> conditions = ex.getConditions();
if(conditions.isEmpty()) {
xml.append(TAG_SUFFIX_SELF_CLOSE_NEW_LINE);
} else {
xml.append(TAG_SUFFIX_NEW_LINE);
for (Exclude.Condition c : conditions) {
xml.append(c.toString());
}
xml.append(CLOSING_TAG_PREFIX).append(EXCLUDE_ELEMENT_NAME).append(TAG_SUFFIX_NEW_LINE);
}
}
xml.append(CLOSING_TAG_PREFIX).append(SCAN_ELEMENT_NAME).append(TAG_SUFFIX_NEW_LINE);
}
}

private static void appendAttribute(String name, String value, StringBuilder xml) {
xml.append(" ").append(name).append("=\"").append(value).append("\"");
}

private static void appendAlternatives(List<Class<?>> alternatives, List<Class<?>> stereotypes, StringBuilder xml) {
if (alternatives.size() > 0 || stereotypes.size() > 0) {
xml.append(OPENING_TAG_PREFIX).append(ALTERNATIVES_ELEMENT_NAME).append(TAG_SUFFIX_NEW_LINE);
appendClasses(CLASS, alternatives, xml);
Expand All @@ -108,15 +275,15 @@ private void appendAlternatives(List<Class<?>> alternatives, List<Class<?>> ster
}
}

private void appendSection(String name, String subName, List<Class<?>> classes, StringBuilder xml) {
private static void appendSection(String name, String subName, List<Class<?>> classes, StringBuilder xml) {
if (classes.size() > 0) {
xml.append(OPENING_TAG_PREFIX).append(name).append(TAG_SUFFIX_NEW_LINE);
appendClasses(subName, classes, xml);
xml.append(CLOSING_TAG_PREFIX).append(name).append(TAG_SUFFIX_NEW_LINE);
}
}

private void appendClasses(String name, List<Class<?>> classes, StringBuilder xml) {
private static void appendClasses(String name, List<Class<?>> classes, StringBuilder xml) {
for (Class<?> clazz : classes) {
xml.append(OPENING_TAG_PREFIX).append(name).append(TAG_SUFFIX).append(clazz.getName()).append(CLOSING_TAG_PREFIX).append(name).append(TAG_SUFFIX_NEW_LINE);
}
Expand Down

0 comments on commit 4d0e224

Please sign in to comment.