ClassInfo.java

/**
 *
 */
package uk.co.jemos.podam.api;

import net.jcip.annotations.Immutable;

import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * This class wraps fields and setters information about a given class
 * <p>
 * The purpose of this class is to work as a sort of cache which stores the list
 * of declared fields and setter methods of a given class. These information
 * will then be analysed to compose the list of setters which can be invoked to
 * create the state of a given POJO.
 * </p>
 *
 * @author mtedone
 *
 * @since 1.0.0
 *
 */
@Immutable
public class ClassInfo implements Serializable {

	private static final long serialVersionUID = 1L;

	/** The Class name whose info are stored in this class */
	private final Class<?> className;

	/** The Set of fields belonging to this class */
	private final Set<ClassAttribute> classAttributes = new HashSet<ClassAttribute>();
	private final List<Method> extraMethods = new ArrayList<Method>();

	/**
	 * Partial constructor.
	 *
	 * @param className
	 *            The class name
	 * @param classAttributes
	 *            The collection of attributes belonging to this class
	 */
	public ClassInfo(Class<?> className, Collection<ClassAttribute> classAttributes) {
		this(className, classAttributes, Collections.<Method>emptyList());
	}

	/**
	 * Full constructor.
	 * @param className The class name
	 * @param classAttributes The collection of attributes belonging to this class
	 * @param extraMethods The collection of extra methods to execute
	 */
	public ClassInfo(Class<?> className, Collection<ClassAttribute> classAttributes, Collection<Method> extraMethods) {
		this.className = className;
		this.classAttributes.addAll(classAttributes);
		this.extraMethods.addAll(extraMethods);
	}

	/**
	 * @return the classSetters
	 */
	public Set<ClassAttribute> getClassAttributes() {
		return new HashSet<ClassAttribute>(classAttributes);
	}

	/**
	 * It returns the class name.
	 *
	 * @return the className
	 */
	public Class<?> getClassName() {
		return className;
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + classAttributes.hashCode();
		result = prime * result
				+ (className == null ? 0 : className.hashCode());
		return result;
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (!(obj instanceof ClassInfo)) {
			return false;
		}
		ClassInfo other = (ClassInfo) obj;
		if (!classAttributes.equals(other.classAttributes)) {
			return false;
		}
		if (className == null) {
			if (other.className != null) {
				return false;
			}
		} else if (!className.equals(other.className)) {
			return false;
		}
		return true;
	}



}