/*
* This code is distributed under The GNU Lesser General Public License (LGPLv3)
* Please visit GNU site for LGPLv3 http://www.gnu.org/copyleft/lesser.html
*
* Copyright Denis Pavlov 2009
* Web: http://www.genericdtoassembler.org
* SVN: https://svn.code.sf.net/p/geda-genericdto/code/trunk/
* SVN (mirror): http://geda-genericdto.googlecode.com/svn/trunk/
*/
package com.inspiresoftware.lib.dto.geda.osgi;
import com.inspiresoftware.lib.dto.geda.adapter.ExtensibleBeanFactory;
import com.inspiresoftware.lib.dto.geda.dsl.Registry;
import com.inspiresoftware.lib.dto.geda.event.DTOEventListener;
import com.inspiresoftware.lib.dto.geda.osgi.test.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.ops4j.pax.exam.Configuration;
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.ProbeBuilder;
import org.ops4j.pax.exam.TestProbeBuilder;
import org.ops4j.pax.exam.junit.PaxExam;
import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
import org.ops4j.pax.exam.spi.reactors.PerMethod;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.*;
import static org.ops4j.pax.exam.CoreOptions.*;
/**
* User: denispavlov
* Date: 13-02-19
* Time: 2:23 PM
*/
@RunWith(PaxExam.class)
@ExamReactorStrategy(PerMethod.class)
public class OSGiTest {
@Inject
private BundleContext bundleContext;
@Configuration
public Option[] configFelix() throws Exception{
return options(
cleanCaches(),
mavenBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.javassist", "3.12.1.ga_1").start(),
mavenBundle("com.inspire-software.lib.dto.geda", "geda.osgi").versionAsInProject().start(),
bootDelegationPackage("com.inspiresoftware.lib.dto.geda.osgi.test"),
junitBundles()
);
}
@ProbeBuilder
public TestProbeBuilder probeConfiguration(TestProbeBuilder probe) {
return probe;
}
@Test
public void testServicesAreSetup() throws Exception {
final Logger log = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
String vendor = bundleContext.getBundle(0).getHeaders().get(Constants.BUNDLE_VENDOR);
if (vendor == null) {
vendor = bundleContext.getBundle(0).getHeaders().get(Constants.BUNDLE_SYMBOLICNAME);
}
String version = bundleContext.getBundle(0).getHeaders().get(Constants.BUNDLE_VERSION);
log.info("\n\nOSGi Framework : {} - {} \n\n", vendor, version);
final ServiceReference<GeDAFacade> facadeReference =
bundleContext.getServiceReference(GeDAFacade.class);
assertNotNull(facadeReference);
final GeDAFacade facade =
bundleContext.getService(facadeReference);
assertNotNull(facade);
}
@Test
public void testAnnotationsSimpleByClass() throws Exception {
final ServiceReference<GeDAFacade> facadeReference =
bundleContext.getServiceReference(GeDAFacade.class);
assertNotNull(facadeReference);
final GeDAFacade facade =
bundleContext.getService(facadeReference);
assertNotNull(facade);
final DTOSupportAnnotationsService annotationsService = facade.getAnnService(this.getClass().getClassLoader());
final SimpleEntityClass entity = new SimpleEntityClass();
entity.setString("aether");
entity.setDecimal(new BigDecimal("28.97"));
entity.setInteger(1);
final SimpleDTOClass dto = new SimpleDTOClass();
final DTOEventListener expectations = new ExpectationsDTOEventListener(new Object[] { dto, entity });
annotationsService.addListener("onDtoAssembled", expectations);
annotationsService.assembleDto(dto, entity, null, "simple");
annotationsService.removeListener(expectations);
assertEquals("aether", dto.getString());
assertTrue(new BigDecimal("28.97").compareTo(dto.getDecimal()) == 0);
assertEquals(1, dto.getInteger());
final SimpleEntityClass copy = new SimpleEntityClass();
annotationsService.assembleEntity(dto, copy, null, "copy");
assertEquals("aether", copy.getString());
assertTrue(new BigDecimal("28.97").compareTo(copy.getDecimal()) == 0);
assertEquals(1, copy.getInteger());
}
@Test
public void testAnnotationsSimpleByInterface() throws Exception {
final ServiceReference<GeDAFacade> facadeReference =
bundleContext.getServiceReference(GeDAFacade.class);
assertNotNull(facadeReference);
final GeDAFacade facade =
bundleContext.getService(facadeReference);
assertNotNull(facade);
final DTOSupportAnnotationsService annotationsService = facade.getAnnService(this.getClass().getClassLoader());
final SimpleEntity entity = new SimpleEntityClass();
entity.setString("aether");
entity.setDecimal(new BigDecimal("28.97"));
entity.setInteger(1);
final SimpleDTO dto = new SimpleDTOClass();
final DTOEventListener expectations = new ExpectationsDTOEventListener(new Object[] { dto, entity });
annotationsService.addListener("onDtoAssembled", expectations);
annotationsService.assembleDto(dto, entity, null, "simple");
annotationsService.removeListener(expectations);
assertEquals("aether", dto.getString());
assertTrue(new BigDecimal("28.97").compareTo(dto.getDecimal()) == 0);
assertEquals(1, dto.getInteger());
final SimpleEntity copy = new SimpleEntityClass();
annotationsService.assembleEntity(dto, copy, null, "copy");
assertEquals("aether", copy.getString());
assertTrue(new BigDecimal("28.97").compareTo(copy.getDecimal()) == 0);
assertEquals(1, copy.getInteger());
}
@Test
public void testAnnotationsComplex() throws Exception {
final ServiceReference<GeDAFacade> facadeReference =
bundleContext.getServiceReference(GeDAFacade.class);
assertNotNull(facadeReference);
final GeDAFacade facade =
bundleContext.getService(facadeReference);
assertNotNull(facade);
final ExtensibleBeanFactory beanFactory = facade.createBeanFactory(this.getClass().getClassLoader());
final DTOSupportAnnotationsService annotationsService = facade.getAnnService(this.getClass().getClassLoader());
beanFactory.registerDto("SimpleDTO",
"com.inspiresoftware.lib.dto.geda.osgi.test.SimpleDTOClass");
beanFactory.registerEntity("SimpleEntity",
"com.inspiresoftware.lib.dto.geda.osgi.test.SimpleEntityClass",
"com.inspiresoftware.lib.dto.geda.osgi.test.SimpleEntity");
beanFactory.registerDto("ComplexDTO",
"com.inspiresoftware.lib.dto.geda.osgi.test.ComplexDTOClass");
beanFactory.registerEntity("ComplexEntity",
"com.inspiresoftware.lib.dto.geda.osgi.test.ComplexEntityClass",
"com.inspiresoftware.lib.dto.geda.osgi.test.ComplexEntity");
annotationsService.registerAdapter("EqualsByString", new EqualsByStringMatcher());
final SimpleEntity inner = (SimpleEntity) beanFactory.get("SimpleEntity");
inner.setString("aether");
inner.setDecimal(new BigDecimal("28.97"));
inner.setInteger(1);
final SimpleEntity colItem = (SimpleEntity) beanFactory.get("SimpleEntity");
colItem.setString("aqua");
colItem.setDecimal(new BigDecimal("18.0153"));
colItem.setInteger(2);
final List<SimpleEntity> col = new ArrayList<SimpleEntity>();
col.add(colItem);
final SimpleEntity mapItem = (SimpleEntity) beanFactory.get("SimpleEntity");
mapItem.setString("terra");
mapItem.setDecimal(new BigDecimal("150"));
mapItem.setInteger(3);
final Map<String, SimpleEntity> map = new HashMap<String, SimpleEntity>();
map.put(mapItem.getString(), mapItem);
final ComplexEntity entity = (ComplexEntity) beanFactory.get("ComplexEntity");
entity.setName("elements");
entity.setInner(inner);
entity.setCollection(col);
entity.setMap(map);
final ComplexDTO dto = (ComplexDTO) beanFactory.get("ComplexDTO");
final DTOEventListener expectations = new ExpectationsDTOEventListener(new Object[] { dto, entity });
annotationsService.addListener("onDtoAssembled", expectations);
annotationsService.assembleDto(dto, entity, beanFactory, "simple");
annotationsService.removeListener(expectations);
assertEquals("elements", dto.getName());
final SimpleDTO dtoInner = dto.getInner();
assertNotNull(dtoInner);
assertEquals("aether", dtoInner.getString());
assertTrue(new BigDecimal("28.97").compareTo(dtoInner.getDecimal()) == 0);
assertEquals(1, dtoInner.getInteger());
final List<SimpleDTO> dtoCol = dto.getCollection();
assertNotNull(dtoCol);
assertEquals(1, dtoCol.size());
final SimpleDTO dtoColItem = dtoCol.get(0);
assertNotNull(dtoColItem);
assertEquals("aqua", dtoColItem.getString());
assertTrue(new BigDecimal("18.0153").compareTo(dtoColItem.getDecimal()) == 0);
assertEquals(2, dtoColItem.getInteger());
final Map<String, SimpleDTO> dtoMap = dto.getMap();
assertNotNull(dtoMap);
assertEquals(1, dtoMap.size());
final Map.Entry<String, SimpleDTO> dtoMapItem = dtoMap.entrySet().iterator().next();
assertNotNull(dtoMapItem);
assertEquals("terra", dtoMapItem.getKey());
assertNotNull(dtoMapItem.getValue());
assertEquals("terra", dtoMapItem.getValue().getString());
assertTrue(new BigDecimal("150").compareTo(dtoMapItem.getValue().getDecimal()) == 0);
assertEquals(3, dtoMapItem.getValue().getInteger());
final ComplexEntity copy = new ComplexEntityClass();
annotationsService.assembleEntity(dto, copy, beanFactory, "copy");
assertEquals("elements", copy.getName());
final SimpleEntity copyInner = copy.getInner();
assertNotNull(copyInner);
assertEquals("aether", copyInner.getString());
assertTrue(new BigDecimal("28.97").compareTo(copyInner.getDecimal()) == 0);
assertEquals(1, copyInner.getInteger());
final List<SimpleEntity> copyCol = copy.getCollection();
assertNotNull(copyCol);
assertEquals(1, copyCol.size());
final SimpleEntity copyColItem = copyCol.get(0);
assertNotNull(copyColItem);
assertEquals("aqua", copyColItem.getString());
assertTrue(new BigDecimal("18.0153").compareTo(copyColItem.getDecimal()) == 0);
assertEquals(2, copyColItem.getInteger());
final Map<String, SimpleEntity> copyMap = copy.getMap();
assertNotNull(copyMap);
assertEquals(1, copyMap.size());
final Map.Entry<String, SimpleEntity> copyMapItem = copyMap.entrySet().iterator().next();
assertNotNull(copyMapItem);
assertEquals("terra", copyMapItem.getKey());
assertNotNull(copyMapItem.getValue());
assertEquals("terra", copyMapItem.getValue().getString());
assertTrue(new BigDecimal("150").compareTo(copyMapItem.getValue().getDecimal()) == 0);
assertEquals(3, copyMapItem.getValue().getInteger());
}
@Test
public void testDSLSimple() throws Exception {
final ServiceReference<GeDAFacade> facadeReference =
bundleContext.getServiceReference(GeDAFacade.class);
assertNotNull(facadeReference);
final GeDAFacade facade =
bundleContext.getService(facadeReference);
assertNotNull(facade);
final ExtensibleBeanFactory beanFactory = facade.createBeanFactory(this.getClass().getClassLoader());
final DTOSupportDSLService dslService = facade.getDSLService(this.getClass().getClassLoader());
Registry basic = dslService.getRegistry("basic");
if (basic == null) {
basic = dslService.createRegistry("basic", beanFactory);
basic.dto(SimpleDTOClass.class).alias("SimpleDTO").forEntityGeneric()
.withField("string").and().withField("decimal").and().withField("integer");
}
final SimpleEntity entity = new SimpleEntityClass();
entity.setString("aether");
entity.setDecimal(new BigDecimal("28.97"));
entity.setInteger(1);
final SimpleDTO dto = new SimpleDTOClass();
final DTOEventListener expectations = new ExpectationsDTOEventListener(new Object[] { dto, entity });
dslService.addListener("onDtoAssembled", expectations);
dslService.assembleDto(dto, entity, basic, "simple");
dslService.removeListener(expectations);
assertEquals("aether", dto.getString());
assertTrue(new BigDecimal("28.97").compareTo(dto.getDecimal()) == 0);
assertEquals(1, dto.getInteger());
final SimpleEntity copy = new SimpleEntityClass();
dslService.assembleEntity(dto, copy, basic, "copy");
assertEquals("aether", copy.getString());
assertTrue(new BigDecimal("28.97").compareTo(copy.getDecimal()) == 0);
assertEquals(1, copy.getInteger());
}
@Test
public void testDSLComplex() throws Exception {
final ServiceReference<GeDAFacade> facadeReference =
bundleContext.getServiceReference(GeDAFacade.class);
assertNotNull(facadeReference);
final GeDAFacade facade =
bundleContext.getService(facadeReference);
assertNotNull(facade);
final ExtensibleBeanFactory beanFactory = facade.createBeanFactory(this.getClass().getClassLoader());
final DTOSupportDSLService dslService = facade.getDSLService(this.getClass().getClassLoader());
Registry basic = dslService.getRegistry("basic");
if (basic == null) {
beanFactory.registerEntity("SimpleEntity",
"com.inspiresoftware.lib.dto.geda.osgi.test.SimpleEntityClass",
"com.inspiresoftware.lib.dto.geda.osgi.test.SimpleEntity");
basic = dslService.createRegistry("basic", beanFactory);
basic.dto(SimpleDTOClass.class).alias("SimpleDTO").forEntityGeneric()
.withField("string").and().withField("decimal").and().withField("integer");
basic.dto(ComplexDTOClass.class).alias("ComplexDTO").forEntityGeneric()
.withField("name").and()
.withField("inner")
.dtoBeanKey("SimpleDTO")
.entityBeanKeys("SimpleEntity").and()
.withCollection("collection")
.dtoBeanKey("SimpleDTO")
.entityBeanKeys("SimpleEntity")
.dtoToEntityMatcherKey("EqualsByString").and()
.withMap("map")
.dtoBeanKey("SimpleDTO")
.entityBeanKeys("SimpleEntity")
.dtoToEntityMatcherKey("EqualsByString").and();
}
dslService.registerAdapter("EqualsByString", new EqualsByStringMatcher());
final SimpleEntity inner = new SimpleEntityClass();
inner.setString("aether");
inner.setDecimal(new BigDecimal("28.97"));
inner.setInteger(1);
final SimpleEntity colItem = new SimpleEntityClass();
colItem.setString("aqua");
colItem.setDecimal(new BigDecimal("18.0153"));
colItem.setInteger(2);
final List<SimpleEntity> col = new ArrayList<SimpleEntity>();
col.add(colItem);
final SimpleEntity mapItem = new SimpleEntityClass();
mapItem.setString("terra");
mapItem.setDecimal(new BigDecimal("150"));
mapItem.setInteger(3);
final Map<String, SimpleEntity> map = new HashMap<String, SimpleEntity>();
map.put(mapItem.getString(), mapItem);
final ComplexEntity entity = new ComplexEntityClass();
entity.setName("elements");
entity.setInner(inner);
entity.setCollection(col);
entity.setMap(map);
final ComplexDTO dto = new ComplexDTOClass();
final DTOEventListener expectations = new ExpectationsDTOEventListener(new Object[] { dto, entity });
dslService.addListener("onDtoAssembled", expectations);
dslService.assembleDto(dto, entity, basic, "simple");
dslService.removeListener(expectations);
assertEquals("elements", dto.getName());
final SimpleDTO dtoInner = dto.getInner();
assertNotNull(dtoInner);
assertEquals("aether", dtoInner.getString());
assertTrue(new BigDecimal("28.97").compareTo(dtoInner.getDecimal()) == 0);
assertEquals(1, dtoInner.getInteger());
final List<SimpleDTO> dtoCol = dto.getCollection();
assertNotNull(dtoCol);
assertEquals(1, dtoCol.size());
final SimpleDTO dtoColItem = dtoCol.get(0);
assertNotNull(dtoColItem);
assertEquals("aqua", dtoColItem.getString());
assertTrue(new BigDecimal("18.0153").compareTo(dtoColItem.getDecimal()) == 0);
assertEquals(2, dtoColItem.getInteger());
final Map<String, SimpleDTO> dtoMap = dto.getMap();
assertNotNull(dtoMap);
assertEquals(1, dtoMap.size());
final Map.Entry<String, SimpleDTO> dtoMapItem = dtoMap.entrySet().iterator().next();
assertNotNull(dtoMapItem);
assertEquals("terra", dtoMapItem.getKey());
assertNotNull(dtoMapItem.getValue());
assertEquals("terra", dtoMapItem.getValue().getString());
assertTrue(new BigDecimal("150").compareTo(dtoMapItem.getValue().getDecimal()) == 0);
assertEquals(3, dtoMapItem.getValue().getInteger());
final ComplexEntity copy = new ComplexEntityClass();
dslService.assembleEntity(dto, copy, basic, "copy");
assertEquals("elements", copy.getName());
final SimpleEntity copyInner = copy.getInner();
assertNotNull(copyInner);
assertEquals("aether", copyInner.getString());
assertTrue(new BigDecimal("28.97").compareTo(copyInner.getDecimal()) == 0);
assertEquals(1, copyInner.getInteger());
final List<SimpleEntity> copyCol = copy.getCollection();
assertNotNull(copyCol);
assertEquals(1, copyCol.size());
final SimpleEntity copyColItem = copyCol.get(0);
assertNotNull(copyColItem);
assertEquals("aqua", copyColItem.getString());
assertTrue(new BigDecimal("18.0153").compareTo(copyColItem.getDecimal()) == 0);
assertEquals(2, copyColItem.getInteger());
final Map<String, SimpleEntity> copyMap = copy.getMap();
assertNotNull(copyMap);
assertEquals(1, copyMap.size());
final Map.Entry<String, SimpleEntity> copyMapItem = copyMap.entrySet().iterator().next();
assertNotNull(copyMapItem);
assertEquals("terra", copyMapItem.getKey());
assertNotNull(copyMapItem.getValue());
assertEquals("terra", copyMapItem.getValue().getString());
assertTrue(new BigDecimal("150").compareTo(copyMapItem.getValue().getDecimal()) == 0);
assertEquals(3, copyMapItem.getValue().getInteger());
}
}