blob: d201ee8a7f1bdf41c928d3d13e59e4248a7df868 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008-2014 Sonatype, 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
*******************************************************************************/
package org.eclipse.m2e.wtp.internal.preferences;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.m2e.wtp.MavenWtpPlugin;
import org.eclipse.m2e.wtp.internal.Messages;
import org.eclipse.m2e.wtp.internal.StringUtils;
import org.eclipse.m2e.wtp.preferences.ConfiguratorEnabler;
import org.eclipse.m2e.wtp.preferences.IMavenWtpPreferences;
import org.eclipse.m2e.wtp.preferences.IMavenWtpPreferencesManager;
import org.eclipse.m2e.wtp.preferences.MavenWtpPreferencesConstants;
import org.osgi.service.prefs.BackingStoreException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* An implementation of IMavenWtpPreferencesManager
*
* @author Fred Bricon
*/
public class MavenWtpPreferencesManagerImpl implements IMavenWtpPreferencesManager {
private static final String ATTR_ENABLER_ID = "id"; //$NON-NLS-1$
private static final String ATTR_CONFIGURATOR_IDS = "configuratorIds"; //$NON-NLS-1$
private static final String ATTR_LABEL = "label"; //$NON-NLS-1$
private static final String ATTR_DESCRIPTION = "description"; //$NON-NLS-1$
private static final Logger LOG = LoggerFactory.getLogger(MavenWtpPreferencesManagerImpl.class);
private static final String CONFIGURATOR_ENABLER_EXTENSION_POINT = MavenWtpPlugin.ID+".javaeeConfiguratorEnabler"; //$NON-NLS-1$
private List<ConfiguratorEnabler> enablers;
/**
* @see org.eclipse.m2e.wtp.preferences.IMavenWtpPreferencesManager#getPreferences(org.eclipse.core.resources.IProject)
*/
@Override
public IMavenWtpPreferences getPreferences(IProject project) {
if (project == null) {
return loadWorkspacePreferences();
}
IEclipsePreferences eclipsePrefs = getEclipsePreferences(project);
if (eclipsePrefs.getBoolean(MavenWtpPreferencesConstants.P_ENABLED_PROJECT_SPECIFIC__PREFS, false)) {
return convertPreferences(eclipsePrefs);
}
return loadWorkspacePreferences();
}
/**
* @see org.eclipse.m2e.wtp.preferences.IMavenWtpPreferencesManager#createNewPreferences()
*/
@Override
public IMavenWtpPreferences createNewPreferences() {
return new MavenWtpPreferencesImpl();
}
/**
* @see org.eclipse.m2e.wtp.preferences.IMavenWtpPreferencesManager#getWorkspacePreferences()
*/
@Override
public IMavenWtpPreferences getWorkspacePreferences() {
return loadWorkspacePreferences();
}
/**
* @see org.eclipse.m2e.wtp.preferences.IMavenWtpPreferencesManager#savePreferences(org.eclipse.m2e.wtp.preferences.IMavenWtpPreferences, org.eclipse.core.resources.IProject)
*/
@Override
public void savePreferences(IMavenWtpPreferences preferences, IProject project) {
if (preferences == null) return;
IEclipsePreferences eclipsePrefs;
if (project != null) {
eclipsePrefs = getEclipsePreferences(project);
if (preferences.isEnabledProjectSpecificSettings()) {
transformPreferences(preferences, eclipsePrefs);
} else {
removeSpecificSettings(eclipsePrefs);
}
eclipsePrefs.putBoolean(MavenWtpPreferencesConstants.P_ENABLED_PROJECT_SPECIFIC__PREFS, preferences.isEnabledProjectSpecificSettings());
} else {
eclipsePrefs = getEclipsePreferences();
transformPreferences(preferences, eclipsePrefs);
}
try {
eclipsePrefs.flush();
} catch (BackingStoreException e) {
LOG.error(Messages.MavenWtpPreferencesManagerImpl_0, e);
}
}
private void removeSpecificSettings(IEclipsePreferences eclipsePrefs) {
eclipsePrefs.remove(MavenWtpPreferencesConstants.P_APPLICATION_XML_IN_BUILD_DIR);
eclipsePrefs.remove(MavenWtpPreferencesConstants.P_WEB_MAVENARCHIVER_IN_BUILD_DIR);
}
private IMavenWtpPreferences loadWorkspacePreferences() {
return convertPreferences(getEclipsePreferences());
}
private void transformPreferences(IMavenWtpPreferences preferences, IEclipsePreferences eclipsePrefs) {
eclipsePrefs.putBoolean(MavenWtpPreferencesConstants.P_APPLICATION_XML_IN_BUILD_DIR, preferences.isApplicationXmGeneratedInBuildDirectory());
eclipsePrefs.putBoolean(MavenWtpPreferencesConstants.P_WEB_MAVENARCHIVER_IN_BUILD_DIR, preferences.isWebMavenArchiverUsesBuildDirectory());
eclipsePrefs.putBoolean(MavenWtpPreferencesConstants.P_ENABLE_M2EWTP, preferences.isEnabled());
}
private IMavenWtpPreferences convertPreferences(IEclipsePreferences eclipsePrefs) {
IMavenWtpPreferences preferences = createNewPreferences();
preferences.setEnabledProjectSpecificSettings(eclipsePrefs.getBoolean(MavenWtpPreferencesConstants.P_ENABLED_PROJECT_SPECIFIC__PREFS, false));
preferences.setApplicationXmGeneratedInBuildDirectory(eclipsePrefs.getBoolean(MavenWtpPreferencesConstants.P_APPLICATION_XML_IN_BUILD_DIR, true));
preferences.setWebMavenArchiverUsesBuildDirectory(eclipsePrefs.getBoolean(MavenWtpPreferencesConstants.P_WEB_MAVENARCHIVER_IN_BUILD_DIR, true));
preferences.setEnabled(eclipsePrefs.getBoolean(MavenWtpPreferencesConstants.P_ENABLE_M2EWTP, true));
return preferences;
}
private static IEclipsePreferences getEclipsePreferences()
{
return InstanceScope.INSTANCE.getNode(MavenWtpPreferencesConstants.PREFIX);
}
private static IEclipsePreferences getEclipsePreferences(IProject project)
{
return new ProjectScope(project).getNode(MavenWtpPreferencesConstants.PREFIX);
}
@Override
public ConfiguratorEnabler[] getConfiguratorEnablers() {
if (enablers == null) {
enablers = loadConfiguratorEnablers();
}
ConfiguratorEnabler[] enablersArray = new ConfiguratorEnabler[enablers.size()];
enablers.toArray(enablersArray);
return enablersArray;
}
private static List<ConfiguratorEnabler> loadConfiguratorEnablers() {
IExtensionRegistry registry = Platform.getExtensionRegistry();
IConfigurationElement[] enablerConfigs = registry.getConfigurationElementsFor(CONFIGURATOR_ENABLER_EXTENSION_POINT);
if (enablerConfigs == null) {
return Collections.emptyList();
}
ArrayList<ConfiguratorEnabler> enablers = new ArrayList<>();
for (IConfigurationElement config : enablerConfigs) {
String enablerId = config.getAttribute(ATTR_ENABLER_ID);
String[] configuratorIds = split(config.getAttribute(ATTR_CONFIGURATOR_IDS));
String label = config.getAttribute(ATTR_LABEL);
String description = config.getAttribute(ATTR_DESCRIPTION);
enablers.add(new ConfiguratorEnabler(enablerId, label, configuratorIds, description));
}
return enablers;
}
private static String[] split(String str) {
return StringUtils.tokenizeToStringArray(str, ","); //$NON-NLS-1$
}
/* (non-Javadoc)
* @see org.eclipse.m2e.wtp.preferences.IMavenWtpPreferencesManager#isEnabled(java.lang.String)
*/
@Override
public boolean isEnabled(String configuratorId) {
for (ConfiguratorEnabler enabler : getConfiguratorEnablers()) {
if (enabler.appliesTo(configuratorId)) {
return enabler.isEnabled();
}
}
return true;
}
}