package hudson.tools;
import hudson.Functions;
import hudson.model.Describable;
import hudson.model.Descriptor;
import java.util.ArrayList;
import java.util.List;
/**
* Base {@link Descriptor} type used for {@code XyzProperty} classes.
*
* @param <P>
* Type of the {@code XyzProperty}. Called 'property type'
* @param <T>
* Type of the {@code Xyz}, that the property attaches to. Called 'target type'
* @author Kohsuke Kawaguchi
* @since 1.305
*/
public abstract class PropertyDescriptor<P extends Describable<P>,T> extends Descriptor<P> {
protected PropertyDescriptor(Class<? extends P> clazz) {
super(clazz);
}
protected PropertyDescriptor() {
}
/**
* Infer the type parameterization 'P'
*/
private Class<P> getP() {
return Functions.getTypeParameter(getClass(),Descriptor.class,0);
}
/**
* Returns true if this property type is applicable to the
* given target type.
*
* <p>
* The default implementation of this method checks if the given node type is assignable
* according to the parameterization, but subtypes can extend this to change this behavior.
*
* @return
* true to indicate applicable, in which case the property will be
* displayed in the configuration screen of the target, for example.
*/
public boolean isApplicable(Class<? extends T> targetType) {
Class<? extends T> applicable = Functions.getTypeParameter(clazz,getP(),0);
return applicable.isAssignableFrom(targetType);
}
public static <D extends PropertyDescriptor<?,T>,T> List<D> for_(List<D> all, Class<? extends T> target) {
List<D> result = new ArrayList<D>();
for (D d : all)
if (d.isApplicable(target))
result.add(d);
return result;
}
public static <D extends PropertyDescriptor<?,T>,T> List<D> for_(List<D> all, T target) {
return for_(all,(Class)target.getClass());
}
}