diff --git a/.circleci/config.yml b/.circleci/config.yml index c8f9dc3ac..6688b6c9b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -38,6 +38,7 @@ jobs: docker run --volumes-from mms_test_configs --network container:mms -t postman/newman run permissions.postman_collection.json -e test-env.json --delay-request 500 docker run --volumes-from mms_test_configs --network container:mms -t postman/newman run search.postman_collection.json -e test-env.json --delay-request 1000 docker run --volumes-from mms_test_configs --network container:mms -t postman/newman run artifacts.postman_collection.json -e test-env.json --delay-request 500 + docker run --volumes-from mms_test_configs --network container:mms -t postman/newman run elastic.postman_collection.json -e test-env.json --delay-request 500 - persist_to_workspace: root: /home/circleci/ diff --git a/core/src/main/java/org/openmbee/mms/core/dao/NodeIndexDAO.java b/core/src/main/java/org/openmbee/mms/core/dao/NodeIndexDAO.java index e30ddea8b..8d14d5fed 100644 --- a/core/src/main/java/org/openmbee/mms/core/dao/NodeIndexDAO.java +++ b/core/src/main/java/org/openmbee/mms/core/dao/NodeIndexDAO.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Optional; import java.util.Set; + import org.openmbee.mms.json.BaseJson; import org.openmbee.mms.json.ElementJson; diff --git a/core/src/main/java/org/openmbee/mms/core/exceptions/MMSException.java b/core/src/main/java/org/openmbee/mms/core/exceptions/MMSException.java index bc45a655f..cdede62dc 100644 --- a/core/src/main/java/org/openmbee/mms/core/exceptions/MMSException.java +++ b/core/src/main/java/org/openmbee/mms/core/exceptions/MMSException.java @@ -11,11 +11,18 @@ public MMSException() { } public MMSException(HttpStatus code, Object messageObject) { + if (messageObject instanceof Throwable) { + super.initCause((Throwable)messageObject); + } this.code = code; this.messageObject = messageObject; + } public MMSException(int code, Object messageObject) { + if (messageObject instanceof Throwable) { + super.initCause((Throwable)messageObject); + } this.code = HttpStatus.resolve(code); this.messageObject = messageObject; } @@ -36,4 +43,12 @@ public void setMessageObject(Object messageObject) { this.messageObject = messageObject; } + @Override + public String getMessage() { + if (messageObject == null) { + return super.getMessage(); + } + return (messageObject instanceof Throwable) ? + ((Throwable)messageObject).getMessage() : messageObject.toString(); + } } \ No newline at end of file diff --git a/crud/src/main/java/org/openmbee/mms/crud/services/DefaultBranchService.java b/crud/src/main/java/org/openmbee/mms/crud/services/DefaultBranchService.java index 784118ee3..72201fb06 100644 --- a/crud/src/main/java/org/openmbee/mms/crud/services/DefaultBranchService.java +++ b/crud/src/main/java/org/openmbee/mms/crud/services/DefaultBranchService.java @@ -166,7 +166,7 @@ public RefJson createBranch(String projectId, RefJson branch) { for (Node n: nodeRepository.findAllByDeleted(false)) { docIds.add(n.getDocId()); } - nodeIndex.addToRef(docIds); + try { nodeIndex.addToRef(docIds); } catch(Exception e) {} eventPublisher.forEach((pub) -> pub.publish( EventObject.create(projectId, branch.getId(), "branch_created", branch))); return branch; diff --git a/crud/src/main/java/org/openmbee/mms/crud/services/DefaultNodeService.java b/crud/src/main/java/org/openmbee/mms/crud/services/DefaultNodeService.java index 772825d54..482e052fa 100644 --- a/crud/src/main/java/org/openmbee/mms/crud/services/DefaultNodeService.java +++ b/crud/src/main/java/org/openmbee/mms/crud/services/DefaultNodeService.java @@ -13,6 +13,7 @@ import java.util.stream.IntStream; import java.util.stream.Stream; import org.openmbee.mms.core.exceptions.BadRequestException; +import org.openmbee.mms.core.exceptions.InternalErrorException; import org.openmbee.mms.core.objects.ElementsCommitResponse; import org.openmbee.mms.core.objects.EventObject; import org.openmbee.mms.core.services.EventService; @@ -22,7 +23,6 @@ import org.openmbee.mms.core.config.ContextHolder; import org.openmbee.mms.core.objects.ElementsRequest; import org.openmbee.mms.core.objects.ElementsResponse; -import org.openmbee.mms.core.exceptions.InternalErrorException; import org.openmbee.mms.data.domains.scoped.Commit; import org.openmbee.mms.data.domains.scoped.CommitType; import org.openmbee.mms.data.domains.scoped.Node; @@ -37,10 +37,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; -import org.springframework.transaction.TransactionDefinition; -import org.springframework.transaction.TransactionStatus; -import org.springframework.transaction.support.DefaultTransactionDefinition; - @Service("defaultNodeService") public class DefaultNodeService implements NodeService { @@ -144,6 +140,7 @@ public void readAsStream(String projectId, String refId, } else { stream.write("\n".getBytes(StandardCharsets.UTF_8)); } + stream.close(); } @Override @@ -207,23 +204,18 @@ public ElementsCommitResponse createOrUpdate(String projectId, String refId, Ele return response; } - //@Transactional - protected void commitChanges(NodeChangeInfo info) { - //TODO: Test rollback on IndexDAO failure - TransactionDefinition def = new DefaultTransactionDefinition(); - TransactionStatus status = this.nodeRepository.getTransactionManager().getTransaction(def); - + public void commitChanges(NodeChangeInfo info) { Map nodes = info.getToSaveNodeMap(); Map json = info.getUpdatedMap(); CommitJson cmjs = info.getCommitJson(); Instant now = info.getNow(); if (!nodes.isEmpty()) { try { - this.nodeRepository.saveAll(new ArrayList<>(nodes.values())); if (json != null && !json.isEmpty()) { this.nodeIndex.indexAll(json.values()); } - this.nodeIndex.removeFromRef(info.getOldDocIds()); + try { this.nodeIndex.removeFromRef(info.getOldDocIds()); } catch(Exception e) {} + this.commitIndex.index(cmjs); Optional existing = this.commitRepository.findByCommitId(cmjs.getId()); existing.ifPresentOrElse( @@ -240,13 +232,10 @@ protected void commitChanges(NodeChangeInfo info) { commit.setComment(cmjs.getComment()); this.commitRepository.save(commit); }); - this.commitIndex.index(cmjs); - - this.nodeRepository.getTransactionManager().commit(status); + this.nodeRepository.saveAll(new ArrayList<>(nodes.values())); } catch (Exception e) { - logger.error("commitChanges error: ", e); - this.nodeRepository.getTransactionManager().rollback(status); - throw new InternalErrorException("Error committing transaction"); + logger.error("commitChanges error: {}", e.getMessage()); + throw new InternalErrorException("Error committing changes: " + e.getMessage()); } eventPublisher.forEach((pub) -> pub.publish( EventObject.create(cmjs.getProjectId(), cmjs.getRefId(), "commit", cmjs))); diff --git a/elastic/src/main/java/org/openmbee/mms/elastic/BaseElasticDAOImpl.java b/elastic/src/main/java/org/openmbee/mms/elastic/BaseElasticDAOImpl.java index f75de49bb..1ef83b76c 100644 --- a/elastic/src/main/java/org/openmbee/mms/elastic/BaseElasticDAOImpl.java +++ b/elastic/src/main/java/org/openmbee/mms/elastic/BaseElasticDAOImpl.java @@ -7,7 +7,6 @@ import java.util.Map; import java.util.Optional; import java.util.Set; -import java.util.concurrent.TimeUnit; import org.elasticsearch.action.DocWriteResponse; import org.elasticsearch.action.bulk.BackoffPolicy; import org.elasticsearch.action.bulk.BulkProcessor; @@ -30,6 +29,7 @@ import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.index.get.GetResult; import org.elasticsearch.search.fetch.subphase.FetchSourceContext; +import org.openmbee.mms.core.exceptions.InternalErrorException; import org.openmbee.mms.elastic.utils.Index; import org.openmbee.mms.json.BaseJson; import org.slf4j.Logger; @@ -79,7 +79,8 @@ public void deleteById(String index, String docId) { try { client.delete(new DeleteRequest(index, docId), REQUEST_OPTIONS); } catch (IOException e) { - throw new RuntimeException(e); + logger.error(e.getMessage(), e); + throw new InternalErrorException(e); } } @@ -91,7 +92,8 @@ public void deleteAll(String index, Collection jsons) { } client.bulk(bulkIndex, REQUEST_OPTIONS); } catch (IOException e) { - throw new RuntimeException(e); + logger.error(e.getMessage(), e); + throw new InternalErrorException(e); } } @@ -102,7 +104,8 @@ public boolean existsById(String index, String docId) { getRequest.storedFields("_none_"); return client.exists(getRequest, REQUEST_OPTIONS); } catch (IOException e) { - throw new RuntimeException(e); + logger.error(e.getMessage(), e); + throw new InternalErrorException(e); } } @@ -118,7 +121,8 @@ public Optional findById(String index, String docId) { return Optional.empty(); } } catch (IOException e) { - throw new RuntimeException(e); + logger.error(e.getMessage(), e); + throw new InternalErrorException(e); } } @@ -145,7 +149,8 @@ public List findAllById(String index, Set docIds) { } return listOfResponses; } catch (IOException e) { - throw new RuntimeException(e); + logger.error(e.getMessage(), e); + throw new InternalErrorException(e); } } @@ -169,21 +174,15 @@ public void indexAll(String index, Collection jsons) { for (BaseJson json : jsons) { bulkProcessor.add(new IndexRequest(index).id(json.getDocId()).source(json)); } - try { - if (!bulkProcessor.awaitClose(1200L, TimeUnit.SECONDS)) { - logger.error("Timed out in bulk processing"); - } - } catch (InterruptedException e) { - logger.error("Index all interrupted: ", e); - } - + bulkProcessor.close(); } public void index(String index, BaseJson json) { try { client.index(new IndexRequest(index).id(json.getDocId()).source(json), REQUEST_OPTIONS); } catch (IOException e) { - throw new RuntimeException(e); + logger.error(e.getMessage(), e); + throw new InternalErrorException(e); } } @@ -203,42 +202,26 @@ public E update(String index, BaseJson json) { } } } catch (IOException e) { - throw new RuntimeException(e); + logger.error(e.getMessage(), e); + throw new InternalErrorException(e); } return response; } protected BulkProcessor getBulkProcessor(RestHighLevelClient client) { - return getBulkProcessor(client, null); - } - - private BulkProcessor getBulkProcessor(RestHighLevelClient client, BulkProcessor.Listener listener) { - if (listener == null) { - listener = new BulkProcessor.Listener() { - private final Logger logger = LoggerFactory.getLogger(getClass()); - @Override - public void beforeBulk(long executionId, BulkRequest request) { - } - - @Override - public void afterBulk(long executionId, BulkRequest request, BulkResponse response) { - if (response.hasFailures()) { - response.iterator().forEachRemaining(action -> { - if (action.isFailed()) { - logger.error("Error in bulk processing: {}", action.getFailureMessage()); - } - }); - } - } - - @Override - public void afterBulk(long executionId, BulkRequest request, Throwable failure) { - logger.error("Error in bulk processing: ", failure); + BulkProcessor.Builder bpBuilder = BulkProcessor.builder((request, bulkListener) -> { + try { + BulkResponse response = client.bulk(request, RequestOptions.DEFAULT); + if (response.hasFailures()) { + String failure = response.buildFailureMessage(); + logger.error("Bulk response error: {}", failure); + throw new InternalErrorException(failure); } - }; - } - BulkProcessor.Builder bpBuilder = BulkProcessor.builder((request, bulkListener) -> client - .bulkAsync(request, RequestOptions.DEFAULT, bulkListener), listener); + } catch (IOException ioe) { + logger.error(ioe.getMessage(), ioe); + throw new InternalErrorException(ioe); + } + }, getListener()); bpBuilder.setBulkActions(bulkLimit); bpBuilder.setBulkSize(new ByteSizeValue(5, ByteSizeUnit.MB)); bpBuilder.setConcurrentRequests(1); @@ -247,4 +230,22 @@ public void afterBulk(long executionId, BulkRequest request, Throwable failure) return bpBuilder.build(); } + + private BulkProcessor.Listener getListener() { + return new BulkProcessor.Listener() { + @Override + public void beforeBulk(long executionId, BulkRequest request) { + } + + @Override + public void afterBulk(long executionId, BulkRequest request, BulkResponse response) { + + } + + @Override + public void afterBulk(long executionId, BulkRequest request, Throwable failure) { + throw new InternalErrorException(failure); + } + }; + } } diff --git a/elastic/src/main/java/org/openmbee/mms/elastic/CommitElasticDAOImpl.java b/elastic/src/main/java/org/openmbee/mms/elastic/CommitElasticDAOImpl.java index d22dbbae0..2f13e8a2d 100644 --- a/elastic/src/main/java/org/openmbee/mms/elastic/CommitElasticDAOImpl.java +++ b/elastic/src/main/java/org/openmbee/mms/elastic/CommitElasticDAOImpl.java @@ -15,6 +15,7 @@ import org.elasticsearch.search.sort.FieldSortBuilder; import org.elasticsearch.search.sort.SortOrder; import org.openmbee.mms.core.dao.CommitIndexDAO; +import org.openmbee.mms.core.exceptions.InternalErrorException; import org.openmbee.mms.elastic.utils.Index; import org.openmbee.mms.json.BaseJson; import org.openmbee.mms.json.CommitJson; @@ -156,7 +157,8 @@ public List elementHistory(String nodeId, Set commitIds) { } return commits; } catch (IOException e) { - throw new RuntimeException(e); + logger.error(e.getMessage(), e); + throw new InternalErrorException(e); } } @@ -186,7 +188,8 @@ private List getDocs(String commitId) { } return rawCommits; } catch (IOException ioe) { - throw new RuntimeException(ioe); + logger.error(ioe.getMessage(), ioe); + throw new InternalErrorException(ioe); } } diff --git a/elastic/src/main/java/org/openmbee/mms/elastic/NodeElasticDAOImpl.java b/elastic/src/main/java/org/openmbee/mms/elastic/NodeElasticDAOImpl.java index 2804f20b8..8f1f31aad 100644 --- a/elastic/src/main/java/org/openmbee/mms/elastic/NodeElasticDAOImpl.java +++ b/elastic/src/main/java/org/openmbee/mms/elastic/NodeElasticDAOImpl.java @@ -7,7 +7,6 @@ import java.util.Map; import java.util.Optional; import java.util.Set; -import java.util.concurrent.TimeUnit; import org.elasticsearch.action.bulk.BulkProcessor; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; @@ -23,6 +22,7 @@ import org.elasticsearch.search.sort.SortOrder; import org.openmbee.mms.core.config.ContextHolder; import org.openmbee.mms.core.dao.NodeIndexDAO; +import org.openmbee.mms.core.exceptions.InternalErrorException; import org.openmbee.mms.elastic.utils.Index; import org.openmbee.mms.json.BaseJson; import org.openmbee.mms.json.ElementJson; @@ -82,7 +82,8 @@ public Optional getByCommitId(String commitId, String nodeId) { ob.putAll(searchResponse.getHits().getAt(0).getSourceAsMap()); return Optional.of(ob); } catch (IOException e) { - throw new RuntimeException(e); + logger.error(e.getMessage(), e); + throw new InternalErrorException(e); } } @@ -112,13 +113,7 @@ private void bulkUpdateRefWithScript(Set docIds, String script) { request.script(inline); bulkProcessor.add(request); } - try { - if (!bulkProcessor.awaitClose(1200L, TimeUnit.SECONDS)) { - logger.error("Timed out in bulk processing"); - } - } catch (InterruptedException e) { - logger.error("Index all interrupted: ", e); - } + bulkProcessor.close(); } @Override @@ -150,7 +145,8 @@ public Optional getElementLessThanOrEqualTimestamp(String nodeId, } count += this.termLimit; } catch (IOException e) { - throw new RuntimeException(e); + logger.error(e.getMessage(), e); + throw new InternalErrorException(e); } } return Optional.empty(); diff --git a/elastic/src/main/java/org/openmbee/mms/elastic/ProjectElasticImpl.java b/elastic/src/main/java/org/openmbee/mms/elastic/ProjectElasticImpl.java index 402d2e1df..ccfc173f2 100644 --- a/elastic/src/main/java/org/openmbee/mms/elastic/ProjectElasticImpl.java +++ b/elastic/src/main/java/org/openmbee/mms/elastic/ProjectElasticImpl.java @@ -14,6 +14,7 @@ import org.elasticsearch.common.xcontent.XContentType; import org.openmbee.mms.core.config.ContextHolder; import org.openmbee.mms.core.dao.ProjectIndex; +import org.openmbee.mms.core.exceptions.InternalErrorException; import org.openmbee.mms.json.ProjectJson; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -57,7 +58,8 @@ public void create(ProjectJson project) { createIndex(metadataIndex); update(project); } catch (IOException e) { - throw new RuntimeException(e); + logger.error(e.getMessage(), e); + throw new InternalErrorException(e); } } @@ -83,7 +85,8 @@ public void delete(String projectId) { client.indices().delete(request2, RequestOptions.DEFAULT).isAcknowledged(); client.indices().delete(request3, RequestOptions.DEFAULT).isAcknowledged(); } catch (IOException e) { - throw new RuntimeException(e); + logger.error(e.getMessage(), e); + throw new InternalErrorException(e); } } diff --git a/elastic/src/main/java/org/openmbee/mms/elastic/services/ElasticSearchService.java b/elastic/src/main/java/org/openmbee/mms/elastic/services/ElasticSearchService.java index e8f2ee158..3e9e1b1d3 100644 --- a/elastic/src/main/java/org/openmbee/mms/elastic/services/ElasticSearchService.java +++ b/elastic/src/main/java/org/openmbee/mms/elastic/services/ElasticSearchService.java @@ -92,7 +92,8 @@ public ElementsSearchResponse recursiveSearch(String projectId, String refId, Ma Collection> filteredElementJson = filterIndexedElementsUsingDatabaseNodes(allNodes, elementJsonMap, deletedElements, showDeletedAsRejected); return prepareResponse(filteredElementJson, deletedElements, from, size); } catch (IOException e) { - throw new RuntimeException(e); + logger.error(e.getMessage(), e); + throw new InternalErrorException(e); } } diff --git a/example/elastic.postman_collection.json b/example/elastic.postman_collection.json new file mode 100644 index 000000000..62a68d9c7 --- /dev/null +++ b/example/elastic.postman_collection.json @@ -0,0 +1,587 @@ +{ + "info": { + "_postman_id": "41251e24-17eb-4133-8e98-edbaa90de5c2", + "name": "elastic", + "description": "elastic-fail tests", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "login using admin", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "", + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + " ", + "});", + "", + "pm.test(\"response has token\", function () {", + " var jsonData = pm.response.json();", + " pm.expect(jsonData.token).to.be.a('string');", + " pm.environment.set(\"token\", jsonData.token);", + "", + "});", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "noauth" + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"username\": \"{{adminUsername}}\",\n\t\"password\": \"{{adminPassword}}\"\n}" + }, + "url": { + "raw": "{{host}}/authentication", + "host": [ + "{{host}}" + ], + "path": [ + "authentication" + ] + } + }, + "response": [] + }, + { + "name": "add org elastic", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"response has org elastic\", function () {", + " var jsonData = pm.response.json();", + " pm.expect(jsonData.orgs[0].id).to.eql('elastic');", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"orgs\": [\n\t\t{\n\t\t\t\"id\": \"elastic\",\n\t\t\t\"name\": \"elastic\"\n\t\t}\n\t]\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{host}}/orgs", + "host": [ + "{{host}}" + ], + "path": [ + "orgs" + ] + } + }, + "response": [] + }, + { + "name": "add project elastic", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"response has project elastic\", function () {", + " var jsonData = pm.response.json();", + " pm.expect(jsonData.projects[0].id).to.eql('elastic');", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"projects\": [\n\t\t{\n\t\t\t\"id\": \"elastic\", \n\t\t\t\"name\": \"elastic\",\n\t\t\t\"orgId\": \"elastic\",\n\t\t\t\"schema\": \"default\"\n\t\t}\n\t]\n}" + }, + "url": { + "raw": "{{host}}/projects", + "host": [ + "{{host}}" + ], + "path": [ + "projects" + ] + } + }, + "response": [] + }, + { + "name": "add element to elastic", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"response has element\", function () {", + " var jsonData = pm.response.json();", + " pm.expect(jsonData.elements.length).to.eql(2);", + "});", + "", + "pm.environment.set(\"commitId1\", pm.response.json().elements[0]._commitId);" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"elements\": [\n\t\t{\n\t\t\t\"id\": \"x\",\n\t\t\t\"name\": \"x\"\n\t\t},\n {\n\t\t\t\"id\": \"z\",\n\t\t\t\"name\": \"z\"\n\t\t}\n\t]\n}" + }, + "url": { + "raw": "{{host}}/projects/elastic/refs/master/elements", + "host": [ + "{{host}}" + ], + "path": [ + "projects", + "elastic", + "refs", + "master", + "elements" + ] + } + }, + "response": [] + }, + { + "name": "update bad element to elastic", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 500\", function () {", + " pm.response.to.have.status(500);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"elements\": [\n {\n\t\t\t\"id\": \"z\",\n\t\t\t\"name\": \"y\"\n\t\t},\n\t\t{\n\t\t\t\"id\": \"x\",\n\t\t\t\"name\": {}\n\t\t}\n\t]\n}" + }, + "url": { + "raw": "{{host}}/projects/elastic/refs/master/elements", + "host": [ + "{{host}}" + ], + "path": [ + "projects", + "elastic", + "refs", + "master", + "elements" + ] + } + }, + "response": [] + }, + { + "name": "get x", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});", + "pm.test(\"response has element x\", function () {", + " var jsonData = pm.response.json();", + " pm.expect(jsonData.elements[0].name).to.eql('x');", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "url": { + "raw": "{{host}}/projects/elastic/refs/master/elements/x", + "host": [ + "{{host}}" + ], + "path": [ + "projects", + "elastic", + "refs", + "master", + "elements", + "x" + ] + } + }, + "response": [] + }, + { + "name": "get z", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});", + "pm.test(\"response has element z\", function () {", + " var jsonData = pm.response.json();", + " pm.expect(jsonData.elements[0].name).to.eql('z');", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "url": { + "raw": "{{host}}/projects/elastic/refs/master/elements/z", + "host": [ + "{{host}}" + ], + "path": [ + "projects", + "elastic", + "refs", + "master", + "elements", + "z" + ] + } + }, + "response": [] + }, + { + "name": "update element to elastic", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});", + "", + "pm.environment.set(\"commitId2\", pm.response.json().elements[0]._commitId);" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"elements\": [\n\t\t{\n\t\t\t\"id\": \"x\",\n\t\t\t\"name\": \"y\"\n\t\t},\n {\n\t\t\t\"id\": \"z\",\n\t\t\t\"name\": \"y\"\n\t\t}\n\t]\n}" + }, + "url": { + "raw": "{{host}}/projects/elastic/refs/master/elements", + "host": [ + "{{host}}" + ], + "path": [ + "projects", + "elastic", + "refs", + "master", + "elements" + ] + } + }, + "response": [] + }, + { + "name": "get x again", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});", + "pm.test(\"response has element x\", function () {", + " var jsonData = pm.response.json();", + " pm.expect(jsonData.elements[0].name).to.eql('y');", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "url": { + "raw": "{{host}}/projects/elastic/refs/master/elements/x", + "host": [ + "{{host}}" + ], + "path": [ + "projects", + "elastic", + "refs", + "master", + "elements", + "x" + ] + } + }, + "response": [] + }, + { + "name": "check ref commit history", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"response has 2 commit\", function () {", + " var jsonData = pm.response.json();", + " pm.expect(jsonData.commits.length).to.eql(2);", + "});", + "", + "pm.test(\"commit history is right\", function() {", + " var jsonData = pm.response.json();", + " pm.expect(jsonData.commits[0].id).to.eql(pm.environment.get(\"commitId2\"))", + " pm.expect(jsonData.commits[1].id).to.eql(pm.environment.get(\"commitId1\"))", + "});", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{host}}/projects/elastic/refs/master/commits", + "host": [ + "{{host}}" + ], + "path": [ + "projects", + "elastic", + "refs", + "master", + "commits" + ] + } + }, + "response": [] + }, + { + "name": "check element x commit history", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"response has 2 commit\", function () {", + " var jsonData = pm.response.json();", + " pm.expect(jsonData.commits.length).to.eql(2);", + "});", + "", + "pm.test(\"commit history is right\", function() {", + " var jsonData = pm.response.json();", + " pm.expect(jsonData.commits[0].id).to.eql(pm.environment.get(\"commitId2\"))", + " pm.expect(jsonData.commits[1].id).to.eql(pm.environment.get(\"commitId1\"))", + "});", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{host}}/projects/elastic/refs/master/elements/x/commits", + "host": [ + "{{host}}" + ], + "path": [ + "projects", + "elastic", + "refs", + "master", + "elements", + "x", + "commits" + ] + } + }, + "response": [] + }, + { + "name": "check element z commit history", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"response has 2 commit\", function () {", + " var jsonData = pm.response.json();", + " pm.expect(jsonData.commits.length).to.eql(2);", + "});", + "", + "pm.test(\"commit history is right\", function() {", + " var jsonData = pm.response.json();", + " pm.expect(jsonData.commits[0].id).to.eql(pm.environment.get(\"commitId2\"))", + " pm.expect(jsonData.commits[1].id).to.eql(pm.environment.get(\"commitId1\"))", + "});", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{host}}/projects/elastic/refs/master/elements/z/commits", + "host": [ + "{{host}}" + ], + "path": [ + "projects", + "elastic", + "refs", + "master", + "elements", + "z", + "commits" + ] + } + }, + "response": [] + } + ], + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{token}}", + "type": "string" + } + ] + }, + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ] +} \ No newline at end of file diff --git a/rdb/src/main/java/org/openmbee/mms/rdb/repositories/BaseDAOImpl.java b/rdb/src/main/java/org/openmbee/mms/rdb/repositories/BaseDAOImpl.java index 4a5e21365..d2f878092 100644 --- a/rdb/src/main/java/org/openmbee/mms/rdb/repositories/BaseDAOImpl.java +++ b/rdb/src/main/java/org/openmbee/mms/rdb/repositories/BaseDAOImpl.java @@ -9,8 +9,6 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.PlatformTransactionManager; -import java.util.regex.Pattern; - import static org.openmbee.mms.core.config.Constants.BRANCH_ID_VALID_PATTERN; public abstract class BaseDAOImpl { diff --git a/rdb/src/main/java/org/openmbee/mms/rdb/repositories/node/NodeDAOImpl.java b/rdb/src/main/java/org/openmbee/mms/rdb/repositories/node/NodeDAOImpl.java index 4ed518e6e..d40e9ef58 100644 --- a/rdb/src/main/java/org/openmbee/mms/rdb/repositories/node/NodeDAOImpl.java +++ b/rdb/src/main/java/org/openmbee/mms/rdb/repositories/node/NodeDAOImpl.java @@ -193,4 +193,4 @@ private PreparedStatement prepareStatement(PreparedStatement ps, Node n) throws } return ps; } -} +} \ No newline at end of file