diff --git a/java/registry/src/main/java/io/opensaber/registry/config/GenericConfiguration.java b/java/registry/src/main/java/io/opensaber/registry/config/GenericConfiguration.java index 663e3f1e0..0a55dde11 100644 --- a/java/registry/src/main/java/io/opensaber/registry/config/GenericConfiguration.java +++ b/java/registry/src/main/java/io/opensaber/registry/config/GenericConfiguration.java @@ -7,12 +7,9 @@ import java.util.HashMap; import java.util.Map; -import io.opensaber.registry.util.TPGraphMain; import org.apache.commons.validator.routines.UrlValidator; import org.apache.http.client.HttpClient; import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.tinkerpop.gremlin.structure.Graph; -import org.apache.tinkerpop.gremlin.structure.Vertex; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -55,8 +52,10 @@ import io.opensaber.registry.schema.configurator.ISchemaConfigurator; import io.opensaber.registry.schema.configurator.JsonSchemaConfigurator; import io.opensaber.registry.schema.configurator.SchemaType; -import io.opensaber.registry.sink.DBShard; -import io.opensaber.registry.sink.DatabaseProvider; +import io.opensaber.registry.shard.advisory.IShardAdvisor; +import io.opensaber.registry.shard.advisory.SerialNumberShardAdvisor; +import io.opensaber.registry.shard.advisory.ShardAdvisor; +import io.opensaber.registry.sink.DBProviderFactory; import io.opensaber.registry.transform.ConfigurationHelper; import io.opensaber.registry.transform.Json2LdTransformer; import io.opensaber.registry.transform.Ld2JsonTransformer; @@ -72,7 +71,7 @@ public class GenericConfiguration implements WebMvcConfigurer { private static Logger logger = LoggerFactory.getLogger(GenericConfiguration.class); - + @Autowired private Environment environment; @@ -275,8 +274,8 @@ public RestTemplate restTemaplteProvider() throws IOException { return new RestTemplate(requestFactory); } @Bean - public DBShard dbshard(){ - return new DBShard(); + public DBProviderFactory dbProviderFactory(){ + return new DBProviderFactory(); } @Bean @@ -285,10 +284,13 @@ public DBConnectionInfoMgr dBConnectionInfoMgr(){ } @Bean - public DatabaseProvider databaseProvider() { - return dbshard().getInstance("shard1"); + public IShardAdvisor shardAdvisor() throws IOException{ + ShardAdvisor shardAdvisor = new ShardAdvisor(); + DBConnectionInfoMgr connectionInforMgr = dBConnectionInfoMgr(); + shardAdvisor.registerAdvisor(connectionInforMgr.getShardProperty(), new SerialNumberShardAdvisor(connectionInforMgr)); + return shardAdvisor.getShardAdvisor(connectionInforMgr.getShardProperty()); } - + @Bean public UrlValidator urlValidator() { @@ -358,21 +360,11 @@ public void addResourceHandlers(ResourceHandlerRegistry registry) { } } - + @Bean public HandlerExceptionResolver customExceptionHandler() { return new CustomExceptionHandler(gson()); } - @Bean - public Vertex parentVertex() { - Graph g = databaseProvider().getGraphStore(); - Vertex parentV = TPGraphMain.createParentVertex(g); - try { - g.close(); - } catch (Exception e) { - logger.info(e.getMessage()); - } - return parentV; - } + } diff --git a/java/registry/src/main/java/io/opensaber/registry/controller/RegistryController.java b/java/registry/src/main/java/io/opensaber/registry/controller/RegistryController.java index 36f4f1f09..917c9cff8 100644 --- a/java/registry/src/main/java/io/opensaber/registry/controller/RegistryController.java +++ b/java/registry/src/main/java/io/opensaber/registry/controller/RegistryController.java @@ -6,12 +6,8 @@ import java.util.List; import java.util.Map; -import com.fasterxml.jackson.databind.JsonNode; -import io.opensaber.registry.schema.configurator.ISchemaConfigurator; -import io.opensaber.registry.service.EncryptionService; -import io.opensaber.registry.sink.DatabaseProvider; -import io.opensaber.registry.util.TPGraphMain; import org.apache.jena.rdf.model.Model; +import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; @@ -23,21 +19,45 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import com.fasterxml.jackson.databind.JsonNode; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; -import io.opensaber.pojos.*; -import io.opensaber.registry.exception.*; +import io.opensaber.pojos.APIMessage; +import io.opensaber.pojos.HealthCheckResponse; +import io.opensaber.pojos.OpenSaberInstrumentation; +import io.opensaber.pojos.Response; +import io.opensaber.pojos.ResponseParams; +import io.opensaber.registry.exception.AuditFailedException; +import io.opensaber.registry.exception.EntityCreationException; +import io.opensaber.registry.exception.RecordNotFoundException; +import io.opensaber.registry.exception.TypeNotProvidedException; import io.opensaber.registry.middleware.util.Constants; import io.opensaber.registry.middleware.util.Constants.Direction; import io.opensaber.registry.middleware.util.Constants.JsonldConstants; import io.opensaber.registry.middleware.util.JSONUtil; +import io.opensaber.registry.schema.configurator.ISchemaConfigurator; +import io.opensaber.registry.service.EncryptionService; import io.opensaber.registry.service.RegistryAuditService; import io.opensaber.registry.service.RegistryService; import io.opensaber.registry.service.SearchService; -import io.opensaber.registry.transform.*; +import io.opensaber.registry.shard.advisory.ShardManager; +import io.opensaber.registry.sink.DatabaseProvider; +import io.opensaber.registry.transform.Configuration; +import io.opensaber.registry.transform.ConfigurationHelper; +import io.opensaber.registry.transform.Data; +import io.opensaber.registry.transform.ITransformer; +import io.opensaber.registry.transform.TransformationException; +import io.opensaber.registry.transform.Transformer; +import io.opensaber.registry.util.TPGraphMain; @RestController public class RegistryController { @@ -58,8 +78,6 @@ public class RegistryController { @Autowired private APIMessage apiMessage; @Autowired - private DatabaseProvider databaseProvider; - @Autowired private ISchemaConfigurator schemaConfigurator; @Autowired private EncryptionService encryptionService; @@ -71,89 +89,9 @@ public class RegistryController { @Autowired private OpenSaberInstrumentation watch; private List keyToPurge = new java.util.ArrayList<>(); - @Autowired - private Vertex parentVertex; - - @RequestMapping(value = "/add2", method = RequestMethod.POST) - public ResponseEntity add(@RequestParam(value = "id", required = false) String id, - @RequestParam(value = "prop", required = false) String property) { - - Model rdf = (Model) apiMessage.getLocalMap(Constants.CONTROLLER_INPUT); - ResponseParams responseParams = new ResponseParams(); - Response response = new Response(Response.API_ID.CREATE, "OK", responseParams); - Map result = new HashMap<>(); - - try { - watch.start("RegistryController.addToExistingEntity"); - String dataObject = apiMessage.getLocalMap(Constants.LD_OBJECT).toString(); - String label = registryService.addEntity(rdf, dataObject, id, property); - result.put("entity", label); - response.setResult(result); - responseParams.setStatus(Response.Status.SUCCESSFUL); - watch.stop("RegistryController.addToExistingEntity"); - logger.debug("RegistryController : Entity with label {} added !", label); - } catch (DuplicateRecordException | EntityCreationException e) { - logger.error("DuplicateRecordException|EntityCreationException in controller while adding entity !", e); - response.setResult(result); - responseParams.setStatus(Response.Status.UNSUCCESSFUL); - responseParams.setErrmsg(e.getMessage()); - } catch (Exception e) { - logger.error("Exception in controller while adding entity !", e); - response.setResult(result); - responseParams.setStatus(Response.Status.UNSUCCESSFUL); - responseParams.setErrmsg(e.getMessage()); - } - return new ResponseEntity<>(response, HttpStatus.OK); - } - - /** - * - * Note: Only one mime type is supported at a time. Picks up the first mime - * type from the header. - * - * @return - */ - @RequestMapping(value = "/read2", method = RequestMethod.POST) - public ResponseEntity readEntity(@RequestHeader HttpHeaders header) { - - ResponseParams responseParams = new ResponseParams(); - Response response = new Response(Response.API_ID.READ, "OK", responseParams); - String dataObject = apiMessage.getRequest().getRequestMapAsString(); - JSONParser parser = new JSONParser(); - try { - JSONObject json = (JSONObject) parser.parse(dataObject); - String entityId = registryContext + json.get("id").toString(); - boolean includeSign = Boolean.parseBoolean(json.getOrDefault("includeSignatures", false).toString()); - - watch.start("RegistryController.readEntity"); - String content = registryService.getEntityFramedById(entityId, includeSign); - logger.info("RegistryController: Framed content " + content); - - Configuration config = configurationHelper.getConfiguration(header.getAccept().iterator().next().toString(), - Direction.OUT); - Data data = new Data(content); - ITransformer responseTransformer = transformer.getInstance(config); - responseTransformer.setPurgeData(getKeysToPurge()); - Data responseContent = responseTransformer.transform(data); - response.setResult(responseContent.getData()); - responseParams.setStatus(Response.Status.SUCCESSFUL); - watch.stop("RegistryController.readEntity"); - logger.debug("RegistryController: entity for {} read !", entityId); - } catch (ParseException | RecordNotFoundException | UnsupportedOperationException | TransformationException e) { - logger.error("RegistryController: Exception while reading entity !", e); - response.setResult(null); - responseParams.setStatus(Response.Status.UNSUCCESSFUL); - responseParams.setErrmsg(e.getMessage()); - } catch (Exception e) { - logger.error("RegistryController: Exception while reading entity!", e); - response.setResult(null); - responseParams.setStatus(Response.Status.UNSUCCESSFUL); - responseParams.setErrmsg("Ding! You encountered an error!"); - } - - return new ResponseEntity<>(response, HttpStatus.OK); - } + @Autowired + ShardManager shardManager; /** * * Note: Only one mime type is supported at a time. Pick up the first mime @@ -327,10 +265,16 @@ public ResponseEntity addTP2Graph(@RequestParam(value = "id", required Map result = new HashMap<>(); String jsonString = apiMessage.getRequest().getRequestMapAsString(); List privateProperties = schemaConfigurator.getAllPrivateProperties(); - //String jsonString = "{\"Teacher\":{\"signatures\":{\"@type\":\"sc:GraphSignature2012\",\"signatureFor\":\"http://localhost:8080/serialNum\",\"creator\":\"https://example.com/i/pat/keys/5\",\"created\":\"2017-09-23T20:21:34Z\",\"nonce\":\"2bbgh3dgjg2302d-d2b3gi423d42\",\"signatureValue\":\"eyiOiJKJ0eXA...OEjgFWFXk\"},\"serialNum\":6,\"teacherCode\":\"12234\",\"nationalIdentifier\":\"1234567890123456\",\"teacherName\":\"FromRajeshLaptop\",\"gender\":\"GenderTypeCode-MALE\",\"birthDate\":\"1990-12-06\",\"socialCategory\":\"SocialCategoryTypeCode-GENERAL\",\"highestAcademicQualification\":\"AcademicQualificationTypeCode-PHD\",\"highestTeacherQualification\":\"TeacherQualificationTypeCode-MED\",\"yearOfJoiningService\":\"2014\",\"teachingRole\":{\"@type\":\"TeachingRole\",\"teacherType\":\"TeacherTypeCode-HEAD\",\"appointmentType\":\"TeacherAppointmentTypeCode-REGULAR\",\"classesTaught\":\"ClassTypeCode-SECONDARYANDHIGHERSECONDARY\",\"appointedForSubjects\":\"SubjectCode-ENGLISH\",\"mainSubjectsTaught\":\"SubjectCode-SOCIALSTUDIES\",\"appointmentYear\":\"2015\"},\"inServiceTeacherTrainingFromBRC\":{\"@type\":\"InServiceTeacherTrainingFromBlockResourceCentre\",\"daysOfInServiceTeacherTraining\":\"10\"},\"inServiceTeacherTrainingFromCRC\":{\"@type\":\"InServiceTeacherTrainingFromClusterResourceCentre\",\"daysOfInServiceTeacherTraining\":\"2\"},\"inServiceTeacherTrainingFromDIET\":{\"@type\":\"InServiceTeacherTrainingFromDIET\",\"daysOfInServiceTeacherTraining\":\"5.5\"},\"inServiceTeacherTrainingFromOthers\":{\"@type\":\"InServiceTeacherTrainingFromOthers\",\"daysOfInServiceTeacherTraining\":\"3.5\"},\"nonTeachingAssignmentsForAcademicCalendar\":{\"@type\":\"NonTeachingAssignmentsForAcademicCalendar\",\"daysOfNonTeachingAssignments\":\"6\"},\"basicProficiencyLevel\":{\"@type\":\"BasicProficiencyLevel\",\"proficiencySubject\":\"SubjectCode-MATH\",\"proficiencyAcademicQualification\":\"AcademicQualificationTypeCode-PHD\"},\"disabilityType\":\"DisabilityCode-NA\",\"trainedForChildrenSpecialNeeds\":\"YesNoCode-YES\",\"trainedinUseOfComputer\":\"YesNoCode-YES\"}}}"; - TPGraphMain tpGraph = new TPGraphMain(databaseProvider, parentVertex, privateProperties, encryptionService); + String entityType = apiMessage.getRequest().getEntityType(); + int slNum = (int) ((HashMap) apiMessage.getRequest().getRequestMap().get(entityType)) + .get(shardManager.getShardProperty()); try { + shardManager.activateDbShard(slNum); + DatabaseProvider databaseProvider = shardManager.getDatabaseProvider(); + Vertex parentVertex = parentVertex(databaseProvider); + TPGraphMain tpGraph = new TPGraphMain(databaseProvider, parentVertex, privateProperties, encryptionService); + watch.start("RegistryController.addToExistingEntity"); JsonNode rootNode = tpGraph.createEncryptedJson(jsonString); tpGraph.createTPGraph(rootNode); @@ -357,6 +301,8 @@ public ResponseEntity readGraph2Json(@RequestHeader HttpHeaders header String osIdVal = json.get("id").toString(); ResponseParams responseParams = new ResponseParams(); List privateProperties = schemaConfigurator.getAllPrivateProperties(); + DatabaseProvider databaseProvider = shardManager.getDatabaseProvider(); + Vertex parentVertex = parentVertex(databaseProvider); TPGraphMain tpGraph = new TPGraphMain(databaseProvider, parentVertex, privateProperties, encryptionService); Response response = new Response(Response.API_ID.READ, "OK", responseParams); response.setResult(tpGraph.readGraph2Json(osIdVal)); @@ -372,5 +318,16 @@ private List getKeysToPurge() { return keyToPurge; } + + private Vertex parentVertex(DatabaseProvider databaseProvider) { + Graph g = databaseProvider.getGraphStore(); + Vertex parentV = TPGraphMain.createParentVertex(g); + try { + g.close(); + } catch (Exception e) { + logger.info(e.getMessage()); + } + return parentV; + } } diff --git a/java/registry/src/main/java/io/opensaber/registry/dao/RegistryDao.java b/java/registry/src/main/java/io/opensaber/registry/dao/RegistryDao.java index 3f8b09221..bb6e2387b 100644 --- a/java/registry/src/main/java/io/opensaber/registry/dao/RegistryDao.java +++ b/java/registry/src/main/java/io/opensaber/registry/dao/RegistryDao.java @@ -10,6 +10,7 @@ import io.opensaber.registry.exception.DuplicateRecordException; import io.opensaber.registry.exception.EncryptionException; import io.opensaber.registry.exception.RecordNotFoundException; +import io.opensaber.registry.sink.DatabaseProvider; public interface RegistryDao { @@ -33,4 +34,7 @@ public Graph getEntityByVertex(Vertex vertex) public String getRootLabelForNodeLabel(String nodeLabel); public String getTypeForNodeLabel(String label); + + public void setDatabaseProvider(DatabaseProvider databaseProvider); + } diff --git a/java/registry/src/main/java/io/opensaber/registry/dao/SearchDao.java b/java/registry/src/main/java/io/opensaber/registry/dao/SearchDao.java index b3dcdf689..e2aa22371 100644 --- a/java/registry/src/main/java/io/opensaber/registry/dao/SearchDao.java +++ b/java/registry/src/main/java/io/opensaber/registry/dao/SearchDao.java @@ -8,10 +8,13 @@ import io.opensaber.registry.exception.AuditFailedException; import io.opensaber.registry.exception.EncryptionException; import io.opensaber.registry.exception.RecordNotFoundException; +import io.opensaber.registry.sink.DatabaseProvider; public interface SearchDao { public Map search(SearchQuery searchQuery) throws AuditFailedException, EncryptionException, RecordNotFoundException; + + public void setDatabaseProvider(DatabaseProvider databaseProvider); } diff --git a/java/registry/src/main/java/io/opensaber/registry/dao/impl/RegistryDaoImpl.java b/java/registry/src/main/java/io/opensaber/registry/dao/impl/RegistryDaoImpl.java index 016679315..97e79cf59 100644 --- a/java/registry/src/main/java/io/opensaber/registry/dao/impl/RegistryDaoImpl.java +++ b/java/registry/src/main/java/io/opensaber/registry/dao/impl/RegistryDaoImpl.java @@ -1,17 +1,37 @@ package io.opensaber.registry.dao.impl; -import java.util.*; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Objects; +import java.util.Optional; +import java.util.Stack; +import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; -import io.opensaber.registry.schema.configurator.ISchemaConfigurator; import org.apache.commons.lang.StringUtils; import org.apache.commons.validator.routines.UrlValidator; -import org.apache.jena.rdf.model.*; +import org.apache.jena.rdf.model.Literal; +import org.apache.jena.rdf.model.NodeIterator; +import org.apache.jena.rdf.model.RDFNode; +import org.apache.jena.rdf.model.ResIterator; +import org.apache.jena.rdf.model.Resource; +import org.apache.jena.rdf.model.ResourceFactory; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; -import org.apache.tinkerpop.gremlin.structure.*; +import org.apache.tinkerpop.gremlin.structure.Direction; +import org.apache.tinkerpop.gremlin.structure.Edge; +import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.Property; +import org.apache.tinkerpop.gremlin.structure.T; +import org.apache.tinkerpop.gremlin.structure.Transaction; +import org.apache.tinkerpop.gremlin.structure.Vertex; +import org.apache.tinkerpop.gremlin.structure.VertexProperty; import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph; import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils; import org.javatuples.Pair; @@ -35,6 +55,7 @@ import io.opensaber.registry.middleware.util.Constants; import io.opensaber.registry.model.AuditRecord; import io.opensaber.registry.schema.config.SchemaLoader; +import io.opensaber.registry.schema.configurator.ISchemaConfigurator; import io.opensaber.registry.sink.DatabaseProvider; @Component @@ -45,7 +66,6 @@ public class RegistryDaoImpl implements RegistryDao { private static Logger logger = LoggerFactory.getLogger(RegistryDaoImpl.class); @Autowired ApplicationContext appContext; - @Autowired private DatabaseProvider databaseProvider; @Value("${registry.context.base}") private String registryContext; @@ -1013,5 +1033,9 @@ private Long getValueConstraint(String constraint, Resource subject) { } return null; } + @Override + public void setDatabaseProvider(DatabaseProvider databaseProvider) { + this.databaseProvider = databaseProvider; + } } diff --git a/java/registry/src/main/java/io/opensaber/registry/dao/impl/SearchDaoImpl.java b/java/registry/src/main/java/io/opensaber/registry/dao/impl/SearchDaoImpl.java index 80a8aa0c0..47467e0d8 100644 --- a/java/registry/src/main/java/io/opensaber/registry/dao/impl/SearchDaoImpl.java +++ b/java/registry/src/main/java/io/opensaber/registry/dao/impl/SearchDaoImpl.java @@ -1,6 +1,11 @@ package io.opensaber.registry.dao.impl; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import org.apache.commons.validator.routines.UrlValidator; import org.apache.tinkerpop.gremlin.process.traversal.P; @@ -25,7 +30,6 @@ @Component public class SearchDaoImpl implements SearchDao { - @Autowired private DatabaseProvider databaseProvider; @Autowired @@ -117,4 +121,10 @@ private void updateValueList(Object value, List valueIriList, List value } } + @Override + public void setDatabaseProvider(DatabaseProvider databaseProvider) { + this.databaseProvider = databaseProvider; + + } + } diff --git a/java/registry/src/main/java/io/opensaber/registry/model/AuditRecordReader.java b/java/registry/src/main/java/io/opensaber/registry/model/AuditRecordReader.java index 9ff4bc93a..7b61a1a69 100644 --- a/java/registry/src/main/java/io/opensaber/registry/model/AuditRecordReader.java +++ b/java/registry/src/main/java/io/opensaber/registry/model/AuditRecordReader.java @@ -12,12 +12,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationContext; -import org.springframework.stereotype.Component; import io.opensaber.registry.exception.audit.LabelCannotBeNullException; import io.opensaber.registry.sink.DatabaseProvider; -@Component public class AuditRecordReader { private static Logger logger = LoggerFactory.getLogger(AuditRecordReader.class); diff --git a/java/registry/src/main/java/io/opensaber/registry/model/DBConnectionInfoMgr.java b/java/registry/src/main/java/io/opensaber/registry/model/DBConnectionInfoMgr.java index 36326d76e..084742ed8 100644 --- a/java/registry/src/main/java/io/opensaber/registry/model/DBConnectionInfoMgr.java +++ b/java/registry/src/main/java/io/opensaber/registry/model/DBConnectionInfoMgr.java @@ -20,6 +20,10 @@ public class DBConnectionInfoMgr { * as of today. */ private String provider; + /** + * Only one property is allowed. + */ + private String shardProperty; /** * Each DBConnectionInfo is a shard connection information. */ @@ -58,5 +62,13 @@ public DBConnectionInfo getDBConnectionInfo(String shardId){ return null; } + public String getShardProperty() { + return shardProperty; + } + + public void setShardProperty(String shardProperty) { + this.shardProperty = shardProperty; + } + } diff --git a/java/registry/src/main/java/io/opensaber/registry/service/RegistryService.java b/java/registry/src/main/java/io/opensaber/registry/service/RegistryService.java index 6bd0c86ba..585812781 100644 --- a/java/registry/src/main/java/io/opensaber/registry/service/RegistryService.java +++ b/java/registry/src/main/java/io/opensaber/registry/service/RegistryService.java @@ -8,7 +8,15 @@ import com.github.jsonldjava.core.JsonLdError; import io.opensaber.pojos.HealthCheckResponse; -import io.opensaber.registry.exception.*; +import io.opensaber.registry.exception.AuditFailedException; +import io.opensaber.registry.exception.DuplicateRecordException; +import io.opensaber.registry.exception.EncryptionException; +import io.opensaber.registry.exception.EntityCreationException; +import io.opensaber.registry.exception.MultipleEntityException; +import io.opensaber.registry.exception.RecordNotFoundException; +import io.opensaber.registry.exception.SignatureException; +import io.opensaber.registry.exception.UpdateException; +import io.opensaber.registry.sink.DatabaseProvider; public interface RegistryService { @@ -38,5 +46,7 @@ public Model getEntityById(String id, boolean includeSignatures) public String getEntityFramedById(String id, boolean includeSignatures) throws RecordNotFoundException, EncryptionException, AuditFailedException, IOException, MultipleEntityException, EntityCreationException; + + public void setDatabaseProvider(DatabaseProvider databaseProvider); } diff --git a/java/registry/src/main/java/io/opensaber/registry/service/SearchService.java b/java/registry/src/main/java/io/opensaber/registry/service/SearchService.java index 704221a01..13d47cb44 100644 --- a/java/registry/src/main/java/io/opensaber/registry/service/SearchService.java +++ b/java/registry/src/main/java/io/opensaber/registry/service/SearchService.java @@ -4,7 +4,13 @@ import org.apache.jena.rdf.model.Model; -import io.opensaber.registry.exception.*; +import io.opensaber.registry.exception.AuditFailedException; +import io.opensaber.registry.exception.EncryptionException; +import io.opensaber.registry.exception.EntityCreationException; +import io.opensaber.registry.exception.MultipleEntityException; +import io.opensaber.registry.exception.RecordNotFoundException; +import io.opensaber.registry.exception.TypeNotProvidedException; +import io.opensaber.registry.sink.DatabaseProvider; public interface SearchService { @@ -13,5 +19,6 @@ public org.eclipse.rdf4j.model.Model search(Model model) public String searchFramed(Model model) throws AuditFailedException, EncryptionException, RecordNotFoundException, TypeNotProvidedException, IOException, MultipleEntityException, EntityCreationException; - + + public void setDatabaseProvider(DatabaseProvider databaseProvider); } diff --git a/java/registry/src/main/java/io/opensaber/registry/service/impl/RegistryServiceImpl.java b/java/registry/src/main/java/io/opensaber/registry/service/impl/RegistryServiceImpl.java index e7588f3c4..8880722e6 100755 --- a/java/registry/src/main/java/io/opensaber/registry/service/impl/RegistryServiceImpl.java +++ b/java/registry/src/main/java/io/opensaber/registry/service/impl/RegistryServiceImpl.java @@ -9,13 +9,20 @@ import java.util.List; import java.util.Map; -import io.opensaber.registry.schema.configurator.ISchemaConfigurator; import org.apache.commons.lang3.StringUtils; import org.apache.jena.datatypes.RDFDatatype; import org.apache.jena.datatypes.TypeMapper; import org.apache.jena.ext.com.google.common.io.ByteStreams; import org.apache.jena.query.DatasetFactory; -import org.apache.jena.rdf.model.*; +import org.apache.jena.rdf.model.Literal; +import org.apache.jena.rdf.model.Model; +import org.apache.jena.rdf.model.ModelFactory; +import org.apache.jena.rdf.model.Property; +import org.apache.jena.rdf.model.RDFNode; +import org.apache.jena.rdf.model.Resource; +import org.apache.jena.rdf.model.ResourceFactory; +import org.apache.jena.rdf.model.Statement; +import org.apache.jena.rdf.model.StmtIterator; import org.apache.jena.riot.JsonLDWriteContext; import org.apache.jena.riot.RDFDataMgr; import org.apache.jena.riot.WriterDatasetRIOT; @@ -36,11 +43,19 @@ import io.opensaber.pojos.ComponentHealthInfo; import io.opensaber.pojos.HealthCheckResponse; import io.opensaber.registry.dao.RegistryDao; -import io.opensaber.registry.exception.*; +import io.opensaber.registry.exception.AuditFailedException; +import io.opensaber.registry.exception.DuplicateRecordException; +import io.opensaber.registry.exception.EncryptionException; +import io.opensaber.registry.exception.EntityCreationException; +import io.opensaber.registry.exception.MultipleEntityException; +import io.opensaber.registry.exception.RecordNotFoundException; +import io.opensaber.registry.exception.SignatureException; +import io.opensaber.registry.exception.UpdateException; import io.opensaber.registry.middleware.util.Constants; import io.opensaber.registry.middleware.util.JSONUtil; import io.opensaber.registry.middleware.util.RDFUtil; import io.opensaber.registry.model.RegistrySignature; +import io.opensaber.registry.schema.configurator.ISchemaConfigurator; import io.opensaber.registry.service.EncryptionService; import io.opensaber.registry.service.RegistryService; import io.opensaber.registry.service.SignatureService; @@ -53,8 +68,8 @@ public class RegistryServiceImpl implements RegistryService { private static final String ID_REGEX = "\"@id\"\\s*:\\s*\"_:[a-z][0-9]+\","; private static Logger logger = LoggerFactory.getLogger(RegistryServiceImpl.class); - @Autowired - DatabaseProvider databaseProvider; + private DatabaseProvider databaseProvider; + @Autowired EncryptionService encryptionService; @Autowired @@ -473,4 +488,10 @@ public String getEntityFramedById(String id, boolean includeSignatures) throws R } return frameEntity(jenaEntityModel); } + + @Override + public void setDatabaseProvider(DatabaseProvider databaseProvider) { + this.databaseProvider = databaseProvider; + registryDao.setDatabaseProvider(this.databaseProvider); + } } \ No newline at end of file diff --git a/java/registry/src/main/java/io/opensaber/registry/service/impl/SearchServiceImpl.java b/java/registry/src/main/java/io/opensaber/registry/service/impl/SearchServiceImpl.java index e1e55b8e0..f91f79210 100644 --- a/java/registry/src/main/java/io/opensaber/registry/service/impl/SearchServiceImpl.java +++ b/java/registry/src/main/java/io/opensaber/registry/service/impl/SearchServiceImpl.java @@ -11,11 +11,17 @@ import io.opensaber.pojos.SearchQuery; import io.opensaber.registry.dao.SearchDao; -import io.opensaber.registry.exception.*; +import io.opensaber.registry.exception.AuditFailedException; +import io.opensaber.registry.exception.EncryptionException; +import io.opensaber.registry.exception.EntityCreationException; +import io.opensaber.registry.exception.MultipleEntityException; +import io.opensaber.registry.exception.RecordNotFoundException; +import io.opensaber.registry.exception.TypeNotProvidedException; import io.opensaber.registry.frame.FrameEntity; import io.opensaber.registry.middleware.util.Constants; import io.opensaber.registry.middleware.util.SearchUtil; import io.opensaber.registry.service.SearchService; +import io.opensaber.registry.sink.DatabaseProvider; import io.opensaber.utils.converters.RDF2Graph; @Component @@ -63,4 +69,9 @@ public String searchFramed(Model model) throws AuditFailedException, EncryptionE return frameEntity.getContent(resultModel); } + @Override + public void setDatabaseProvider(DatabaseProvider databaseProvider) { + searchDao.setDatabaseProvider(databaseProvider); + } + } diff --git a/java/registry/src/main/java/io/opensaber/registry/shard/advisory/IShardAdvisor.java b/java/registry/src/main/java/io/opensaber/registry/shard/advisory/IShardAdvisor.java new file mode 100644 index 000000000..92c4b0c55 --- /dev/null +++ b/java/registry/src/main/java/io/opensaber/registry/shard/advisory/IShardAdvisor.java @@ -0,0 +1,9 @@ +package io.opensaber.registry.shard.advisory; + +import io.opensaber.registry.model.DBConnectionInfo; + +public interface IShardAdvisor { + + public DBConnectionInfo getShard(Object attribute); + public String shardId(); +} diff --git a/java/registry/src/main/java/io/opensaber/registry/shard/advisory/SerialNumberShardAdvisor.java b/java/registry/src/main/java/io/opensaber/registry/shard/advisory/SerialNumberShardAdvisor.java new file mode 100644 index 000000000..6202a8af2 --- /dev/null +++ b/java/registry/src/main/java/io/opensaber/registry/shard/advisory/SerialNumberShardAdvisor.java @@ -0,0 +1,49 @@ +package io.opensaber.registry.shard.advisory; + +import org.springframework.stereotype.Component; + +import io.opensaber.registry.model.DBConnectionInfo; +import io.opensaber.registry.model.DBConnectionInfoMgr; + +@Component +public class SerialNumberShardAdvisor implements IShardAdvisor { + + private String shardId; + private DBConnectionInfoMgr dBConnectionInfoMgr; + + public SerialNumberShardAdvisor(DBConnectionInfoMgr dBConnectionInfoMgr) { + this.dBConnectionInfoMgr = dBConnectionInfoMgr; + } + + /** + * Based on serialNum, choosing the shard. + * If serialNum is even, choose shard with id ‘shard1’ + * If serialNum is odd , choose shard with id 'shard2' + */ + @Override + public DBConnectionInfo getShard(Object serialNumber) { + + DBConnectionInfo connectionInfo = null; + if (serialNumber instanceof Integer) { + Integer serNo = (Integer) serialNumber; + switch (serNo % 2) { + case 0: + connectionInfo = dBConnectionInfoMgr.getDBConnectionInfo("shard1"); + break; + case 1: + connectionInfo = dBConnectionInfoMgr.getDBConnectionInfo("shard2"); + break; + default: + connectionInfo = dBConnectionInfoMgr.getDBConnectionInfo("shard1"); + break; + } + } + shardId = connectionInfo.getShardId(); + return connectionInfo; + } + + @Override + public String shardId() { + return shardId; + } +} diff --git a/java/registry/src/main/java/io/opensaber/registry/shard/advisory/ShardAdvisor.java b/java/registry/src/main/java/io/opensaber/registry/shard/advisory/ShardAdvisor.java new file mode 100644 index 000000000..48e9db7cf --- /dev/null +++ b/java/registry/src/main/java/io/opensaber/registry/shard/advisory/ShardAdvisor.java @@ -0,0 +1,36 @@ +package io.opensaber.registry.shard.advisory; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + + +public class ShardAdvisor { + + private Map advisors = new HashMap(); + /** + * Registers the shardAdvisory by property + * @param property + * @param shardAdvisory + */ + public void registerAdvisor(String property, IShardAdvisor shardAdvisory){ + advisors.put(property, shardAdvisory); + + } + /** + * Return ShardAdvice registered with the property + * @return + * @throws IOException + */ + public IShardAdvisor getShardAdvisor(String property) throws IOException{ + IShardAdvisor advisory = null; + if(advisors.keySet().contains(property)) + advisory = advisors.get(property); + else + throw new IOException("Not found advisory for given property. Cosider registering this property."); + return advisory; + } + + + +} diff --git a/java/registry/src/main/java/io/opensaber/registry/shard/advisory/ShardManager.java b/java/registry/src/main/java/io/opensaber/registry/shard/advisory/ShardManager.java new file mode 100644 index 000000000..c42d1814b --- /dev/null +++ b/java/registry/src/main/java/io/opensaber/registry/shard/advisory/ShardManager.java @@ -0,0 +1,52 @@ +package io.opensaber.registry.shard.advisory; + +import java.io.IOException; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import io.opensaber.registry.model.DBConnectionInfo; +import io.opensaber.registry.model.DBConnectionInfoMgr; +import io.opensaber.registry.service.RegistryService; +import io.opensaber.registry.service.SearchService; +import io.opensaber.registry.sink.DBProviderFactory; +import io.opensaber.registry.sink.DatabaseProvider; + +@Component("shardManager") +public class ShardManager { + + @Autowired + private DBConnectionInfoMgr dBConnectionInfoMgr; + @Autowired + private DBProviderFactory dbProviderFactory; + @Autowired + private IShardAdvisor shardAdvisor; + @Autowired + private RegistryService registryService; + @Autowired + private SearchService searchService; + private DatabaseProvider databaseProvider; + + /** + * intiatiate a DBShard and ensure activating a databaseProvider. + * used for add end point. + * @param attributeValue + * @throws IOException + */ + public void activateDbShard(Object attributeValue) throws IOException{ + DBConnectionInfo connectionInfo = shardAdvisor.getShard(attributeValue); + databaseProvider = dbProviderFactory.getInstance(connectionInfo); + registryService.setDatabaseProvider(databaseProvider); + searchService.setDatabaseProvider(databaseProvider); + } + + public String getShardProperty() { + return dBConnectionInfoMgr.getShardProperty(); + } + + public DatabaseProvider getDatabaseProvider(){ + return databaseProvider; + } + + +} diff --git a/java/registry/src/main/java/io/opensaber/registry/sink/DBShard.java b/java/registry/src/main/java/io/opensaber/registry/sink/DBProviderFactory.java similarity index 74% rename from java/registry/src/main/java/io/opensaber/registry/sink/DBShard.java rename to java/registry/src/main/java/io/opensaber/registry/sink/DBProviderFactory.java index aeb1cebee..a39dd5614 100644 --- a/java/registry/src/main/java/io/opensaber/registry/sink/DBShard.java +++ b/java/registry/src/main/java/io/opensaber/registry/sink/DBProviderFactory.java @@ -1,33 +1,30 @@ package io.opensaber.registry.sink; +import java.io.IOException; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; import io.opensaber.registry.middleware.util.Constants; import io.opensaber.registry.model.DBConnectionInfo; -import io.opensaber.registry.model.DBConnectionInfoMgr; -@Component("dbshard") -public class DBShard { +@Component("dbProviderFactory") +public class DBProviderFactory { @Autowired Environment environment; - - @Autowired - DBConnectionInfoMgr dBConnectionInfoMgr; - - public DatabaseProvider getInstance(String shardId){ + + public DatabaseProvider getInstance(DBConnectionInfo connectionInfo) throws IOException{ String dbProvider = environment.getProperty(Constants.DATABASE_PROVIDER); DatabaseProvider provider; if (dbProvider.equalsIgnoreCase(Constants.GraphDatabaseProvider.ORIENTDB.getName())) { provider = new OrientDBGraphProvider(environment); provider.initializeGlobalGraphConfiguration(); - } else if (dbProvider.equalsIgnoreCase(Constants.GraphDatabaseProvider.NEO4J.getName())) { - DBConnectionInfo connection = dBConnectionInfoMgr.getDBConnectionInfo(shardId); - if(connection == null) - throw new RuntimeException("No shard is configured. Please configure a shard with "+shardId); - provider = new Neo4jGraphProvider(connection); + } else if (dbProvider.equalsIgnoreCase(Constants.GraphDatabaseProvider.NEO4J.getName())) { + if(connectionInfo == null) + throw new IOException("No shard is configured. Please configure a shard"); + provider = new Neo4jGraphProvider(connectionInfo); } else if (dbProvider.equalsIgnoreCase(Constants.GraphDatabaseProvider.SQLG.getName())) { provider = new SqlgProvider(environment); provider.initializeGlobalGraphConfiguration(); diff --git a/java/registry/src/main/resources/application.yml.sample b/java/registry/src/main/resources/application.yml.sample index 8ecd8b00c..3e50563a1 100755 --- a/java/registry/src/main/resources/application.yml.sample +++ b/java/registry/src/main/resources/application.yml.sample @@ -36,17 +36,18 @@ database: #provider available are NEO4J, SQLG, TINKERGRAPH, CASSANDRA, ORIENTDB. #Note: Please avoid repeating the shardId. provider: ${database_provider:NEO4J} + shardProperty: ${database_shardProperty:serialNum} connectionInfo: - shardId: shard1 uri: ${connectionInfo_uri:bolt://localhost:7687} username: ${connectionInfo_username:neo4j} - password: ${connectionInfo_password:test123} + password: ${connectionInfo_password:} - shardId: shard2 uri: ${connectionInfo_uri:bolt://localhost:7688} username: ${connectionInfo_username:neo4j} - password: ${connectionInfo_password:test123} + password: ${connectionInfo_password:} ################################################################################## # Uncomment the following section to use Cassandra as backend store # @@ -161,10 +162,10 @@ frame: encryption: enabled: true - base: https://dev.open-sunbird.org/encryption/ - uri: https://dev.open-sunbird.org/encryption/encrypt + base: https://dev.sunbirded.org/encryption/ + uri: https://dev.sunbirded.org/encryption/encrypt batch: - uri: https://dev.open-sunbird.org/encryption/encrypt/obj + uri: https://dev.sunbirded.org/encryption/encrypt/obj service: connection: timeout: ${encryption_service_connection_timeout:5000} @@ -174,16 +175,16 @@ encryption: timeout: ${encryption_service_read_timeout:5000} decryption: - uri: https://dev.open-sunbird.org/encryption/decrypt + uri: https://dev.sunbirded.org/encryption/decrypt batch: - uri: https://dev.open-sunbird.org/encryption/decrypt/obj + uri: https://dev.sunbirded.org/encryption/decrypt/obj signature: enabled: ${signature_enabled:true} - healthCheckURL: ${sign_health_check_url:http://localhost:8013/} - signURL: ${sign_url:http://localhost:8013/sign} - verifyURL: ${verify_url:http://localhost:8013/verify} - keysURL: ${keys_url:http://localhost:8013/keys/} + healthCheckURL: ${sign_health_check_url:https://dev.sunbirded.org/encryption/} + signURL: ${sign_url:https://dev.sunbirded.org/encryption/sign} + verifyURL: ${verify_url:https://dev.sunbirded.org/encryption/verify} + keysURL: ${keys_url:https://dev.sunbirded.org/encryption/keys/} domain: ${domain_url:https://w3id.org/security/v1/} schema: config: diff --git a/java/registry/src/test/java/io/opensaber/registry/dao/impl/EncryptionDaoImplTest.java b/java/registry/src/test/java/io/opensaber/registry/dao/impl/EncryptionDaoImplTest.java index 50c4bafeb..6a4bf7a5a 100644 --- a/java/registry/src/test/java/io/opensaber/registry/dao/impl/EncryptionDaoImplTest.java +++ b/java/registry/src/test/java/io/opensaber/registry/dao/impl/EncryptionDaoImplTest.java @@ -3,18 +3,35 @@ import static org.hamcrest.CoreMatchers.allOf; import static org.hamcrest.CoreMatchers.containsString; import static org.junit.Assert.assertThat; -import static org.mockito.Mockito.*; +import static org.mockito.ArgumentMatchers.anyMap; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import java.io.IOException; import java.io.InputStreamReader; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.apache.jena.rdf.model.Model; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; -import org.apache.tinkerpop.gremlin.structure.*; +import org.apache.tinkerpop.gremlin.structure.Graph; +import org.apache.tinkerpop.gremlin.structure.T; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph; import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper; -import org.junit.*; +import org.junit.After; +import org.junit.Assume; +import org.junit.Before; +import org.junit.FixMethodOrder; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.rules.TestRule; import org.junit.rules.TestWatcher; @@ -23,7 +40,6 @@ import org.junit.runners.MethodSorters; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -49,6 +65,7 @@ import io.opensaber.registry.middleware.util.Constants; import io.opensaber.registry.model.AuditRecordReader; import io.opensaber.registry.service.impl.EncryptionServiceImpl; +import io.opensaber.registry.sink.DBProviderFactory; import io.opensaber.registry.sink.DatabaseProvider; import io.opensaber.registry.tests.utility.TestHelper; @@ -100,9 +117,14 @@ protected void failed(Throwable e, Description description) { private DatabaseProvider databaseProvider; @Value("${encryption.enabled}") private boolean encryptionEnabled; + @Autowired + private DBProviderFactory dbProviderFactory; @Before - public void initializeGraph() { + public void initializeGraph() throws IOException { + databaseProvider = dbProviderFactory.getInstance(null); + registryDao.setDatabaseProvider(databaseProvider); + auditRecordReader = new AuditRecordReader(databaseProvider); Assume.assumeTrue(encryptionEnabled); graph = TinkerGraph.open(); MockitoAnnotations.initMocks(this); diff --git a/java/registry/src/test/java/io/opensaber/registry/dao/impl/RegistryDaoImplTest.java b/java/registry/src/test/java/io/opensaber/registry/dao/impl/RegistryDaoImplTest.java index 0774feb14..113573694 100644 --- a/java/registry/src/test/java/io/opensaber/registry/dao/impl/RegistryDaoImplTest.java +++ b/java/registry/src/test/java/io/opensaber/registry/dao/impl/RegistryDaoImplTest.java @@ -2,23 +2,54 @@ import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; import java.io.IOException; -import java.util.*; - -import io.opensaber.pojos.APIMessage; -import org.apache.jena.rdf.model.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.UUID; + +import org.apache.jena.rdf.model.Literal; +import org.apache.jena.rdf.model.Model; +import org.apache.jena.rdf.model.ModelFactory; import org.apache.jena.rdf.model.Property; +import org.apache.jena.rdf.model.RDFNode; +import org.apache.jena.rdf.model.Resource; +import org.apache.jena.rdf.model.ResourceFactory; +import org.apache.jena.rdf.model.Statement; +import org.apache.jena.rdf.model.StmtIterator; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; -import org.apache.tinkerpop.gremlin.structure.*; +import org.apache.tinkerpop.gremlin.structure.Direction; +import org.apache.tinkerpop.gremlin.structure.Edge; +import org.apache.tinkerpop.gremlin.structure.Graph; +import org.apache.tinkerpop.gremlin.structure.T; +import org.apache.tinkerpop.gremlin.structure.Vertex; +import org.apache.tinkerpop.gremlin.structure.VertexProperty; import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph; import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils; import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper; import org.eclipse.rdf4j.model.vocabulary.RDF; -import org.junit.*; +import org.junit.After; +import org.junit.Before; +import org.junit.FixMethodOrder; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.rules.TestRule; import org.junit.rules.TestWatcher; @@ -38,23 +69,30 @@ import org.springframework.test.context.junit4.SpringRunner; import io.opensaber.converters.JenaRDF4J; +import io.opensaber.pojos.APIMessage; import io.opensaber.registry.authorization.AuthorizationToken; import io.opensaber.registry.authorization.pojos.AuthInfo; import io.opensaber.registry.config.GenericConfiguration; import io.opensaber.registry.controller.RegistryTestBase; -import io.opensaber.registry.exception.*; +import io.opensaber.registry.exception.AuditFailedException; +import io.opensaber.registry.exception.DuplicateRecordException; +import io.opensaber.registry.exception.EncryptionException; +import io.opensaber.registry.exception.EntityCreationException; +import io.opensaber.registry.exception.MultipleEntityException; +import io.opensaber.registry.exception.RecordNotFoundException; import io.opensaber.registry.exception.audit.LabelCannotBeNullException; import io.opensaber.registry.middleware.util.Constants; import io.opensaber.registry.middleware.util.RDFUtil; import io.opensaber.registry.model.AuditRecordReader; import io.opensaber.registry.service.impl.EncryptionServiceImpl; +import io.opensaber.registry.sink.DBProviderFactory; import io.opensaber.registry.sink.DatabaseProvider; import io.opensaber.registry.tests.utility.TestHelper; import io.opensaber.utils.converters.RDF2Graph; @RunWith(SpringRunner.class) @SpringBootTest(classes = { RegistryDaoImpl.class, Environment.class, ObjectMapper.class, GenericConfiguration.class, - EncryptionServiceImpl.class, AuditRecordReader.class, APIMessage.class}) + EncryptionServiceImpl.class, APIMessage.class}) @FixMethodOrder(MethodSorters.NAME_ASCENDING) @ActiveProfiles(Constants.TEST_ENVIRONMENT) public class RegistryDaoImplTest extends RegistryTestBase { @@ -82,20 +120,25 @@ protected void failed(Throwable e, Description description) { String.format("Test %s failed. Error message: %s", description.getMethodName(), e.getMessage())); } }; - @Autowired + AuditRecordReader auditRecordReader; @Autowired private Environment environment; @Autowired private RegistryDaoImpl registryDao; - @Autowired private DatabaseProvider databaseProvider; @Value("${registry.context.base}") private String registryContext; + @Autowired + private DBProviderFactory dbProviderFactory; @Before - public void initializeGraph() { + public void initializeGraph() throws IOException { graph = TinkerGraph.open(); + databaseProvider = dbProviderFactory.getInstance(null); + registryDao.setDatabaseProvider(databaseProvider); + auditRecordReader = new AuditRecordReader(databaseProvider); + MockitoAnnotations.initMocks(this); TestHelper.clearData(databaseProvider); databaseProvider.getGraphStore().addVertex(Constants.GRAPH_GLOBAL_CONFIG).property(Constants.PERSISTENT_GRAPH, diff --git a/java/registry/src/test/java/io/opensaber/registry/dao/impl/SearchDaoImplTest.java b/java/registry/src/test/java/io/opensaber/registry/dao/impl/SearchDaoImplTest.java index ea7db097a..b8566d84a 100644 --- a/java/registry/src/test/java/io/opensaber/registry/dao/impl/SearchDaoImplTest.java +++ b/java/registry/src/test/java/io/opensaber/registry/dao/impl/SearchDaoImplTest.java @@ -2,6 +2,7 @@ import static org.junit.Assert.assertTrue; +import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -35,8 +36,14 @@ import io.opensaber.registry.controller.RegistryTestBase; import io.opensaber.registry.dao.RegistryDao; import io.opensaber.registry.dao.SearchDao; -import io.opensaber.registry.exception.*; +import io.opensaber.registry.exception.AuditFailedException; +import io.opensaber.registry.exception.DuplicateRecordException; +import io.opensaber.registry.exception.EncryptionException; +import io.opensaber.registry.exception.EntityCreationException; +import io.opensaber.registry.exception.MultipleEntityException; +import io.opensaber.registry.exception.RecordNotFoundException; import io.opensaber.registry.middleware.util.Constants; +import io.opensaber.registry.sink.DBProviderFactory; import io.opensaber.registry.sink.DatabaseProvider; import io.opensaber.registry.tests.utility.TestHelper; import io.opensaber.utils.converters.RDF2Graph; @@ -53,11 +60,17 @@ public class SearchDaoImplTest extends RegistryTestBase { private RegistryDao registryDao; @Autowired private SearchDao searchDao; - @Autowired private DatabaseProvider databaseProvider; + @Autowired + private DBProviderFactory dbProviderFactory; + @Before - public void initializeGraph() { + public void initializeGraph() throws IOException { + databaseProvider = dbProviderFactory.getInstance(null); + registryDao.setDatabaseProvider(databaseProvider); + searchDao.setDatabaseProvider(databaseProvider); + graph = TinkerGraph.open(); MockitoAnnotations.initMocks(this); TestHelper.clearData(databaseProvider); diff --git a/java/registry/src/test/java/io/opensaber/registry/service/impl/RegistryServiceImplTest.java b/java/registry/src/test/java/io/opensaber/registry/service/impl/RegistryServiceImplTest.java index 59f9621b6..0a5c7b010 100644 --- a/java/registry/src/test/java/io/opensaber/registry/service/impl/RegistryServiceImplTest.java +++ b/java/registry/src/test/java/io/opensaber/registry/service/impl/RegistryServiceImplTest.java @@ -1,6 +1,8 @@ package io.opensaber.registry.service.impl; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; import java.io.IOException; @@ -22,6 +24,7 @@ import org.junit.runners.MethodSorters; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -40,12 +43,19 @@ import io.opensaber.registry.config.GenericConfiguration; import io.opensaber.registry.controller.RegistryController; import io.opensaber.registry.controller.RegistryTestBase; +import io.opensaber.registry.dao.RegistryDao; import io.opensaber.registry.dao.impl.RegistryDaoImpl; -import io.opensaber.registry.exception.*; +import io.opensaber.registry.exception.AuditFailedException; +import io.opensaber.registry.exception.DuplicateRecordException; +import io.opensaber.registry.exception.EncryptionException; +import io.opensaber.registry.exception.EntityCreationException; +import io.opensaber.registry.exception.MultipleEntityException; +import io.opensaber.registry.exception.RecordNotFoundException; import io.opensaber.registry.middleware.MiddlewareHaltException; import io.opensaber.registry.middleware.util.Constants; import io.opensaber.registry.middleware.util.RDFUtil; import io.opensaber.registry.model.AuditRecord; +import io.opensaber.registry.sink.DBProviderFactory; import io.opensaber.registry.sink.DatabaseProvider; import io.opensaber.registry.tests.utility.TestHelper; @@ -66,18 +76,22 @@ public class RegistryServiceImplTest extends RegistryTestBase { private String registryContextBase; @Autowired private RegistryServiceImpl registryService; - @Autowired + private DatabaseProvider databaseProvider; @Mock private RestTemplate mockRestTemplate; @Mock private EncryptionServiceImpl encryptionService; @Mock - private SignatureServiceImpl signatureService; - @Mock + private SignatureServiceImpl signatureService; private DatabaseProvider mockDatabaseProvider; + @Mock + private RegistryDao registryDao; @InjectMocks private RegistryServiceImpl registryServiceForHealth; + @Autowired + private DBProviderFactory dbProviderFactory; + public void setup() { if (!isInitialized) { @@ -91,7 +105,11 @@ public void setup() { } @Before - public void initialize() { + public void initialize() throws IOException { + databaseProvider = dbProviderFactory.getInstance(null); + registryService.setDatabaseProvider(databaseProvider); + mockDatabaseProvider = Mockito.mock(DatabaseProvider.class); + registryServiceForHealth.setDatabaseProvider(mockDatabaseProvider); setup(); MockitoAnnotations.initMocks(this); TestHelper.clearData(databaseProvider); diff --git a/java/registry/src/test/java/io/opensaber/registry/service/impl/SearchServiceImplTest.java b/java/registry/src/test/java/io/opensaber/registry/service/impl/SearchServiceImplTest.java index d9d267b53..9b1f4e12c 100644 --- a/java/registry/src/test/java/io/opensaber/registry/service/impl/SearchServiceImplTest.java +++ b/java/registry/src/test/java/io/opensaber/registry/service/impl/SearchServiceImplTest.java @@ -3,6 +3,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import java.io.IOException; import java.util.Collections; import java.util.List; @@ -36,11 +37,18 @@ import io.opensaber.registry.controller.RegistryTestBase; import io.opensaber.registry.dao.RegistryDao; import io.opensaber.registry.dao.SearchDao; -import io.opensaber.registry.exception.*; +import io.opensaber.registry.exception.AuditFailedException; +import io.opensaber.registry.exception.DuplicateRecordException; +import io.opensaber.registry.exception.EncryptionException; +import io.opensaber.registry.exception.EntityCreationException; +import io.opensaber.registry.exception.MultipleEntityException; +import io.opensaber.registry.exception.RecordNotFoundException; +import io.opensaber.registry.exception.TypeNotProvidedException; import io.opensaber.registry.middleware.util.Constants; import io.opensaber.registry.middleware.util.RDFUtil; import io.opensaber.registry.service.RegistryService; import io.opensaber.registry.service.SearchService; +import io.opensaber.registry.sink.DBProviderFactory; import io.opensaber.registry.sink.DatabaseProvider; import io.opensaber.registry.tests.utility.TestHelper; @@ -59,11 +67,15 @@ public class SearchServiceImplTest extends RegistryTestBase { private SearchService searchService; @Autowired private RegistryService registryService; - @Autowired private DatabaseProvider databaseProvider; + @Autowired + private DBProviderFactory dbProviderFactory; @Before - public void initialize() { + public void initialize() throws IOException { + databaseProvider = dbProviderFactory.getInstance(null); + registryService.setDatabaseProvider(databaseProvider); + searchService.setDatabaseProvider(databaseProvider); MockitoAnnotations.initMocks(this); TestHelper.clearData(databaseProvider); databaseProvider.getGraphStore().addVertex(Constants.GRAPH_GLOBAL_CONFIG).property(Constants.PERSISTENT_GRAPH,