information-system-model/src/test/java/org/gcube/informationsystem/utils/discovery/ISMDiscoveryTest.java

155 lines
6.0 KiB
Java

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<PropertyElement> 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<Version, String> typeChangelog = type.getChangelog();
Map<Version, String> 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<? extends Element> 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<Package> packages = new ArrayList<Package>();
Class<Type> tdClz = Type.class;
packages.add(tdClz.getPackage());
AccessType[] accessTypes = AccessType.values();
for(AccessType accessType : accessTypes) {
Class<Element> clz = accessType.getTypeClass();
packages.add(clz.getPackage());
}
ServiceLoader<? extends RegistrationProvider> regsitrationProviders = ServiceLoader
.load(RegistrationProvider.class);
for(RegistrationProvider registrationProvider : regsitrationProviders) {
packages.addAll(registrationProvider.getPackagesToRegister());
}
SchemaAction schemaAction = new SchemaAction() {
@Override
public <R extends RelationElement<? extends EntityElement, ? extends EntityElement>> void manageRelationClass(
Class<R> 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 <P extends PropertyElement> void managePropertyClass(Class<P> 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 <E extends EntityElement> void manageEntityClass(Class<E> 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<? extends Element> 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<PropertyDefinition>")==0);
}
}
String typeDefinitionJsonString = TypeMapper.serializeTypeDefinition(type);
logger.debug(typeDefinitionJsonString);
}
}