/******************************************************************************* * * Copyright (c) 2004-2010 Oracle Corporation. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * * *******************************************************************************/ 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()); } }