blob: 3ea034f900f27b0c2eda6a11fb9ce512d5cf2210 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 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
*******************************************************************************/
package org.eclipse.wst.validation.internal.delegates;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.wst.validation.internal.ConfigurationConstants;
import org.eclipse.wst.validation.internal.core.ValidationException;
import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
import org.eclipse.wst.validation.internal.provisional.core.IValidator;
/**
* ValidatorDelegatesRegistry is a singleton used to store validator delegate
* descriptors for each delegating validator.
*/
public class ValidatorDelegatesRegistry {
/**
* The one and only instance of this registry.
*/
private static ValidatorDelegatesRegistry _instance;
/**
* Provides the one and only instance of this class.
*
* The actual platform extension registry reading happens at this time.
*
* @see ValidatorDelegatesRegistryReader
*
* @return the validator delegates registry singleton instance.
*/
public static ValidatorDelegatesRegistry getInstance() {
if (_instance == null) {
ValidatorDelegatesRegistry instance = new ValidatorDelegatesRegistry();
ValidatorDelegatesRegistryReader reader = new ValidatorDelegatesRegistryReader(instance);
reader.readRegistry();
instance.initDefaults();
_instance = instance;
}
return _instance;
}
/**
* Determine if the product defined any default delegate validators, by setting the old
* DELEGATES_PREFERENCE preference in the default preference scope. If they did, we remember
* them, so that if we every need to return a default for the delegating validator, we can return the one
* that the product requested.
*/
private void initDefaults() {
// This code was copied from the ValidationConfiguration#deserializeDelegates() method. The code was copied because this
// change is part of a patch and I didn't want to disturb the ValidationConfiguration class.
IEclipsePreferences prefs = new DefaultScope().getNode(ValidationPlugin.PLUGIN_ID);
String delegatePref = prefs.get("DELEGATES_PREFERENCE", null); //$NON-NLS-1$
if (delegatePref == null)return;
int delegatesIndex = delegatePref.indexOf(ConfigurationConstants.DELEGATE_VALIDATORS);
String delegates = delegatePref.substring(delegatesIndex + ConfigurationConstants.DELEGATE_VALIDATORS.length(), delegatePref.length());
if (delegates == null)return;
_defaultDelegates = new HashSet<String>(10);
StringTokenizer tokenizer = new StringTokenizer(delegates, ConfigurationConstants.ELEMENT_SEPARATOR);
while (tokenizer.hasMoreTokens()) {
String delegateConfiguration = tokenizer.nextToken();
int separatorIndex = delegateConfiguration.indexOf(ConfigurationConstants.DELEGATES_SEPARATOR);
// String targetID = delegateConfiguration.substring(0, separatorIndex);
String delegateID = delegateConfiguration.substring(separatorIndex + 1);
_defaultDelegates.add(delegateID);
}
}
/**
* The map of target validator id to Map of delegates by id.
*/
private Map<String, Map<String,ValidatorDelegateDescriptor>> _delegatesByTarget =
new HashMap<String, Map<String,ValidatorDelegateDescriptor>>();
/**
* Validator ids that have been defined by the product to be the default validators, for some of the delegating validtors.
*/
private Set<String> _defaultDelegates;
/**
* Adds a descriptor to the registry.
*
* @param descriptor
* The descriptor to add. Must not be null.
*/
void add(ValidatorDelegateDescriptor descriptor) {
if (descriptor == null)return;
String targetID = descriptor.getTargetID();
Map<String,ValidatorDelegateDescriptor> delegates = _delegatesByTarget.get(targetID);
if (delegates == null) {
delegates = new HashMap<String,ValidatorDelegateDescriptor>();
_delegatesByTarget.put(targetID, delegates);
}
delegates.put(descriptor.getId(), descriptor);
}
/**
* Provides the default delegate ID for the given delegating validator ID.
*
* @param targetID
* The delegating validator's ID.
* @return a String with the ID of the default delegate.
*/
public String getDefaultDelegate(String targetID)
{
Map<String,ValidatorDelegateDescriptor> delegates = getDelegateDescriptors(targetID);
if (delegates == null)return null;
if (_defaultDelegates != null){
for (ValidatorDelegateDescriptor vdd : delegates.values()){
String id = vdd.getId();
if (_defaultDelegates.contains(id))return id;
}
}
// TODO: Implement a default attribute and use that to get the default?
// What happens if two or more delegates claim to be the default one?
// For now, just pick the first one in the list.
Iterator<ValidatorDelegateDescriptor> delegatesIterator = delegates.values().iterator();
if (!delegatesIterator.hasNext())return null;
return delegatesIterator.next().getId();
}
/**
* Retrieves a delegate instance based on the target and delegate IDs.
*
* @param targetID
* the delegating validator's ID.
* @param delegateID
* the delegate validator's ID.
* @return an instance of the delegate validator or null if one cannot be
* found.
*/
public IValidator getDelegate(String targetID, String delegateID) throws ValidationException
{
ValidatorDelegateDescriptor descriptor = getDescriptor(targetID, delegateID);
if (descriptor == null)return null;
IValidator delegate = descriptor.getValidator();
return delegate;
}
/**
* Provides a map with all delegates descriptors for the given target, keyed
* by their ID.
*
* @param targetID
* the target (delegating) validator id. Must not be null.
* @return a Map <string, ValidatorDelegateDescriptor>. May be null if the ID
* passed in is not a delegating validator.
*/
public Map<String,ValidatorDelegateDescriptor> getDelegateDescriptors(String targetID) {
return _delegatesByTarget.get(targetID);
}
/**
* Finds a delegate descriptor based on the target id and delegate id.
*
* @param targetID
* the delegating validator's id
* @param delegateID
* the delegate id
* @return a ValidatorDelegateDescriptor for the given target and id or null
* if one cannot be found.
*/
public ValidatorDelegateDescriptor getDescriptor(String targetID, String delegateID)
{
Map<String,ValidatorDelegateDescriptor> delegates = _delegatesByTarget.get(targetID);
if (delegates == null || delegateID == null)return null;
ValidatorDelegateDescriptor descriptor = (ValidatorDelegateDescriptor) delegates.get(delegateID);
return descriptor;
}
/**
* Determines if a given validator has delegates.
*
* @param targetID
* the target validator id.
* @return true if the target has registered delegates, false otherwise.
*/
public boolean hasDelegates(String targetID)
{
Map<String,ValidatorDelegateDescriptor> delegatesByID = _delegatesByTarget.get(targetID);
boolean hasDelegates = (delegatesByID != null && !delegatesByID.isEmpty());
return hasDelegates;
}
}