blob: 05621f5faa8211e2fcd86b8cfa56b40d1ff7ab54 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2006, 2010 VMware Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Apache License v2.0 which accompanies this distribution.
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0
* is available at http://www.opensource.org/licenses/apache2.0.php.
* You may elect to redistribute this code under either of these licenses.
*
* Contributors:
* VMware Inc.
*****************************************************************************/
package org.eclipse.gemini.blueprint.blueprint.container.support;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
import java.util.Queue;
import java.util.Set;
import java.util.SortedMap;
import java.util.SortedSet;
import java.util.Stack;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.Vector;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.springframework.beans.PropertyEditorRegistrar;
import org.springframework.beans.PropertyEditorRegistry;
import org.springframework.beans.propertyeditors.CustomCollectionEditor;
import org.springframework.beans.propertyeditors.CustomMapEditor;
import org.springframework.beans.propertyeditors.PropertiesEditor;
/**
* Registrar holding the specific Blueprint editors. This class is used by the Spring DM extender for all Blueprint
* contexts.
*
* @author Costin Leau
*/
public class BlueprintEditorRegistrar implements PropertyEditorRegistrar {
/**
* Class that changes the default Spring implementation for 'collection'. Spring uses a LinkedHashSet but Blueprint
* mandates an ArrayList.
*
* @author Costin Leau
*/
private static class BlueprintCustomCollectionEditor extends CustomCollectionEditor {
public BlueprintCustomCollectionEditor(Class<? extends Collection> collectionType) {
super(collectionType);
}
@SuppressWarnings("unchecked")
@Override
protected Collection createCollection(Class collectionType, int initialCapacity) {
if (!collectionType.isInterface()) {
try {
return (Collection) collectionType.newInstance();
} catch (Exception ex) {
throw new IllegalArgumentException("Could not instantiate collection class ["
+ collectionType.getName() + "]: " + ex.getMessage());
}
} else if (List.class.equals(collectionType)) {
return new ArrayList(initialCapacity);
} else if (Set.class.equals(collectionType)) {
return new LinkedHashSet(initialCapacity);
} else if (SortedSet.class.equals(collectionType)) {
return new TreeSet();
} else {
return new ArrayList(initialCapacity);
}
}
};
public void registerCustomEditors(PropertyEditorRegistry registry) {
// Date
registry.registerCustomEditor(Date.class, new DateEditor());
// Collection concrete types
registry.registerCustomEditor(Stack.class, new BlueprintCustomCollectionEditor(Stack.class));
registry.registerCustomEditor(Vector.class, new BlueprintCustomCollectionEditor(Vector.class));
// Spring creates a LinkedHashSet for Collection, RFC mandates an ArrayList
// reinitialize default editors
registry.registerCustomEditor(Collection.class, new BlueprintCustomCollectionEditor(Collection.class));
registry.registerCustomEditor(Set.class, new BlueprintCustomCollectionEditor(Set.class));
registry.registerCustomEditor(SortedSet.class, new BlueprintCustomCollectionEditor(SortedSet.class));
registry.registerCustomEditor(List.class, new BlueprintCustomCollectionEditor(List.class));
registry.registerCustomEditor(SortedMap.class, new CustomMapEditor(SortedMap.class));
registry.registerCustomEditor(HashSet.class, new BlueprintCustomCollectionEditor(HashSet.class));
registry.registerCustomEditor(LinkedHashSet.class, new BlueprintCustomCollectionEditor(LinkedHashSet.class));
registry.registerCustomEditor(TreeSet.class, new BlueprintCustomCollectionEditor(TreeSet.class));
registry.registerCustomEditor(ArrayList.class, new BlueprintCustomCollectionEditor(ArrayList.class));
registry.registerCustomEditor(LinkedList.class, new BlueprintCustomCollectionEditor(LinkedList.class));
// Map concrete types
registry.registerCustomEditor(HashMap.class, new CustomMapEditor(HashMap.class));
registry.registerCustomEditor(LinkedHashMap.class, new CustomMapEditor(LinkedHashMap.class));
registry.registerCustomEditor(Hashtable.class, new CustomMapEditor(Hashtable.class));
registry.registerCustomEditor(TreeMap.class, new CustomMapEditor(TreeMap.class));
registry.registerCustomEditor(Properties.class, new PropertiesEditor());
// JDK 5 types
registry.registerCustomEditor(ConcurrentMap.class, new CustomMapEditor(ConcurrentHashMap.class));
registry.registerCustomEditor(ConcurrentHashMap.class, new CustomMapEditor(ConcurrentHashMap.class));
registry.registerCustomEditor(Queue.class, new BlueprintCustomCollectionEditor(LinkedList.class));
// Legacy types
registry.registerCustomEditor(Dictionary.class, new CustomMapEditor(Hashtable.class));
}
}