package org.netbeans.gradle.project.properties.standard; import java.util.regex.Pattern; import org.jtrim.event.ListenerRef; import org.jtrim.event.ListenerRegistries; import org.jtrim.property.PropertySource; import org.jtrim.utils.ExceptionHelper; import org.netbeans.api.java.platform.JavaPlatform; import org.netbeans.gradle.project.NbGradleProject; import org.netbeans.gradle.project.api.config.ConfigPath; import org.netbeans.gradle.project.api.config.PropertyDef; import org.netbeans.gradle.project.api.entry.ProjectPlatform; import org.netbeans.gradle.project.java.JavaExtension; import org.netbeans.gradle.project.properties.global.CommonGlobalSettings; import org.netbeans.gradle.project.query.J2SEPlatformFromScriptQuery; import org.netbeans.gradle.project.util.CachedLookupValue; import org.openide.modules.SpecificationVersion; public final class SourceLevelProperty { public static final String DEFAULT_SOURCE_LEVEL = "1.7"; private static final ConfigPath CONFIG_ROOT = ConfigPath.fromKeys("source-level"); public static final PropertyDef<String, String> PROPERTY_DEF = createPropertyDef(); private static PropertyDef<String, String> createPropertyDef() { PropertyDef.Builder<String, String> result = new PropertyDef.Builder<>(CONFIG_ROOT); result.setKeyEncodingDef(CommonProperties.getIdentityKeyEncodingDef()); result.setValueDef(CommonProperties.<String>getIdentityValueDef()); result.setValueMerger(CommonProperties.<String>getParentIfNullValueMerger()); return result.create(); } private static PropertySource<Boolean> mayRelyOnJavaOfScript() { return CommonGlobalSettings.getDefault().mayRelyOnJavaOfScript().getActiveSource(); } public static PropertySource<String> defaultValue( final NbGradleProject project, final PropertySource<? extends ProjectPlatform> targetPlatform) { ExceptionHelper.checkNotNullArgument(project, "project"); ExceptionHelper.checkNotNullArgument(targetPlatform, "targetPlatform"); final CachedLookupValue<JavaExtension> javaExtRef = new CachedLookupValue<>(project, JavaExtension.class); return new PropertySource<String>() { @Override public String getValue() { if (isReliableJavaVersion(javaExtRef.get())) { String sourceLevel = tryGetScriptSourceLevel(project); if (sourceLevel != null) { return sourceLevel; } } return getSourceLevelFromPlatform(targetPlatform.getValue()); } @Override public ListenerRef addChangeListener(Runnable listener) { ExceptionHelper.checkNotNullArgument(listener, "listener"); ListenerRef ref1 = mayRelyOnJavaOfScript().addChangeListener(listener); ListenerRef ref2 = project.currentModel().addChangeListener(listener); ListenerRef ref3 = targetPlatform.addChangeListener(listener); return ListenerRegistries.combineListenerRefs(ref1, ref2, ref3); } }; } public static String getSourceLevelFromPlatform(JavaPlatform platform) { SpecificationVersion version = platform.getSpecification().getVersion(); String versionStr = version != null ? version.toString() : ""; return getSourceLevelFromPlatformVersion(versionStr); } public static String getSourceLevelFromPlatform(ProjectPlatform platform) { return getSourceLevelFromPlatformVersion(platform.getVersion()); } private static String getSourceLevelFromPlatformVersion(String version) { String[] versionParts = version.split(Pattern.quote(".")); if (versionParts.length < 2) { return DEFAULT_SOURCE_LEVEL; } else { return versionParts[0] + "." + versionParts[1]; } } public static J2SEPlatformFromScriptQuery tryGetPlatformScriptQuery(NbGradleProject project) { return project.getExtensions().lookupExtensionObj(J2SEPlatformFromScriptQuery.class); } private static String tryGetScriptSourceLevel(NbGradleProject project) { J2SEPlatformFromScriptQuery query = tryGetPlatformScriptQuery(project); return query != null ? query.getSourceLevel() : null; } private static boolean isModelSourceReliable(JavaExtension javaExt) { return javaExt.getCurrentModel().getModelSource().isReliableJavaVersion(); } public static boolean isReliableJavaVersion(JavaExtension javaExt) { return (javaExt != null && isModelSourceReliable(javaExt)) || mayRelyOnJavaOfScript().getValue(); } private SourceLevelProperty() { throw new AssertionError(); } }