/******************************************************************************
* 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.metadata;
import java.net.Socket;
import java.util.Collection;
import java.util.List;
import org.osgi.service.blueprint.reflect.BeanArgument;
import org.osgi.service.blueprint.reflect.BeanMetadata;
import org.osgi.service.blueprint.reflect.BeanProperty;
import org.osgi.service.blueprint.reflect.CollectionMetadata;
import org.osgi.service.blueprint.reflect.ComponentMetadata;
import org.osgi.service.blueprint.reflect.MapEntry;
import org.osgi.service.blueprint.reflect.MapMetadata;
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.Target;
import org.osgi.service.blueprint.reflect.ValueMetadata;
/**
* @author Costin Leau
*/
public class BeanComponentMetadataTest extends BaseMetadataTest {
@Override
protected String getConfig() {
return "/org/eclipse/gemini/blueprint/blueprint/config/component-subelements.xml";
}
private BeanMetadata getLocalMetadata(String name) {
ComponentMetadata metadata = blueprintContainer.getComponentMetadata(name);
assertTrue(metadata instanceof BeanMetadata);
BeanMetadata localMetadata = (BeanMetadata) metadata;
assertEquals("the registered name doesn't match the component name", name, localMetadata.getId());
return localMetadata;
}
public void testArgumentIndex() throws Exception {
BeanMetadata localMetadata = getLocalMetadata("idref");
List<BeanArgument> list = localMetadata.getArguments();
BeanArgument arg = list.get(0);
assertEquals(-1, arg.getIndex());
}
public void testConstructorArg() throws Exception {
BeanMetadata localMetadata = getLocalMetadata("constructor-arg");
assertEquals(Integer.class.getName(), localMetadata.getClassName());
List<BeanArgument> list = localMetadata.getArguments();
assertNotNull(list);
assertEquals(1, list.size());
BeanArgument param = list.get(0);
assertEquals(0, param.getIndex());
assertEquals("int", param.getValueType());
assertEquals("3", ((ValueMetadata) param.getValue()).getStringValue());
}
public void testValueInlined() throws Exception {
BeanMetadata localMetadata = getLocalMetadata("propertyValueInline");
assertEquals(Socket.class.getName(), localMetadata.getClassName());
List<BeanProperty> props = localMetadata.getProperties();
assertEquals(1, props.size());
BeanProperty prop = props.iterator().next();
assertEquals("keepAlive", prop.getName());
assertTrue(prop.getValue() instanceof ValueMetadata);
}
public void testNullProperty() throws Exception {
BeanMetadata localMetadata = getLocalMetadata("null");
Collection<BeanProperty> props = localMetadata.getProperties();
assertEquals(1, props.size());
BeanProperty prop = props.iterator().next();
assertEquals("propA", prop.getName());
assertEquals(NullMetadata.NULL, prop.getValue());
}
public void testConstructorAndNestedValueTypes() throws Exception {
BeanMetadata localMetadata = getLocalMetadata("nestedArgs");
List<BeanArgument> params = localMetadata.getArguments();
assertEquals(1, params.size());
BeanArgument param = params.get(0);
assertEquals(String.class.getName(), param.getValueType());
System.out.println("Param value is " + param.getValue());
ValueMetadata stv = (ValueMetadata) param.getValue();
assertEquals(Boolean.class.getName(), stv.getType());
}
public void testConstructorAndNestedValueWOTypes() throws Exception {
BeanMetadata localMetadata = getLocalMetadata("nestedArgs2");
List<BeanArgument> params = localMetadata.getArguments();
assertEquals(1, params.size());
BeanArgument param = params.get(0);
assertEquals(boolean.class.getName(), param.getValueType());
System.out.println("Param value is " + param.getValue());
ValueMetadata stv = (ValueMetadata) param.getValue();
assertEquals(null, stv.getType());
}
public void testNanDouble() throws Exception {
System.out.println(blueprintContainer.getComponentInstance("nan"));
BeanMetadata localMetadata = getLocalMetadata("set");
System.out.println(localMetadata.getProperties());
}
public void testCollectionWithDefaultType() throws Exception {
BeanMetadata localMetadata = getLocalMetadata("listWDefaultType");
BeanProperty prop = (BeanProperty) localMetadata.getProperties().iterator().next();
CollectionMetadata listValue = (CollectionMetadata) prop.getValue();
assertEquals(List.class, listValue.getCollectionClass());
assertEquals(Double.class.getName(), listValue.getValueType());
List<ValueMetadata> list = listValue.getValues();
for (ValueMetadata valueString : list) {
assertNull(valueString.getType());
}
}
public void testPropertiesMetadata() throws Exception {
BeanMetadata localMetadata = getLocalMetadata("props");
BeanProperty prop = (BeanProperty) localMetadata.getProperties().iterator().next();
PropsMetadata propsValue = (PropsMetadata) prop.getValue();
System.out.println(propsValue);
// assertEquals("two", propsValue.getEntries().getProperty("one"));
}
public void testNestedRef() throws Exception {
BeanMetadata localMetadata = getLocalMetadata("nestedRef");
}
// SPR-5554
public void testStaticFactoryArgumentsOrder() throws Exception {
BeanMetadata localMetadata = getLocalMetadata("staticFactory");
List<BeanArgument> args = localMetadata.getArguments();
for (BeanArgument arg : args) {
System.out.println("StaticFactory param " + arg.getIndex());
}
assertEquals(3, args.size());
assertEquals(1, args.get(0).getIndex());
assertEquals(2, args.get(1).getIndex());
assertEquals(0, args.get(2).getIndex());
}
public void testFactoryMethod() throws Exception {
BeanMetadata localMetadata = getLocalMetadata("noArgStaticFactory");
assertEquals("staticMethod", localMetadata.getFactoryMethod());
List<BeanArgument> params = localMetadata.getArguments();
assertNotNull(params);
assertTrue(params.isEmpty());
assertTrue(localMetadata.getArguments().isEmpty());
}
public void testFactoryArgMethod() throws Exception {
BeanMetadata localMetadata = getLocalMetadata("oneArgStaticFactory");
assertNull(localMetadata.getFactoryComponent());
assertEquals("staticMethod", localMetadata.getFactoryMethod());
List<BeanArgument> params = localMetadata.getArguments();
assertNotNull(params);
assertEquals(1, params.size());
assertTrue(localMetadata.getProperties().isEmpty());
}
public void testInstanceFactoryMethod() throws Exception {
BeanMetadata localMetadata = getLocalMetadata("noArgInstanceFactory");
assertEquals("instanceMethod", localMetadata.getFactoryMethod());
assertTrue(localMetadata.getArguments().isEmpty());
Target factoryComponent = localMetadata.getFactoryComponent();
assertTrue(factoryComponent instanceof RefMetadata);
assertEquals("instanceFactory", ((RefMetadata) factoryComponent).getComponentId());
assertTrue(localMetadata.getProperties().isEmpty());
}
public void testInstanceFactoryArgMethod() throws Exception {
BeanMetadata localMetadata = getLocalMetadata("oneArgInstanceFactory");
assertEquals("instanceMethod", localMetadata.getFactoryMethod());
List params = localMetadata.getArguments();
assertNotNull(params);
assertEquals(1, params.size());
Target factoryComponent = localMetadata.getFactoryComponent();
assertTrue(factoryComponent instanceof RefMetadata);
assertEquals("instanceFactory", ((RefMetadata) factoryComponent).getComponentId());
assertTrue(localMetadata.getProperties().isEmpty());
}
public void testEmptyArray() throws Exception {
BeanMetadata localMetadata = getLocalMetadata("arrayItem");
List<BeanArgument> args = localMetadata.getArguments();
for (BeanArgument beanArgument : args) {
CollectionMetadata mt = (CollectionMetadata) beanArgument.getValue();
assertNull(mt.getValueType());
}
}
public void tstPrimitiveArray() throws Exception {
BeanMetadata localMetadata = getLocalMetadata("primitiveArray");
List<BeanArgument> args = localMetadata.getArguments();
for (BeanArgument beanArgument : args) {
CollectionMetadata mt = (CollectionMetadata) beanArgument.getValue();
assertNull(mt.getValueType());
}
}
public void testCompDateArray() throws Exception {
BeanMetadata localMetadata = getLocalMetadata("compURLArray");
System.out.println(blueprintContainer.getComponentInstance("compDateArray"));
for (BeanArgument argument : (List<BeanArgument>) localMetadata.getArguments()) {
System.out.println(argument.getValueType());
CollectionMetadata mt = (CollectionMetadata) argument.getValue();
System.out.println(mt.getValueType());
System.out.println(mt.getCollectionClass());
System.out.println(mt.getValues());
for (ValueMetadata meta : (List<ValueMetadata>) mt.getValues()) {
System.out.println(meta.getType());
System.out.println(meta.getStringValue());
}
}
}
public void testNestedBeanProperties() throws Exception {
BeanMetadata localMetadata = getLocalMetadata("nestedBeanInitializing");
List<BeanProperty> props = localMetadata.getProperties();
BeanProperty a = props.get(0);
BeanMetadata meta = (BeanMetadata) a.getValue();
assertNull(meta.getScope());
assertEquals(BeanMetadata.ACTIVATION_LAZY, meta.getActivation());
}
public void testInnerMap() throws Exception {
BeanMetadata localMetadata = getLocalMetadata("compInnerMap");
List<BeanArgument> args = localMetadata.getArguments();
BeanArgument arg = args.get(0);
assertNull(arg.getValueType());
MapMetadata meta = (MapMetadata) arg.getValue();
List<MapEntry> entries = meta.getEntries();
MapEntry entry = entries.get(0);
BeanMetadata bm = (BeanMetadata) entry.getValue();
assertNull(bm.getScope());
args = bm.getArguments();
for (BeanArgument arg1 : args) {
assertEquals(String.class.getName(), arg1.getValueType());
}
entry = entries.get(1);
bm = (BeanMetadata) entry.getValue();
List<BeanProperty> props = bm.getProperties();
for (BeanProperty beanProperty : props) {
ValueMetadata vm = (ValueMetadata) beanProperty.getValue();
assertNull(vm.getType());
}
}
public void testTypedItemMetadata() throws Exception {
BeanMetadata localMetadata = getLocalMetadata("typedItem");
List<BeanProperty> properties = localMetadata.getProperties();
BeanProperty bp = properties.get(0);
CollectionMetadata value = (CollectionMetadata) bp.getValue();
assertEquals(Double.class.getName(), value.getValueType());
List<ValueMetadata> values = value.getValues();
System.out.println(values.get(0).getStringValue());
}
}