/******************************************************************************* * Copyright (c) 2012, 2014 Wind River Systems, 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: * Wind River Systems - initial API and implementation *******************************************************************************/ package org.eclipse.tcf.te.launch.core.persistence; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.tcf.te.runtime.events.EventManager; /** * Launch framework default persistence delegate. */ public class DefaultPersistenceDelegate { // **** Interface methods to apply attributes only if changed. // **** // **** By default, calling a setAttribute method of the ILaunchConfigurationWorkingCopy // **** interface, marks the ILaunchConfiguration as dirty independent of the fact that the // **** real attribute value may not have changed at all. This basically leads to the UI // **** question if or if not to apply the changes made to a launch configuration by just // **** switching through the launch configuration tabs. However, it is desired functionality // **** to modify the launch configuration only if some attributes have really changed. // **** These methods here read and compare the attribute before really writing something // **** to the given ILaunchConfigurationWorkingCopy. All methods here are based on the // **** corresponding method declaration in ILaunchConfigurationWorkingCopy. /** * Checks if the given attribute value under the given attribute id if the value * has changed compared to the already stored value under the given attribute id or * if the attribute id has not been stored yet. If the attribute value is <code>null</code>, * the attribute id will be checked if it may need to get removed from the given launch * configuration working copy. * * @param wc The launch configuration working copy instance to check the attributes against. Must not be <code>null</code>. * @param attributeId The attribute id. Must not be <code>null</code>. * @param attributeValue The attribute value. * * @return <code>true</code> if the attribute value has changed compared to it's old value, <code>false</code> otherwise. */ public final static boolean isAttributeChanged(ILaunchConfigurationWorkingCopy wc, String attributeId, Object attributeValue) { boolean changed = false; Assert.isNotNull(wc); Assert.isNotNull(attributeId); try { // Read the old attribute value from the launch configuration. Map<?,?> attributes = wc.getAttributes(); // Case: If new attribute value == null and attribute id exists // --> Remove the attribute from the launch configuration. if (attributeValue == null && attributes.containsKey(attributeId)) { changed = true; } else { // Case: If new attribute value != null and attribute id does not exists // --> Store the attribute to the launch configuration. if (attributeValue != null && !attributes.containsKey(attributeId)) { changed = true; } else { // Case: If new attribute value != null and attribute id exists // --> Compare new value with old value and if not equal, // store the attribute to the launch configuration. if (attributeValue != null && attributes.containsKey(attributeId)) { Object oldAttributeValue = attributes.get(attributeId); if (! attributeValue.equals(oldAttributeValue)) { changed = true; } } } } } catch (CoreException e) { /* ignored */ } return changed; } /** * Stores the given boolean attribute value under the given attribute id if the value * has changed compared to the already stored value under the given attribute id or * if the attribute id has not been stored yet. * * @param wc The launch configuration working copy instance to apply the attribute to. Must not be <code>null</code>. * @param attributeId The attribute id to store the attribute value under. Must not be <code>null</code>. * @param attributeValue The attribute value to store under the given attribute id. */ public final static void setAttribute(ILaunchConfigurationWorkingCopy wc, String attributeId, boolean attributeValue) { if (wc == null || attributeId == null) return; if (isAttributeChanged(wc, attributeId, Boolean.valueOf(attributeValue))) { // Determine the old attribute value Object oldValue = null; if (hasAttribute(wc, attributeId)) try { oldValue = wc.getAttributes().get(attributeId); } catch (CoreException e) { /* ignored on purpose */ } // Set the new value to the launch configuration wc.setAttribute(attributeId, attributeValue); // And fire an notification event EventManager.getInstance().fireEvent(new LaunchConfigurationChangedEvent(wc, attributeId, oldValue, Boolean.valueOf(attributeValue))); } } /** * Stores the given integer attribute value under the given attribute id if the value * has changed compared to the already stored value under the given attribute id or * if the attribute id has not been stored yet. * * @param wc The launch configuration working copy instance to apply the attribute to. Must not be <code>null</code>. * @param attributeId The attribute id to store the attribute value under. Must not be <code>null</code>. * @param attributeValue The attribute value to store under the given attribute id. */ public final static void setAttribute(ILaunchConfigurationWorkingCopy wc, String attributeId, int attributeValue) { if (wc == null || attributeId == null) return; if (isAttributeChanged(wc, attributeId, Integer.valueOf(attributeValue))) { // Determine the old attribute value Object oldValue = null; if (hasAttribute(wc, attributeId)) try { oldValue = wc.getAttributes().get(attributeId); } catch (CoreException e) { /* ignored on purpose */ } // Set the new value to the launch configuration wc.setAttribute(attributeId, attributeValue); // And fire an notification event EventManager.getInstance().fireEvent(new LaunchConfigurationChangedEvent(wc, attributeId, oldValue, Integer.valueOf(attributeValue))); } } /** * Stores the given string attribute value under the given attribute id if the value * has changed compared to the already stored value under the given attribute id or * if the attribute id has not been stored yet. If the attribute value is <code>null</code>, * the attribute id will be removed from the given launch configuration working copy. * * @param wc The launch configuration working copy instance to apply the attribute to. Must not be <code>null</code>. * @param attributeId The attribute id to store the attribute value under. Must not be <code>null</code>. * @param attributeValue The attribute value to store under the given attribute id. */ public final static void setAttribute(ILaunchConfigurationWorkingCopy wc, String attributeId, String attributeValue) { if (wc == null || attributeId == null) return; if (isAttributeChanged(wc, attributeId, attributeValue)) { // Determine the old attribute value Object oldValue = null; if (hasAttribute(wc, attributeId)) try { oldValue = wc.getAttributes().get(attributeId); } catch (CoreException e) { /* ignored on purpose */ } // Set the new value to the launch configuration wc.setAttribute(attributeId, attributeValue); // And fire an notification event EventManager.getInstance().fireEvent(new LaunchConfigurationChangedEvent(wc, attributeId, oldValue, attributeValue)); } } /** * Stores the given list attribute value under the given attribute id if the value * has changed compared to the already stored value under the given attribute id or * if the attribute id has not been stored yet. If the attribute value is <code>null</code>, * the attribute id will be removed from the given launch configuration working copy. * * @param wc The launch configuration working copy instance to apply the attribute to. Must not be <code>null</code>. * @param attributeId The attribute id to store the attribute value under. Must not be <code>null</code>. * @param attributeValue The attribute value to store under the given attribute id. */ public final static void setAttribute(ILaunchConfigurationWorkingCopy wc, String attributeId, List<String> attributeValue) { if (wc == null || attributeId == null) return; if (isAttributeChanged(wc, attributeId, attributeValue)) { // Determine the old attribute value Object oldValue = null; if (hasAttribute(wc, attributeId)) try { oldValue = wc.getAttributes().get(attributeId); } catch (CoreException e) { /* ignored on purpose */ } // Set the new value to the launch configuration wc.setAttribute(attributeId, attributeValue); // And fire an notification event EventManager.getInstance().fireEvent(new LaunchConfigurationChangedEvent(wc, attributeId, oldValue, attributeValue)); } } /** * Stores the given map attribute value under the given attribute id if the value * has changed compared to the already stored value under the given attribute id or * if the attribute id has not been stored yet. If the attribute value is <code>null</code>, * the attribute id will be removed from the given launch configuration working copy. * * @param wc The launch configuration working copy instance to apply the attribute to. Must not be <code>null</code>. * @param attributeId The attribute id to store the attribute value under. Must not be <code>null</code>. * @param attributeValue The attribute value to store under the given attribute id. */ public final static void setAttribute(ILaunchConfigurationWorkingCopy wc, String attributeId, Map<String, String> attributeValue) { if (wc == null || attributeId == null) return; if (isAttributeChanged(wc, attributeId, attributeValue)) { // Determine the old attribute value Object oldValue = null; if (hasAttribute(wc, attributeId)) try { oldValue = wc.getAttributes().get(attributeId); } catch (CoreException e) { /* ignored on purpose */ } // Set the new value to the launch configuration wc.setAttribute(attributeId, attributeValue); // And fire an notification event EventManager.getInstance().fireEvent(new LaunchConfigurationChangedEvent(wc, attributeId, oldValue, attributeValue)); } } /** * Stores the given set attribute value under the given attribute id if the value * has changed compared to the already stored value under the given attribute id or * if the attribute id has not been stored yet. If the attribute value is <code>null</code>, * the attribute id will be removed from the given launch configuration working copy. * * @param wc The launch configuration working copy instance to apply the attribute to. Must not be <code>null</code>. * @param attributeId The attribute id to store the attribute value under. Must not be <code>null</code>. * @param attributeValue The attribute value to store under the given attribute id. */ public final static void setAttribute(ILaunchConfigurationWorkingCopy wc, String attributeId, Set<String> attributeValue) { if (wc == null || attributeId == null) return; if (isAttributeChanged(wc, attributeId, attributeValue)) { // Determine the old attribute value Object oldValue = null; if (hasAttribute(wc, attributeId)) try { oldValue = wc.getAttributes().get(attributeId); } catch (CoreException e) { /* ignored on purpose */ } // Set the new value to the launch configuration wc.setAttribute(attributeId, attributeValue); // And fire an notification event EventManager.getInstance().fireEvent(new LaunchConfigurationChangedEvent(wc, attributeId, oldValue, attributeValue)); } } /** * Returns the boolean attribute stored under the given attribute name or * the default value if the attribute does not exist or the read failed. * * @param lc The launch configuration to read the attribute from. Must not be <code>null</code>. * @param attributeName The attribute name. Must not be <code>null</code>. * @param defaultValue The default value. * * @return The boolean attribute or the default value. */ public final static boolean getAttribute(ILaunchConfiguration lc, String attributeName, boolean defaultValue) { Assert.isNotNull(lc); Assert.isNotNull(attributeName); boolean value = defaultValue; try { value = lc.getAttribute(attributeName, defaultValue); } catch (CoreException e) { /* ignored on purpose */ } return value; } /** * Returns the int attribute stored under the given attribute name or * the default value if the attribute does not exist or the read failed. * * @param lc The launch configuration to read the attribute from. Must not be <code>null</code>. * @param attributeName The attribute name. Must not be <code>null</code>. * @param defaultValue The default value. * * @return The int attribute or the default value. */ public final static int getAttribute(ILaunchConfiguration lc, String attributeName, int defaultValue) { Assert.isNotNull(lc); Assert.isNotNull(attributeName); int value = defaultValue; try { value = lc.getAttribute(attributeName, defaultValue); } catch (CoreException e) { /* ignored on purpose */ } return value; } /** * Returns the list attribute stored under the given attribute name or * the default value if the attribute does not exist or the read failed. * * @param lc The launch configuration to read the attribute from. Must not be <code>null</code>. * @param attributeName The attribute name. Must not be <code>null</code>. * @param defaultValue The default value. * * @return The list attribute or the default value. */ public final static List<String> getAttribute(ILaunchConfiguration lc, String attributeName, List<String> defaultValue) { Assert.isNotNull(lc); Assert.isNotNull(attributeName); List<String> value = defaultValue; try { value = lc.getAttribute(attributeName, defaultValue); } catch (CoreException e) { /* ignored on purpose */ } return value; } /** * Returns the set attribute stored under the given attribute name or * the default value if the attribute does not exist or the read failed. * * @param lc The launch configuration to read the attribute from. Must not be <code>null</code>. * @param attributeName The attribute name. Must not be <code>null</code>. * @param defaultValue The default value. * * @return The set attribute or the default value. */ public final static Set<String> getAttribute(ILaunchConfiguration lc, String attributeName, Set<String> defaultValue) { Assert.isNotNull(lc); Assert.isNotNull(attributeName); Set<String> value = defaultValue; try { value = lc.getAttribute(attributeName, defaultValue); } catch (CoreException e) { /* ignored on purpose */ } return value; } /** * Returns the map attribute stored under the given attribute name or * the default value if the attribute does not exist or the read failed. * * @param lc The launch configuration to read the attribute from. Must not be <code>null</code>. * @param attributeName The attribute name. Must not be <code>null</code>. * @param defaultValue The default value. * * @return The map attribute or the default value. */ public final static Map<String, String> getAttribute(ILaunchConfiguration lc, String attributeName, Map<String, String> defaultValue) { Assert.isNotNull(lc); Assert.isNotNull(attributeName); Map<String, String> value = defaultValue; try { value = lc.getAttribute(attributeName, defaultValue); } catch (CoreException e) { /* ignored on purpose */ } return value; } /** * Returns the string attribute stored under the given attribute name or * the default value if the attribute does not exist or the read failed. * * @param lc The launch configuration to read the attribute from. Must not be <code>null</code>. * @param attributeName The attribute name. Must not be <code>null</code>. * @param defaultValue The default value. * * @return The string attribute or the default value. */ public final static String getAttribute(ILaunchConfiguration lc, String attributeName, String defaultValue) { Assert.isNotNull(lc); Assert.isNotNull(attributeName); String value = defaultValue; try { value = lc.getAttribute(attributeName, defaultValue); } catch (CoreException e) { /* ignored on purpose */ } return value; } /** * Returns whether the given launch configuration contains an attribute of the given name. * * @param lc The launch configuration. Must not be <code>null</code>. * @param attributeName The attribute name. Must not be <code>null</code>. * * @return <code>True</code> if the launch configuration contains the attribute, <code>false</code> otherwise. */ public final static boolean hasAttribute(ILaunchConfiguration lc, String attributeName) { Assert.isNotNull(lc); Assert.isNotNull(attributeName); boolean hasAttribute = false; try { hasAttribute = lc.hasAttribute(attributeName); } catch (CoreException e) { /* ignored on purpose */ } return hasAttribute; } }