Package org.erlide.engine.internal.model.root

Source Code of org.erlide.engine.internal.model.root.FileProjectConfigurator

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.IPath;
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(final IPath baseDir) {
        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);
    }

}
TOP

Related Classes of org.erlide.engine.internal.model.root.FileProjectConfigurator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.