Project: Gemini-Blueprint
/******************************************************************************
 * 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<?> collectionType) { 
   super(collectionType); 
  
 
  @Override 
  public void setValue(Object value) { 
   if (value != null && (!(value instanceof Collection)) && (!value.getClass().isArray())) { 
    throw new IllegalArgumentException("Cannot create collection from type " + value.getClass() 
      " of instance " + value); 
   
   super.setValue(value); 
  
 
  @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.classnew DateEditor()); 
  // Collection concrete types 
  registry.registerCustomEditor(Stack.classnew BlueprintCustomCollectionEditor(Stack.class)); 
  registry.registerCustomEditor(Vector.classnew BlueprintCustomCollectionEditor(Vector.class)); 
 
  // Spring creates a LinkedHashSet for Collection, RFC mandates an ArrayList 
  // reinitialize default editors 
  registry.registerCustomEditor(Collection.classnew BlueprintCustomCollectionEditor(Collection.class)); 
  registry.registerCustomEditor(Set.classnew BlueprintCustomCollectionEditor(Set.class)); 
  registry.registerCustomEditor(SortedSet.classnew BlueprintCustomCollectionEditor(SortedSet.class)); 
  registry.registerCustomEditor(List.classnew BlueprintCustomCollectionEditor(List.class)); 
  registry.registerCustomEditor(SortedMap.classnew CustomMapEditor(SortedMap.class)); 
 
  registry.registerCustomEditor(HashSet.classnew BlueprintCustomCollectionEditor(HashSet.class)); 
  registry.registerCustomEditor(LinkedHashSet.classnew BlueprintCustomCollectionEditor(LinkedHashSet.class)); 
  registry.registerCustomEditor(TreeSet.classnew BlueprintCustomCollectionEditor(TreeSet.class)); 
 
  registry.registerCustomEditor(ArrayList.classnew BlueprintCustomCollectionEditor(ArrayList.class)); 
  registry.registerCustomEditor(LinkedList.classnew BlueprintCustomCollectionEditor(LinkedList.class)); 
 
  // Map concrete types 
  registry.registerCustomEditor(HashMap.classnew CustomMapEditor(HashMap.class)); 
  registry.registerCustomEditor(LinkedHashMap.classnew CustomMapEditor(LinkedHashMap.class)); 
  registry.registerCustomEditor(Hashtable.classnew CustomMapEditor(Hashtable.class)); 
  registry.registerCustomEditor(TreeMap.classnew CustomMapEditor(TreeMap.class)); 
  registry.registerCustomEditor(Properties.classnew PropertiesEditor()); 
 
  // JDK 5 types 
  registry.registerCustomEditor(ConcurrentMap.classnew CustomMapEditor(ConcurrentHashMap.class)); 
  registry.registerCustomEditor(ConcurrentHashMap.classnew CustomMapEditor(ConcurrentHashMap.class)); 
  registry.registerCustomEditor(Queue.classnew BlueprintCustomCollectionEditor(LinkedList.class)); 
 
  // Legacy types 
  registry.registerCustomEditor(Dictionary.classnew CustomMapEditor(Hashtable.class)); 
 
}