Subversion Repositories bacoAlunos

Rev

Blame | Last modification | View Log | RSS feed

package com.owlike.genson.reflect;

import java.lang.reflect.Member;
import java.lang.reflect.Modifier;

/**
 * This class is used as filter for properties discovery. It uses java modifiers to check if a
 * property (can be a method, field, constructor or any class that implements Member interface) is
 * visible.
 * <p/>
 * The filter acts by excluding the properties with specified modifiers. Here are some examples :
 * <p/>
 * <pre>
 * // will filter nothing :
 * new VisibilityFilter();
 *
 * // exclude only private and transient:
 * new VisibilityFilter(Modifier.TRANSIENT, Modifier.PRIVATE);
 *
 * // exclude only public!! and allow all the rest
 * new VisibilityFilter(Modifier.public);
 * </pre>
 * <p/>
 * So the idea is to pass to the constructor all the Modifier.XXX modifiers that you want to be
 * filtered.
 *
 * @author eugen
 * @see BeanMutatorAccessorResolver.StandardMutaAccessorResolver
 */

public final class VisibilityFilter {

  private final static int JAVA_MODIFIERS = 1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.PUBLIC | 1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.PROTECTED
    | 1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.PRIVATE | 1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.ABSTRACT | 1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.STATIC | 1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.FINAL
    | 1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.1.5.0/docs/api/org/omg/CORBA/TRANSIENT.html">TRANSIENT | 1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.VOLATILE | 1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.SYNCHRONIZED | 1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.NATIVE
    | 1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.STRICT | 1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.INTERFACE;

  public final static VisibilityFilter ABSTRACT = new VisibilityFilter(1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.ABSTRACT);
  public final static VisibilityFilter PRIVATE = new VisibilityFilter(1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.1.5.0/docs/api/org/omg/CORBA/TRANSIENT.html">TRANSIENT,
    1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.NATIVE, 1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.STATIC);
  public final static VisibilityFilter ALL = new VisibilityFilter();
  public final static VisibilityFilter NONE = new VisibilityFilter(JAVA_MODIFIERS);
  public final static VisibilityFilter PROTECTED = new VisibilityFilter(1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.1.5.0/docs/api/org/omg/CORBA/TRANSIENT.html">TRANSIENT,
    1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.NATIVE, 1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.STATIC, 1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.PRIVATE);
  public final static VisibilityFilter PACKAGE_PUBLIC = new VisibilityFilter(1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.1.5.0/docs/api/org/omg/CORBA/TRANSIENT.html">TRANSIENT,
    1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.NATIVE, 1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.STATIC, 1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.PRIVATE, 1.5.0/docs/api/java/lang/reflect/Modifier.html">Modifier.PROTECTED);

  private int filter;

  /**
   * Creates a new VisibilityFilter with specified modifiers. You must use existing values from
   * Modifier class otherwise an exception will be thrown.
   *
   * @param modifier all the modifiers you want to exclude.
   */

  public VisibilityFilter(int... modifier) {
    filter = 0;
    for (int m : modifier) {

      if ((m & JAVA_MODIFIERS) == 0)
        throw new 1.5.0/docs/api/java/lang/IllegalArgumentException.html">IllegalArgumentException(
          "One of the modifiers is not a standard java modifier.");
      filter = filter | m;
    }
  }

  /**
   * Checks whether this member is visible or not according to this filter.
   *
   * @param member
   * @return true if this member is visible according to this filter.
   */

  public final boolean isVisible(1.5.0/docs/api/java/lang/reflect/Member.html">Member member) {
    return isVisible(member.getModifiers());
  }

  public final boolean isVisible(int modifiers) {
    return (modifiers & filter) == 0;
  }
}