package org.netbeans.gradle.project.properties.standard; import java.util.Arrays; import org.jtrim.property.PropertyFactory; import org.jtrim.property.PropertySource; import org.jtrim.property.ValueConverter; import org.jtrim.utils.ExceptionHelper; import org.netbeans.api.java.platform.JavaPlatform; import org.netbeans.gradle.project.api.config.ConfigPath; import org.netbeans.gradle.project.api.config.ConfigTree; import org.netbeans.gradle.project.api.config.PropertyDef; import org.netbeans.gradle.project.api.config.PropertyKeyEncodingDef; import org.netbeans.gradle.project.api.config.PropertyReference; import org.netbeans.gradle.project.api.config.PropertyValueDef; import org.netbeans.gradle.project.properties.PlatformSelector; import org.netbeans.gradle.project.properties.ScriptPlatform; import org.netbeans.gradle.project.properties.global.PlatformOrder; import static org.netbeans.gradle.project.properties.standard.JavaPlatformUtils.*; public final class ScriptPlatformProperty { private static final ConfigPath CONFIG_KEY_SCRIPT_PLATFORM = ConfigPath.fromKeys("script-platform"); public static PropertyDef<?, ScriptPlatform> getPropertyDef(PropertyReference<? extends PlatformOrder> orderRef) { return getPropertyDef(orderRef.getActiveSource()); } public static PropertyDef<?, ScriptPlatform> getPropertyDef(PropertySource<? extends PlatformOrder> orderRef) { PropertyDef.Builder<PlatformSelector, ScriptPlatform> result = new PropertyDef.Builder<>(CONFIG_KEY_SCRIPT_PLATFORM); result.setKeyEncodingDef(getEncodingDef()); result.setValueDef(getPlatformIdValueDef(orderRef)); return result.create(); } private static PropertyKeyEncodingDef<PlatformSelector> getEncodingDef() { return new PropertyKeyEncodingDef<PlatformSelector>() { @Override public PlatformSelector decode(ConfigTree config) { PlatformSelector result = ExplicitPlatformRef.tryParse(config); if (result != null) { return result; } return PlatformId.tryDecode(config); } @Override public ConfigTree encode(PlatformSelector value) { return value.toConfig(); } }; } private static PropertySource<ScriptPlatform> javaPlatform( final PlatformSelector selector, final PropertySource<? extends PlatformOrder> orderRef) { if (selector == null) { return PropertyFactory.constSource(null); } return PropertyFactory.convert(installedPlatforms(), new ValueConverter<JavaPlatform[], ScriptPlatform>() { @Override public ScriptPlatform convert(JavaPlatform[] input) { return selector.selectPlatform(Arrays.asList(input), orderRef.getValue()); } }); } private static PropertyValueDef<PlatformSelector, ScriptPlatform> getPlatformIdValueDef( final PropertySource<? extends PlatformOrder> orderRef) { ExceptionHelper.checkNotNullArgument(orderRef, "orderRef"); return new PropertyValueDef<PlatformSelector, ScriptPlatform>() { @Override public PropertySource<ScriptPlatform> property(PlatformSelector valueKey) { return javaPlatform(valueKey, orderRef); } @Override public PlatformSelector getKeyFromValue(ScriptPlatform value) { if (value == null) { return null; } switch (value.getSelectionMode()) { case BY_VERSION: return PlatformId.tryGetIdOfPlatform(value.getJavaPlatform()); case BY_LOCATION: return new ExplicitPlatformRef(value.getJavaPlatform()); default: throw new AssertionError(value.getSelectionMode().name()); } } }; } private ScriptPlatformProperty() { throw new AssertionError(); } }