/* * Copyright 2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.gradle.api.internal.tasks.options; import org.apache.commons.lang.builder.CompareToBuilder; import org.gradle.internal.reflect.JavaMethod; import org.gradle.util.CollectionUtils; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Set; public class InstanceOptionDescriptor implements OptionDescriptor { private final Object object; private final OptionElement optionElement; private final JavaMethod<Object, Collection> optionValueMethod; InstanceOptionDescriptor(Object object, OptionElement optionElement) { this(object, optionElement, null); } public InstanceOptionDescriptor(Object object, OptionElement optionElement, JavaMethod<Object, Collection> optionValueMethod) { this.object = object; this.optionElement = optionElement; this.optionValueMethod = optionValueMethod; } public OptionElement getOptionElement() { return optionElement; } public String getName() { return optionElement.getOptionName(); } public Set<String> getAvailableValues() { final Set<String> values = optionElement.getAvailableValues(); if (getArgumentType().isAssignableFrom(String.class)) { values.addAll(readDynamicAvailableValues()); } return values; } public Class<?> getArgumentType() { return optionElement.getOptionType(); } private List<String> readDynamicAvailableValues() { if (optionValueMethod != null) { Collection values = optionValueMethod.invoke(object); return CollectionUtils.toStringList(values); } return Collections.emptyList(); } public String getDescription() { return optionElement.getDescription(); } public int getOrder() { return optionElement.getOrder(); } public void apply(Object objectParam, List<String> parameterValues) { if (objectParam != object) { throw new AssertionError(String.format("Object %s not applyable. Expecting %s", objectParam, object)); } optionElement.apply(objectParam, parameterValues); } public int compareTo(OptionDescriptor o) { return new CompareToBuilder().append(getOrder(), o.getOrder()).append(getName(), o.getName()).toComparison(); } }