/******************************************************************************* * Copyright (c) 2016 Pivotal, Inc. * 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: * Pivotal, Inc. - initial API and implementation *******************************************************************************/ package org.springframework.ide.eclipse.boot.properties.editor.metadata; import java.util.Collection; import java.util.List; import org.eclipse.jdt.core.IJavaProject; import org.springframework.boot.configurationmetadata.ValueHint; import org.springframework.ide.eclipse.boot.properties.editor.metadata.ValueProviderRegistry.ValueProviderStrategy; import org.springframework.ide.eclipse.boot.properties.editor.util.TypedProperty; import org.springframework.ide.eclipse.editor.support.util.CollectionUtil; import org.springframework.ide.eclipse.editor.support.yaml.path.YamlPathSegment; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; /** * A single hint provider that combines the two kinds of 'hint' metadata that spring boot * may contain (namely 'values' data and 'valueProvider' data). * <p> * This basic hint provider is not context-aware and returns the same value hints regardless of the * yaml context. * <p> * This hint provider doesn't provide 'property' hints because property hints typically require * context information (i.e the type of the parent context). * <p> * To make this provider 'context aware' it can be wrapped in an adapter created by calling * one of the static methods in the {@link HintProviders} class. * * @author Kris De Volder */ public class BasicHintProvider implements HintProvider { private IJavaProject javaProject; private ImmutableList<ValueHint> valueHints; private ValueProviderStrategy valueProvider; public BasicHintProvider(IJavaProject javaProject, ImmutableList<ValueHint> valueHints, ValueProviderStrategy valueProvider) { this.javaProject = javaProject; this.valueHints = valueHints; this.valueProvider = valueProvider; } @Override public HintProvider traverse(YamlPathSegment s) throws Exception { //since this provider is not context sensitive it just returns itself (So hints provides in 'sub-contexts' // are exaclty the same as hints in the parent context. return this; } @Override public List<StsValueHint> getValueHints(String query) { Builder<StsValueHint> builder = ImmutableList.builder(); if (CollectionUtil.hasElements(valueHints)) { for (ValueHint hint : valueHints) { builder.add(StsValueHint.create(hint)); } } if (valueProvider!=null) { Collection<StsValueHint> provided = valueProvider.getValuesNow(javaProject, query); if (CollectionUtil.hasElements(provided)) { builder.addAll(provided); } } return builder.build(); } @Override public List<TypedProperty> getPropertyHints(String query) { return ImmutableList.of(); } }