org.jboss.tools.maven.apt.internal.preferences.PreferencesManager.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.maven.apt.internal.preferences.PreferencesManager.java

Source

/*******************************************************************************
 * Copyright (c) 2012-2014 Red Hat, Inc. and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *      Red Hat, Inc. - initial API and implementation
 *******************************************************************************/
package org.jboss.tools.maven.apt.internal.preferences;

import java.util.Properties;

import org.jboss.tools.maven.apt.MavenJdtAptPlugin;
import org.jboss.tools.maven.apt.preferences.AnnotationProcessingMode;
import org.jboss.tools.maven.apt.preferences.IPreferencesManager;
import org.jboss.tools.maven.apt.preferences.PreferencesConstants;
import org.osgi.service.prefs.BackingStoreException;
import org.osgi.service.prefs.Preferences;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IPreferencesService;
import org.eclipse.core.runtime.preferences.IScopeContext;
import org.eclipse.core.runtime.preferences.InstanceScope;

import org.apache.maven.project.MavenProject;

import org.eclipse.m2e.core.MavenPlugin;
import org.eclipse.m2e.core.internal.IMavenConstants;
import org.eclipse.m2e.core.project.IMavenProjectFacade;

/**
 * PreferencesManager
 *
 * @author Fred Bricon
 */
public class PreferencesManager implements IPreferencesManager {

    private static final Logger log = LoggerFactory.getLogger(PreferencesManager.class);

    public PreferencesManager() {
        DefaultScope.INSTANCE.getNode(MavenJdtAptPlugin.PLUGIN_ID);//Initializes AnnotationProcessingPreferenceInitializer
    }

    public void setAnnotationProcessorMode(IProject project, AnnotationProcessingMode mode) {
        IEclipsePreferences prefs = getPreferences(project);
        prefs.put(PreferencesConstants.MODE, mode.toString());
        save(prefs);
    }

    private void save(IEclipsePreferences prefs) {
        try {
            // prefs are automatically flushed during a plugin's "super.stop()".
            prefs.flush();
        } catch (BackingStoreException e) {
            log.error("Error saving preferences", e);
        }
    }

    public AnnotationProcessingMode getAnnotationProcessorMode(IProject project) {
        String mode = getString(project, PreferencesConstants.MODE);
        if (mode == null) {
            mode = PreferencesConstants.DEFAULT_OPTIONS.get(PreferencesConstants.MODE);
        }
        return AnnotationProcessingMode.getFromString(mode);
    }

    private String getString(IProject project, String optionName) {
        if (project == null) {
            return getString(getWorkspaceContexts(), optionName);
        }

        //Read Eclipse project pref 
        String value = new ProjectScope(project).getNode(MavenJdtAptPlugin.PLUGIN_ID).get(optionName, null);
        if (value == null) {
            //Read Maven property
            value = getStringFromMavenProps(project, optionName);
        }
        if (value == null) {
            //Read Eclipse Workspace pref
            value = getString(getWorkspaceContexts(), optionName);
        }
        return value;
    }

    private String getStringFromMavenProps(IProject project, String optionName) {
        if (PreferencesConstants.MODE.equals(optionName)) {
            AnnotationProcessingMode mode = getPomAnnotationProcessorMode(project);
            return mode == null ? null : mode.name();
        }

        if (PreferencesConstants.ANNOTATION_PROCESS_DURING_RECONCILE.equals(optionName)) {
            return getPomAnnotationProcessDuringReconcile(project);
        }

        return null;
    }

    private static IScopeContext[] getWorkspaceContexts() {
        return new IScopeContext[] { InstanceScope.INSTANCE, DefaultScope.INSTANCE };
    }

    private String getString(IScopeContext[] contexts, String optionName) {
        if (contexts == null) {
            return null;
        }
        IPreferencesService service = Platform.getPreferencesService();
        return service.getString(MavenJdtAptPlugin.PLUGIN_ID, optionName, null, contexts);
    }

    private IEclipsePreferences getPreferences(IProject project) {
        IScopeContext scopeContext;
        if (project == null) {
            scopeContext = InstanceScope.INSTANCE;
        } else {
            scopeContext = new ProjectScope(project);
        }
        IEclipsePreferences prefs = scopeContext.getNode(MavenJdtAptPlugin.PLUGIN_ID);
        return prefs;
    }

    public boolean hasSpecificProjectSettings(IProject project) {
        if (project != null) {
            Preferences[] prefs = new Preferences[] {
                    new ProjectScope(project).getNode(MavenJdtAptPlugin.PLUGIN_ID) };
            IPreferencesService service = Platform.getPreferencesService();
            for (String optionName : PreferencesConstants.DEFAULT_OPTIONS.keySet()) {
                if (service.get(optionName, null, prefs) != null) {
                    return true;
                }
            }
        }
        return false;
    }

    public void clearSpecificSettings(IProject project) {
        if (project != null) {
            try {
                IEclipsePreferences prefs = new ProjectScope(project).getNode(MavenJdtAptPlugin.PLUGIN_ID);
                prefs.clear();
                prefs.flush();
            } catch (BackingStoreException ex) {
                log.error("Error saving " + project.getName() + "preferences", ex);
            }
        }
    }

    private static Properties getMavenProperties(IProject project) {
        try {
            if (!project.isAccessible() || !project.hasNature(IMavenConstants.NATURE_ID)) {
                return null;
            }
            IMavenProjectFacade facade = MavenPlugin.getMavenProjectRegistry().getProject(project);
            if (facade == null) {
                IFile pom = project.getFile(IMavenConstants.POM_FILE_NAME);
                facade = MavenPlugin.getMavenProjectRegistry().create(pom, true, new NullProgressMonitor());
            }
            if (facade != null) {
                MavenProject mavenProject = facade.getMavenProject(new NullProgressMonitor());
                return mavenProject.getProperties();
            }
        } catch (CoreException ex) {
            log.error("Error loading maven project for " + project.getName(), ex);
        }
        return null;
    }

    @Override
    public AnnotationProcessingMode getPomAnnotationProcessorMode(IProject project) {
        if (project != null) {
            Properties properties = getMavenProperties(project);
            if (properties != null) {
                return AnnotationProcessingMode
                        .getFromStringOrNull(properties.getProperty(M2E_APT_ACTIVATION_PROPERTY));
            }
        }
        return null;
    }

    @Override
    public String getPomAnnotationProcessDuringReconcile(IProject project) {
        if (project != null) {
            Properties properties = getMavenProperties(project);
            if (properties != null) {
                return properties.getProperty(M2E_APT_PROCESS_DURING_RECONCILE_PROPERTY);
            }
        }

        return null;
    }

    @Override
    public void setAnnotationProcessDuringReconcile(IProject project, boolean enable) {
        IEclipsePreferences prefs = getPreferences(project);
        prefs.put(PreferencesConstants.ANNOTATION_PROCESS_DURING_RECONCILE, String.valueOf(enable));
        save(prefs);
    }

    @Override
    public boolean shouldEnableAnnotationProcessDuringReconcile(IProject project) {
        String option = getString(project, PreferencesConstants.ANNOTATION_PROCESS_DURING_RECONCILE);
        if (option == null) {
            option = PreferencesConstants.DEFAULT_OPTIONS
                    .get(PreferencesConstants.ANNOTATION_PROCESS_DURING_RECONCILE);
        }
        return option.equalsIgnoreCase("true");
    }

}