org.eclim.plugin.jdt.preference.OptionHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.eclim.plugin.jdt.preference.OptionHandler.java

Source

/**
 * Copyright (C) 2005 - 2014  Eric Van Dewoestine
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.eclim.plugin.jdt.preference;

import java.net.MalformedURLException;
import java.net.URL;

import java.util.Hashtable;
import java.util.Map;

import org.eclim.Services;

import org.eclim.plugin.core.preference.Preferences;

import org.eclim.plugin.jdt.util.JavaUtils;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ProjectScope;

import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IScopeContext;
import org.eclipse.core.runtime.preferences.InstanceScope;

import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;

import org.eclipse.jdt.ui.JavaUI;

/**
 * Option handler for jdt/java options.
 *
 * @author Eric Van Dewoestine
 */
public class OptionHandler implements org.eclim.plugin.core.preference.OptionHandler {
    private static final String NATURE = "org.eclipse.jdt.core.javanature";
    private static final String PROJECT_JAVADOC = JavaUI.ID_PLUGIN + ".project_javadoc_location";

    @Override
    public String getNature() {
        return NATURE;
    }

    @Override
    public Map<String, String> getValues() throws Exception {
        @SuppressWarnings("unchecked")
        Map<String, String> coreOptions = JavaCore.getOptions();
        Map<String, String> options = new Hashtable<String, String>();
        options.putAll(coreOptions);
        options.putAll(getUIValues(null));
        return options;
    }

    @Override
    public Map<String, String> getValues(IProject project) throws Exception {
        IJavaProject javaProject = JavaCore.create(project);
        if (!javaProject.exists()) {
            throw new IllegalArgumentException(Services.getMessage("project.not.found", project.getName()));
        }

        @SuppressWarnings("unchecked")
        Map<String, String> coreOptions = javaProject.getOptions(true);
        Map<String, String> options = new Hashtable<String, String>();
        options.putAll(coreOptions);
        options.putAll(getUIValues(project));

        URL javadoc = JavaUI.getProjectJavadocLocation(javaProject);
        options.put(PROJECT_JAVADOC, javadoc != null ? javadoc.toString() : "");

        return options;
    }

    private Map<String, String> getUIValues(IProject project) throws Exception {
        Hashtable<String, String> options = new Hashtable<String, String>();

        IScopeContext[] contexts = null;
        if (project != null) {
            contexts = new IScopeContext[] { new ProjectScope(project), InstanceScope.INSTANCE,
                    DefaultScope.INSTANCE, };
        } else {
            contexts = new IScopeContext[] { InstanceScope.INSTANCE, DefaultScope.INSTANCE, };
        }

        String[] names = Preferences.getInstance().getOptionNames();
        for (String name : names) {
            if (name.startsWith(JavaUI.ID_PLUGIN)) {
                for (IScopeContext context : contexts) {
                    IEclipsePreferences node = context.getNode(JavaUI.ID_PLUGIN);
                    String value = node.get(name, null);
                    if (value != null) {
                        options.put(name, value);
                        break;
                    }
                }
            }
        }

        return options;
    }

    @Override
    public void setOption(String name, String value) throws Exception {
        @SuppressWarnings("unchecked")
        Map<String, String> options = JavaCore.getOptions();

        if (name.equals(JavaCore.COMPILER_SOURCE)) {
            JavaUtils.setCompilerSourceCompliance(value);
        } else if (name.startsWith(JavaUI.ID_PLUGIN)) {
            Preferences.getInstance().setPreference(JavaUI.ID_PLUGIN, null, name, value);
        } else {
            options.put(name, value);
            JavaCore.setOptions((Hashtable<String, String>) options);
        }
    }

    @Override
    public void setOption(IProject project, String name, String value) throws Exception {
        IJavaProject javaProject = JavaCore.create(project);
        if (!javaProject.exists()) {
            throw new IllegalArgumentException(Services.getMessage("project.not.found", project.getName()));
        }

        @SuppressWarnings("unchecked")
        Map<String, String> global = javaProject.getOptions(true);
        @SuppressWarnings("unchecked")
        Map<String, String> options = javaProject.getOptions(false);

        Object current = global.get(name);
        if (current == null || !current.equals(value)) {
            if (name.equals(JavaCore.COMPILER_SOURCE)) {
                JavaUtils.setCompilerSourceCompliance(javaProject, value);
            } else if (name.equals(PROJECT_JAVADOC)) {
                if (value != null && value.trim().length() == 0) {
                    value = null;
                }
                try {
                    JavaUI.setProjectJavadocLocation(javaProject, value != null ? new URL(value) : null);
                } catch (MalformedURLException mue) {
                    throw new IllegalArgumentException(
                            PROJECT_JAVADOC + ": Invalid javadoc url: " + mue.getMessage());
                }
            } else if (name.startsWith(JavaUI.ID_PLUGIN)) {
                Preferences.getInstance().setPreference(JavaUI.ID_PLUGIN, project, name, value);
            } else {
                options.put(name, value);
                javaProject.setOptions(options);
            }
        }
    }
}