package org.erlide.engine.internal.model.root; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; import java.util.List; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IResourceDeltaVisitor; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.annotation.NonNull; import org.erlide.engine.model.root.ErlangContentDescriber; import org.erlide.engine.model.root.ErlangProjectProperties; import org.erlide.engine.model.root.IProjectConfigurator; import org.erlide.engine.model.root.ProjectConfigurationSerializer; import org.erlide.util.ErlLogger; import org.erlide.util.IDisposable; import com.google.common.base.Charsets; import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import com.google.common.io.Files; public class FileProjectConfigurator implements IProjectConfigurator, IResourceChangeListener, IDisposable { private final String filePath; @NonNull private final ProjectConfigurationSerializer serializer; public FileProjectConfigurator(final ProjectConfigurationSerializer serializer, final String filePath) { Preconditions.checkArgument(filePath != null); Preconditions.checkArgument(serializer != null); this.serializer = serializer; this.filePath = filePath; ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE); } @Override public ErlangProjectProperties getConfiguration() { if (filePath == null) { return null; } return getRawConfig(new File(filePath)); } private ErlangProjectProperties getRawConfig(final File confFile) { ErlangProjectProperties result = null; try { final Charset coding = ErlangContentDescriber.detectCodingForFile(confFile); final List<String> confString = Files.readLines(confFile, coding); if (confString != null) { final String content = Joiner.on("\n").join(confString); if (content != null) { result = getSerializer().decodeConfig(content); } } } catch (final IOException e) { ErlLogger.error(e); return null; } return result; } @Override public void setConfiguration(final ErlangProjectProperties info) { final File confFile = new File(filePath); final String confString = getSerializer().encodeConfig(info); if (confString != null) { final String content = "%% coding: UTF-8\n" + confString; try { Files.write(content, confFile, Charsets.UTF_8); } catch (final IOException e) { ErlLogger.error(e); } } } public ProjectConfigurationSerializer getSerializer() { return serializer; } @Override public void resourceChanged(final IResourceChangeEvent event) { final IResourceDelta delta = event.getDelta(); try { delta.accept(new IResourceDeltaVisitor() { @Override public boolean visit(final IResourceDelta aDelta) throws CoreException { final IResource res = aDelta.getResource(); if (res.getLocation().equals(new Path(filePath))) { System.out.println("DETECTED " + aDelta.getKind() + " " + res); } return false; } }); } catch (final CoreException e) { ErlLogger.error(e); } } @Override public void dispose() { ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); } }