package org.netbeans.gradle.project.properties;
import java.nio.charset.Charset;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.event.ChangeListener;
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.ProfileDef;
import org.netbeans.gradle.project.api.entry.ProjectPlatform;
import org.netbeans.gradle.project.api.task.GradleCommandTemplate;
import org.netbeans.gradle.project.java.JavaExtension;
import org.netbeans.gradle.project.query.J2SEPlatformFromScriptQuery;
import org.w3c.dom.Element;
public final class DefaultProjectProperties extends AbstractProjectProperties {
private static final Logger LOGGER = Logger.getLogger(DefaultProjectProperties.class.getName());
private final NbGradleProject project;
private final JavaExtension javaExt;
public DefaultProjectProperties(NbGradleProject project) {
ExceptionHelper.checkNotNullArgument(project, "project");
this.project = project;
this.javaExt = project.getLookup().lookup(JavaExtension.class);
}
@Override
public MutableProperty<LicenseHeaderInfo> getLicenseHeader() {
return new UnmodifiableProperty<LicenseHeaderInfo>("LicenseHeader") {
@Override
public LicenseHeaderInfo getValue() {
return null;
}
};
}
private J2SEPlatformFromScriptQuery tryGetPlatformScriptQuery() {
return project.getCombinedExtensionLookup().lookup(J2SEPlatformFromScriptQuery.class);
}
private String tryGetScriptSourceLevel() {
J2SEPlatformFromScriptQuery query = tryGetPlatformScriptQuery();
return query != null ? query.getSourceLevel() : null;
}
private ProjectPlatform tryGetScriptPlatform() {
J2SEPlatformFromScriptQuery query = tryGetPlatformScriptQuery();
return query != null ? query.getPlatform(): null;
}
private boolean isReliableJavaVersion() {
return javaExt.getCurrentModel().getModelSource().isReliableJavaVersion()
|| GlobalGradleSettings.getMayRelyOnJavaOfScript().getValue();
}
@Override
public MutableProperty<String> getSourceLevel() {
return new UnmodifiableProperty<String>("SourceLevel") {
@Override
public String getValue() {
if (isReliableJavaVersion()) {
String sourceLevel = tryGetScriptSourceLevel();
if (sourceLevel != null) {
return sourceLevel;
}
}
return getSourceLevelFromPlatform(getPlatform().getValue());
}
@Override
public void addChangeListener(ChangeListener listener) {
getPlatform().addChangeListener(listener);
project.addModelChangeListener(listener);
GlobalGradleSettings.getMayRelyOnJavaOfScript().addChangeListener(listener);
}
@Override
public void removeChangeListener(ChangeListener listener) {
GlobalGradleSettings.getMayRelyOnJavaOfScript().removeChangeListener(listener);
project.removeModelChangeListener(listener);
getPlatform().removeChangeListener(listener);
}
};
}
@Override
public MutableProperty<ProjectPlatform> getPlatform() {
return new UnmodifiableProperty<ProjectPlatform>("Platform") {
// This is here only to register and remove listeners because
// it can detect changes in the list of platforms defined in
// NetBeans. We will never request the value of this property
// source, so the actual parameters do not matter.
private final PropertySource<?> platformListHelper
= DefaultPropertySources.findPlatformSource("j2se", "1.3", true);
@Override
public ProjectPlatform getValue() {
if (isReliableJavaVersion()) {
ProjectPlatform platform = tryGetScriptPlatform();
if (platform != null) {
return platform;
}
}
return AbstractProjectPlatformSource.getDefaultPlatform();
}
@Override
public void addChangeListener(ChangeListener listener) {
GlobalGradleSettings.getMayRelyOnJavaOfScript().addChangeListener(listener);
project.addModelChangeListener(listener);
platformListHelper.addChangeListener(listener);
}
@Override
public void removeChangeListener(ChangeListener listener) {
platformListHelper.removeChangeListener(listener);
project.removeModelChangeListener(listener);
GlobalGradleSettings.getMayRelyOnJavaOfScript().addChangeListener(listener);
}
};
}
@Override
public MutableProperty<JavaPlatform> getScriptPlatform() {
return new WrappedUnmodifiableProperty<>("ScriptPlatform", GlobalGradleSettings.getGradleJdk());
}
@Override
public MutableProperty<GradleLocation> getGradleLocation() {
return new WrappedUnmodifiableProperty<>("GradleLocation", GlobalGradleSettings.getGradleHome());
}
@Override
public MutableProperty<Charset> getSourceEncoding() {
return new UnmodifiableProperty<Charset>("SourceEncoding") {
@Override
public Charset getValue() {
return DEFAULT_SOURCE_ENCODING;
}
};
}
@Override
public MutableProperty<List<PredefinedTask>> getCommonTasks() {
return new UnmodifiableProperty<List<PredefinedTask>>("CommonTasks") {
@Override
public List<PredefinedTask> getValue() {
return Collections.emptyList();
}
};
}
private static PredefinedTask templateToPredefined(
String displayName, GradleCommandTemplate command) {
List<PredefinedTask.Name> taskNames = new LinkedList<>();
for (String taskName: command.getTasks()) {
taskNames.add(new PredefinedTask.Name(taskName, false));
}
return new PredefinedTask(displayName,
taskNames,
command.getArguments(),
command.getJvmArguments(),
!command.isBlocking());
}
@Override
public MutableProperty<PredefinedTask> tryGetBuiltInTask(String command) {
ProfileDef profile = project.getCurrentProfile().getProfileDef();
GradleCommandTemplate commandTemplate
= project.getMergedCommandQuery().tryGetDefaultGradleCommand(profile, command);
final PredefinedTask task = commandTemplate != null
? templateToPredefined(command, commandTemplate)
: null;
return new UnmodifiableProperty<PredefinedTask>("BuiltInTask-" + command) {
@Override
public PredefinedTask getValue() {
return task;
}
};
}
@Override
public Set<String> getKnownBuiltInCommands() {
return project.getMergedCommandQuery().getSupportedCommands();
}
@Override
public MutableProperty<Void> getAuxConfigListener() {
return new UnmodifiableProperty<Void>("AuxConfigListener") {
@Override
public Void getValue() {
return null;
}
};
}
@Override
public AuxConfigProperty getAuxConfig(String elementName, String namespace) {
UnmodifiableProperty<Element> property = new UnmodifiableProperty<Element>("AuxConfig-" + elementName) {
@Override
public Element getValue() {
return null;
}
};
return new AuxConfigProperty(
new DomElementKey(elementName, namespace),
property);
}
@Override
public void setAllAuxConfigs(Collection<AuxConfig> configs) {
LOGGER.log(Level.WARNING, "Attempting to modify a default property: AuxConfigs");
}
@Override
public Collection<AuxConfigProperty> getAllAuxConfigs() {
return Collections.emptyList();
}
private static final class WrappedUnmodifiableProperty<ValueType> extends UnmodifiableProperty<ValueType> {
private final MutableProperty<ValueType> wrapped;
public WrappedUnmodifiableProperty(String propertyName, MutableProperty<ValueType> wrapped) {
super(propertyName);
ExceptionHelper.checkNotNullArgument(wrapped, "wrapped");
this.wrapped = wrapped;
}
@Override
public ValueType getValue() {
return wrapped.getValue();
}
@Override
public void addChangeListener(ChangeListener listener) {
wrapped.addChangeListener(listener);
}
@Override
public void removeChangeListener(ChangeListener listener) {
wrapped.removeChangeListener(listener);
}
}
private static abstract class UnmodifiableProperty<ValueType> implements MutableProperty<ValueType> {
private final String propertyName;
public UnmodifiableProperty(String propertyName) {
ExceptionHelper.checkNotNullArgument(propertyName, "propertyName");
this.propertyName = propertyName;
}
@Override
public final void setValueFromSource(PropertySource<? extends ValueType> source) {
LOGGER.log(Level.WARNING, "Attempting to modify a default property: {0}", propertyName);
}
@Override
public final void setValue(ValueType value) {
LOGGER.log(Level.WARNING, "Attempting to modify a default property: {0}", propertyName);
}
@Override
public final boolean isDefault() {
return true;
}
@Override
public void addChangeListener(ChangeListener listener) {
}
@Override
public void removeChangeListener(ChangeListener listener) {
}
}
}