package org.gcube.informationsystem.resourceregistry; import java.util.ArrayList; import java.util.List; import org.gcube.informationsystem.impl.utils.discovery.SchemaAction; import org.gcube.informationsystem.model.ISManageable; import org.gcube.informationsystem.model.discovery.ISMDiscovery; import org.gcube.informationsystem.model.embedded.Embedded; import org.gcube.informationsystem.model.embedded.ValueSchema; import org.gcube.informationsystem.model.entity.Entity; import org.gcube.informationsystem.model.relation.Relation; import org.gcube.informationsystem.resourceregistry.api.exceptions.schema.SchemaAlreadyPresentException; import org.gcube.informationsystem.resourceregistry.api.exceptions.schema.SchemaNotFoundException; import org.gcube.informationsystem.resourceregistry.dbinitialization.DatabaseEnvironment; import org.gcube.informationsystem.resourceregistry.dbinitialization.SchemaActionImpl; import org.jgrapht.graph.DefaultEdge; import org.jgrapht.traverse.BreadthFirstIterator; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DataBaseCreator { private static Logger logger = LoggerFactory.getLogger(ISMDiscovery.class); @SuppressWarnings({ "unchecked" }) @Test public void createDatabase() throws Exception{ String db = DatabaseEnvironment.DB_URI; logger.debug("Created DB {}", db); List> isManageables= new ArrayList<>(); isManageables.add((Class) Embedded.class); isManageables.add((Class) Entity.class); isManageables.add((Class) Relation.class); SchemaAction schemaAction = new SchemaActionImpl(); for(Class ism : isManageables){ ISMDiscovery ismDiscovery = new ISMDiscovery<>(ism); ismDiscovery.discover(); BreadthFirstIterator, DefaultEdge> breadthFirstIterator = new BreadthFirstIterator<>(ismDiscovery.getGraph()); List> toRetry = new ArrayList<>(); while(breadthFirstIterator.hasNext()){ Class clz = breadthFirstIterator.next(); manageClass(schemaAction, ism, clz, toRetry); List> nested = new ArrayList<>(); for(Class c : toRetry){ manageClass(schemaAction, ism, c, nested); } toRetry = nested; if(clz==Embedded.class){ schemaAction.manageEmbeddedClass(ValueSchema.class); } } for(Class c : toRetry){ manageClass(schemaAction, ism, c, null); } } } @SuppressWarnings({ "unchecked", "rawtypes" }) protected void manageClass(SchemaAction schemaAction, Class ism, Class clz, List> toRetry) throws Exception{ try { if(ism==Embedded.class){ schemaAction.manageEmbeddedClass((Class) clz); } if(ism==Entity.class){ schemaAction.manageEntityClass((Class) clz); } if(ism==Relation.class){ schemaAction.manageRelationClass((Class) clz); } } catch (SchemaNotFoundException e) { if(toRetry!=null){ toRetry.add(clz); } } catch (SchemaAlreadyPresentException e) { logger.error("{}", e.getMessage()); }catch (Exception e) { throw e; } } }