├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── config.yml ├── fix-docs-version.sh ├── maven-central-deploy.sh ├── semver-check.sh ├── settings.xml ├── vuepress-deploy.sh └── workflows │ ├── doc.yml │ ├── publish_to_jmeter_plugins.yaml │ └── release.yaml ├── .gitignore ├── CONTRIBUTING.md ├── CUSTOM_EXTENSIONS.md ├── LICENSE ├── README.md ├── checkstyle.xml ├── customizing ├── siebel_extension_explanations.md └── the_flow_explanation.md ├── docs ├── .gitignore ├── bzmRepositoriesScreenshot.png ├── jmeterpluginsScreenshot.png ├── package.json ├── src │ ├── .vuepress │ │ ├── config.js │ │ ├── enhanceApp.js │ │ ├── public │ │ │ ├── examples │ │ │ │ ├── CustomContext.java │ │ │ │ └── CustomCorrelationExtractor.java │ │ │ └── images │ │ │ │ └── blazemeter-labs-logo.png │ │ ├── styles │ │ │ ├── index.styl │ │ │ └── palette.styl │ │ └── theme │ │ │ ├── components │ │ │ └── Home.vue │ │ │ └── index.js │ ├── bugreport │ │ └── assets │ │ │ └── JTLRecordingConfiguration.png │ ├── contributing │ │ ├── README.md │ │ └── assets │ │ │ ├── classDiagram.puml │ │ │ ├── exampleDiagram.puml │ │ │ └── umlDiagram.png │ ├── guide │ │ ├── README.md │ │ ├── advanced-features.md │ │ ├── after-recording.md │ │ ├── analysis-configuration.md │ │ ├── assets │ │ │ ├── add_custom_extractor.gif │ │ │ ├── add_custom_replacement.gif │ │ │ ├── adding-new-group.png │ │ │ ├── adding-new-rule.png │ │ │ ├── auto-correlation-successful-dialog.png │ │ │ ├── automatic-correlation-suggestions.png │ │ │ ├── click-helper.gif │ │ │ ├── correlation-suggestions.png │ │ │ ├── correlation-wizard-button.png │ │ │ ├── exampleDiagram.png │ │ │ ├── expand-advance-sextion-extractor.gif │ │ │ ├── expand-advance-sextion-replacement.gif │ │ │ ├── extraction-multiple-non-overwritable.png │ │ │ ├── extraction-multiple-overwritable.png │ │ │ ├── extraction-specific-match-non-overwritable.png │ │ │ ├── extraction-specific-match-overwritable.png │ │ │ ├── ignore-value-replacement.png │ │ │ ├── json-correlation-extractor.png │ │ │ ├── json-correlation-replacement.png │ │ │ ├── multiple-parameter-replacement.png │ │ │ ├── multiple-transformed-replacement.png │ │ │ ├── no-dynamic-values-report-dialog.png │ │ │ ├── regex-correlation-extractor.png │ │ │ ├── regex-correlation-replacement.png │ │ │ ├── replay-report-dialog.png │ │ │ ├── rules-container-table.png │ │ │ ├── select-automatic-correlation-method.png │ │ │ ├── select-correlation-method.png │ │ │ ├── select-correlation-template.png │ │ │ ├── selecting-other-correlation-extractor.gif │ │ │ ├── selecting-other-correlation-replacement.gif │ │ │ ├── single-parameter-replacement.png │ │ │ ├── single-transformed-replacement.png │ │ │ ├── using-the-plugin-history-1.png │ │ │ ├── using-the-plugin-history-2.png │ │ │ ├── using-the-plugin-history-3.png │ │ │ └── using-the-plugin-history-4.png │ │ ├── before-recording.md │ │ ├── best-practices.md │ │ ├── concepts.md │ │ ├── configuring-correlation-rules.md │ │ ├── correlation-process.md │ │ ├── correlation-rules.md │ │ ├── custom-extensions │ │ │ ├── README.md │ │ │ ├── custom-extensions.md │ │ │ └── the_flow_explanation.md │ │ ├── installation-configuration.md │ │ ├── installation-guide.md │ │ ├── knonw-issues.md │ │ ├── templates │ │ │ ├── create.md │ │ │ └── readme.md │ │ ├── troubleshooting.md │ │ └── using-the-plugin.md │ └── index.md └── yarn.lock ├── examples ├── CustomContext.java └── CustomCorrelationExtractor.java ├── pom.xml └── src ├── main ├── java │ └── com │ │ └── blazemeter │ │ └── jmeter │ │ └── correlation │ │ ├── CorrelationProxyControl.java │ │ ├── CorrelationProxyControlGui.java │ │ ├── core │ │ ├── BaseCorrelationContext.java │ │ ├── ClassFinderUtils.java │ │ ├── CorrelationContext.java │ │ ├── CorrelationEngine.java │ │ ├── CorrelationRule.java │ │ ├── CorrelationRulePartTestElement.java │ │ ├── DescriptionContent.java │ │ ├── InvalidRulePartElementException.java │ │ ├── ParameterDefinition.java │ │ ├── RegexMatcher.java │ │ ├── RulesGroup.java │ │ ├── analysis │ │ │ ├── Analysis.java │ │ │ ├── AnalysisReporter.java │ │ │ └── CorrelationRuleReport.java │ │ ├── automatic │ │ │ ├── Appearances.java │ │ │ ├── AppearancesExtraction.java │ │ │ ├── Configuration.java │ │ │ ├── CorrelationHistory.java │ │ │ ├── CorrelationSuggestion.java │ │ │ ├── CustomResultCollector.java │ │ │ ├── DynamicElement.java │ │ │ ├── ExtractionSuggestion.java │ │ │ ├── ExtractorGenerator.java │ │ │ ├── FileManagementUtils.java │ │ │ ├── JMeterElementUtils.java │ │ │ ├── JsonUtils.java │ │ │ ├── RecordingExtraction.java │ │ │ ├── RegexCommons.java │ │ │ ├── ReplacementSuggestion.java │ │ │ ├── ReplayReport.java │ │ │ ├── ReplayWorker.java │ │ │ ├── ResponseAnalyzer.java │ │ │ ├── ResultFileParser.java │ │ │ ├── ResultsExtraction.java │ │ │ ├── Sources.java │ │ │ ├── TemplateGeneration.java │ │ │ ├── WaitingDialog.java │ │ │ ├── extraction │ │ │ │ ├── StructureType.java │ │ │ │ ├── location │ │ │ │ │ ├── BodyExtractionStrategy.java │ │ │ │ │ ├── CookieExtractionStrategy.java │ │ │ │ │ ├── ExtractionStrategy.java │ │ │ │ │ ├── HeaderExtractionStrategy.java │ │ │ │ │ └── LocationType.java │ │ │ │ └── method │ │ │ │ │ ├── CookieExtractor.java │ │ │ │ │ ├── ExtractionConstants.java │ │ │ │ │ ├── Extractor.java │ │ │ │ │ ├── ExtractorFactory.java │ │ │ │ │ ├── HeaderExtractor.java │ │ │ │ │ ├── JsonBodyExtractor.java │ │ │ │ │ ├── RawTextBodyExtractor.java │ │ │ │ │ ├── RegexExtractor.java │ │ │ │ │ └── XmlBodyExtractor.java │ │ │ └── replacement │ │ │ │ └── method │ │ │ │ ├── ReplacementContext.java │ │ │ │ ├── ReplacementJsonStrategy.java │ │ │ │ ├── ReplacementRegex.java │ │ │ │ ├── ReplacementRegexStrategy.java │ │ │ │ ├── ReplacementStrategy.java │ │ │ │ └── ReplacementString.java │ │ ├── extractors │ │ │ ├── CorrelationExtractor.java │ │ │ ├── JsonCorrelationExtractor.java │ │ │ ├── RegexCorrelationExtractor.java │ │ │ ├── ResultField.java │ │ │ └── XmlCorrelationExtractor.java │ │ ├── proxy │ │ │ ├── ComparableCookie.java │ │ │ ├── CorrelationProxy.java │ │ │ ├── Jsr223PreProcessorFactory.java │ │ │ ├── PendingProxy.java │ │ │ └── ReflectionUtils.java │ │ ├── replacements │ │ │ ├── CorrelationReplacement.java │ │ │ ├── FunctionCorrelationReplacement.java │ │ │ ├── JsonCorrelationReplacement.java │ │ │ └── RegexCorrelationReplacement.java │ │ ├── suggestions │ │ │ ├── InterruptibleWorkerAgreement.java │ │ │ ├── SuggestionGenerator.java │ │ │ ├── SuggestionsApplianceWorker.java │ │ │ ├── SuggestionsUtils.java │ │ │ ├── context │ │ │ │ ├── AnalysisContext.java │ │ │ │ ├── ComparisonContext.java │ │ │ │ └── CorrelationContext.java │ │ │ └── method │ │ │ │ ├── AnalysisMethod.java │ │ │ │ ├── ComparisonMethod.java │ │ │ │ ├── CorrelationMethod.java │ │ │ │ ├── DynamicElementHandler.java │ │ │ │ └── LegacyMethod.java │ │ └── templates │ │ │ ├── ConfigurationException.java │ │ │ ├── CorrelationRuleSerializationPropertyFilter.java │ │ │ ├── CorrelationTemplateDependency.java │ │ │ ├── CorrelationTemplateVersions.java │ │ │ ├── CorrelationTemplatesRegistry.java │ │ │ ├── CorrelationTemplatesRegistryHandler.java │ │ │ ├── CorrelationTemplatesRepositoriesConfiguration.java │ │ │ ├── CorrelationTemplatesRepositoriesRegistry.java │ │ │ ├── CorrelationTemplatesRepositoriesRegistryHandler.java │ │ │ ├── CorrelationTemplatesRepository.java │ │ │ ├── CorrelationTemplatesRepositoryConfiguration.java │ │ │ ├── LocalConfiguration.java │ │ │ ├── LocalCorrelationTemplatesRegistry.java │ │ │ ├── LocalCorrelationTemplatesRepositoriesRegistry.java │ │ │ ├── Protocol.java │ │ │ ├── RemoteCorrelationTemplatesRepositoriesRegistry.java │ │ │ ├── Repository.java │ │ │ ├── RepositoryGeneralConst.java │ │ │ ├── SiebelTemplateRemoval.java │ │ │ ├── Template.java │ │ │ ├── TemplateVersion.java │ │ │ ├── TemplateVersionKeyDeserializer.java │ │ │ └── repository │ │ │ ├── FileRepository.java │ │ │ ├── PluggableRepository.java │ │ │ ├── Properties.java │ │ │ ├── RemoteRepository.java │ │ │ ├── RepositoryManager.java │ │ │ ├── RepositoryRegistry.java │ │ │ ├── RepositoryUtils.java │ │ │ ├── TemplateProperties.java │ │ │ └── pluggable │ │ │ ├── CentralRepository.java │ │ │ ├── LocalRepository.java │ │ │ ├── RemoteFolderRepository.java │ │ │ └── RemoteUrlRepository.java │ │ └── gui │ │ ├── CorrelationComponentsRegistry.java │ │ ├── CorrelationRulePartPanel.java │ │ ├── CorrelationRuleTestElement.java │ │ ├── CorrelationRulesTestElement.java │ │ ├── CustomExtensionsDialog.java │ │ ├── GroupPanel.java │ │ ├── GroupsContainer.java │ │ ├── GroupsTableGui.java │ │ ├── ResponseFilterPanel.java │ │ ├── RuleTableRow.java │ │ ├── RulesContainer.java │ │ ├── RulesGroupTestElement.java │ │ ├── RulesTableGui.java │ │ ├── TestPlanTemplatesRepository.java │ │ ├── analysis │ │ ├── CorrelationTemplatesSelectionPanel.java │ │ ├── TemplateSelectionTableModel.java │ │ ├── TemplateSuggestionsGeneratorWorker.java │ │ ├── TemplateVersionsTableItem.java │ │ └── TemplatesSelectionTable.java │ │ ├── automatic │ │ ├── CorrelationHistoryFrame.java │ │ ├── CorrelationMethodPanel.java │ │ ├── CorrelationSuggestionsPanel.java │ │ ├── CorrelationWizard.java │ │ ├── SelectAllHeader.java │ │ ├── TextBoxPopupDialog.java │ │ └── WizardStepPanel.java │ │ ├── common │ │ ├── CollapsiblePanel.java │ │ ├── HelperDialog.java │ │ ├── NonStringValuedTableGui.java │ │ ├── PlaceHolderTextField.java │ │ ├── RulePartType.java │ │ ├── StringUtils.java │ │ ├── TemplateVersionUtils.java │ │ ├── ThemedIcon.java │ │ └── ThemedIconLabel.java │ │ └── templates │ │ ├── PlaceHolderComboBox.java │ │ ├── RepositoriesConfigFrame.java │ │ ├── TemplateDependenciesTable.java │ │ ├── TemplateManagerDisplay.java │ │ ├── TemplateSaveFrame.java │ │ ├── TemplatesManagerFrame.java │ │ ├── UpdateRepositoriesWorker.java │ │ ├── VersionUtils.java │ │ └── validations │ │ ├── BaseValidation.java │ │ ├── ComponentValidation.java │ │ ├── Condition.java │ │ ├── ValidationManager.java │ │ └── type │ │ ├── NoNumbersCondition.java │ │ ├── NotEmptyCondition.java │ │ └── UniqueVersionCondition.java └── resources │ ├── configurations │ └── correlation.properties │ ├── correlation-descriptions │ ├── DescriptionTemplate.html │ ├── FunctionCorrelationReplacement.html │ ├── JsonCorrelationExtractor.html │ ├── JsonCorrelationReplacement.html │ ├── MoreExtractor.html │ ├── MoreReplacement.html │ ├── NoneExtractor.html │ ├── NoneReplacement.html │ ├── RegexCorrelationExtractor.html │ ├── RegexCorrelationReplacement.html │ ├── RepositoriesConfigFrame.html │ ├── TemplateSaveFrame.html │ └── XmlCorrelationExtractor.html │ ├── dark-theme │ ├── add.png │ ├── collapsed-valued.png │ ├── collapsed.png │ ├── down-arrow.png │ ├── expanded-valued.png │ ├── expanded.png │ ├── help.png │ ├── lock.png │ ├── pencil-edit.png │ ├── refresh-button.png │ ├── remove.png │ └── up-arrow.png │ ├── light-theme │ ├── add.png │ ├── collapsed-valued.png │ ├── collapsed.png │ ├── down-arrow.png │ ├── expanded-valued.png │ ├── expanded.png │ ├── help.png │ ├── lock.png │ ├── pencil-edit.png │ ├── refresh-button.png │ ├── remove.png │ └── up-arrow.png │ └── templates │ ├── auto-correlation-recorder-template-description.xml │ ├── auto-correlation-recorder.jmx │ └── components │ ├── ExtractingVariableAssertion.xml │ └── JSR223AssertionTemplate.xml └── test ├── java └── com │ └── blazemeter │ └── jmeter │ └── correlation │ ├── CorrelationProxyControlBuilder.java │ ├── CorrelationProxyControlGuiIT.java │ ├── CorrelationProxyControlTest.java │ ├── JMeterTestUtils.java │ ├── SwingTestRunner.java │ ├── TestUtils.java │ ├── core │ ├── BaseCorrelationContextTest.java │ ├── CorrelationEngineTest.java │ ├── CorrelationRuleTest.java │ ├── RegexMatcherTest.java │ ├── ResultFieldTest.java │ ├── analysis │ │ ├── AnalysisIT.java │ │ ├── AnalysisReporterIT.java │ │ ├── AnalysisReporterTest.java │ │ └── AnalysisTest.java │ ├── automatic │ │ ├── CorrelationHistoryBaseTest.java │ │ ├── CorrelationHistoryTest.java │ │ ├── ExtractorGeneratorTest.java │ │ ├── JMeterElementUtilsTest.java │ │ ├── NonGuiFilesExtractor.java │ │ ├── RecordingExtractionTest.java │ │ ├── RequestBodyJsonParameters.java │ │ ├── RequestHeaderFieldsParameters.java │ │ ├── RequestUrlParameters.java │ │ ├── ResultExtractionTest.java │ │ ├── extraction │ │ │ ├── location │ │ │ │ └── ExtractionStrategyTest.java │ │ │ └── method │ │ │ │ ├── ComparableJMeterVariables.java │ │ │ │ ├── CookieExtractorTest.java │ │ │ │ ├── JsonBodyExtractorTest.java │ │ │ │ ├── RawTextBodyExtractorTest.java │ │ │ │ └── XmlBodyExtractorTest.java │ │ └── replacement │ │ │ └── method │ │ │ ├── ReplacementJsonStrategyTest.java │ │ │ └── ReplacementRegexTest.java │ ├── extractors │ │ ├── JsonCorrelationExtractorTest.java │ │ └── RegexCorrelationExtractorTest.java │ ├── replacements │ │ ├── JsonCorrelationReplacementTest.java │ │ └── RegexCorrelationReplacementTest.java │ ├── suggestions │ │ ├── SuggestionGeneratorIT.java │ │ ├── SuggestionGeneratorTest.java │ │ ├── context │ │ │ └── AnalysisContextTest.java │ │ └── method │ │ │ ├── AnalysisMethodTest.java │ │ │ ├── ComparisonMethodTest.java │ │ │ ├── DynamicElementHandlerTest.java │ │ │ └── ReplacementTest.java │ └── templates │ │ ├── CorrelationTemplateDependencyTest.java │ │ ├── CorrelationTemplateVersionsTest.java │ │ ├── CorrelationTemplatesRepositoriesConfigurationTest.java │ │ ├── CorrelationTemplatesRepositoryConfigurationTest.java │ │ ├── CorrelationTemplatesRepositoryTest.java │ │ ├── LocalConfigurationTest.java │ │ ├── LocalCorrelationTemplatesRegistryTest.java │ │ ├── LocalCorrelationTemplatesRepositoriesRegistryTest.java │ │ ├── ProtocolTest.java │ │ ├── RemoteCorrelationTemplatesRepositoriesRegistryTest.java │ │ ├── RepositoryTest.java │ │ ├── SiebelTemplateRemovalTest.java │ │ ├── TemplateTest.java │ │ ├── TemplateUtils.java │ │ ├── TemplateVersionKeyDeserializerTest.java │ │ └── WiredBaseTest.java │ ├── custom │ └── extension │ │ ├── CustomContext.java │ │ ├── CustomCorrelationExtractor.java │ │ └── CustomCorrelationReplacement.java │ ├── gui │ ├── CorrelationComponentsRegistryTest.java │ ├── CorrelationRulePartPanelIT.java │ ├── CustomCellWriter.java │ ├── CustomExtensionsDialogIT.java │ ├── GroupPanelIT.java │ ├── GroupsContainerIT.java │ ├── ResponseFilterPanelTestIT.java │ ├── RuleTableRowIT.java │ ├── RuleTableRowTest.java │ ├── RulesContainerIT.java │ ├── TestPlanTemplatesRepositoryTest.java │ ├── analysis │ │ └── CorrelationTemplatesSelectionPanelTest.java │ ├── automatic │ │ ├── CorrelationHistoryFrameIT.java │ │ ├── CorrelationSuggestionsPanelTest.java │ │ └── CorrelationWizardIT.java │ ├── common │ │ ├── CollapsiblePanelIT.java │ │ ├── HelperDialogTest.java │ │ └── RulePartTypeTest.java │ └── templates │ │ ├── BaseTest.java │ │ ├── RepositoriesConfigFrameTestIT.java │ │ ├── TemplateDependenciasTableIT.java │ │ ├── TemplateSaveFrameIT.java │ │ └── TemplatesManagerFrameIT.java │ └── regression │ ├── ClientMock.java │ ├── FileTemplateAssert.java │ ├── Recording.java │ ├── RecordingJtlVisitor.java │ ├── ServerMock.java │ └── StringReplacement.java └── resources ├── DefaultExtractorHelper.html ├── OneReplacementHelperDescription.xml ├── RegexCorrelationExtractorDescription.html ├── RegexCorrelationExtractorFullDisplay.html ├── callToActionRequest.jmx ├── correlation-descriptions ├── CustomCorrelationExtractor.html └── CustomCorrelationReplacement.html ├── correlation-templates ├── base-repository.json ├── test-1.0-template.json ├── test-1.1-template.json └── wordpress-1.0-template.json ├── delete-wordpress-1.0-template.json ├── displayTemplateWithImage.html ├── first%20spaced%20template-1.0-template.json ├── first-1.0-template.json ├── first-1.1-template.json ├── firstTemplateDescription.html ├── history-test.json ├── jtl ├── recording │ ├── recording-1698345455862.jtl │ └── recording-get-json-token-send-json-token.jtl └── replay │ ├── replay-1698345458421.jtl │ └── replay-get-json-token-send-json-token.jtl ├── log4j2-test.xml ├── loggedUserRequest.jmx ├── loggedUserResponse.html ├── recordings ├── recordingTrace │ ├── recording-encode-decode.jtl │ ├── recordingForMendix.jtl │ ├── recordingWithNonces.jtl │ └── replay-encode-decode.jtl └── testplans │ └── recordingWithNonces.jmx ├── repository-with-spaced-templates.json ├── responses ├── html │ ├── response.html │ └── responseWithTwoBodyNonces.html ├── json │ ├── mendixJson.json │ ├── object-list-inner-object.json │ ├── object-list-with-duplicated-values.json │ ├── object-list.json │ ├── object-with-inner-list.json │ ├── object-with-integer-key.json │ ├── object-with-special-characters.json │ ├── response.json │ ├── single-object-integer-value.json │ └── single-object.json └── xml │ ├── anotherDirtyResponse.xml │ ├── cleanResponse.xml │ ├── cleanResponse2.xml │ └── dirtyResponse.xml ├── second-1.0-template.json ├── selectedReplacementDescription.html ├── templateFromRepository.json ├── templates ├── serialization-test-1.0-template.json ├── serialization-test-2.0-template.json ├── siebel-template-removal.json └── template.json ├── test-plan-template ├── correlation-recorder-base-template.jmx ├── correlation-recorder-template-description.xml ├── correlation-recorder-with-assertions.jmx ├── recording-correlations.jmx ├── template-correlation-recorder.xml └── templates.xml ├── test-repository.json ├── validResponseData.txt └── xmlObjects ├── recordingMapSerialization.xml └── replayMapSerialization.xml /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | 12 | A clear and concise description of what the bug is. 13 | 14 | **Environment** 15 | 16 | Let us know in which versions of these tools the error occurs: 17 | 18 | - JMeter 19 | - Correlation Recorder 20 | - Plugin Manager (if applicable) 21 | - Protocol version (if apply, eg: Siebel CRM IP17 & IP18) 22 | 23 | **To Reproduce** 24 | 25 | Steps to reproduce the bug: 26 | 27 | 1. Go to '...' 28 | 2. Click on '....' 29 | 3. Scroll down to '....' 30 | 4. See error 31 | 32 | **Expected behavior** 33 | 34 | A clear and concise description of what you expected to happen. 35 | 36 | **Complementary information** 37 | 38 | To have a faster and accurate response to your issue, please share: 39 | 40 | - The JTL for the recording and the replay (if needed) 41 | - The configuration of the Correlation Rules/Templates used (picture, test plan, or JSON file) 42 | 43 | *In case of sharing the JTL, please make sure you configure it as shown in the docs/JTLRecordingConfiguration.png file* 44 | 45 | **Additional context** 46 | Add any other context about the problem here. -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false -------------------------------------------------------------------------------- /.github/fix-docs-version.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # This script takes care of setting proper version in docs. 4 | # 5 | set -eo pipefail 6 | 7 | VERSION=$1 8 | 9 | update_file_versions() { 10 | local VERSION="$1" 11 | local FILE="$2" 12 | sed -i "s/.*<\/version>/${VERSION}<\/version>/g" ${FILE} 13 | } 14 | 15 | update_file_versions ${VERSION} README.md 16 | 17 | git add README.md 18 | if ! git diff-index --quiet HEAD; then 19 | git config --local user.email "$(git log --format='%ae' HEAD^!)" 20 | git config --local user.name "$(git log --format='%an' HEAD^!)" 21 | git commit -m "[skip ci] Updated README version" 22 | git push origin HEAD:master 23 | fi 24 | -------------------------------------------------------------------------------- /.github/maven-central-deploy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # This script takes care of deploying tagged versions to maven central and updating the pom.xml 4 | # version with next development version. 5 | # 6 | # Required environment variables: GPG_SECRET_KEYS, GPG_OWNERTRUST, GPG_EXECUTABLE 7 | 8 | set -eo pipefail 9 | 10 | echo $GPG_SECRET_KEYS | base64 --decode | $GPG_EXECUTABLE --batch --import 11 | echo $GPG_OWNERTRUST | base64 --decode | $GPG_EXECUTABLE --batch --import-ownertrust 12 | mvn --batch-mode deploy -Prelease -DskipTests --settings .github/settings.xml 13 | -------------------------------------------------------------------------------- /.github/semver-check.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # This script checks that the version number of the release is an expected one, and avoid erroneous releases which don't follow semver 4 | set -eo pipefail 5 | 6 | git fetch --tags --quiet 7 | VERSION="$1" 8 | PREV_VERSION=$(git describe --abbrev=0 --tags `git rev-list --tags --skip=1 --max-count=1`) 9 | PREV_VERSION=${PREV_VERSION#v} 10 | PREV_MAJOR="${PREV_VERSION%%.*}" 11 | PREV_VERSION="${PREV_VERSION#*.}" 12 | PREV_MINOR="${PREV_VERSION%%.*}" 13 | PREV_PATCH="${PREV_VERSION#*.}" 14 | if [[ "$PREV_VERSION" == "$PREV_PATCH" ]]; then 15 | PREV_PATCH="0" 16 | fi 17 | echo "Verifying that $VERSION is one of the following valid versions" 18 | echo "$PREV_MAJOR.$PREV_MINOR.$((PREV_PATCH + 1))" 19 | echo "$PREV_MAJOR.$((PREV_MINOR + 1))" 20 | echo "$((PREV_MAJOR + 1)).0" 21 | [[ "$VERSION" == "$PREV_MAJOR.$PREV_MINOR.$((PREV_PATCH + 1))"?(.0) || "$VERSION" == "$PREV_MAJOR.$((PREV_MINOR + 1))"?(.0) || "$VERSION" == "$((PREV_MAJOR + 1)).0"?(.0) ]] 22 | -------------------------------------------------------------------------------- /.github/settings.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | ossrh 9 | ${env.SONATYPE_USERNAME} 10 | ${env.SONATYPE_PASSWORD} 11 | 12 | 13 | 14 | 15 | 16 | ossrh 17 | 18 | true 19 | 20 | 21 | ${env.GPG_EXECUTABLE} 22 | ${env.GPG_PASSPHRASE} 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /.github/vuepress-deploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | # 3 | # This script takes care of building and deploying the vuepress documentation to github pages. 4 | # 5 | set -e 6 | 7 | cd docs 8 | 9 | yarn && yarn build 10 | 11 | cd src/.vuepress/dist 12 | 13 | EMAIL="$(git log --format='%ae' HEAD^!)" 14 | USERNAME="$(git log --format='%an' HEAD^!)" 15 | git init 16 | git config --local user.email "$EMAIL" 17 | git config --local user.name "$USERNAME" 18 | git add . 19 | git commit -m '[skip ci] Deploy docs to GitHub pages' 20 | 21 | git push -f https://git:${ACCESS_TOKEN}@github.com/Blazemeter/CorrelationRecorder.git master:gh-pages 22 | 23 | cd $GITHUB_WORKSPACE 24 | -------------------------------------------------------------------------------- /.github/workflows/doc.yml: -------------------------------------------------------------------------------- 1 | name: doc 2 | on: workflow_dispatch 3 | 4 | jobs: 5 | deploy-doc: 6 | runs-on: ubuntu-latest 7 | steps: 8 | - uses: actions/checkout@v3 9 | - uses: actions/setup-java@v3 10 | with: 11 | distribution: temurin 12 | java-version: 8 13 | - uses: actions/setup-node@v3 14 | with: 15 | node-version: '14' 16 | - name: deploy github pages 17 | run: .github/vuepress-deploy.sh 18 | env: 19 | ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} 20 | -------------------------------------------------------------------------------- /.github/workflows/publish_to_jmeter_plugins.yaml: -------------------------------------------------------------------------------- 1 | name: Deploy to JMeter Plugins 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | changes: 7 | description: 'Release notes for the update' 8 | required: true 9 | 10 | jobs: 11 | publish: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Run Publish JMeter Plugin Action 15 | id: publish-plugin 16 | uses: abstracta/jmeter-plugin-publish-action@main 17 | with: 18 | forked-repository: https://github.com/Abstracta/jmeter-plugins.git 19 | plugin-artifact-name: jmeter-bzm-correlation-recorder 20 | plugin-id: bzm-siebel 21 | changes: ${{ inputs.changes }} 22 | token: ${{ secrets.GH_TOKEN }} 23 | ignore-dependencies: bzm-repositories-plugin 24 | 25 | - name: Pull Request URL 26 | run: echo ${{ steps.publish-plugin.outputs.pull_request }} 27 | -------------------------------------------------------------------------------- /.github/workflows/release.yaml: -------------------------------------------------------------------------------- 1 | name: publish release 2 | on: 3 | release: 4 | types: [ published ] 5 | jobs: 6 | release: 7 | runs-on: ubuntu-latest 8 | concurrency: blazemeter_test 9 | steps: 10 | - uses: actions/checkout@v2 11 | - name: Setup Java 1.8 12 | uses: actions/setup-java@v1 13 | with: 14 | java-version: 1.8 15 | - name: Get version 16 | id: version 17 | run: echo "release_version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV 18 | - name: Check version 19 | run: .github/semver-check.sh ${{ env.release_version }} 20 | - name: set maven project version 21 | run: mvn --batch-mode --no-transfer-progress versions:set -DnewVersion=${{ env.release_version }} --settings .github/settings.xml 22 | - name: package release 23 | run: mvn --batch-mode --no-transfer-progress clean package -DskipTests -Dkeytool.directory=${{ env.JAVA_HOME }}/bin -Dproxy.cert.directory=${{ runner.temp }} --settings .github/settings.xml 24 | - name: Upload built jar into release 25 | uses: svenstaro/upload-release-action@v2 26 | with: 27 | repo_token: ${{ secrets.GITHUB_TOKEN }} 28 | file: target/*.jar 29 | file_glob: true 30 | tag: ${{ github.ref }} 31 | - name: publish to Nexus 32 | run: .github/maven-central-deploy.sh 33 | env: 34 | GPG_SECRET_KEYS: ${{ secrets.GPG_SECRET_KEYS }} 35 | GPG_OWNERTRUST: ${{ secrets.GPG_OWNERTRUST }} 36 | GPG_EXECUTABLE: gpg 37 | GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} 38 | SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }} 39 | SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }} 40 | - name: update docs version 41 | run: .github/fix-docs-version.sh ${{ env.release_version }} 42 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | We are using a custom [checkstyle](http://checkstyle.sourceforge.net/index.html) configuration file which is based on google's one, is advisable to use one of the [google style configuration files](https://github.com/google/styleguide) in IDEs to reduce the friction with checkstyle and automate styling. 4 | 5 | ## Building 6 | 7 | ### Pre-requisites 8 | 9 | - [jdk 1.8+](http://www.oracle.com/technetwork/java/javase/downloads/index.html) 10 | - [maven 3.3+](https://maven.apache.org/) 11 | 12 | ### Build 13 | 14 | To build the plugin and run all tests just run `mvn clean verify` 15 | 16 | ### Installation 17 | 18 | To use the plugin, install it (by copying the jar from `target` folder) in `lib/ext/` folder of the JMeter installation. 19 | 20 | Run JMeter and check the new Siebel HTTP(S) Test Script Recorder is available. 21 | 22 | ### Class Diagram 23 | 24 | The following diagram contains all the relationships between the classes. Please take a close look at it, and also the code, for further understanding. 25 | 26 | ![Project Diagram](docs/umlDiagram.png) 27 | 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Auto Correlations Recorder Plugin for JMeter 2 | 3 | ![BlazeMeter Labs](https://raw.githubusercontent.com/Blazemeter/jmeter-bzm-commons/refs/heads/master/src/main/resources/dark-theme/blazemeter-by-perforce-logo.png) 4 | 5 | Welcome to the Auto Correlation Recorder's JMeter Plugin, the main and extensive documentation can be seen in [this link](https://blazemeter.github.io/CorrelationRecorder/). 6 | 7 | ## Usage 8 | 9 | You can either use the plugin to [automatically correlate your dynamic variables](https://blazemeter.github.io/CorrelationRecorder/guide/#correlating-dynamic-variables) while recording in JMeter or, you can [implement your own logic for your particular case.](https://blazemeter.github.io/CorrelationRecorder/custom-extensions/) 10 | 11 | ## Contributing 12 | 13 | Got **something interesting** you'd like to **share**? Learn about [contributing](https://blazemeter.github.io/CorrelationRecorder/contributing/). 14 | 15 | ## License 16 | 17 | Apache License 2.0 18 | 19 | ```text 20 | A permissive license whose main conditions require preservation of copyright and license notices. 21 | Contributors provide an express grant of patent rights. Licensed works, modifications, and larger 22 | works may be distributed under different terms and without source code. 23 | ``` 24 | 25 | To know more about it, read the license [here](LICENSE) 26 | 27 | ## Credits 28 | 29 | All the awesome icons we are using come from [Material.io](https://material.io/). If you like them, please check them out. 30 | -------------------------------------------------------------------------------- /docs/.gitignore: -------------------------------------------------------------------------------- 1 | pids 2 | logs 3 | node_modules 4 | npm-debug.log 5 | coverage/ 6 | run 7 | dist 8 | .DS_Store 9 | .nyc_output 10 | .basement 11 | config.local.js 12 | basement_dist 13 | -------------------------------------------------------------------------------- /docs/bzmRepositoriesScreenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blazemeter/CorrelationRecorder/b4bc3e972dfcb0353976f0f0ed8525340777bb64/docs/bzmRepositoriesScreenshot.png -------------------------------------------------------------------------------- /docs/jmeterpluginsScreenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blazemeter/CorrelationRecorder/b4bc3e972dfcb0353976f0f0ed8525340777bb64/docs/jmeterpluginsScreenshot.png -------------------------------------------------------------------------------- /docs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "AutoCorrelationRecorder", 3 | "version": "2.0.", 4 | "description": "Effortlessly handle dynamic values in JMeter with the Auto Correlation Recorder plugin.", 5 | "main": "index.js", 6 | "authors": { 7 | "name": "", 8 | "email": "" 9 | }, 10 | "repository": "Blazemeter/CorrelationRecorder", 11 | "scripts": { 12 | "dev": "vuepress dev src", 13 | "build": "vuepress build src" 14 | }, 15 | "license": "Apache-2.0", 16 | "devDependencies": { 17 | "vuepress": "^1.9.2" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /docs/src/.vuepress/enhanceApp.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Client app enhancement file. 3 | * 4 | * https://v1.vuepress.vuejs.org/guide/basic-config.html#app-level-enhancements 5 | */ 6 | 7 | export default ({ 8 | Vue, // the version of Vue being used in the VuePress app 9 | options, // the options for the root Vue instance 10 | router, // the router instance for the app 11 | siteData // site metadata 12 | }) => { 13 | // ...apply enhancements for the site. 14 | } 15 | -------------------------------------------------------------------------------- /docs/src/.vuepress/public/examples/CustomContext.java: -------------------------------------------------------------------------------- 1 | import com.blazemeter.jmeter.correlation.core.CorrelationContext; 2 | import org.apache.jmeter.samplers.SampleResult; 3 | 4 | 5 | /** 6 | * This is the structure for a basic Correlation Context Implementation. 7 | * All the values that want to be shared between a Correlation 8 | * Extensions will be stored using this class. 9 | * The update method is the one that gets the information 10 | * */ 11 | public class CustomContext implements CorrelationContext { 12 | 13 | /** 14 | * Define the variables that are going to be shared between the CorrelationExtractors and 15 | * CorrelationReplacements 16 | */ 17 | private final Map sharedFieldOne = new HashMap<>(); 18 | private int sharedFieldTwo = 0; 19 | private Integer counter; 20 | 21 | /** 22 | * Resets the shared variables to their default values. 23 | * 24 | * This method is always called when the JMeter starts recording and the Proxy is started. 25 | */ 26 | @Override 27 | public void reset() { 28 | sharedFieldOne = new HashMap<>(); 29 | sharedFieldTwo = 0; 30 | counter = 0; 31 | } 32 | 33 | /** 34 | * Define the logic for updating the shared values. 35 | * 36 | * This method is always called when the {@link CorrelationEngine} is processing the responses 37 | * from the server. 38 | * 39 | */ 40 | @Override 41 | public void update(SampleResult sampleResult) { 42 | /* 43 | * Here goes to logic used to update values comming from the sampleResult. 44 | * For Example: Lets count if the is any