blob: 26cb8b23751c187421ee0071a819257a412ce48f [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.reflect;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import org.eclipse.gemini.blueprint.blueprint.reflect.internal.support.OrderedManagedProperties;
import org.osgi.service.blueprint.reflect.CollectionMetadata;
import org.osgi.service.blueprint.reflect.ComponentMetadata;
import org.osgi.service.blueprint.reflect.IdRefMetadata;
import org.osgi.service.blueprint.reflect.MapEntry;
import org.osgi.service.blueprint.reflect.MapMetadata;
import org.osgi.service.blueprint.reflect.Metadata;
import org.osgi.service.blueprint.reflect.NullMetadata;
import org.osgi.service.blueprint.reflect.PropsMetadata;
import org.osgi.service.blueprint.reflect.RefMetadata;
import org.osgi.service.blueprint.reflect.ValueMetadata;
import org.springframework.beans.BeanMetadataElement;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.RuntimeBeanNameReference;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.ManagedArray;
import org.springframework.beans.factory.support.ManagedList;
import org.springframework.beans.factory.support.ManagedMap;
import org.springframework.beans.factory.support.ManagedProperties;
import org.springframework.beans.factory.support.ManagedSet;
/**
* Adapter between OSGi's Blueprint {@link Value} and Spring {@link BeanMetadataElement}.
*
* @see ValueFactory
* @author Costin Leau
*/
class BeanMetadataElementFactory {
static BeanMetadataElement buildBeanMetadata(Metadata metadata) {
return buildBeanMetadata(metadata, null);
}
/**
* Creates the equivalent Spring metadata for the given value.
*
* @param value
* @param defaultTypeName
* @return
*/
static BeanMetadataElement buildBeanMetadata(Metadata value, String defaultTypeName) {
if (value instanceof ValueMetadata) {
ValueMetadata typedString = (ValueMetadata) value;
String specifiedType = typedString.getType();
if (specifiedType == null) {
specifiedType = defaultTypeName;
}
return new org.springframework.beans.factory.config.TypedStringValue(typedString.getStringValue(),
specifiedType);
}
if (value instanceof ComponentMetadata) {
ComponentMetadata component = (ComponentMetadata) value;
return MetadataFactory.buildBeanDefinitionFor(component);
}
// null vs non-null check
if (value instanceof NullMetadata) {
return new org.springframework.beans.factory.config.TypedStringValue(null);
}
if (value instanceof RefMetadata) {
RefMetadata reference = (RefMetadata) value;
return new RuntimeBeanReference(reference.getComponentId());
}
if (value instanceof IdRefMetadata) {
IdRefMetadata reference = (IdRefMetadata) value;
return new RuntimeBeanNameReference(reference.getComponentId());
}
if (value instanceof CollectionMetadata) {
CollectionMetadata collection = (CollectionMetadata) value;
Class<?> type = collection.getCollectionClass();
List<Metadata> values = collection.getValues();
Collection coll;
if (List.class.isAssignableFrom(type)) {
ManagedList<BeanMetadataElement> list = new ManagedList<BeanMetadataElement>(values.size());
list.setElementTypeName(collection.getValueType());
coll = list;
} else if (Set.class.isAssignableFrom(type)) {
ManagedSet<BeanMetadataElement> set = new ManagedSet<BeanMetadataElement>(values.size());
set.setElementTypeName(collection.getValueType());
coll = set;
} else if (Object[].class.isAssignableFrom(type)) {
ManagedArray array = new ManagedArray(collection.getValueType(), values.size());
coll = array;
} else {
throw new IllegalArgumentException("Cannot create collection for type " + type);
}
for (Metadata val : values) {
coll.add(BeanMetadataElementFactory.buildBeanMetadata(val, collection.getValueType()));
}
return (BeanMetadataElement) coll;
}
if (value instanceof MapMetadata) {
MapMetadata mapValue = (MapMetadata) value;
List<MapEntry> entries = mapValue.getEntries();
String defaultKeyType = mapValue.getKeyType();
String defaultValueType = mapValue.getValueType();
ManagedMap<BeanMetadataElement, BeanMetadataElement> managedMap =
new ManagedMap<BeanMetadataElement, BeanMetadataElement>(entries.size());
managedMap.setKeyTypeName(defaultKeyType);
managedMap.setValueTypeName(defaultValueType);
for (MapEntry mapEntry : entries) {
managedMap.put(BeanMetadataElementFactory.buildBeanMetadata(mapEntry.getKey(), defaultKeyType),
BeanMetadataElementFactory.buildBeanMetadata(mapEntry.getValue(), defaultValueType));
}
return managedMap;
}
if (value instanceof PropsMetadata) {
PropsMetadata propertiesValue = (PropsMetadata) value;
List<MapEntry> entries = propertiesValue.getEntries();
ManagedProperties managedProperties = new OrderedManagedProperties();
for (MapEntry mapEntry : entries) {
managedProperties.put(BeanMetadataElementFactory.buildBeanMetadata(mapEntry.getKey()),
BeanMetadataElementFactory.buildBeanMetadata(mapEntry.getValue()));
}
}
throw new IllegalArgumentException("Unknown value type " + value.getClass());
}
}