From 4b7b8644fd772085186f8135f998598959bad4c7 Mon Sep 17 00:00:00 2001 From: pbortnik Date: Wed, 20 Sep 2017 01:20:16 +0300 Subject: [PATCH 1/5] Update script for generate id --- .../core/item/StartTestItemHandlerImpl.java | 4 +- .../core/item/TestItemUniqueIdGenerator.java | 84 ++++++++++++++++++- .../core/item/UniqueIdGenerator.java | 5 +- .../core/launch/impl/MergeLaunchHandler.java | 8 +- .../demo_data/DemoDataCommonService.java | 4 +- .../migration/ChangeSets_3_3.java | 5 ++ .../core/item/UniqueIdGeneratorTest.java | 83 +++++++++--------- 7 files changed, 138 insertions(+), 55 deletions(-) diff --git a/src/main/java/com/epam/ta/reportportal/core/item/StartTestItemHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/item/StartTestItemHandlerImpl.java index aa8f46d7d2..c4eb2015fb 100644 --- a/src/main/java/com/epam/ta/reportportal/core/item/StartTestItemHandlerImpl.java +++ b/src/main/java/com/epam/ta/reportportal/core/item/StartTestItemHandlerImpl.java @@ -91,7 +91,7 @@ public EntryCreatedRS startRootItem(String projectName, StartTestItemRQ rq) { validate(projectName, rq, launch); TestItem item = testItemBuilder.get().addStartItemRequest(rq).addStatus(Status.IN_PROGRESS).addLaunch(launch).build(); if (null == item.getUniqueId()) { - item.setUniqueId(identifierGenerator.generate(item, projectName)); + item.setUniqueId(identifierGenerator.generate(item)); } testItemRepository.save(item); return new EntryCreatedRS(item.getId()); @@ -110,7 +110,7 @@ public EntryCreatedRS startChildItem(String projectName, StartTestItemRQ rq, Str TestItem item = testItemBuilder.get().addStartItemRequest(rq).addParent(parentItem).addPath(parentItem) .addStatus(Status.IN_PROGRESS).build(); if (null == item.getUniqueId()) { - item.setUniqueId(identifierGenerator.generate(item, projectName)); + item.setUniqueId(identifierGenerator.generate(item)); } testItemRepository.save(item); diff --git a/src/main/java/com/epam/ta/reportportal/core/item/TestItemUniqueIdGenerator.java b/src/main/java/com/epam/ta/reportportal/core/item/TestItemUniqueIdGenerator.java index 36c9ea352a..235084ac29 100644 --- a/src/main/java/com/epam/ta/reportportal/core/item/TestItemUniqueIdGenerator.java +++ b/src/main/java/com/epam/ta/reportportal/core/item/TestItemUniqueIdGenerator.java @@ -23,15 +23,27 @@ import com.epam.ta.reportportal.database.dao.LaunchRepository; import com.epam.ta.reportportal.database.dao.TestItemRepository; +import com.epam.ta.reportportal.database.entity.Launch; import com.epam.ta.reportportal.database.entity.item.Parameter; import com.epam.ta.reportportal.database.entity.item.TestItem; import com.google.common.base.Strings; +import com.mongodb.BasicDBObject; +import com.mongodb.DBObject; import org.apache.commons.collections.CollectionUtils; +import org.bson.types.ObjectId; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.event.ContextRefreshedEvent; +import org.springframework.context.event.EventListener; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoOperations; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.util.CloseableIterator; import org.springframework.stereotype.Service; import java.nio.charset.StandardCharsets; import java.util.*; +import java.util.concurrent.Executors; import java.util.stream.Collectors; /** @@ -51,15 +63,30 @@ public class TestItemUniqueIdGenerator implements UniqueIdGenerator { private static final String SECRET = "auto:"; + private static final String COLLECTION = "generationCheckpoint"; + private static final String CHECKPOINT_ID = "checkpoint"; + private static final String CHECKPOINT_ITEM_ID = "item_id"; + private static final int BATCH_SIZE = 1000; + @Autowired private TestItemRepository testItemRepository; @Autowired private LaunchRepository launchRepository; + @Autowired + private MongoOperations mongoOperations; + + @EventListener + public void onContextRefresh(ContextRefreshedEvent event) { + if (mongoOperations.collectionExists(COLLECTION)) { + Executors.newSingleThreadExecutor().execute(this::generateForAll); + } + } + @Override - public String generate(TestItem testItem, String projectName) { - String forEncoding = prepareForEncoding(testItem, projectName); + public String generate(TestItem testItem) { + String forEncoding = prepareForEncoding(testItem); return ENCODER.encodeToString(forEncoding.getBytes(StandardCharsets.UTF_8)); } @@ -68,8 +95,57 @@ public boolean validate(String encoded) { return !Strings.isNullOrEmpty(encoded) && new String(DECODER.decode(encoded), StandardCharsets.UTF_8).startsWith(SECRET); } - private String prepareForEncoding(TestItem testItem, String projectName) { - String launchName = launchRepository.findNameNumberAndModeById(testItem.getLaunchRef()).getName(); + @Override + public void generateForAll() { + String checkPoint = getLastCheckPoint(); + try (CloseableIterator itemIterator = getItemIterator(checkPoint)) { + List testItems = new ArrayList<>(BATCH_SIZE); + while (itemIterator.hasNext()) { + TestItem next = itemIterator.next(); + if (next != null) { + String uniqueId = generate(next); + next.setUniqueId(uniqueId); + if (checkPoint == null) { + checkPoint = next.getId(); + } + testItems.add(next); + if (testItems.size() == BATCH_SIZE || !itemIterator.hasNext()) { + createCheckpoint(checkPoint); + testItemRepository.save(testItems); + testItems = new ArrayList<>(BATCH_SIZE); + checkPoint = null; + } + } + + } + } + mongoOperations.getCollection(COLLECTION).drop(); + } + + private void createCheckpoint(String checkPoint) { + BasicDBObject checkpoint = new BasicDBObject("_id", CHECKPOINT_ID).append(CHECKPOINT_ITEM_ID, checkPoint); + mongoOperations.getCollection(COLLECTION).save(checkpoint); + } + + private CloseableIterator getItemIterator(String checkPoint) { + Sort sort = new Sort(Sort.Direction.ASC, "_id"); + Query query = new Query().with(sort).noCursorTimeout(); + query.addCriteria(Criteria.where("uniqueId").exists(false)); + if (checkPoint != null) { + query.addCriteria(Criteria.where("_id").gte(new ObjectId(checkPoint))); + } + return mongoOperations.stream(query, TestItem.class); + } + + private String getLastCheckPoint() { + DBObject object = mongoOperations.getCollection(COLLECTION).findOne(new BasicDBObject("_id", CHECKPOINT_ID)); + return object == null ? null : (String) object.get(CHECKPOINT_ITEM_ID); + } + + private String prepareForEncoding(TestItem testItem) { + Launch launch = launchRepository.findOne(testItem.getLaunchRef()); + String launchName = launch.getName(); + String projectName = launch.getProjectRef(); List pathNames = getPathNames(testItem.getPath()); String itemName = testItem.getName(); List parameters = Optional.ofNullable(testItem.getParameters()).orElse(Collections.emptyList()); diff --git a/src/main/java/com/epam/ta/reportportal/core/item/UniqueIdGenerator.java b/src/main/java/com/epam/ta/reportportal/core/item/UniqueIdGenerator.java index 585c906222..8be8984da2 100644 --- a/src/main/java/com/epam/ta/reportportal/core/item/UniqueIdGenerator.java +++ b/src/main/java/com/epam/ta/reportportal/core/item/UniqueIdGenerator.java @@ -31,10 +31,9 @@ public interface UniqueIdGenerator { /** * Generates the unique identifier for test item * @param testItem source for id - * @param projectName project * @return unique id */ - String generate(TestItem testItem, String projectName); + String generate(TestItem testItem); /** * Validate if string has been generated. @@ -43,4 +42,6 @@ public interface UniqueIdGenerator { */ boolean validate(String encoded); + void generateForAll(); + } diff --git a/src/main/java/com/epam/ta/reportportal/core/launch/impl/MergeLaunchHandler.java b/src/main/java/com/epam/ta/reportportal/core/launch/impl/MergeLaunchHandler.java index e8d45a6415..23daa4a183 100644 --- a/src/main/java/com/epam/ta/reportportal/core/launch/impl/MergeLaunchHandler.java +++ b/src/main/java/com/epam/ta/reportportal/core/launch/impl/MergeLaunchHandler.java @@ -129,8 +129,7 @@ public LaunchResource mergeLaunches(String projectName, String userName, MergeLa Launch launch = createResultedLaunch(projectName, userName, rq); boolean isNameChanged = !launch.getName().equals(launchesList.get(0).getName()); - updateChildrenOfLaunches(launch.getId(), rq.getLaunches(), - rq.isExtendSuitesDescription(), isNameChanged, projectName); + updateChildrenOfLaunches(launch.getId(), rq.getLaunches(), rq.isExtendSuitesDescription(), isNameChanged); MergeStrategyType type = MergeStrategyType.fromValue(rq.getMergeStrategyType()); expect(type, notNull()).verify(UNSUPPORTED_MERGE_STRATEGY_TYPE, type); @@ -198,14 +197,13 @@ private void validateMergingLaunches(List launches, User user, Project p /** * Update test-items of specified launches with new LaunchID */ - private void updateChildrenOfLaunches(String launchId, Set launches, boolean extendDescription, - boolean isNameChanged, String project) { + private void updateChildrenOfLaunches(String launchId, Set launches, boolean extendDescription, boolean isNameChanged) { List testItems = launches.stream().flatMap(id -> { Launch launch = launchRepository.findOne(id); return testItemRepository.findByLaunch(launch).stream().map(item -> { item.setLaunchRef(launchId); if (isNameChanged && identifierGenerator.validate(item.getUniqueId())) { - item.setUniqueId(identifierGenerator.generate(item, project)); + item.setUniqueId(identifierGenerator.generate(item)); } if (item.getType().sameLevel(TestItemType.SUITE)) { // Add launch reference description for top level items diff --git a/src/main/java/com/epam/ta/reportportal/demo_data/DemoDataCommonService.java b/src/main/java/com/epam/ta/reportportal/demo_data/DemoDataCommonService.java index f90ab98770..a69658b9b7 100644 --- a/src/main/java/com/epam/ta/reportportal/demo_data/DemoDataCommonService.java +++ b/src/main/java/com/epam/ta/reportportal/demo_data/DemoDataCommonService.java @@ -117,7 +117,7 @@ TestItem startRootItem(String rootItemName, String launchId, TestItemType type, testItem.setHasChilds(true); testItem.setStatus(IN_PROGRESS); testItem.setType(type); - testItem.setUniqueId(identifierGenerator.generate(testItem, project)); + testItem.setUniqueId(identifierGenerator.generate(testItem)); return testItemRepository.save(testItem); } @@ -149,7 +149,7 @@ TestItem startTestItem(TestItem rootItemId, String launchId, String name, testItem.setType(type); testItem.getPath().addAll(rootItemId.getPath()); testItem.getPath().add(rootItemId.getId()); - testItem.setUniqueId(identifierGenerator.generate(testItem, project)); + testItem.setUniqueId(identifierGenerator.generate(testItem)); return testItemRepository.save(testItem); } diff --git a/src/main/java/com/epam/ta/reportportal/migration/ChangeSets_3_3.java b/src/main/java/com/epam/ta/reportportal/migration/ChangeSets_3_3.java index 55f2a65f62..5dd9578dcb 100644 --- a/src/main/java/com/epam/ta/reportportal/migration/ChangeSets_3_3.java +++ b/src/main/java/com/epam/ta/reportportal/migration/ChangeSets_3_3.java @@ -97,6 +97,11 @@ public void updateActivityTypes(MongoTemplate mongoTemplate) { }); } + @ChangeSet(order = "3.3-3", id = "v3.3-Generate id", author = "pbortnik") + public void generate(MongoTemplate mongoTemplate) { + mongoTemplate.createCollection("generationCheckpoint"); + } + private Update createShareHistory(Update u, String objectType, String oldValue, String newValue) { Map[] dbArray = new LinkedHashMap[1]; Map res = new LinkedHashMap(3); diff --git a/src/test/java/com/epam/ta/reportportal/core/item/UniqueIdGeneratorTest.java b/src/test/java/com/epam/ta/reportportal/core/item/UniqueIdGeneratorTest.java index e54a5b3397..13d18d83cf 100644 --- a/src/test/java/com/epam/ta/reportportal/core/item/UniqueIdGeneratorTest.java +++ b/src/test/java/com/epam/ta/reportportal/core/item/UniqueIdGeneratorTest.java @@ -33,59 +33,62 @@ import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; +import java.nio.charset.StandardCharsets; +import java.util.Base64; import java.util.List; /** - * * @author Pavel_Bortnik */ @SpringFixture("triggerTests") public class UniqueIdGeneratorTest extends BaseTest { - @Rule - @Autowired - public SpringFixtureRule dfRule; + @Rule + @Autowired + public SpringFixtureRule dfRule; - @Autowired - private TestItemRepository testItemRepository; + @Autowired + private TestItemRepository testItemRepository; - @Autowired - private UniqueIdGenerator identifierGenerator; + @Autowired + private UniqueIdGenerator identifierGenerator; - private static final String ITEM = "44524cc1553de753b3e5ab2f"; - private static final String PROJECT = "DEFAULT"; + private static final String ITEM = "44524cc1553de753b3e5ab2f"; + private static final String PROJECT = "DEFAULT"; - @Test - public void generateUniqueId() { - TestItem item = testItemRepository.findOne(ITEM); - String s1 = identifierGenerator.generate(item, PROJECT); - String s2 = identifierGenerator.generate(item, PROJECT); - Assert.assertEquals(s1, s2); - item.setParameters(getParameters()); - String s3 = identifierGenerator.generate(item, PROJECT); - Assert.assertNotEquals(s1, s3); + @Test + public void generateUniqueId() { + TestItem item = testItemRepository.findOne(ITEM); + String s1 = identifierGenerator.generate(item); + String s2 = identifierGenerator.generate(item); + Assert.assertEquals(s1, s2); + item.setParameters(getParameters()); + String s3 = identifierGenerator.generate(item); + Assert.assertNotEquals(s1, s3); - item.setName("Different"); - item.setParameters(null); - String s4 = identifierGenerator.generate(item, PROJECT); - Assert.assertNotEquals(s3, s4); - } + item.setName("Different"); + item.setParameters(null); + String s4 = identifierGenerator.generate(item); + Assert.assertNotEquals(s3, s4); + } - @Test - public void validate() { - TestItem item = testItemRepository.findOne(ITEM); - String s1 = identifierGenerator.generate(item, PROJECT); - Assert.assertTrue(identifierGenerator.validate(s1)); - Assert.assertFalse(identifierGenerator.validate("customId")); - } + @Test + public void validate() { + TestItem item = testItemRepository.findOne(ITEM); + String s1 = identifierGenerator.generate(item); + Assert.assertTrue(identifierGenerator.validate(s1)); + byte[] decode = Base64.getDecoder().decode(s1); + Assert.assertTrue(new String(decode, StandardCharsets.UTF_8).contains("project1")); + Assert.assertFalse(identifierGenerator.validate("customId")); + } - private List getParameters() { - Parameter parameters = new Parameter(); - parameters.setKey("CardNumber"); - parameters.setValue("4444333322221111"); - Parameter parameters1 = new Parameter(); - parameters1.setKey("Stars"); - parameters1.setValue("2 stars"); - return ImmutableList.builder().add(parameters).add(parameters1).build(); - } + private List getParameters() { + Parameter parameters = new Parameter(); + parameters.setKey("CardNumber"); + parameters.setValue("4444333322221111"); + Parameter parameters1 = new Parameter(); + parameters1.setKey("Stars"); + parameters1.setValue("2 stars"); + return ImmutableList.builder().add(parameters).add(parameters1).build(); + } } \ No newline at end of file From b2f86f52322db4d3e10d257ece12815f8b57b5c0 Mon Sep 17 00:00:00 2001 From: Pavel_Bortnik Date: Wed, 20 Sep 2017 10:42:55 +0300 Subject: [PATCH 2/5] Optimize generating unique id logic --- .../core/item/TestItemUniqueIdGenerator.java | 64 +++++++------------ 1 file changed, 24 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/epam/ta/reportportal/core/item/TestItemUniqueIdGenerator.java b/src/main/java/com/epam/ta/reportportal/core/item/TestItemUniqueIdGenerator.java index 235084ac29..fe21a7bcf5 100644 --- a/src/main/java/com/epam/ta/reportportal/core/item/TestItemUniqueIdGenerator.java +++ b/src/main/java/com/epam/ta/reportportal/core/item/TestItemUniqueIdGenerator.java @@ -27,14 +27,10 @@ import com.epam.ta.reportportal.database.entity.item.Parameter; import com.epam.ta.reportportal.database.entity.item.TestItem; import com.google.common.base.Strings; -import com.mongodb.BasicDBObject; -import com.mongodb.DBObject; import org.apache.commons.collections.CollectionUtils; -import org.bson.types.ObjectId; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.EventListener; -import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; @@ -64,19 +60,30 @@ public class TestItemUniqueIdGenerator implements UniqueIdGenerator { private static final String SECRET = "auto:"; private static final String COLLECTION = "generationCheckpoint"; - private static final String CHECKPOINT_ID = "checkpoint"; - private static final String CHECKPOINT_ITEM_ID = "item_id"; + private static final int BATCH_SIZE = 1000; - @Autowired private TestItemRepository testItemRepository; - @Autowired private LaunchRepository launchRepository; - @Autowired private MongoOperations mongoOperations; + @Autowired + public void setTestItemRepository(TestItemRepository testItemRepository) { + this.testItemRepository = testItemRepository; + } + + @Autowired + public void setLaunchRepository(LaunchRepository launchRepository) { + this.launchRepository = launchRepository; + } + + @Autowired + public void setMongoOperations(MongoOperations mongoOperations) { + this.mongoOperations = mongoOperations; + } + @EventListener public void onContextRefresh(ContextRefreshedEvent event) { if (mongoOperations.collectionExists(COLLECTION)) { @@ -97,50 +104,27 @@ public boolean validate(String encoded) { @Override public void generateForAll() { - String checkPoint = getLastCheckPoint(); - try (CloseableIterator itemIterator = getItemIterator(checkPoint)) { - List testItems = new ArrayList<>(BATCH_SIZE); + try (CloseableIterator itemIterator = getItemIterator()) { + List testItems = new ArrayList<>(BATCH_SIZE); while (itemIterator.hasNext()) { TestItem next = itemIterator.next(); if (next != null) { - String uniqueId = generate(next); - next.setUniqueId(uniqueId); - if (checkPoint == null) { - checkPoint = next.getId(); - } - testItems.add(next); + String item = generate(next); + next.setUniqueId(item); + testItems.add(next); if (testItems.size() == BATCH_SIZE || !itemIterator.hasNext()) { - createCheckpoint(checkPoint); testItemRepository.save(testItems); testItems = new ArrayList<>(BATCH_SIZE); - checkPoint = null; } } - } } mongoOperations.getCollection(COLLECTION).drop(); } - private void createCheckpoint(String checkPoint) { - BasicDBObject checkpoint = new BasicDBObject("_id", CHECKPOINT_ID).append(CHECKPOINT_ITEM_ID, checkPoint); - mongoOperations.getCollection(COLLECTION).save(checkpoint); - } - - private CloseableIterator getItemIterator(String checkPoint) { - Sort sort = new Sort(Sort.Direction.ASC, "_id"); - Query query = new Query().with(sort).noCursorTimeout(); - query.addCriteria(Criteria.where("uniqueId").exists(false)); - if (checkPoint != null) { - query.addCriteria(Criteria.where("_id").gte(new ObjectId(checkPoint))); - } - return mongoOperations.stream(query, TestItem.class); - } - - private String getLastCheckPoint() { - DBObject object = mongoOperations.getCollection(COLLECTION).findOne(new BasicDBObject("_id", CHECKPOINT_ID)); - return object == null ? null : (String) object.get(CHECKPOINT_ITEM_ID); - } + private CloseableIterator getItemIterator() { + return mongoOperations.stream(new Query().addCriteria(Criteria.where("uniqueId").exists(false)), TestItem.class); + } private String prepareForEncoding(TestItem testItem) { Launch launch = launchRepository.findOne(testItem.getLaunchRef()); From 4859d1d3ccdec43e2584fa2fb54533ffb3a47aa1 Mon Sep 17 00:00:00 2001 From: Pavel_Bortnik Date: Wed, 20 Sep 2017 10:52:36 +0300 Subject: [PATCH 3/5] More documentation --- .../core/item/UniqueIdGenerator.java | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/epam/ta/reportportal/core/item/UniqueIdGenerator.java b/src/main/java/com/epam/ta/reportportal/core/item/UniqueIdGenerator.java index 8be8984da2..23d44a3dc4 100644 --- a/src/main/java/com/epam/ta/reportportal/core/item/UniqueIdGenerator.java +++ b/src/main/java/com/epam/ta/reportportal/core/item/UniqueIdGenerator.java @@ -24,24 +24,32 @@ import com.epam.ta.reportportal.database.entity.item.TestItem; /** + * Unique id generator for designate test item's originality + * * @author Pavel_Bortnik + * @since V3.2 */ public interface UniqueIdGenerator { - /** - * Generates the unique identifier for test item - * @param testItem source for id - * @return unique id - */ - String generate(TestItem testItem); + /** + * Generates the unique identifier for test item + * + * @param testItem source for id + * @return unique id + */ + String generate(TestItem testItem); - /** - * Validate if string has been generated. - * @param encoded - * @return - */ - boolean validate(String encoded); + /** + * Validate if string has been generated automatically + * + * @param encoded encoded + * @return true if it has been generated automatically + */ + boolean validate(String encoded); - void generateForAll(); + /** + * Generate unique ids for all test items without it + */ + void generateForAll(); } From 832f73df4c38fd02440ff79748e0801f1bcb8a7c Mon Sep 17 00:00:00 2001 From: Pavel_Bortnik Date: Wed, 20 Sep 2017 10:54:44 +0300 Subject: [PATCH 4/5] Formatted --- .../core/item/TestItemUniqueIdGenerator.java | 130 +++++++++--------- 1 file changed, 65 insertions(+), 65 deletions(-) diff --git a/src/main/java/com/epam/ta/reportportal/core/item/TestItemUniqueIdGenerator.java b/src/main/java/com/epam/ta/reportportal/core/item/TestItemUniqueIdGenerator.java index fe21a7bcf5..b53685ce4e 100644 --- a/src/main/java/com/epam/ta/reportportal/core/item/TestItemUniqueIdGenerator.java +++ b/src/main/java/com/epam/ta/reportportal/core/item/TestItemUniqueIdGenerator.java @@ -53,21 +53,21 @@ @Service public class TestItemUniqueIdGenerator implements UniqueIdGenerator { - private static final Base64.Encoder ENCODER = Base64.getEncoder(); + private static final Base64.Encoder ENCODER = Base64.getEncoder(); - private static final Base64.Decoder DECODER = Base64.getDecoder(); + private static final Base64.Decoder DECODER = Base64.getDecoder(); - private static final String SECRET = "auto:"; + private static final String SECRET = "auto:"; - private static final String COLLECTION = "generationCheckpoint"; + private static final String COLLECTION = "generationCheckpoint"; - private static final int BATCH_SIZE = 1000; + private static final int BATCH_SIZE = 1000; - private TestItemRepository testItemRepository; + private TestItemRepository testItemRepository; - private LaunchRepository launchRepository; + private LaunchRepository launchRepository; - private MongoOperations mongoOperations; + private MongoOperations mongoOperations; @Autowired public void setTestItemRepository(TestItemRepository testItemRepository) { @@ -84,71 +84,71 @@ public void setMongoOperations(MongoOperations mongoOperations) { this.mongoOperations = mongoOperations; } - @EventListener - public void onContextRefresh(ContextRefreshedEvent event) { - if (mongoOperations.collectionExists(COLLECTION)) { - Executors.newSingleThreadExecutor().execute(this::generateForAll); - } - } - - @Override - public String generate(TestItem testItem) { - String forEncoding = prepareForEncoding(testItem); - return ENCODER.encodeToString(forEncoding.getBytes(StandardCharsets.UTF_8)); - } - - @Override - public boolean validate(String encoded) { - return !Strings.isNullOrEmpty(encoded) && new String(DECODER.decode(encoded), StandardCharsets.UTF_8).startsWith(SECRET); - } - - @Override - public void generateForAll() { + @EventListener + public void onContextRefresh(ContextRefreshedEvent event) { + if (mongoOperations.collectionExists(COLLECTION)) { + Executors.newSingleThreadExecutor().execute(this::generateForAll); + } + } + + @Override + public String generate(TestItem testItem) { + String forEncoding = prepareForEncoding(testItem); + return ENCODER.encodeToString(forEncoding.getBytes(StandardCharsets.UTF_8)); + } + + @Override + public boolean validate(String encoded) { + return !Strings.isNullOrEmpty(encoded) && new String(DECODER.decode(encoded), StandardCharsets.UTF_8).startsWith(SECRET); + } + + @Override + public void generateForAll() { try (CloseableIterator itemIterator = getItemIterator()) { List testItems = new ArrayList<>(BATCH_SIZE); - while (itemIterator.hasNext()) { - TestItem next = itemIterator.next(); - if (next != null) { + while (itemIterator.hasNext()) { + TestItem next = itemIterator.next(); + if (next != null) { String item = generate(next); next.setUniqueId(item); testItems.add(next); - if (testItems.size() == BATCH_SIZE || !itemIterator.hasNext()) { - testItemRepository.save(testItems); - testItems = new ArrayList<>(BATCH_SIZE); - } - } - } - } - mongoOperations.getCollection(COLLECTION).drop(); - } + if (testItems.size() == BATCH_SIZE || !itemIterator.hasNext()) { + testItemRepository.save(testItems); + testItems = new ArrayList<>(BATCH_SIZE); + } + } + } + } + mongoOperations.getCollection(COLLECTION).drop(); + } private CloseableIterator getItemIterator() { return mongoOperations.stream(new Query().addCriteria(Criteria.where("uniqueId").exists(false)), TestItem.class); } - private String prepareForEncoding(TestItem testItem) { - Launch launch = launchRepository.findOne(testItem.getLaunchRef()); - String launchName = launch.getName(); - String projectName = launch.getProjectRef(); - List pathNames = getPathNames(testItem.getPath()); - String itemName = testItem.getName(); - List parameters = Optional.ofNullable(testItem.getParameters()).orElse(Collections.emptyList()); - StringJoiner joiner = new StringJoiner(";"); - joiner.add(SECRET).add(projectName).add(launchName); - if (!CollectionUtils.isEmpty(pathNames)) { - joiner.add(pathNames.stream().collect(Collectors.joining(","))); - } - joiner.add(itemName); - if (!parameters.isEmpty()) { - joiner.add(parameters.stream().map(parameter -> - (!Strings.isNullOrEmpty(parameter.getKey()) ? - parameter.getKey() + "=" : "") + parameter.getValue()).collect(Collectors.joining(","))); - } - return joiner.toString(); - } - - private List getPathNames(List path) { - Map names = testItemRepository.findPathNames(path); - return path.stream().map(names::get).collect(Collectors.toList()); - } + private String prepareForEncoding(TestItem testItem) { + Launch launch = launchRepository.findOne(testItem.getLaunchRef()); + String launchName = launch.getName(); + String projectName = launch.getProjectRef(); + List pathNames = getPathNames(testItem.getPath()); + String itemName = testItem.getName(); + List parameters = Optional.ofNullable(testItem.getParameters()).orElse(Collections.emptyList()); + StringJoiner joiner = new StringJoiner(";"); + joiner.add(SECRET).add(projectName).add(launchName); + if (!CollectionUtils.isEmpty(pathNames)) { + joiner.add(pathNames.stream().collect(Collectors.joining(","))); + } + joiner.add(itemName); + if (!parameters.isEmpty()) { + joiner.add(parameters.stream() + .map(parameter -> (!Strings.isNullOrEmpty(parameter.getKey()) ? parameter.getKey() + "=" : "") + parameter.getValue()) + .collect(Collectors.joining(","))); + } + return joiner.toString(); + } + + private List getPathNames(List path) { + Map names = testItemRepository.findPathNames(path); + return path.stream().map(names::get).collect(Collectors.toList()); + } } From 02af355f42ac0d87a5a10e58a16ee9cc8d24e9e0 Mon Sep 17 00:00:00 2001 From: Pavel_Bortnik Date: Thu, 21 Sep 2017 16:07:45 +0300 Subject: [PATCH 5/5] fixed issue with test items without launches --- .../core/item/TestItemUniqueIdGenerator.java | 40 ++++++++++++++++--- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/epam/ta/reportportal/core/item/TestItemUniqueIdGenerator.java b/src/main/java/com/epam/ta/reportportal/core/item/TestItemUniqueIdGenerator.java index b53685ce4e..c0f3314d41 100644 --- a/src/main/java/com/epam/ta/reportportal/core/item/TestItemUniqueIdGenerator.java +++ b/src/main/java/com/epam/ta/reportportal/core/item/TestItemUniqueIdGenerator.java @@ -22,8 +22,11 @@ package com.epam.ta.reportportal.core.item; import com.epam.ta.reportportal.database.dao.LaunchRepository; +import com.epam.ta.reportportal.database.dao.LogRepository; +import com.epam.ta.reportportal.database.dao.ProjectRepository; import com.epam.ta.reportportal.database.dao.TestItemRepository; import com.epam.ta.reportportal.database.entity.Launch; +import com.epam.ta.reportportal.database.entity.Project; import com.epam.ta.reportportal.database.entity.item.Parameter; import com.epam.ta.reportportal.database.entity.item.TestItem; import com.google.common.base.Strings; @@ -67,6 +70,12 @@ public class TestItemUniqueIdGenerator implements UniqueIdGenerator { private LaunchRepository launchRepository; + @Autowired + private LogRepository logRepository; + + @Autowired + private ProjectRepository projectRepository; + private MongoOperations mongoOperations; @Autowired @@ -109,12 +118,15 @@ public void generateForAll() { while (itemIterator.hasNext()) { TestItem next = itemIterator.next(); if (next != null) { - String item = generate(next); - next.setUniqueId(item); - testItems.add(next); - if (testItems.size() == BATCH_SIZE || !itemIterator.hasNext()) { - testItemRepository.save(testItems); - testItems = new ArrayList<>(BATCH_SIZE); + boolean isRemoved = removeIfInvalid(next); + if (!isRemoved) { + String item = generate(next); + next.setUniqueId(item); + testItems.add(next); + if (testItems.size() == BATCH_SIZE || !itemIterator.hasNext()) { + testItemRepository.save(testItems); + testItems = new ArrayList<>(BATCH_SIZE); + } } } } @@ -122,6 +134,22 @@ public void generateForAll() { mongoOperations.getCollection(COLLECTION).drop(); } + private boolean removeIfInvalid(TestItem next) { + String launchRef = next.getLaunchRef(); + Launch one = launchRepository.findOne(launchRef); + if (one == null) { + testItemRepository.delete(next.getId()); + return true; + } else { + Project project = projectRepository.findByName(one.getProjectRef()); + if (project == null) { + launchRepository.delete(launchRef); + return true; + } + } + return false; + } + private CloseableIterator getItemIterator() { return mongoOperations.stream(new Query().addCriteria(Criteria.where("uniqueId").exists(false)), TestItem.class); }