/******************************************************************************* * Copyright (c) 2008-2015 Sonatype, Inc. * 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: * Sonatype, Inc. - initial API and implementation *******************************************************************************/ package org.eclipse.m2e.core.internal.preferences; import java.util.Map; import org.osgi.service.prefs.BackingStoreException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.eclipse.aether.repository.RepositoryPolicy; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.ListenerList; 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.IEclipsePreferences.INodeChangeListener; import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener; import org.eclipse.core.runtime.preferences.IEclipsePreferences.NodeChangeEvent; import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent; import org.eclipse.core.runtime.preferences.IPreferenceFilter; import org.eclipse.core.runtime.preferences.IPreferencesService; import org.eclipse.core.runtime.preferences.InstanceScope; import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy; import org.eclipse.m2e.core.embedder.IMavenConfiguration; import org.eclipse.m2e.core.embedder.IMavenConfigurationChangeListener; import org.eclipse.m2e.core.embedder.MavenConfigurationChangeEvent; import org.eclipse.m2e.core.internal.IMavenConstants; import org.eclipse.m2e.core.internal.MavenPluginActivator; import org.eclipse.m2e.core.internal.lifecyclemapping.LifecycleMappingFactory; public class MavenConfigurationImpl implements IMavenConfiguration, IPreferenceChangeListener, INodeChangeListener { private static final Logger log = LoggerFactory.getLogger(MavenConfigurationImpl.class); private final IEclipsePreferences[] preferencesLookup = new IEclipsePreferences[2]; private final IPreferencesService preferenceStore; private final ListenerList listeners = new ListenerList(ListenerList.IDENTITY); public MavenConfigurationImpl() { preferenceStore = Platform.getPreferencesService(); init(); } private boolean exists(IEclipsePreferences preferenceNode) { if(preferenceNode == null) { return false; } try { return preferenceNode.nodeExists(""); } catch(BackingStoreException ex) { log.error(ex.getMessage(), ex); return false; } } private void init() { if(exists(preferencesLookup[0])) { ((IEclipsePreferences) preferencesLookup[0].parent()).removeNodeChangeListener(this); preferencesLookup[0].removePreferenceChangeListener(this); } preferencesLookup[0] = InstanceScope.INSTANCE.getNode(IMavenConstants.PLUGIN_ID); ((IEclipsePreferences) preferencesLookup[0].parent()).addNodeChangeListener(this); preferencesLookup[0].addPreferenceChangeListener(this); if(exists(preferencesLookup[1])) { ((IEclipsePreferences) preferencesLookup[1].parent()).removeNodeChangeListener(this); preferencesLookup[1].removePreferenceChangeListener(this); } preferencesLookup[1] = DefaultScope.INSTANCE.getNode(IMavenConstants.PLUGIN_ID); ((IEclipsePreferences) preferencesLookup[1].parent()).addNodeChangeListener(this); } public String getGlobalSettingsFile() { return preferenceStore.get(MavenPreferenceConstants.P_GLOBAL_SETTINGS_FILE, null, preferencesLookup); } public String getUserSettingsFile() { return preferenceStore.get(MavenPreferenceConstants.P_USER_SETTINGS_FILE, null, preferencesLookup); } public boolean isDebugOutput() { return Boolean.parseBoolean(preferenceStore.get(MavenPreferenceConstants.P_DEBUG_OUTPUT, null, preferencesLookup)); } public void setDebugOutput(boolean debug) { preferencesLookup[0].putBoolean(MavenPreferenceConstants.P_DEBUG_OUTPUT, debug); } public boolean isDownloadJavaDoc() { return Boolean.parseBoolean(preferenceStore.get(MavenPreferenceConstants.P_DOWNLOAD_JAVADOC, null, preferencesLookup)); } public boolean isDownloadSources() { return Boolean.parseBoolean(preferenceStore.get(MavenPreferenceConstants.P_DOWNLOAD_SOURCES, null, preferencesLookup)); } public void setDownloadSources(boolean downloadSources) { preferencesLookup[0].putBoolean(MavenPreferenceConstants.P_DOWNLOAD_SOURCES, downloadSources); } public boolean isHideFoldersOfNestedProjects() { return Boolean.parseBoolean(preferenceStore.get(MavenPreferenceConstants.P_HIDE_FOLDERS_OF_NESTED_PROJECTS, null, preferencesLookup)); } public boolean isOffline() { return Boolean.parseBoolean(preferenceStore.get(MavenPreferenceConstants.P_OFFLINE, null, preferencesLookup)); } public void setUserSettingsFile(String settingsFile) throws CoreException { settingsFile = trim(settingsFile); if(!eq(settingsFile, preferencesLookup[0].get(MavenPreferenceConstants.P_USER_SETTINGS_FILE, null))) { if(settingsFile != null) { preferencesLookup[0].put(MavenPreferenceConstants.P_USER_SETTINGS_FILE, settingsFile); } else { preferencesLookup[0].remove(MavenPreferenceConstants.P_USER_SETTINGS_FILE); } preferenceStore.applyPreferences(preferencesLookup[0], new IPreferenceFilter[] {getPreferenceFilter()}); } } public void setGlobalSettingsFile(String globalSettingsFile) throws CoreException { globalSettingsFile = trim(globalSettingsFile); if(!eq(globalSettingsFile, preferencesLookup[0].get(MavenPreferenceConstants.P_GLOBAL_SETTINGS_FILE, null))) { if(globalSettingsFile != null) { preferencesLookup[0].put(MavenPreferenceConstants.P_GLOBAL_SETTINGS_FILE, globalSettingsFile); } else { preferencesLookup[0].remove(MavenPreferenceConstants.P_GLOBAL_SETTINGS_FILE); } preferenceStore.applyPreferences(preferencesLookup[0], new IPreferenceFilter[] {getPreferenceFilter()}); } } private boolean eq(String a, String b) { return a != null ? a.equals(b) : b == null; } private String trim(String str) { if(str == null) { return null; } str = str.trim(); return !str.isEmpty() ? str : null; } public boolean isUpdateProjectsOnStartup() { return Boolean.parseBoolean(preferenceStore .get(MavenPreferenceConstants.P_UPDATE_PROJECTS, null, preferencesLookup)); } public boolean isUpdateIndexesOnStartup() { return Boolean .parseBoolean(preferenceStore.get(MavenPreferenceConstants.P_UPDATE_INDEXES, null, preferencesLookup)); } public synchronized void addConfigurationChangeListener(IMavenConfigurationChangeListener listener) { this.listeners.add(listener); } public void preferenceChange(PreferenceChangeEvent event) { MavenConfigurationChangeEvent mavenEvent = new MavenConfigurationChangeEvent(event.getKey(), event.getNewValue(), event.getOldValue()); for(Object listener : listeners.getListeners()) { try { ((IMavenConfigurationChangeListener) listener).mavenConfigurationChange(mavenEvent); } catch(Exception e) { log.error("Could not deliver maven configuration change event", e); } } } public void added(NodeChangeEvent event) { } public void removed(NodeChangeEvent event) { if(event.getChild() == preferencesLookup[0] || event.getChild() == preferencesLookup[1]) { init(); } } private IPreferenceFilter getPreferenceFilter() { return new IPreferenceFilter() { public String[] getScopes() { return new String[] {InstanceScope.SCOPE, DefaultScope.SCOPE}; } @SuppressWarnings("rawtypes") public Map getMapping(String scope) { return null; } }; } public String getGlobalUpdatePolicy() { boolean never = Boolean.parseBoolean(preferenceStore.get(MavenPreferenceConstants.P_GLOBAL_UPDATE_NEVER, null, preferencesLookup)); return never ? RepositoryPolicy.UPDATE_POLICY_NEVER : null; } public void setGlobalUpdatePolicy(String policy) { if(policy == null) { preferencesLookup[0].putBoolean(MavenPreferenceConstants.P_GLOBAL_UPDATE_NEVER, false); } else if(RepositoryPolicy.UPDATE_POLICY_NEVER.equals(policy)) { preferencesLookup[0].putBoolean(MavenPreferenceConstants.P_GLOBAL_UPDATE_NEVER, true); } else { throw new IllegalArgumentException(); } } public String getWorkspaceLifecycleMappingMetadataFile() { IPath stateLocation = MavenPluginActivator.getDefault().getStateLocation(); String defaultValue = stateLocation.append(LifecycleMappingFactory.LIFECYCLE_MAPPING_METADATA_SOURCE_NAME) .toString(); return preferenceStore.get(MavenPreferenceConstants.P_WORKSPACE_MAPPINGS_LOCATION, defaultValue, preferencesLookup); } public void setWorkspaceLifecycleMappingMetadataFile(String location) throws CoreException { if(location != null) { preferencesLookup[0].put(MavenPreferenceConstants.P_WORKSPACE_MAPPINGS_LOCATION, location); } else { preferencesLookup[0].remove(MavenPreferenceConstants.P_WORKSPACE_MAPPINGS_LOCATION); } preferenceStore.applyPreferences(preferencesLookup[0], new IPreferenceFilter[] {getPreferenceFilter()}); } public String getOutOfDateProjectSeverity() { return preferenceStore.get(MavenPreferenceConstants.P_OUT_OF_DATE_PROJECT_CONFIG_PB, ProblemSeverity.error.toString(), preferencesLookup); } /** * For testing purposes only */ public void setOutOfDateProjectSeverity(String severity) throws CoreException { if(severity == null) { preferencesLookup[0].remove(MavenPreferenceConstants.P_OUT_OF_DATE_PROJECT_CONFIG_PB); } else { preferencesLookup[0].put(MavenPreferenceConstants.P_OUT_OF_DATE_PROJECT_CONFIG_PB, severity); } preferenceStore.applyPreferences(preferencesLookup[0], new IPreferenceFilter[] {getPreferenceFilter()}); } @Override public String getGlobalChecksumPolicy() { return preferenceStore.get(MavenPreferenceConstants.P_GLOBAL_CHECKSUM_POLICY, null, preferencesLookup); } /** * For testing purposes only. */ public void setGlobalChecksumPolicy(String checksumPolicy) { if(checksumPolicy == null) { preferencesLookup[0].remove(MavenPreferenceConstants.P_GLOBAL_CHECKSUM_POLICY); } else if(ArtifactRepositoryPolicy.CHECKSUM_POLICY_FAIL.equals(checksumPolicy) //will fail eclipse builds in case checksum fails || ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN.equals(checksumPolicy) //XXX checksum warnings should be rendered as markers || ArtifactRepositoryPolicy.CHECKSUM_POLICY_IGNORE.equals(checksumPolicy)) {//will simply be ignored preferencesLookup[0].put(MavenPreferenceConstants.P_GLOBAL_CHECKSUM_POLICY, checksumPolicy); } else { throw new IllegalArgumentException(checksumPolicy + " is not a valid checksum policy"); } } @Override public String getNotCoveredMojoExecutionSeverity() { return preferenceStore.get(MavenPreferenceConstants.P_NOT_COVERED_MOJO_EXECUTION_PB, ProblemSeverity.error.toString(), preferencesLookup); } /** * For testing purposes only */ public void setNotCoveredMojoExecutionSeverity(String severity) throws CoreException { if(severity == null) { preferencesLookup[0].remove(MavenPreferenceConstants.P_NOT_COVERED_MOJO_EXECUTION_PB); } else { preferencesLookup[0].put(MavenPreferenceConstants.P_NOT_COVERED_MOJO_EXECUTION_PB, severity); } preferenceStore.applyPreferences(preferencesLookup[0], new IPreferenceFilter[] {getPreferenceFilter()}); } @Override public String getOverridingManagedVersionExecutionSeverity() { return preferenceStore.get(MavenPreferenceConstants.P_OVERRIDING_MANAGED_VERSION_PB, ProblemSeverity.warning.toString(), preferencesLookup); } /** * For testing purposes only */ public void setOverridingManagedVersionExecutionSeverity(String severity) throws CoreException { if(severity == null) { preferencesLookup[0].remove(MavenPreferenceConstants.P_OVERRIDING_MANAGED_VERSION_PB); } else { preferencesLookup[0].put(MavenPreferenceConstants.P_OVERRIDING_MANAGED_VERSION_PB, severity); } preferenceStore.applyPreferences(preferencesLookup[0], new IPreferenceFilter[] {getPreferenceFilter()}); } @Override public boolean isAutomaticallyUpdateConfiguration() { return Boolean.parseBoolean(preferenceStore.get(MavenPreferenceConstants.P_AUTO_UPDATE_CONFIGURATION, null, preferencesLookup)); } public void setAutomaticallyUpdateConfiguration(boolean value) { preferencesLookup[0].putBoolean(MavenPreferenceConstants.P_AUTO_UPDATE_CONFIGURATION, value); } }