package org.gcube.informationsystem.utils.discovery; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.ServiceLoader; import org.gcube.informationsystem.base.reference.AccessType; import org.gcube.informationsystem.base.reference.Element; import org.gcube.informationsystem.base.reference.entities.EntityElement; import org.gcube.informationsystem.base.reference.properties.PropertyElement; import org.gcube.informationsystem.base.reference.relations.RelationElement; import org.gcube.informationsystem.discovery.Discovery; import org.gcube.informationsystem.discovery.DiscoveryUtility; import org.gcube.informationsystem.discovery.RegistrationProvider; import org.gcube.informationsystem.discovery.SchemaAction; import org.gcube.informationsystem.types.TypeMapper; import org.gcube.informationsystem.types.reference.Type; import org.gcube.informationsystem.types.reference.properties.PropertyDefinition; import org.gcube.informationsystem.types.reference.properties.PropertyType; import org.gcube.informationsystem.utils.Version; import org.junit.Assert; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author Luca Frosini (ISTI - CNR) */ public class ISMDiscoveryTest { private static final Logger logger = LoggerFactory.getLogger(ISMDiscoveryTest.class); @Test public void testISMDIscovery() { Discovery propertyDiscovery = new Discovery<>(PropertyElement.class); propertyDiscovery.analizeISM(PropertyType.class); } private void checkType(Type type, Type expected) { Assert.assertTrue(type.getName().compareTo(expected.getName())==0); Assert.assertTrue(type.getVersion().compareTo(expected.getVersion())==0); Assert.assertTrue(type.getDescription().compareTo(expected.getDescription())==0); Assert.assertTrue(type.isAbstract() == expected.isAbstract()); Assert.assertTrue(type.getSuperClasses().containsAll(expected.getSuperClasses())); Assert.assertTrue(expected.getSuperClasses().containsAll(type.getSuperClasses())); Map typeChangelog = type.getChangelog(); Map typeManagedChangelog = expected.getChangelog(); Assert.assertTrue(typeChangelog.keySet().containsAll(typeManagedChangelog.keySet())); Assert.assertTrue(typeManagedChangelog.keySet().containsAll(typeChangelog.keySet())); for(Version typeVersion : typeChangelog.keySet()) { Assert.assertTrue(typeChangelog.get(typeVersion).compareTo(typeManagedChangelog.get(typeVersion))==0); } if(type.getProperties()!=null || expected.getProperties()!=null) { Assert.assertTrue(type.getProperties().containsAll(expected.getProperties())); Assert.assertTrue(expected.getProperties().containsAll(type.getProperties())); } } @Test public void testcheckType() throws Exception { Class clz = PropertyType.class; Type type = TypeMapper.createTypeDefinition(clz); Type expected = TypeMapper.createTypeDefinition(PropertyType.class); checkType(type, expected); String json = TypeMapper.serializeType(clz); expected = TypeMapper.deserializeTypeDefinition(json); checkType(type, expected); } @Test public void test() throws Exception { List packages = new ArrayList(); Class tdClz = Type.class; packages.add(tdClz.getPackage()); AccessType[] accessTypes = AccessType.values(); for(AccessType accessType : accessTypes) { Class clz = accessType.getTypeClass(); packages.add(clz.getPackage()); } ServiceLoader regsitrationProviders = ServiceLoader .load(RegistrationProvider.class); for(RegistrationProvider registrationProvider : regsitrationProviders) { packages.addAll(registrationProvider.getPackagesToRegister()); } SchemaAction schemaAction = new SchemaAction() { @Override public > void manageRelationClass( Class r) throws Exception { Type type = TypeMapper.createTypeDefinition(r); Assert.assertTrue(type.getName().compareTo(r.getSimpleName())==0); String typeDefinitionJsonString = TypeMapper.serializeTypeDefinition(type); logger.debug("{} {}", r.getSimpleName(), typeDefinitionJsonString); Type expected = TypeMapper.deserializeTypeDefinition(typeDefinitionJsonString); checkType(type, expected); } @Override public

void managePropertyClass(Class

p) throws Exception { Type type = TypeMapper.createTypeDefinition(p); Assert.assertTrue(type.getName().compareTo(p.getSimpleName())==0); String typeDefinitionJsonString = TypeMapper.serializeTypeDefinition(type); logger.debug("{} {}", p.getSimpleName(), typeDefinitionJsonString); Type expected = TypeMapper.deserializeTypeDefinition(typeDefinitionJsonString); checkType(type, expected); } @Override public void manageEntityClass(Class e) throws Exception { Type type = TypeMapper.createTypeDefinition(e); Assert.assertTrue(type.getName().compareTo(e.getSimpleName())==0); String typeDefinitionJsonString = TypeMapper.serializeTypeDefinition(type); logger.debug("{} {}", e.getSimpleName(), typeDefinitionJsonString); Type expected = TypeMapper.deserializeTypeDefinition(typeDefinitionJsonString); checkType(type, expected); } }; DiscoveryUtility.manageISM(schemaAction , packages); } @Test public void testTypeDefinition() throws Exception { Class clz = PropertyType.class; Type type = TypeMapper.createTypeDefinition(clz); Assert.assertTrue(type.getName().compareTo(PropertyType.NAME)==0); for(PropertyDefinition propertyDefinition : type.getProperties()) { if(propertyDefinition.getName().compareTo(PropertyType.PROPERTIES_PROPERTY)==0) { logger.debug("{}", propertyDefinition); Assert.assertTrue(propertyDefinition.getType().compareTo("Set")==0); } } String typeDefinitionJsonString = TypeMapper.serializeTypeDefinition(type); logger.debug(typeDefinitionJsonString); } }