/****************************************************************************** | |
* 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.reflect.internal.support; | |
import java.util.ArrayList; | |
import java.util.Collection; | |
import java.util.Enumeration; | |
import java.util.LinkedHashMap; | |
import java.util.List; | |
import java.util.Map; | |
import java.util.NoSuchElementException; | |
import java.util.Properties; | |
import java.util.Set; | |
import org.springframework.beans.factory.support.ManagedProperties; | |
/** | |
* Extension that adds ordering to {@link ManagedProperties} class intended for preserving declaration order. | |
* | |
* @author Costin Leau | |
*/ | |
public class OrderedManagedProperties extends ManagedProperties { | |
private final Map<Object, Object> orderedStorage = new LinkedHashMap<Object, Object>(); | |
public void clear() { | |
orderedStorage.clear(); | |
} | |
public boolean containsKey(Object key) { | |
return orderedStorage.containsKey(key); | |
} | |
public boolean containsValue(Object value) { | |
return orderedStorage.containsValue(value); | |
} | |
public Set<java.util.Map.Entry<Object, Object>> entrySet() { | |
return orderedStorage.entrySet(); | |
} | |
public boolean equals(Object o) { | |
return orderedStorage.equals(o); | |
} | |
public Object get(Object key) { | |
return orderedStorage.get(key); | |
} | |
public int hashCode() { | |
return orderedStorage.hashCode(); | |
} | |
public boolean isEmpty() { | |
return orderedStorage.isEmpty(); | |
} | |
public Set<Object> keySet() { | |
return orderedStorage.keySet(); | |
} | |
public Object put(Object key, Object value) { | |
return orderedStorage.put(key, value); | |
} | |
public void putAll(Map<? extends Object, ? extends Object> t) { | |
orderedStorage.putAll(t); | |
} | |
public Object remove(Object key) { | |
return orderedStorage.remove(key); | |
} | |
public int size() { | |
return orderedStorage.size(); | |
} | |
public Collection<Object> values() { | |
return orderedStorage.values(); | |
} | |
@Override | |
public String getProperty(String key, String defaultValue) { | |
String val = getProperty(key); | |
return (val == null ? defaultValue : val); | |
} | |
@Override | |
public String getProperty(String key) { | |
Object val = orderedStorage.get(key); | |
return (val instanceof String ? (String) val : null); | |
} | |
@Override | |
public Enumeration<?> propertyNames() { | |
return new ArrayEnumeration<String>(filter(orderedStorage.keySet(), String.class)); | |
} | |
@Override | |
public synchronized Object setProperty(String key, String value) { | |
return orderedStorage.put(key, value); | |
} | |
@Override | |
public synchronized boolean contains(Object value) { | |
return orderedStorage.containsKey(value); | |
} | |
@Override | |
public synchronized Enumeration<Object> elements() { | |
return new ArrayEnumeration<Object>(filter(orderedStorage.values(), Object.class)); | |
} | |
@Override | |
public synchronized Enumeration<Object> keys() { | |
return new ArrayEnumeration<Object>(filter(orderedStorage.keySet(), Object.class)); | |
} | |
@Override | |
public synchronized String toString() { | |
return orderedStorage.toString(); | |
} | |
public Object merge(Object parent) { | |
if (!isMergeEnabled()) { | |
throw new IllegalStateException("Not allowed to merge when the 'mergeEnabled' property is set to 'false'"); | |
} | |
if (parent == null) { | |
return this; | |
} | |
if (!(parent instanceof Properties)) { | |
throw new IllegalArgumentException("Cannot merge with object of type [" + parent.getClass() + "]"); | |
} | |
Properties merged = new OrderedManagedProperties(); | |
merged.putAll((Properties) parent); | |
merged.putAll(this); | |
return merged; | |
} | |
private <T> T[] filter(Collection<?> collection, Class<T> type) { | |
List<T> list = new ArrayList<T>(); | |
for (Object member : collection) { | |
if (type.isInstance(member)) { | |
list.add((T) member); | |
} | |
} | |
return (T[]) list.toArray(new Object[list.size()]); | |
} | |
private static class ArrayEnumeration<E> implements Enumeration<E> { | |
private final E[] array; | |
private int counter = 0; | |
ArrayEnumeration(E[] array) { | |
this.array = array; | |
} | |
public boolean hasMoreElements() { | |
return (counter < array.length); | |
} | |
public E nextElement() { | |
if (hasMoreElements()) | |
return array[counter++]; | |
throw new NoSuchElementException(); | |
} | |
} | |
} |