package org.netbeans.gradle.project.properties; import java.io.IOException; import java.nio.file.Path; import java.util.Collection; import java.util.logging.Level; import java.util.logging.Logger; import org.jtrim.event.ListenerRef; import org.jtrim.property.MutableProperty; import org.jtrim.utils.ExceptionHelper; import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectManager; import org.netbeans.gradle.project.api.config.ProfileKey; import org.netbeans.gradle.project.api.config.PropertyDef; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.w3c.dom.Element; final class ProjectProfileSettings implements LoadableSingleProfileSettingsEx { private static final Logger LOGGER = Logger.getLogger(ProjectProfileSettings.class.getName()); private final GenericProfileSettings impl; public ProjectProfileSettings(ProjectProfileSettingsKey key) { ExceptionHelper.checkNotNullArgument(key, "key"); this.impl = new GenericProfileSettings(new ProjectProfileLocationProvider(key)); } @Override public Collection<DomElementKey> getAuxConfigKeys() { return impl.getAuxConfigKeys(); } @Override public Element getAuxConfigValue(DomElementKey key) { return impl.getAuxConfigValue(key); } @Override public boolean setAuxConfigValue(DomElementKey key, Element value) { return impl.setAuxConfigValue(key, value); } @Override public void saveAndWait() { impl.saveAndWait(); } @Override public ProfileKey getKey() { return impl.getKey(); } @Override public <ValueType> MutableProperty<ValueType> getProperty(PropertyDef<?, ValueType> propertyDef) { return impl.getProperty(propertyDef); } @Override public void ensureLoadedAndWait() { impl.ensureLoadedAndWait(); } @Override public void ensureLoaded() { impl.ensureLoaded(); } @Override public ListenerRef notifyWhenLoaded(Runnable runnable) { return impl.notifyWhenLoaded(runnable); } private static final class ProjectProfileLocationProvider implements ProfileLocationProvider { private final ProjectProfileSettingsKey key; public ProjectProfileLocationProvider(ProjectProfileSettingsKey key) { this.key = key; } @Override public ProfileKey getKey() { return key.getKey(); } @Override public Path tryGetOutputPath() throws IOException { return SettingsFiles.getProfileFile(key.getProjectDir(), key.getKey()); } @Override public ProfileFileDef tryGetOutputDef() throws IOException { Project project = tryGetProject(); if (project == null) { LOGGER.log(Level.WARNING, "No project in {0}", key.getProjectDir()); return null; } Path profileFile = tryGetOutputPath(); if (profileFile == null) { return null; } ConfigSaveOptions saveOptions = ConfigXmlUtils.getSaveOptions(project, profileFile); return new ProfileFileDef(profileFile, saveOptions); } private Project tryGetProject() throws IOException { Path projectDir = key.getProjectDir(); FileObject projectDirObj = FileUtil.toFileObject(projectDir.toFile()); return projectDirObj != null ? ProjectManager.getDefault().findProject(projectDirObj) : null; } } }