/****************************************************************************** | |
* 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)); | |
} | |
} |