/**
* This file is protected by Copyright.
* Please refer to the COPYRIGHT file distributed with this source distribution.
*
* This file is part of REDHAWK IDE.
*
* 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.
*
*/
// BEGIN GENERATED CODE
package gov.redhawk.eclipsecorba.library.impl;
import gov.redhawk.eclipsecorba.library.IdlLibrary;
import gov.redhawk.eclipsecorba.library.LibraryPackage;
import gov.redhawk.eclipsecorba.library.LibraryPlugin;
import gov.redhawk.eclipsecorba.library.PreferenceNodePathSet;
import gov.redhawk.eclipsecorba.library.util.RefreshIdlLibraryJob;
import gov.redhawk.model.sca.commands.ScaModelCommand;
import gov.redhawk.sca.util.PluginUtil;
import gov.redhawk.sca.util.ScopedPreferenceAccessor;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.core.variables.VariablesPlugin;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
/**
* <!-- begin-user-doc -->
* An implementation of the model object '<em><b>Preference Node Path Set</b></em>'.
* @since 4.0
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
* <ul>
* <li>{@link gov.redhawk.eclipsecorba.library.impl.PreferenceNodePathSetImpl#getQualifier <em>Qualifier</em>}</li>
* <li>{@link gov.redhawk.eclipsecorba.library.impl.PreferenceNodePathSetImpl#getKey <em>Key</em>}</li>
* <li>{@link gov.redhawk.eclipsecorba.library.impl.PreferenceNodePathSetImpl#getDelimiter <em>Delimiter</em>}</li>
* <li>{@link gov.redhawk.eclipsecorba.library.impl.PreferenceNodePathSetImpl#isFileUri <em>File Uri</em>}</li>
* <li>{@link gov.redhawk.eclipsecorba.library.impl.PreferenceNodePathSetImpl#isReplaceEnv <em>Replace Env</em>}</li>
* </ul>
* </p>
*
* @generated
*/
public class PreferenceNodePathSetImpl extends PathImpl implements PreferenceNodePathSet {
/**
* The default value of the '{@link #getQualifier() <em>Qualifier</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getQualifier()
* @generated
* @ordered
*/
protected static final String QUALIFIER_EDEFAULT = null;
/**
* The cached value of the '{@link #getQualifier() <em>Qualifier</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getQualifier()
* @generated
* @ordered
*/
protected String qualifier = QUALIFIER_EDEFAULT;
/**
* The default value of the '{@link #getKey() <em>Key</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getKey()
* @generated
* @ordered
*/
protected static final String KEY_EDEFAULT = null;
/**
* The cached value of the '{@link #getKey() <em>Key</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getKey()
* @generated
* @ordered
*/
protected String key = KEY_EDEFAULT;
/**
* The default value of the '{@link #getDelimiter() <em>Delimiter</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getDelimiter()
* @generated
* @ordered
*/
protected static final String DELIMITER_EDEFAULT = null;
/**
* The cached value of the '{@link #getDelimiter() <em>Delimiter</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getDelimiter()
* @generated
* @ordered
*/
protected String delimiter = DELIMITER_EDEFAULT;
/**
* The default value of the '{@link #isFileUri() <em>File Uri</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #isFileUri()
* @generated
* @ordered
*/
protected static final boolean FILE_URI_EDEFAULT = false;
/**
* The cached value of the '{@link #isFileUri() <em>File Uri</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #isFileUri()
* @generated
* @ordered
*/
protected boolean fileUri = FILE_URI_EDEFAULT;
/**
* The default value of the '{@link #isReplaceEnv() <em>Replace Env</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #isReplaceEnv()
* @generated
* @ordered
*/
protected static final boolean REPLACE_ENV_EDEFAULT = false;
/**
* The cached value of the '{@link #isReplaceEnv() <em>Replace Env</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #isReplaceEnv()
* @generated
* @ordered
*/
protected boolean replaceEnv = REPLACE_ENV_EDEFAULT;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected PreferenceNodePathSetImpl() {
super();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
protected EClass eStaticClass() {
return LibraryPackage.Literals.PREFERENCE_NODE_PATH_SET;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public String getQualifier() {
return qualifier;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void setQualifier(String newQualifier) {
String oldQualifier = qualifier;
qualifier = newQualifier;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, LibraryPackage.PREFERENCE_NODE_PATH_SET__QUALIFIER, oldQualifier, qualifier));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public String getKey() {
return key;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void setKey(String newKey) {
String oldKey = key;
key = newKey;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, LibraryPackage.PREFERENCE_NODE_PATH_SET__KEY, oldKey, key));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public String getDelimiter() {
return delimiter;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void setDelimiter(String newDelimiter) {
String oldDelimiter = delimiter;
delimiter = newDelimiter;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, LibraryPackage.PREFERENCE_NODE_PATH_SET__DELIMITER, oldDelimiter, delimiter));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public boolean isFileUri() {
return fileUri;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void setFileUri(boolean newFileUri) {
boolean oldFileUri = fileUri;
fileUri = newFileUri;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, LibraryPackage.PREFERENCE_NODE_PATH_SET__FILE_URI, oldFileUri, fileUri));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public boolean isReplaceEnv() {
return replaceEnv;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void setReplaceEnv(boolean newReplaceEnv) {
boolean oldReplaceEnv = replaceEnv;
replaceEnv = newReplaceEnv;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, LibraryPackage.PREFERENCE_NODE_PATH_SET__REPLACE_ENV, oldReplaceEnv, replaceEnv));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public Object eGet(int featureID, boolean resolve, boolean coreType) {
switch (featureID) {
case LibraryPackage.PREFERENCE_NODE_PATH_SET__QUALIFIER:
return getQualifier();
case LibraryPackage.PREFERENCE_NODE_PATH_SET__KEY:
return getKey();
case LibraryPackage.PREFERENCE_NODE_PATH_SET__DELIMITER:
return getDelimiter();
case LibraryPackage.PREFERENCE_NODE_PATH_SET__FILE_URI:
return isFileUri();
case LibraryPackage.PREFERENCE_NODE_PATH_SET__REPLACE_ENV:
return isReplaceEnv();
}
return super.eGet(featureID, resolve, coreType);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void eSet(int featureID, Object newValue) {
switch (featureID) {
case LibraryPackage.PREFERENCE_NODE_PATH_SET__QUALIFIER:
setQualifier((String)newValue);
return;
case LibraryPackage.PREFERENCE_NODE_PATH_SET__KEY:
setKey((String)newValue);
return;
case LibraryPackage.PREFERENCE_NODE_PATH_SET__DELIMITER:
setDelimiter((String)newValue);
return;
case LibraryPackage.PREFERENCE_NODE_PATH_SET__FILE_URI:
setFileUri((Boolean)newValue);
return;
case LibraryPackage.PREFERENCE_NODE_PATH_SET__REPLACE_ENV:
setReplaceEnv((Boolean)newValue);
return;
}
super.eSet(featureID, newValue);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void eUnset(int featureID) {
switch (featureID) {
case LibraryPackage.PREFERENCE_NODE_PATH_SET__QUALIFIER:
setQualifier(QUALIFIER_EDEFAULT);
return;
case LibraryPackage.PREFERENCE_NODE_PATH_SET__KEY:
setKey(KEY_EDEFAULT);
return;
case LibraryPackage.PREFERENCE_NODE_PATH_SET__DELIMITER:
setDelimiter(DELIMITER_EDEFAULT);
return;
case LibraryPackage.PREFERENCE_NODE_PATH_SET__FILE_URI:
setFileUri(FILE_URI_EDEFAULT);
return;
case LibraryPackage.PREFERENCE_NODE_PATH_SET__REPLACE_ENV:
setReplaceEnv(REPLACE_ENV_EDEFAULT);
return;
}
super.eUnset(featureID);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public boolean eIsSet(int featureID) {
switch (featureID) {
case LibraryPackage.PREFERENCE_NODE_PATH_SET__QUALIFIER:
return QUALIFIER_EDEFAULT == null ? qualifier != null : !QUALIFIER_EDEFAULT.equals(qualifier);
case LibraryPackage.PREFERENCE_NODE_PATH_SET__KEY:
return KEY_EDEFAULT == null ? key != null : !KEY_EDEFAULT.equals(key);
case LibraryPackage.PREFERENCE_NODE_PATH_SET__DELIMITER:
return DELIMITER_EDEFAULT == null ? delimiter != null : !DELIMITER_EDEFAULT.equals(delimiter);
case LibraryPackage.PREFERENCE_NODE_PATH_SET__FILE_URI:
return fileUri != FILE_URI_EDEFAULT;
case LibraryPackage.PREFERENCE_NODE_PATH_SET__REPLACE_ENV:
return replaceEnv != REPLACE_ENV_EDEFAULT;
}
return super.eIsSet(featureID);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public String toString() {
if (eIsProxy()) return super.toString();
StringBuffer result = new StringBuffer(super.toString());
result.append(" (qualifier: ");
result.append(qualifier);
result.append(", key: ");
result.append(key);
result.append(", delimiter: ");
result.append(delimiter);
result.append(", fileUri: ");
result.append(fileUri);
result.append(", replaceEnv: ");
result.append(replaceEnv);
result.append(')');
return result.toString();
}
{
// Handle changes to our members
eAdapters().add(new AdapterImpl() {
@Override
public void notifyChanged(final Notification msg) {
switch (msg.getFeatureID(PreferenceNodePathSet.class)) {
case LibraryPackage.PREFERENCE_NODE_PATH_SET__QUALIFIER:
if (msg.getOldStringValue() != null) {
removeQualifierPreferenceChangeListener(msg.getOldStringValue());
}
addQualifierPreferenceChangeListener(msg.getNewStringValue());
// Keep going (no break) - common code below
case LibraryPackage.PREFERENCE_NODE_PATH_SET__DELIMITER:
case LibraryPackage.PREFERENCE_NODE_PATH_SET__KEY:
case LibraryPackage.PREFERENCE_NODE_PATH_SET__FILE_URI:
case LibraryPackage.PREFERENCE_NODE_PATH_SET__REPLACE_ENV:
updateDerivedPaths();
break;
default:
break;
}
}
});
}
/**
* Stores a reference to our preference change listener. We need this in order to remove it if the qualifier gets
* changed.
*/
private IPreferenceChangeListener qualifterPreferenceChangeListener = null;
/**
* Removes the preference change listener for the previous (old) qualifier.
*
* @param oldQualifier The previous (old) qualifier
*/
private void removeQualifierPreferenceChangeListener(final String oldQualifier) {
Assert.isNotNull(this.qualifterPreferenceChangeListener);
final ScopedPreferenceAccessor accessor = new ScopedPreferenceAccessor(InstanceScope.INSTANCE, oldQualifier);
accessor.removePreferenceChangeListener(this.qualifterPreferenceChangeListener);
this.qualifterPreferenceChangeListener = null;
}
/**
* Adds a preference change listener for a new qualifier.
*
* @param newQualifier The new qualifier
*/
private void addQualifierPreferenceChangeListener(final String newQualifier) {
Assert.isTrue(this.qualifterPreferenceChangeListener == null);
final ScopedPreferenceAccessor accessor = new ScopedPreferenceAccessor(InstanceScope.INSTANCE, newQualifier);
this.qualifterPreferenceChangeListener = new IPreferenceChangeListener() {
@Override
public void preferenceChange(final PreferenceChangeEvent event) {
if (event.getKey().equals(getKey())) {
ScaModelCommand.execute(PreferenceNodePathSetImpl.this, new ScaModelCommand() {
@Override
public void execute() {
updateDerivedPaths();
}
});
// Because the preference has changed, we'll initiate a refresh job
if (eContainer() instanceof IdlLibrary) {
final RefreshIdlLibraryJob job = new RefreshIdlLibraryJob((IdlLibrary) eContainer());
job.setSystem(true);
job.schedule();
}
}
}
};
accessor.addPreferenceChangeListener(this.qualifterPreferenceChangeListener);
}
/**
* Helper method used to update the derived paths based on the current object's settings.
*/
private void updateDerivedPaths() {
getDerivedPath().clear();
if (getKey() != null && getDelimiter() != null && getQualifier() != null) {
final ScopedPreferenceAccessor accessor = new ScopedPreferenceAccessor(InstanceScope.INSTANCE, getQualifier());
final String value = accessor.getString(getKey());
final String[] values = value.split(getDelimiter());
for (String v : values) {
if ((v == null) || (v.trim().length() == 0)) {
continue;
}
if (isReplaceEnv()) {
// Let Eclipse perform any variable substitution it can
try {
v = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(v, false);
} catch (final CoreException e) {
// This shouldn't happen ever (we ask for no error reports above)
LibraryPlugin
.getPlugin()
.getLog()
.log(new Status(IStatus.ERROR, LibraryPlugin.getPlugin().getSymbolicName(),
"Unexpected error while resolving variables in preference node path (" + v + ")", e));
continue;
}
// Resolve remaining variable references using environment variables
v = PluginUtil.replaceEnvIn(v, null);
}
final URI uri;
if (isFileUri()) {
uri = URI.createFileURI(v);
} else {
uri = URI.createURI(v);
}
getDerivedPath().add(uri);
}
}
}
} //PreferenceNodePathSetImpl