blob: 8eec29d1625684aa2f8bf801bc8723861027b865 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2015 IBM Corporation 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:
* IBM Corporation - initial API and implementation
* Semion Chichelnitsky (semion@il.ibm.com) - bug 208564
*******************************************************************************/
package org.eclipse.ui.internal.registry;
import com.ibm.icu.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.PreferenceFilterEntry;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.internal.preferences.PreferenceTransferElement;
/**
* Preference Transfer registry reader to read extenders of the
* preferenceTransfer schema.
*
* @since 3.1
*/
public class PreferenceTransferRegistryReader extends RegistryReader {
private List preferenceTransfers;
private String pluginPoint;
/**
* Create an instance of this class.
*
* @param pluginPointId
* java.lang.String
*/
public PreferenceTransferRegistryReader(String pluginPointId) {
pluginPoint = pluginPointId;
}
/**
* Returns a new PreferenceTransferElement configured according to the
* parameters contained in the passed element.
*
* @param element
* the configuration element
* @return the preference transfer element or <code>null</code> if there was
* not enough information in the element
*/
protected PreferenceTransferElement createPreferenceTransferElement(
IConfigurationElement element) {
// PreferenceTransfers must have a class attribute
if (element.getAttribute(IWorkbenchRegistryConstants.ATT_NAME) == null) {
logMissingAttribute(element, IWorkbenchRegistryConstants.ATT_NAME);
return null;
}
// must specify a mapping
if (element.getChildren(IWorkbenchRegistryConstants.TAG_MAPPING) == null) {
logMissingElement(element, IWorkbenchRegistryConstants.TAG_MAPPING);
return null;
}
return new PreferenceTransferElement(element);
}
/**
* Returns a sorted list of preference transfers.
*
* @return an array of <code>IPreferenceTransfer</code> objects
*/
public PreferenceTransferElement[] getPreferenceTransfers() {
readPreferenceTransfers();
PreferenceTransferElement[] transfers = new PreferenceTransferElement[preferenceTransfers
.size()];
Collections.sort(preferenceTransfers, (o1, o2) -> {
String name1 = ((PreferenceTransferElement) o1).getName();
String name2 = ((PreferenceTransferElement) o2).getName();
return Collator.getInstance().compare(name1, name2);
});
preferenceTransfers.toArray(transfers);
return transfers;
}
@Override
protected boolean readElement(IConfigurationElement element) {
if (element.getName().equals(IWorkbenchRegistryConstants.TAG_TRANSFER)) {
PreferenceTransferElement transfer = createPreferenceTransferElement(element);
if (transfer != null)
preferenceTransfers.add(transfer);
return true;
}
// Allow settings transfers as well.
return element.getName().equals(
IWorkbenchRegistryConstants.TAG_SETTINGS_TRANSFER);
}
/**
* Reads the wizards in a registry.
*/
protected void readPreferenceTransfers() {
preferenceTransfers = new ArrayList();
IExtensionRegistry registry = Platform.getExtensionRegistry();
readRegistry(registry, WorkbenchPlugin.PI_WORKBENCH, pluginPoint);
}
/**
* Get the preference mappings.
*
* @param configElement
* @return the child configuration elements
*/
public static IConfigurationElement[] getMappings(
IConfigurationElement configElement) {
IConfigurationElement[] children = configElement
.getChildren(IWorkbenchRegistryConstants.TAG_MAPPING);
if (children.length < 1) {
logMissingElement(configElement,
IWorkbenchRegistryConstants.TAG_MAPPING);
return new IConfigurationElement[0];
}
return children;
}
/**
* @param element
* @return the scope attribute for this element
*/
public static String getScope(IConfigurationElement element) {
return element.getAttribute(IWorkbenchRegistryConstants.ATT_SCOPE);
}
/**
* @param element
* the configuration element
* @return a map that maps nodes to keys for this element or
* <code>null</code> for all nodes
*/
public static Map getEntry(IConfigurationElement element) {
IConfigurationElement[] entries = element.getChildren(IWorkbenchRegistryConstants.TAG_ENTRY);
if (entries.length == 0) {
return null;
}
Map map = new HashMap(entries.length);
for (IConfigurationElement entry : entries) {
IConfigurationElement[] keys = entry.getChildren(IWorkbenchRegistryConstants.ATT_KEY);
PreferenceFilterEntry[] prefFilters = null;
if (keys.length > 0) {
prefFilters = new PreferenceFilterEntry[keys.length];
for (int j = 0; j < keys.length; j++) {
IConfigurationElement keyElement = keys[j];
prefFilters[j] = new PreferenceFilterEntry(
keyElement.getAttribute(IWorkbenchRegistryConstants.ATT_NAME),
keyElement.getAttribute(IWorkbenchRegistryConstants.ATT_MATCH_TYPE));
}
}
map.put(entry.getAttribute(IWorkbenchRegistryConstants.ATT_NODE), prefFilters);
}
return map;
}
}