/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.aries.blueprint.plugin.model;
import com.google.common.collect.Sets;
import org.apache.aries.blueprint.plugin.BlueprintConfigurationImpl;
import org.apache.aries.blueprint.plugin.bad.BadBean1;
import org.apache.aries.blueprint.plugin.bad.BadBean2;
import org.apache.aries.blueprint.plugin.bad.BadBean3;
import org.apache.aries.blueprint.plugin.bad.BadFieldBean1;
import org.apache.aries.blueprint.plugin.bad.BadFieldBean2;
import org.apache.aries.blueprint.plugin.bad.BadFieldBean3;
import org.apache.aries.blueprint.plugin.bad.FieldBean4;
import org.apache.aries.blueprint.plugin.test.BeanWithConfig;
import org.apache.aries.blueprint.plugin.test.MyBean1;
import org.apache.aries.blueprint.plugin.test.MyBean3;
import org.apache.aries.blueprint.plugin.test.MyBean4;
import org.apache.aries.blueprint.plugin.test.MyBean5;
import org.apache.aries.blueprint.plugin.test.ServiceAImpl1;
import org.junit.Test;
import javax.inject.Named;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import static junit.framework.Assert.assertFalse;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class BeanTest {
private static final String NS_JPA1 = "http://aries.apache.org/xmlns/jpa/v1.1.0";
private static final String NS_TX1 = "http://aries.apache.org/xmlns/transactions/v1.1.0";
private final Set<String> namespaces = new HashSet<String>(Arrays.asList(NS_JPA1, NS_TX1));
private final BlueprintConfigurationImpl blueprintConfiguration = new BlueprintConfigurationImpl(namespaces, null, null);
private final Blueprint blueprint = new Blueprint(blueprintConfiguration);
@Test
public void testParseMyBean1() {
Bean bean = new Bean(MyBean1.class, blueprint);
bean.resolveDependency(blueprint);
assertEquals(MyBean1.class, bean.clazz);
assertEquals("myBean1", bean.id); // Name derived from class name
assertEquals(2, getPersistenceFields(bean).size());
assertEquals(Sets.newHashSet("em", "emf"), getPersistenceFields(bean));
assertEquals(1, bean.properties.size());
assertEquals("singleton", bean.attributes.get("scope"));
Property prop = bean.properties.iterator().next();
assertEquals("bean2", prop.name);
assertEquals("serviceA", prop.ref);
Set<TransactionalDef> expectedTxs = Sets.newHashSet(new TransactionalDef("*", "RequiresNew"),
new TransactionalDef("txNotSupported", "NotSupported"),
new TransactionalDef("txMandatory", "Mandatory"),
new TransactionalDef("txNever", "Never"),
new TransactionalDef("txRequired", "Required"),
new TransactionalDef("txOverridenWithRequiresNew", "RequiresNew"),
new TransactionalDef("txSupports", "Supports"));
assertEquals(expectedTxs, getTransactionalDefs(bean));
}
@Test
public void testParseMyBean3() {
Bean bean = new Bean(MyBean3.class, blueprint);
bean.resolveDependency(blueprint);
assertEquals(MyBean3.class, bean.clazz);
assertEquals("myBean3", bean.id); // Name derived from class name
assertEquals("There should be no persistence fields", 0, getPersistenceFields(bean).size());
assertEquals(5, bean.properties.size());
assertEquals("prototype", bean.attributes.get("scope"));
Set<TransactionalDef> expectedTxs = Sets.newHashSet(new TransactionalDef("*", "RequiresNew"),
new TransactionalDef("txNotSupported", "NotSupported"),
new TransactionalDef("txMandatory", "Mandatory"),
new TransactionalDef("txNever", "Never"),
new TransactionalDef("txRequired", "Required"),
new TransactionalDef("txRequiresNew", "RequiresNew"),
new TransactionalDef("txSupports", "Supports"));
assertEquals(expectedTxs, getTransactionalDefs(bean));
}
@Test
public void testParseNamedBean() {
Bean bean = new Bean(ServiceAImpl1.class, blueprint);
bean.resolveDependency(blueprint);
String definedName = ServiceAImpl1.class.getAnnotation(Named.class).value();
assertEquals("my1", definedName);
assertEquals("Name should be defined using @Named", definedName, bean.id);
assertEquals("There should be no persistence fields", 0, getPersistenceFields(bean).size());
assertTrue("There should be no transaction definition", getTransactionalDefs(bean).isEmpty());
assertEquals("There should be no properties", 0, bean.properties.size());
assertEquals("prototype", bean.attributes.get("scope"));
}
@Test
public void testBlueprintBundleContext() {
Bean bean = new Bean(MyBean4.class, blueprint);
bean.resolveDependency(blueprint);
Property bcProp = bean.properties.iterator().next();
assertEquals("bundleContext", bcProp.name);
assertEquals("blueprintBundleContext", bcProp.ref);
assertEquals("singleton", bean.attributes.get("scope"));
Set<TransactionalDef> expectedTxs = Sets.newHashSet(new TransactionalDef("txWithoutClassAnnotation", "Supports"));
assertEquals(expectedTxs, getTransactionalDefs(bean));
}
private Set<TransactionalDef> getTransactionalDefs(Bean bean) {
Set<String> beanWriters = bean.beanContentWriters.keySet();
Set<TransactionalDef> transactionalDefs = new HashSet<>();
for (String beanWriter : beanWriters) {
if (beanWriter.startsWith("javax.transactional.method/")) {
String[] splitId = beanWriter.split("/");
transactionalDefs.add(new TransactionalDef(splitId[2], splitId[3]));
}
}
return transactionalDefs;
}
private Set<String> getPersistenceFields(Bean bean) {
Set<String> beanWriters = bean.beanContentWriters.keySet();
Set<String> persistenceFields = new HashSet<>();
for (String beanWriter : beanWriters) {
if (beanWriter.startsWith("javax.persistence.field.")) {
persistenceFields.add(beanWriter.split("/")[1]);
}
}
return persistenceFields;
}
@Test(expected = IllegalArgumentException.class)
public void testMultipleInitMethods() {
new Bean(BadBean1.class, blueprint);
}
@Test(expected = IllegalArgumentException.class)
public void testMultipleDestroyMethods() {
new Bean(BadBean2.class, blueprint);
}
@Test(expected = UnsupportedOperationException.class)
public void testSpringNestedTransactionNotSupported() {
new Bean(BadBean3.class, blueprint);
}
@Test(expected = UnsupportedOperationException.class)
public void testBadFieldBean1() {
new Blueprint(blueprintConfiguration, BadFieldBean1.class);
}
@Test(expected = UnsupportedOperationException.class)
public void testBadFieldBean2() {
new Blueprint(blueprintConfiguration, BadFieldBean2.class);
}
@Test(expected = UnsupportedOperationException.class)
public void testBadFieldBean3() {
new Blueprint(blueprintConfiguration, BadFieldBean3.class);
}
@Test
public void testFieldBean4() {
new Blueprint(blueprintConfiguration, FieldBean4.class);
}
@Test
public void testParseBeanWithConstructorInject() {
Bean bean = new Bean(MyBean5.class, blueprint);
bean.resolveDependency(blueprint);
assertEquals(MyBean5.class, bean.clazz);
assertEquals("myBean5", bean.id); // Name derived from class name
assertTrue("There should be no persistenceUnit", getPersistenceFields(bean).isEmpty());
assertEquals(0, bean.properties.size());
assertEquals(8, bean.constructorArguments.size());
assertEquals("my2", bean.constructorArguments.get(0).getRef());
assertEquals("serviceA", bean.constructorArguments.get(1).getRef());
assertEquals("serviceB", bean.constructorArguments.get(2).getRef());
assertEquals("100", bean.constructorArguments.get(3).getValue());
assertEquals("ser1", bean.constructorArguments.get(4).getRef());
assertEquals("ser2", bean.constructorArguments.get(5).getRef());
assertEquals("serviceA", bean.constructorArguments.get(6).getRef());
assertEquals("produced2", bean.constructorArguments.get(7).getRef());
}
@Test
public void testParseBeanWithConfig() {
Bean bean = new Bean(BeanWithConfig.class, blueprint);
bean.resolveDependency(blueprint);
assertEquals("There should be a property", 1, bean.properties.size());
Property prop = bean.properties.iterator().next();
assertEquals("title", prop.name);
assertEquals("$[title]", prop.value);
}
}