From 65e4c998d76afadd5fb9f6b27ba3b4d5664e3365 Mon Sep 17 00:00:00 2001 From: Ryan Ashcraft Date: Tue, 9 May 2023 11:07:17 -0400 Subject: [PATCH] #1 :truck: separate fermenter-mda from frameworks --- README.md | 11 +- ale/ale-angular-mda/pom.xml | 2 +- ale/ale-cookbook-angular/pom.xml | 2 +- ale/pom.xml | 4 +- brett/brett-cookbook/pom.xml | 2 +- brett/brett-mda/pom.xml | 2 +- brett/pom.xml | 4 +- docker/pom.xml | 4 +- fermenter-mda/README.md | 75 --- fermenter-mda/pom.xml | 161 ----- .../fermenter/mda/CleanMojo.java | 52 -- .../fermenter/mda/GenerateSourcesHelper.java | 336 ---------- .../fermenter/mda/GenerateSourcesMojo.java | 610 ------------------ .../fermenter/mda/PackageManager.java | 80 --- .../fermenter/mda/TypeManager.java | 146 ----- .../fermenter/mda/element/ExpandedFamily.java | 75 --- .../mda/element/ExpandedProfile.java | 131 ---- .../fermenter/mda/element/Family.java | 40 -- .../mda/element/FamilyReference.java | 21 - .../fermenter/mda/element/Profile.java | 73 --- .../mda/element/ProfileReference.java | 21 - .../fermenter/mda/element/Target.java | 96 --- .../mda/element/TargetReference.java | 21 - .../fermenter/mda/element/Type.java | 51 -- .../fermenter/mda/element/TypeDictionary.java | 98 --- .../mda/element/ValidatedElement.java | 44 -- .../mda/exception/FermenterException.java | 40 -- .../mda/generator/AbstractGenerator.java | 260 -------- .../AbstractModelAgnosticGenerator.java | 24 - .../mda/generator/GenerationContext.java | 206 ------ .../mda/generator/GenerationException.java | 23 - .../fermenter/mda/generator/Generator.java | 24 - .../AbstractAllEntitiesAwareGenerator.java | 43 -- ...tractAllOrderedEntitiesAwareGenerator.java | 43 -- .../entity/AbstractEntityGenerator.java | 69 -- .../field/AbstractFieldGenerator.java | 59 -- .../AbstractMessageGroupGenerator.java | 55 -- .../generator/rule/AbstractRuleGenerator.java | 55 -- .../service/AbstractServiceGenerator.java | 53 -- .../metamodel/AbstractMetamodelManager.java | 364 ----------- .../AbstractModelInstanceRepository.java | 40 -- .../DefaultModelInstanceRepository.java | 472 -------------- .../DictionaryModelInstanceManager.java | 54 -- .../mda/metamodel/EntityComparator.java | 126 ---- .../metamodel/EntityModelInstanceManager.java | 154 ----- .../EnumerationModelInstanceManager.java | 54 -- .../MessageGroupModelInstanceManager.java | 54 -- .../mda/metamodel/MetadataUrlResolver.java | 17 - .../mda/metamodel/MetamodelConfig.java | 74 --- .../fermenter/mda/metamodel/ModelContext.java | 62 -- .../metamodel/ModelInstanceRepository.java | 18 - .../ModelInstanceRepositoryManager.java | 47 -- .../mda/metamodel/ModelInstanceUrl.java | 63 -- .../ModelRepositoryConfiguration.java | 53 -- .../metamodel/RuleModelInstanceManager.java | 54 -- .../ServiceModelInstanceManager.java | 54 -- .../BaseConfigurationItemDecorator.java | 49 -- .../element/BaseEntityDecorator.java | 221 ------- .../metamodel/element/BaseEnumDecorator.java | 41 -- .../element/BaseEnumertionDecorator.java | 88 --- .../metamodel/element/BaseFieldDecorator.java | 270 -------- .../element/BaseMessageDecorator.java | 41 -- .../element/BaseMessageGroupDecorator.java | 83 --- .../element/BaseOperationDecorator.java | 95 --- .../element/BaseParameterDecorator.java | 78 --- .../element/BaseParentDecorator.java | 74 --- .../element/BaseReferenceDecorator.java | 106 --- .../element/BaseRelationDecorator.java | 81 --- .../element/BaseReturnDecorator.java | 103 --- .../metamodel/element/BaseRuleDecorator.java | 103 --- .../element/BaseServiceDecorator.java | 79 --- .../element/BaseValidationDecorator.java | 120 ---- .../metamodel/element/ConfigurationItem.java | 22 - .../element/ConfigurationItemElement.java | 72 --- .../mda/metamodel/element/DictionaryType.java | 23 - .../element/DictionaryTypeElement.java | 130 ---- .../mda/metamodel/element/Entity.java | 171 ----- .../mda/metamodel/element/EntityElement.java | 340 ---------- .../fermenter/mda/metamodel/element/Enum.java | 23 - .../mda/metamodel/element/EnumElement.java | 39 -- .../mda/metamodel/element/Enumeration.java | 39 -- .../metamodel/element/EnumerationElement.java | 112 ---- .../mda/metamodel/element/Field.java | 127 ---- .../mda/metamodel/element/FieldElement.java | 258 -------- .../element/ForeignKeyFieldElement.java | 39 -- .../mda/metamodel/element/Message.java | 22 - .../mda/metamodel/element/MessageElement.java | 42 -- .../mda/metamodel/element/MessageGroup.java | 17 - .../element/MessageGroupElement.java | 46 -- .../mda/metamodel/element/Metamodel.java | 17 - .../metamodel/element/MetamodelElement.java | 124 ---- .../mda/metamodel/element/MetamodelType.java | 51 -- .../mda/metamodel/element/MetamodelUtils.java | 27 - .../element/NamespacedMetamodel.java | 16 - .../element/NamespacedMetamodelElement.java | 84 --- .../mda/metamodel/element/Operation.java | 44 -- .../metamodel/element/OperationElement.java | 185 ------ .../mda/metamodel/element/Parameter.java | 29 - .../metamodel/element/ParameterElement.java | 127 ---- .../mda/metamodel/element/Parent.java | 90 --- .../mda/metamodel/element/ParentElement.java | 115 ---- .../mda/metamodel/element/Reference.java | 43 -- .../metamodel/element/ReferenceElement.java | 168 ----- .../mda/metamodel/element/Relation.java | 201 ------ .../metamodel/element/RelationElement.java | 185 ------ .../mda/metamodel/element/Return.java | 36 -- .../mda/metamodel/element/ReturnElement.java | 154 ----- .../fermenter/mda/metamodel/element/Rule.java | 45 -- .../mda/metamodel/element/RuleElement.java | 120 ---- .../mda/metamodel/element/Service.java | 24 - .../mda/metamodel/element/ServiceElement.java | 86 --- .../mda/metamodel/element/Transaction.java | 64 -- .../mda/metamodel/element/Validatable.java | 15 - .../mda/metamodel/element/Validation.java | 105 --- .../metamodel/element/ValidationElement.java | 227 ------- .../fermenter/mda/reporting/FileStats.java | 124 ---- .../mda/reporting/StatisticsService.java | 184 ------ .../mda/reporting/StatsCollectingWriter.java | 40 -- .../fermenter/mda/util/JsonUtils.java | 178 ----- .../fermenter/mda/util/MessageTracker.java | 149 ----- .../fermenter/mda/util/PriorityMessage.java | 90 --- .../mda/util/PriorityMessageExecution.java | 58 -- .../mda/util/PriorityMessageService.java | 79 --- .../mda/xml/LoggingErrorHandler.java | 97 --- .../mda/xml/TrackErrorsErrorHandler.java | 33 - .../resources/fermenter-2-entity-schema.json | 186 ------ .../fermenter-2-enumeration-schema.json | 35 - .../resources/fermenter-2-family-schema.json | 29 - .../fermenter-2-message-group-schema.json | 35 - .../resources/fermenter-2-profile-schema.json | 62 -- .../resources/fermenter-2-rule-schema.json | 99 --- .../resources/fermenter-2-service-schema.json | 90 --- .../resources/fermenter-2-target-schema.json | 31 - .../fermenter-2-type-dictionary-schema.json | 31 - .../resources/fermenter-2-type-schema.json | 19 - .../LanguageSpecificPluginConfigSteps.java | 88 --- .../fermenter/mda/MojoTestCaseWrapper.java | 109 ---- .../fermenter/mda/TestSpecifications.java | 15 - .../mda/element/AbstractEntitySteps.java | 93 --- .../mda/element/AdvancedProfileSteps.java | 86 --- .../fermenter/mda/element/CommonSteps.java | 54 -- .../fermenter/mda/element/EntitySteps.java | 520 --------------- .../mda/element/EnumerationSteps.java | 211 ------ .../fermenter/mda/element/FamilyInput.java | 31 - .../mda/element/MessageGroupSteps.java | 125 ---- .../mda/element/MessageTrackerSteps.java | 46 -- .../mda/element/OrderedEntitiesSteps.java | 145 ----- .../mda/element/PriorityMessageSteps.java | 193 ------ .../fermenter/mda/element/ProfileSteps.java | 124 ---- .../fermenter/mda/element/ServiceSteps.java | 427 ------------ .../fermenter/mda/element/TargetSteps.java | 91 --- .../mda/element/TypeDictionarySteps.java | 190 ------ .../fermenter/mda/element/TypeSteps.java | 71 -- .../mda/generator/TestGenerator.java | 74 --- .../MetadataRepositoryManagerTest.java | 108 ---- .../mda/reporting/GenerationStatsSteps.java | 128 ---- .../java-default-config/pom.xml | 26 - .../java-no-base-package/pom.xml | 26 - .../override-local-metadata-config/pom.xml | 32 - .../python-habushu-packaging/pom.xml | 31 - .../python-language-config/pom.xml | 26 - .../advanced-profile-model.feature | 21 - .../specifications/entity-model.feature | 229 ------- .../specifications/enumeration-model.feature | 46 -- .../specifications/generation-stats.feature | 37 -- .../language-specific-plugin-config.feature | 32 - .../message-group-model.feature | 23 - .../specifications/message-tracking.feature | 37 -- .../specifications/ordered-entities.feature | 63 -- .../specifications/priority-message.feature | 22 - .../specifications/profile-model.feature | 81 --- .../specifications/service-model.feature | 193 ------ .../specifications/target-model.feature | 29 - .../specifications/type-dictionary.feature | 85 --- .../specifications/type-model.feature | 22 - pom.xml | 35 +- stout/pom.xml | 4 +- stout/stout-authentication/pom.xml | 2 +- .../pom.xml | 2 +- stout/stout-authzforce/pom.xml | 2 +- stout/stout-build-tools/pom.xml | 2 +- stout/stout-cookbook/pom.xml | 2 +- .../stout-cookbook-domain-client/pom.xml | 2 +- .../stout-cookbook-domain-webapp/pom.xml | 2 +- .../stout-cookbook-domain/pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../stout-cookbook-referencing-domain/pom.xml | 2 +- .../stout-cookbook-test-generation/pom.xml | 2 +- stout/stout-core/pom.xml | 2 +- stout/stout-oak/pom.xml | 2 +- stout/stout-spring-client/pom.xml | 2 +- stout/stout-spring-mda/pom.xml | 2 +- stout/stout-spring-util/pom.xml | 2 +- stout/stout-spring/pom.xml | 2 +- stout/stout-test/pom.xml | 2 +- stout/stout-web-container-mda/pom.xml | 2 +- 197 files changed, 49 insertions(+), 16081 deletions(-) delete mode 100644 fermenter-mda/README.md delete mode 100644 fermenter-mda/pom.xml delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/CleanMojo.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/GenerateSourcesHelper.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/GenerateSourcesMojo.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/PackageManager.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/TypeManager.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/ExpandedFamily.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/ExpandedProfile.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/Family.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/FamilyReference.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/Profile.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/ProfileReference.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/Target.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/TargetReference.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/Type.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/TypeDictionary.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/ValidatedElement.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/exception/FermenterException.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/AbstractGenerator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/AbstractModelAgnosticGenerator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/GenerationContext.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/GenerationException.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/Generator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/entity/AbstractAllEntitiesAwareGenerator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/entity/AbstractAllOrderedEntitiesAwareGenerator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/entity/AbstractEntityGenerator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/field/AbstractFieldGenerator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/message/AbstractMessageGroupGenerator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/rule/AbstractRuleGenerator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/service/AbstractServiceGenerator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/AbstractMetamodelManager.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/AbstractModelInstanceRepository.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/DefaultModelInstanceRepository.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/DictionaryModelInstanceManager.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/EntityComparator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/EntityModelInstanceManager.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/EnumerationModelInstanceManager.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/MessageGroupModelInstanceManager.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/MetadataUrlResolver.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/MetamodelConfig.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ModelContext.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ModelInstanceRepository.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ModelInstanceRepositoryManager.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ModelInstanceUrl.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ModelRepositoryConfiguration.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/RuleModelInstanceManager.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ServiceModelInstanceManager.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseConfigurationItemDecorator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseEntityDecorator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseEnumDecorator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseEnumertionDecorator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseFieldDecorator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseMessageDecorator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseMessageGroupDecorator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseOperationDecorator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseParameterDecorator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseParentDecorator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseReferenceDecorator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseRelationDecorator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseReturnDecorator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseRuleDecorator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseServiceDecorator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseValidationDecorator.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ConfigurationItem.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ConfigurationItemElement.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/DictionaryType.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/DictionaryTypeElement.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Entity.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/EntityElement.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Enum.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/EnumElement.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Enumeration.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/EnumerationElement.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Field.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/FieldElement.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ForeignKeyFieldElement.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Message.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MessageElement.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MessageGroup.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MessageGroupElement.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Metamodel.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MetamodelElement.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MetamodelType.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MetamodelUtils.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/NamespacedMetamodel.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/NamespacedMetamodelElement.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Operation.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/OperationElement.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Parameter.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ParameterElement.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Parent.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ParentElement.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Reference.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ReferenceElement.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Relation.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/RelationElement.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Return.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ReturnElement.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Rule.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/RuleElement.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Service.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ServiceElement.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Transaction.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Validatable.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Validation.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ValidationElement.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/reporting/FileStats.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/reporting/StatisticsService.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/reporting/StatsCollectingWriter.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/util/JsonUtils.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/util/MessageTracker.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/util/PriorityMessage.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/util/PriorityMessageExecution.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/util/PriorityMessageService.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/xml/LoggingErrorHandler.java delete mode 100644 fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/xml/TrackErrorsErrorHandler.java delete mode 100644 fermenter-mda/src/main/resources/fermenter-2-entity-schema.json delete mode 100644 fermenter-mda/src/main/resources/fermenter-2-enumeration-schema.json delete mode 100644 fermenter-mda/src/main/resources/fermenter-2-family-schema.json delete mode 100644 fermenter-mda/src/main/resources/fermenter-2-message-group-schema.json delete mode 100644 fermenter-mda/src/main/resources/fermenter-2-profile-schema.json delete mode 100644 fermenter-mda/src/main/resources/fermenter-2-rule-schema.json delete mode 100644 fermenter-mda/src/main/resources/fermenter-2-service-schema.json delete mode 100644 fermenter-mda/src/main/resources/fermenter-2-target-schema.json delete mode 100644 fermenter-mda/src/main/resources/fermenter-2-type-dictionary-schema.json delete mode 100644 fermenter-mda/src/main/resources/fermenter-2-type-schema.json delete mode 100644 fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/LanguageSpecificPluginConfigSteps.java delete mode 100644 fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/MojoTestCaseWrapper.java delete mode 100644 fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/TestSpecifications.java delete mode 100644 fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/AbstractEntitySteps.java delete mode 100644 fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/AdvancedProfileSteps.java delete mode 100644 fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/CommonSteps.java delete mode 100644 fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/EntitySteps.java delete mode 100644 fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/EnumerationSteps.java delete mode 100644 fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/FamilyInput.java delete mode 100644 fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/MessageGroupSteps.java delete mode 100644 fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/MessageTrackerSteps.java delete mode 100644 fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/OrderedEntitiesSteps.java delete mode 100644 fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/PriorityMessageSteps.java delete mode 100644 fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/ProfileSteps.java delete mode 100644 fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/ServiceSteps.java delete mode 100644 fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/TargetSteps.java delete mode 100644 fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/TypeDictionarySteps.java delete mode 100644 fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/TypeSteps.java delete mode 100644 fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/generator/TestGenerator.java delete mode 100644 fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/metamodel/MetadataRepositoryManagerTest.java delete mode 100644 fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/reporting/GenerationStatsSteps.java delete mode 100644 fermenter-mda/src/test/resources/plugin-testing-harness-pom-files/java-default-config/pom.xml delete mode 100644 fermenter-mda/src/test/resources/plugin-testing-harness-pom-files/java-no-base-package/pom.xml delete mode 100644 fermenter-mda/src/test/resources/plugin-testing-harness-pom-files/override-local-metadata-config/pom.xml delete mode 100644 fermenter-mda/src/test/resources/plugin-testing-harness-pom-files/python-habushu-packaging/pom.xml delete mode 100644 fermenter-mda/src/test/resources/plugin-testing-harness-pom-files/python-language-config/pom.xml delete mode 100644 fermenter-mda/src/test/resources/specifications/advanced-profile-model.feature delete mode 100644 fermenter-mda/src/test/resources/specifications/entity-model.feature delete mode 100644 fermenter-mda/src/test/resources/specifications/enumeration-model.feature delete mode 100644 fermenter-mda/src/test/resources/specifications/generation-stats.feature delete mode 100644 fermenter-mda/src/test/resources/specifications/language-specific-plugin-config.feature delete mode 100644 fermenter-mda/src/test/resources/specifications/message-group-model.feature delete mode 100644 fermenter-mda/src/test/resources/specifications/message-tracking.feature delete mode 100644 fermenter-mda/src/test/resources/specifications/ordered-entities.feature delete mode 100644 fermenter-mda/src/test/resources/specifications/priority-message.feature delete mode 100644 fermenter-mda/src/test/resources/specifications/profile-model.feature delete mode 100644 fermenter-mda/src/test/resources/specifications/service-model.feature delete mode 100644 fermenter-mda/src/test/resources/specifications/target-model.feature delete mode 100644 fermenter-mda/src/test/resources/specifications/type-dictionary.feature delete mode 100644 fermenter-mda/src/test/resources/specifications/type-model.feature diff --git a/README.md b/README.md index ca55e6ea..9361231d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Fermenter # -[![Maven Central](https://img.shields.io/maven-central/v/org.technologybrewery.fermenter/root.svg)](https://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22org.technologybrewery.fermenter%22%20AND%20a%3A%22root%22) +[![Maven Central](https://img.shields.io/maven-central/v/org.technologybrewery.fermenter/fermenter-legacy-frameworks.svg)](https://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22org.technologybrewery.fermenter%22%20AND%20a%3A%22fermenter-legacy-frameworks%22) [![License](https://img.shields.io/github/license/mashape/apistatus.svg)](https://opensource.org/licenses/mit) In brewing, a fermenter is a vessel in which unfinished ingredients become nearly finished beer. In Model Driven Architecture, Fermenter is a project that converts functional concepts into nearly finished applications. This approach allows for the quick definition and assembly of applications with the focus on functional concepts rather than technical underpinnings. @@ -22,20 +22,21 @@ Fermenter will generate source into the folder structure appropriate for the typ Fermenter's default framework, called `stout`, blends best practices from Spring, Jackson, JPA, and other libraries to construct cohesive Java Servlet compatible web applications. The resulting generated source uses object oriented concepts to stub out locations for business logic and provides key extension points to modify default functionality where necessary. Please see the `stout-cookbook-domain` module for examples of all the model concepts in action. Additionally, you can use the `integration-test` Maven profile to automatically download and execute the examples in a live Tomcat container. ## Ale ## - Ale is a Fermenter framework that makes it easier for developers to utilize [Angular](https://angular.io/) best practices and leverage a consistent frontend base layer. Generated base layer support includes entity models, services, and some basic UI components which allows for less time to be spent writing scaffolding and more time to be spent on complex high-value visualization areas. See the `ale-cookbook-angular` module for a demonstrative example of how Ale may be used. ## Brett ## - Contrary to how Brettanomyces (i.e. "Brett") is a yeast that can yield unpredictable results when brewing, the `brett` Fermenter framework helps developers institute enterprise development and configuration management best practices to the often unpredictable world of Python development. `brett` facilitates the generation of Python projects that align with [Habushu](https://github.com/TechnologyBrewery/habushu/) standards. Due to the Habushu's usage of Python build tools that currently must be manually installed, Fermenter developers must opt-in to build `brett` modules by using `with-python-support` Maven profile (i.e. `mvn clean install -Pwith-python-support`). See the `brett-cookbook` for an example of how `brett` combines Fermenter-driven Python module generation with an automated DevOps lifecycle managed through Habushu. -# Distribution Channel +# Repository Structure +This repository contains the legacy Fermenter frameworks described above. The `fermenter-mda` plugin itself is located +in https://github.com/TechnologyBrewery/fermenter. +# Distribution Channel Want Fermenter in your project? As demonstrated in the `stout-cookbook-domain` project, add the following Maven plugin declaration and dependency to your project from Maven Central: ```xml - 2.5.0 + LATEST VERSION HERE (e.g., 2.9.0) diff --git a/ale/ale-angular-mda/pom.xml b/ale/ale-angular-mda/pom.xml index 796b2d4f..4b801a5d 100644 --- a/ale/ale-angular-mda/pom.xml +++ b/ale/ale-angular-mda/pom.xml @@ -8,7 +8,7 @@ 2.9.0-SNAPSHOT - Fermenter::Ale::Angular + Fermenter Legacy Frameworks::Ale::Angular Contains resources for generating application code for Angular frontend projects diff --git a/ale/ale-cookbook-angular/pom.xml b/ale/ale-cookbook-angular/pom.xml index a587f782..4f3415af 100644 --- a/ale/ale-cookbook-angular/pom.xml +++ b/ale/ale-cookbook-angular/pom.xml @@ -8,7 +8,7 @@ 2.9.0-SNAPSHOT - Fermenter::Ale::Cookbook::Angular + Fermenter Legacy Frameworks::Ale::Cookbook::Angular A angular project that leverages ale-angular-mda generation ale-cookbook-angular diff --git a/ale/pom.xml b/ale/pom.xml index 0a1eac23..2d10d7b4 100644 --- a/ale/pom.xml +++ b/ale/pom.xml @@ -4,7 +4,7 @@ org.technologybrewery.fermenter - root + fermenter-legacy-frameworks 2.9.0-SNAPSHOT @@ -12,7 +12,7 @@ ale pom - Fermenter::Ale + Fermenter Legacy Frameworks::Ale Ale is an angular Fermenter Framework that uses fermenter-mda to generate angular frontend application code diff --git a/brett/brett-cookbook/pom.xml b/brett/brett-cookbook/pom.xml index 7602dfaf..4add20c5 100644 --- a/brett/brett-cookbook/pom.xml +++ b/brett/brett-cookbook/pom.xml @@ -8,7 +8,7 @@ 2.9.0-SNAPSHOT - Fermenter::Brett::Brett Cookbook + Fermenter Legacy Frameworks::Brett::Brett Cookbook Demonstrative Cookbook project that shows how the Fermenter MDA generation templates and profiles contained within brett-mda may be utilized to generate a Habushu-compliant Python project. diff --git a/brett/brett-mda/pom.xml b/brett/brett-mda/pom.xml index 0509f5ae..4efeba74 100644 --- a/brett/brett-mda/pom.xml +++ b/brett/brett-mda/pom.xml @@ -8,7 +8,7 @@ 2.9.0-SNAPSHOT - Fermenter::Brett::Brett MDA Resources + Fermenter Legacy Frameworks::Brett::Brett MDA Resources Contains resources for generating Python code that realizes projects that align with Habushu's structural requirements and can be integrated into the build lifecyle defined by the Habushu Maven Plugin diff --git a/brett/pom.xml b/brett/pom.xml index b73a79e9..897df298 100644 --- a/brett/pom.xml +++ b/brett/pom.xml @@ -4,7 +4,7 @@ org.technologybrewery.fermenter - root + fermenter-legacy-frameworks 2.9.0-SNAPSHOT @@ -12,7 +12,7 @@ brett pom - Fermenter::Brett + Fermenter Legacy Frameworks::Brett Brett utilizes fermenter-mda to generate Python projects that align with the project structure and best practices prescribed by Habushu. As Brettanomyces (i.e. Brett) is a yeast that can yield unpredictable diff --git a/docker/pom.xml b/docker/pom.xml index 7d649ea9..c170b03d 100644 --- a/docker/pom.xml +++ b/docker/pom.xml @@ -4,11 +4,11 @@ org.technologybrewery.fermenter - root + fermenter-legacy-frameworks 2.9.0-SNAPSHOT - Fermenter::Docker + Fermenter Legacy Frameworks::Docker Fermenter-related docker containers docker diff --git a/fermenter-mda/README.md b/fermenter-mda/README.md deleted file mode 100644 index 6d551c20..00000000 --- a/fermenter-mda/README.md +++ /dev/null @@ -1,75 +0,0 @@ -# Overview # -the `fermenter-mda` plugin allows the generation of code via entities, services, and enumerations. - -# Configuring the fermenter-mda plugin # -There are three ways in which to leverage the `fermenter-mda` plugin: - -1. With local metadata -1. With external metadata -1. With a mixture of the two. (NOTE: in the future, they will be "mashable" in a more intelligent fashion) - -## With Local Metadata ## -In the following snippet shows the `fermenter-mda` plugin within a Maven build. The major points are: - -* configuration -> basePackage: specify the base package for generated sources. In this case, all files generated will have a package that starts with `org.technologybrewery.fermenter.cookbook.domain` -* configuration -> profile: specify the generation 'profile' that will control what exactly gets generated -* dependency -> a dependency that contains the needed profile.xml and associated targets.xml files used for `fermenter-mda` generation - -``` -#!xml - - org.technologybrewery.fermenter - fermenter-mda - ${fermenter.version} - - org.technologybrewery.fermenter.cookbook.domain - cookbook-domain - - - - org.technologybrewery.fermenter - stout-cookbook-profile - ${fermenter.version} - - - - -``` - -## With External Metadata ## -In the following snippet shows the `fermenter-mda` plugin within a Maven build. The major points are: - -* configuration -> metadataDependencies -> metadataDependency: allows you to specify an artifactId within the plugin's dependencies that contains metadata to be loaded. If it is in the classpath, but not specified here, the metadata will NOT be loaded. -* dependencies -> dependency -> last dependency: as noted in the prior bullet - it has to be in the **plugin's classpath** to be found and listed as a metadata dependency. - -``` -#!xml - - org.technologybrewery.fermenter - fermenter-mda - ${fermenter.version} - - org.technologybrewery.fermenter.cookbook.domain.client - cookbook-domain-client - - MAVEN ARTIFACTID OF JAR CONTAINING FERMENTER METADATA - - - - - org.technologybrewery.fermenter - stout-cookbook-profile - ${fermenter.version} - - - some.groupId - MAVEN ARTIFACTID OF JAR CONTAINING FERMENTER METADATA - some-version - - - - -``` - -## Mixing Local and External Metadata ## -You simply combine the two approaches - it will look like the external example, but you will mix any local metadata you have in with the external metadata. More on how to combine these soon. diff --git a/fermenter-mda/pom.xml b/fermenter-mda/pom.xml deleted file mode 100644 index 11b7a53f..00000000 --- a/fermenter-mda/pom.xml +++ /dev/null @@ -1,161 +0,0 @@ - - - - org.technologybrewery.fermenter - root - 2.9.0-SNAPSHOT - - - Fermenter Model-Driven Architecture Code Generator - - 4.0.0 - fermenter-mda - maven-plugin - - - 2.13.4 - 3.8.6 - 3.6.4 - - - - - - - org.mozilla - rhino - 1.7.14 - - - - - - - org.apache.maven - maven-core - ${version.maven.core} - provided - - - org.apache.maven - maven-plugin-api - ${version.maven.core} - provided - - - org.apache.maven.plugin-tools - maven-plugin-annotations - ${version.maven.plugin.tools} - provided - - - org.apache.velocity - velocity-engine-core - 2.3 - - - commons-logging - commons-logging - 1.2 - - - commons-io - commons-io - - - org.apache.commons - commons-collections4 - - - org.apache.commons - commons-lang3 - - - com.fasterxml.jackson.core - jackson-core - ${version.jackson} - - - com.fasterxml.jackson.core - jackson-databind - ${version.jackson} - - - com.github.java-json-tools - json-schema-validator - 2.2.14 - - - com.fasterxml.jackson.core - jackson-databind - - - - - org.technologybrewery.krausening - krausening - 16 - - - junit - junit - test - - - info.cukes - cucumber-java - test - - - info.cukes - cucumber-junit - test - - - org.apache.maven.plugin-testing - maven-plugin-testing-harness - 3.3.0 - test - - - org.apache.maven - maven-compat - ${version.maven.core} - test - - - ch.qos.logback - logback-classic - 1.3.3 - test - - - ch.qos.logback - logback-core - 1.3.3 - test - - - - - - - org.apache.maven.plugins - maven-plugin-plugin - ${version.maven.plugin.tools} - - - default-descriptor - process-classes - - - - - - net.masterthought - maven-cucumber-reporting - - - - diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/CleanMojo.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/CleanMojo.java deleted file mode 100644 index e73f671e..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/CleanMojo.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.technologybrewery.fermenter.mda; - -import java.io.File; -import java.io.IOException; - -import org.apache.commons.io.FileUtils; -import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugin.MojoFailureException; -import org.apache.maven.plugins.annotations.Mojo; -import org.apache.maven.plugins.annotations.Parameter; - -/** - * Removes transient code generated by Fermenter. - */ -@Mojo(name = "clean", threadSafe = true) -public class CleanMojo extends AbstractMojo { - - /** - * Base generated main source directory. All generated source code will wind up underneath this folder. This folder - * will be cleaned as part of the clean target, and its contents should not be put under version control. - */ - @Parameter(required = true, defaultValue = "${project.basedir}/src/generated") - private File generatedBasedir; - - /** - * Base generated test source directory. All generated test source code will wind up underneath this folder. This - * folder will be cleaned as part of the clean target, and its contents should not be put under version control. - */ - @Parameter(required = true, defaultValue = "${project.basedir}/src/generated-test") - private File generatedTestBasedir; - - /** - * {@inheritDoc} - */ - public void execute() throws MojoExecutionException, MojoFailureException { - removeDirectory(generatedBasedir); - removeDirectory(generatedTestBasedir); - } - - private void removeDirectory(File dir) { - if (dir != null && dir.exists() && dir.isDirectory()) { - getLog().info("Deleting " + dir.getAbsolutePath()); - try { - FileUtils.deleteDirectory(dir); - } catch (IOException e) { - getLog().error("Problem encountered removing a directory!", e); - } - } - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/GenerateSourcesHelper.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/GenerateSourcesHelper.java deleted file mode 100644 index e846b49b..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/GenerateSourcesHelper.java +++ /dev/null @@ -1,336 +0,0 @@ -package org.technologybrewery.fermenter.mda; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.function.BiFunction; -import java.util.function.Function; - -import org.technologybrewery.fermenter.mda.GenerateSourcesHelper.LoggerDelegate.LogLevel; -import org.technologybrewery.fermenter.mda.element.ExpandedFamily; -import org.technologybrewery.fermenter.mda.element.ExpandedProfile; -import org.technologybrewery.fermenter.mda.element.Family; -import org.technologybrewery.fermenter.mda.element.Profile; -import org.technologybrewery.fermenter.mda.element.Target; -import org.technologybrewery.fermenter.mda.generator.GenerationContext; -import org.technologybrewery.fermenter.mda.generator.GenerationException; -import org.technologybrewery.fermenter.mda.generator.Generator; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceRepository; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceRepositoryManager; -import org.technologybrewery.fermenter.mda.metamodel.ModelRepositoryConfiguration; -import org.technologybrewery.fermenter.mda.util.MessageTracker; -import org.technologybrewery.fermenter.mda.util.PriorityMessage; -import org.technologybrewery.fermenter.mda.util.PriorityMessageService; -import org.technologybrewery.krausening.Krausening; - -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.io.Files; - -/** - * Utility class that provides common metamodel loading, parsing, and source - * code generation functionality needed by Maven, Gradle, or other build tool - * responsible for executing Fermenter. - */ -public final class GenerateSourcesHelper { - - protected static final String METAMODEL_PROPERTIES = "metamodel.properties"; - - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); - - private static final PriorityMessageService PRIORITY_MESSAGE_SERVICE = new PriorityMessageService(); - - public static LoggerDelegate logger; - - private GenerateSourcesHelper() { - - } - - /** - * Enables the delegation of logging to build tool specific mechanisms. - */ - public interface LoggerDelegate { - public enum LogLevel { - TRACE, DEBUG, INFO, WARN, ERROR - } - - void log(LogLevel level, String message); - } - - /** - * Loads all {@link Family}s contained within the given - * {@link InputStream}, which is expected to reference the desired - * families.json file to load. - * - * @param familiesStream - * {@link InputStream} referencing families.json file desired to - * load. - * @return {@link Map} containing all loaded {@link ExpandedFamily}s with - * their corresponding name as the map key. - * @throws IOException - */ - public static Map loadFamilies(InputStream familiesStream, - Map families) throws IOException { - List loadedFamilies = OBJECT_MAPPER.readValue(familiesStream, new TypeReference>() {}); - for (Family f : loadedFamilies) { - families.put(f.getName(), new ExpandedFamily(f)); - } - - return families; - } - - /** - * Loads all {@link Target}s contained within the given {@link InputStream}, - * which references the desired targets.json file to load. - * - * @param targetsStream - * {@link InputStream} referencing targets.json file desired to - * load. - * @return {@link Map} containing all loaded {@link Target}s with their - * corresponding name as the map key. - * @throws IOException - */ - public static Map loadTargets(InputStream targetsStream, Map targets) - throws IOException { - List loadedTargets = OBJECT_MAPPER.readValue(targetsStream, new TypeReference>() { - }); - for (Target t : loadedTargets) { - targets.put(t.getName(), t); - } - return targets; - } - - /** - * Loads all {@link Profile}s contained within the given - * {@link InputStream}, which is expected to reference the desired - * profiles.json file to load. - * - * @param profilesStream - * {@link InputStream} referencing profiles.json file desired to - * load. - * @return {@link Map} containing all loaded {@link ExpandedProfile}s with - * their corresponding name as the map key. - * @throws IOException - */ - public static Map loadProfiles(InputStream profilesStream, - Map profiles) throws IOException { - List loadedProfiles = OBJECT_MAPPER.readValue(profilesStream, new TypeReference>() { - }); - for (Profile p : loadedProfiles) { - profiles.put(p.getName(), new ExpandedProfile(p)); - } - - return profiles; - } - - /** - * Loads all metamodels defined by the given - * {@link ModelRepositoryConfiguration} using the specified repository - * implementation class. If any errors have been collected by the - * {@link MessageTracker}, a {@link GenerationException} will be thrown. - * - * @see {@link #validateMetamodelRepository(ModelInstanceRepository, LoggerDelegate)}. - * - * @param config - * configures the {@link ModelInstanceRepository} that will be - * used to load metamodels. - * @param modelInstanceRepositoryImplClazz - * fully qualified class name of the desired - * {@link ModelInstanceRepository} to use to load metamodels - * specified by the given {@link ModelRepositoryConfiguration}. - * @param logger - * build tool specific logging implementation to which logging - * will be delegated. - * @return {@link ModelInstanceRepository} of the specified type which has - * been loaded with all configured metamodels. NOTE: - * Metamodels have *not* yet been validated. - * @throws ClassNotFoundException - * @throws NoSuchMethodException - * @throws InstantiationException - * @throws IllegalAccessException - * @throws InvocationTargetException - */ - public static ModelInstanceRepository loadMetamodelRepository(ModelRepositoryConfiguration config, - String modelInstanceRepositoryImplClazz, LoggerDelegate logger) throws ClassNotFoundException, - NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { - - GenerateSourcesHelper.logger = logger; - - long start = System.currentTimeMillis(); - logger.log(LogLevel.INFO, String.format("START: loading metamodel repository implementation: %s ...", - modelInstanceRepositoryImplClazz)); - - ModelInstanceRepository repository; - Class repoImplClass = Class.forName(modelInstanceRepositoryImplClazz); - Class[] constructorParamTypes = { ModelRepositoryConfiguration.class }; - Constructor constructor = repoImplClass.getConstructor(constructorParamTypes); - Object[] params = { config }; - repository = (ModelInstanceRepository) constructor.newInstance(params); - - ModelInstanceRepositoryManager.setRepository(repository); - repository.load(); - - MessageTracker.getInstance().emitMessages(logger); - if (MessageTracker.getInstance().hasErrors()) { - throw new GenerationException("Errors encountered!"); - } - - long stop = System.currentTimeMillis(); - logger.log(LogLevel.INFO, - String.format("COMPLETE: metamodel repository loading in %d ms", (stop - start))); - - return repository; - } - - /** - * Validates all metamodels loaded into the given - * {@link ModelInstanceRepository} to preemptively identify any model - * definition errors, such as metamodel schema violations, model references - * to invalid types or entities, etc.
- * Pre-condition: The provided {@link ModelInstanceRepository} must - * be correctly initialized via - * {@link #loadMetamodelRepository(ModelRepositoryConfiguration, String, LoggerDelegate)} - * prior to invoking this method. - * - * @see {@link #loadMetamodelRepository(ModelRepositoryConfiguration, String, LoggerDelegate)}. - * @param metamodelRepository - * metamodel repository desired for validation which has been - * initialized with the relevant metamodel definitions. - * @param logger - * build tool specific logging implementation to which logging - * will be delegated. - */ - public static void validateMetamodelRepository(ModelInstanceRepository metamodelRepository, LoggerDelegate logger) { - long start = System.currentTimeMillis(); - logger.log(LogLevel.INFO, "START: validating metamodel repository..."); - - metamodelRepository.validate(); - - long stop = System.currentTimeMillis(); - logger.log(LogLevel.INFO, "COMPLETE: validation of metamodel repository in " + (stop - start) + "ms"); - } - - /** - * Executes code generation on the targets defined within the provided - * profile, delegating to the appropriate {@link Generator} instances.
- * Pre-condition: It is assumed that all metamodels have been loaded - * into the appropriate {@link ModelInstanceRepository} instance and - * validated. - * - * @param targetProfile {@link Profile} defining the desired source code, resources, - * etc. to generate. - * @param profiles all valid {@link Profile}s that are available for code - * generation. - * @param createGenerationContext {@link Function} that creates the appropriate - * {@link GenerationContext} based on a given {@link Target}. - * Enables build tool specific logic for populating the - * {@link GenerationContext}. - * @param handleInvalidProfile enables developers to provide build tool specific handling the - * specification of an invalid profile. This {@link Function} - * receives the invalid profile that was specified and all valid - * {@link Profile}s as input parameters, and may optionally - * return an {@link Exception}, which will be thrown if non-null. - * @param logger build tool specific logging implementation to which logging - * will be delegated. - * @throws Exception an invalid profile was specified or an unexpected error - * occurred during {@link Generator} creation and processing. - */ - public static void performSourceGeneration(String targetProfile, - Map profiles, - Function createGenerationContext, - BiFunction, Exception> handleInvalidProfile, - LoggerDelegate logger, - File projectDir) - throws Exception { - long start = System.currentTimeMillis(); - ExpandedProfile profile = profiles.get(targetProfile); - - // First validate the profile specified by the developer - if (profile == null) { - Exception invalidProfileException = handleInvalidProfile.apply(targetProfile, profiles.values()); - if (invalidProfileException != null) { - throw invalidProfileException; - } - } else { - if (profile.isDeprecated()) { - //creates the priority message to be replayed at the end of the build - PriorityMessage priorityMessage = new PriorityMessage(); - priorityMessage.setFilePath(projectDir.toString() + "/pom.xml"); - - //default warning message if none is provided - if (profile.getWarningMessage() == null || profile.getWarningMessage().isBlank()) { - String warningMessage = "The profile '" + profile.getName() + "' is deprecated, " + - "please replace all references to it."; - logger.log(LogLevel.WARN, warningMessage); - priorityMessage.setMessage(warningMessage); - } else { - logger.log(LogLevel.WARN, profile.getWarningMessage()); - priorityMessage.setMessage(profile.getWarningMessage()); - } - - PRIORITY_MESSAGE_SERVICE.addPriorityMessage(priorityMessage); - } - - logger.log(LogLevel.INFO, "Generating code for profile '" + profile.getName() + "'"); - - // For each target, instantiate a generator and call generate - for (Target target : profile.getTargets()) { - logger.log(LogLevel.DEBUG, "\tExecuting target '" + target.getName() + "'"); - GenerationContext context = createGenerationContext.apply(target); - Class clazz = Class.forName(target.getGenerator()); - Generator generator = (Generator) clazz.getDeclaredConstructor().newInstance(); - generator.setMetadataContext(target.getMetadataContext()); - generator.generate(context); - } - - long stop = System.currentTimeMillis(); - logger.log(LogLevel.INFO, "Generation completed in " + (stop - start) + "ms"); - } - - } - - /** - * We don't have great fine-grained control of logging inside the plugin, so - * default some Krausening values when they aren't specified so warnings - * don't pollute the Maven output. - */ - public static void suppressKrauseningWarnings() { - if (System.getProperty(Krausening.BASE_LOCATION) == null) { - File tempKrauseningLocation = Files.createTempDir(); - File tempBaseLocation = new File(tempKrauseningLocation, "base"); - tempBaseLocation.mkdir(); - File tempExtLocation = new File(tempKrauseningLocation, "ext"); - tempExtLocation.mkdir(); - try { - Properties p = new Properties(); - String comments = "default file to suppress warnings"; - p.store(new FileWriter(new File(tempBaseLocation, METAMODEL_PROPERTIES)), comments); - p.store(new FileWriter(new File(tempExtLocation, METAMODEL_PROPERTIES)), comments); - - } catch (IOException e) { - // do nothing, this is just to suppress some warnings... - } - - System.setProperty(Krausening.BASE_LOCATION, tempBaseLocation.getAbsolutePath()); - System.setProperty(Krausening.EXTENSIONS_LOCATION, tempExtLocation.getAbsolutePath()); - } - - if (System.getProperty(Krausening.KRAUSENING_PASSWORD) == null) { - System.setProperty(Krausening.KRAUSENING_PASSWORD, "stub"); - } - } - - public static void cleanUp() { - PackageManager.cleanUp(); - TypeManager.cleanUp(); - MessageTracker.cleanUp(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/GenerateSourcesMojo.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/GenerateSourcesMojo.java deleted file mode 100644 index 75ae24ea..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/GenerateSourcesMojo.java +++ /dev/null @@ -1,610 +0,0 @@ -package org.technologybrewery.fermenter.mda; - -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.logging.LogFactory; -import org.apache.maven.artifact.Artifact; -import org.apache.maven.artifact.versioning.ComparableVersion; -import org.apache.maven.model.Plugin; -import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugin.descriptor.PluginDescriptor; -import org.apache.maven.plugin.logging.Log; -import org.apache.maven.plugins.annotations.LifecyclePhase; -import org.apache.maven.plugins.annotations.Mojo; -import org.apache.maven.plugins.annotations.Parameter; -import org.apache.maven.plugins.annotations.ResolutionScope; -import org.apache.maven.project.MavenProject; -import org.apache.velocity.app.VelocityEngine; -import org.apache.velocity.runtime.RuntimeConstants; -import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader; -import org.technologybrewery.fermenter.mda.element.*; -import org.technologybrewery.fermenter.mda.element.*; -import org.technologybrewery.fermenter.mda.generator.GenerationContext; -import org.technologybrewery.fermenter.mda.generator.Generator; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceRepository; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceUrl; -import org.technologybrewery.fermenter.mda.metamodel.ModelRepositoryConfiguration; -import org.technologybrewery.fermenter.mda.util.MessageTracker; -import org.technologybrewery.fermenter.mda.reporting.StatisticsService; - -import javax.inject.Inject; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.InvocationTargetException; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.*; - -/** - * Executes the Fermenter MDA process. - */ -@Mojo(name = "generate-sources", defaultPhase = LifecyclePhase.GENERATE_SOURCES, requiresDependencyResolution = ResolutionScope.COMPILE, threadSafe = true) -public class GenerateSourcesMojo extends AbstractMojo { - - private static final org.apache.commons.logging.Log LOG = LogFactory.getLog(GenerateSourcesMojo.class); - - private Map profiles = new HashMap<>(); - - private Map targets = new HashMap<>(); - - private Map families = new HashMap<>(); - - @Inject - private StatisticsService statisticsService; - - @Parameter(required = true, readonly = true, defaultValue = "${project}") - private MavenProject project; - - @Parameter(defaultValue = "${plugin}", readonly = true) - private PluginDescriptor plugin; - - @Parameter(required = true) - private String profile; - - @Parameter - private List metadataDependencies; - - @Parameter - private String basePackage; - - /** - * Captures the target programming language in which source code artifacts will be generated. This - * configuration drives the automatic configuration of {@link #mainSourceRoot}, {@link #generatedSourceRoot}, - * {@link #generatedTestSourceRoot}, and other language specific structural elements. - */ - @Parameter(required = true, defaultValue = "java") - private String language; - - private String targetsFileLocation = "targets.json"; - private String profilesFileLocation = "profiles.json"; - private String familiesFileLocation = "families.json"; - - /** - * Represents the artifactIds that will be targeted for generation if the - * metadataContext equals 'targeted'. - */ - @Parameter(required = false) - private List targetModelInstances; - - @Parameter(required = true, defaultValue = "${project.basedir}/src/main") - private File mainSourceRoot; - - @Parameter(required = true, defaultValue = "${project.basedir}/src/generated") - private File generatedSourceRoot; - - @Parameter(required = true, defaultValue = "${project.basedir}/src/test") - private File testSourceRoot; - - @Parameter(required = true, defaultValue = "${project.basedir}/src/generated-test") - private File generatedTestSourceRoot; - - /** - * Local path from which metadata will be loaded. Defaults to "{@link #mainSourceRoot}/resources" - * via {@link #getLocalMetadataRoot()}. - */ - @Parameter - private File localMetadataRoot; - - @Parameter(required = true, defaultValue = "${project.basedir}/src/main/resources/types.json") - private File localTypes; - - @Parameter(required = true, readonly = true, defaultValue = "org.technologybrewery.fermenter.mda.metamodel.DefaultModelInstanceRepository") - private String metadataRepositoryImpl; - - /** - * List of general properties to pass to the {@link GenerationContext}. - */ - @Parameter - private Map propertyVariables; - - private VelocityEngine engine; - - /** - * Creates a {@link GenerateSourcesHelper.LoggerDelegate} implementation for use with - * {@link GenerateSourcesHelper} that delegates to the {@link Log} that has - * been injected into this mojo. - */ - protected GenerateSourcesHelper.LoggerDelegate mavenLoggerDelegate = new GenerateSourcesHelper.LoggerDelegate() { - - @Override - public void log(LogLevel level, String message) { - Log log = getLog(); - switch (level) { - case TRACE: - case DEBUG: - log.debug(message); - break; - case INFO: - log.info(message); - break; - case WARN: - log.warn(message); - break; - case ERROR: - log.error(message); - break; - default: - log.info(message); - break; - } - } - }; - - @Override - public void execute() throws MojoExecutionException { - GenerateSourcesHelper.suppressKrauseningWarnings(); - - try { - setup(); - GenerateSourcesHelper.performSourceGeneration(profile, profiles, this::createGenerationContext, - this::handleInvalidProfile, mavenLoggerDelegate, project.getBasedir()); - } catch (Exception e) { - String message = "Error while performing source generation"; - // NB logging and re-throwing isn't usually a best practice as it - // can result in duplicative error logging and clutter, but here it - // can be helpful in providing additional context about an error - // without needing to re-run Maven with -e or -X turned on - getLog().error(message, e); - throw new MojoExecutionException(message, e); - - } finally { - GenerateSourcesHelper.cleanUp(); - - } - - } - - /** - * Performs all setup activities required to load and validate metamodels - * prior to code generation, including loading generation targets and - * profiles, automatically adding src/generated/java to the project's list - * of source directories, and loading/validating metamodels into the - * appropriate {@link ModelInstanceRepository}. - * - * @throws MojoExecutionException any unexpected error occurs during metamodel loading and - * validation. - */ - private void setup() throws MojoExecutionException { - if (metadataDependencies == null) { - metadataDependencies = new ArrayList<>(); - } - - updateMojoConfigsBasedOnLanguage(); - validateMojoConfigs(); - - loadTargets(); - loadProfiles(); - loadFamilies(); - TypeManager.getInstance().loadLocalTypes(localTypes); - - if (isGeneratingJavaProject()) { - try { - project.addCompileSourceRoot(getJavaCompilePathForGeneratedSource()); - } catch (IOException e) { - throw new MojoExecutionException("Could not add generated Java source root to project compilation path list", e); - } - } - - try { - ModelRepositoryConfiguration config = createMetadataConfiguration(); - ModelInstanceRepository newRepository = GenerateSourcesHelper.loadMetamodelRepository(config, - metadataRepositoryImpl, mavenLoggerDelegate); - - GenerateSourcesHelper.validateMetamodelRepository(newRepository, mavenLoggerDelegate); - } catch (MalformedURLException | ClassNotFoundException | NoSuchMethodException | InstantiationException - | IllegalAccessException | InvocationTargetException e) { - throw new MojoExecutionException("Could not successfully load metamodel repository", e); - } - - engine = new VelocityEngine(); - engine.setProperty(RuntimeConstants.RESOURCE_LOADERS, "classpath"); - engine.setProperty("resource.loader.classpath.class", ClasspathResourceLoader.class.getName()); - engine.init(); - } - - - /** - * Scans the classpath for any families.json files and loads all defined - * {@link Family} configurations. - * - * @throws MojoExecutionException - */ - public void loadFamilies() throws MojoExecutionException { - Enumeration familyEnumeration = null; - try { - familyEnumeration = getClass().getClassLoader().getResources(familiesFileLocation); - } catch (IOException ioe) { - throw new MojoExecutionException("Unable to find families", ioe); - } - - URL familiesResource; - while (familyEnumeration.hasMoreElements()) { - familiesResource = familyEnumeration.nextElement(); - getLog().info(String.format("Loading families from: %s", familiesResource.toString())); - - try (InputStream familiesStream = familiesResource.openStream()) { - families = GenerateSourcesHelper.loadFamilies(familiesStream, families); - } catch (IOException e) { - throw new MojoExecutionException("Unable to parse " + familiesFileLocation, e); - } - } - - for (ExpandedFamily f : families.values()) { - f.dereference(families, profiles); - } - - } - - /** - * Scans the classpath for any targets.json files and loads all defined - * {@link Target} configurations. - * - * @throws MojoExecutionException - */ - public void loadTargets() throws MojoExecutionException { - Enumeration targetEnumeration = null; - try { - targetEnumeration = getClass().getClassLoader().getResources(targetsFileLocation); - } catch (IOException ioe) { - throw new MojoExecutionException("Unable to find targets", ioe); - } - - URL targetsResource; - while (targetEnumeration.hasMoreElements()) { - targetsResource = targetEnumeration.nextElement(); - getLog().info(String.format("Loading targets from: %s", targetsResource.toString())); - - try (InputStream targetsStream = targetsResource.openStream()) { - targets = GenerateSourcesHelper.loadTargets(targetsStream, targets); - } catch (IOException e) { - throw new MojoExecutionException("Unable to parse " + targetsFileLocation, e); - } - } - } - - /** - * Scans the classpath for any profiles.json files and loads all defined - * {@link Profile} configurations. - * - * @throws MojoExecutionException - */ - public void loadProfiles() throws MojoExecutionException { - Enumeration profileEnumeration = null; - try { - profileEnumeration = getClass().getClassLoader().getResources(profilesFileLocation); - } catch (IOException ioe) { - throw new MojoExecutionException("Unable to find profiles", ioe); - } - - URL profilesResource; - while (profileEnumeration.hasMoreElements()) { - profilesResource = profileEnumeration.nextElement(); - getLog().info(String.format("Loading profiles from: %s", profilesResource.toString())); - - try (InputStream profilesStream = profilesResource.openStream()) { - profiles = GenerateSourcesHelper.loadProfiles(profilesStream, profiles); - } catch (IOException e) { - throw new MojoExecutionException("Unable to parse " + profilesFileLocation, e); - } - } - - for (ExpandedProfile p : profiles.values()) { - p.dereference(profiles, targets); - } - } - - /** - * Creates a {@link ModelRepositoryConfiguration} utilized by the - * appropriate {@link ModelInstanceRepository} for metamodel loading. This - * method primarily extracts the metamodel dependencies specified in the - * <metadataDependencies> and <targetModelInstances> - * configurations and enables them to be appropriately referenced through - * the created {@link ModelRepositoryConfiguration}. - * - * @return appropriately configured {@link ModelRepositoryConfiguration} - * that may be used for metamodel processing. - * @throws MalformedURLException - */ - private ModelRepositoryConfiguration createMetadataConfiguration() throws MalformedURLException { - ModelRepositoryConfiguration config = new ModelRepositoryConfiguration(); - config.setArtifactId(project.getArtifactId()); - config.setBasePackage(basePackage); - - List targetedArtifactIds = new ArrayList<>(); - if (CollectionUtils.isEmpty(targetModelInstances)) { - targetedArtifactIds.add(project.getArtifactId()); - - } else { - targetedArtifactIds = targetModelInstances; - - } - - if ((targetedArtifactIds.size() > 1) || (!targetedArtifactIds.contains(project.getArtifactId()))) { - LOG.info("Generation targets (" + targetedArtifactIds.size() - + ") are different from project's local metadata (" + targetedArtifactIds.toString() + ")"); - } - - config.setTargetModelInstances(targetedArtifactIds); - Map metadataUrls = config.getMetamodelInstanceLocations(); - String projectUrl = getLocalMetadataRoot().toURI().toURL().toString(); - metadataUrls.put(project.getArtifactId(), new ModelInstanceUrl(project.getArtifactId(), projectUrl)); - PackageManager.addMapping(project.getArtifactId(), basePackage); - - if (metadataDependencies != null) { - metadataDependencies.add(project.getArtifactId()); - - List artifacts = plugin.getArtifacts(); - for (Artifact a : artifacts) { - if (metadataDependencies.contains(a.getArtifactId())) { - URL url = a.getFile().toURI().toURL(); - metadataUrls.put(a.getArtifactId(), new ModelInstanceUrl(a.getArtifactId(), url.toString())); - PackageManager.addMapping(a.getArtifactId(), url, a.getGroupId()); - LOG.info("Adding metadataDependency to current set of metadata: " + a.getArtifactId()); - } - } - - } - return config; - } - - /** - * Helper method that automatically updates appropriate Mojo configurations based on the specified target language, - * which is configured via {@link #language}. Specifically, this method overrides the various file locations in - * which generated code is placed to align with the expected file structures required by each language associated - * DevOps and build tooling. - */ - protected void updateMojoConfigsBasedOnLanguage() { - if (isGeneratingPythonProject()) { - String pythonPackageFolder = getPythonPackageFolderForProject(); - this.mainSourceRoot = new File(project.getBasedir(), String.format("src/%s", pythonPackageFolder)); - this.generatedSourceRoot = new File(project.getBasedir(), String.format("src/%s/generated", pythonPackageFolder)); - this.testSourceRoot = new File(project.getBasedir(), "tests"); - this.generatedTestSourceRoot = new File(project.getBasedir(), "tests"); - this.localTypes = new File(mainSourceRoot, "resources/types.json"); - if (StringUtils.isEmpty(this.basePackage)) { - this.basePackage = pythonPackageFolder; - } - } - } - - /** - * Performs complex validation on user-provided configurations to this Mojo, outside of metamodel validation. - * - * @throws MojoExecutionException unrecoverable validation error was detected. - */ - protected void validateMojoConfigs() throws MojoExecutionException { - MessageTracker messageTracker = MessageTracker.getInstance(); - if (isGeneratingJavaProject()) { - if (StringUtils.isEmpty(basePackage)) { - messageTracker.addErrorMessage(" must be specified for Java-based projects"); - } - } - - if (messageTracker.hasErrors()) { - messageTracker.emitMessages(mavenLoggerDelegate); - throw new MojoExecutionException("Provided configuration was invalid!"); - } - } - - /** - * Handles the specification of an invalid or non-existent generation - * profile by providing diagnostic error logging and returning the - * appropriate exception to throw. - * - * @param targetProfile invalid profile specified in the fermenter-mda plugin - * declaration. - * @param allProfiles all valid {@link Profile}s based on the fermenter-mda plugin - * configuration. - * @return a {@link MojoExecutionException} to throw and halt the build. - */ - private Exception handleInvalidProfile(String targetProfile, Collection allProfiles) { - StringBuilder sb = new StringBuilder(); - Set orderedProfiles = new TreeSet<>(allProfiles); - for (ExpandedProfile profileValue : orderedProfiles) { - sb.append("\t- ").append(profileValue.getName()).append("\n"); - } - - getLog().error("\n\n" - + "\torg.technologybrewery.fermenter\n" - + "\tfermenter-mda\n" - + "\t...\n" - + "\t\n" - + "\t\t" + targetProfile + " <----------- INVALID PROFILE!\n" - + "\t\t...\n" - + "\t\n" - + "\n" - + "Profile '" + targetProfile + "' is invalid. Please choose one of the following valid profiles:\n" + sb.toString()); - - return new MojoExecutionException("Invalid profile specified: '" + targetProfile + "'"); - } - - /** - * Creates a new {@link GenerationContext} object based on the given - * {@link Target} which captures key configuration details needed to - * generate the source file(s) modeled by the given {@link Target} and it's - * {@link Generator}. - * - * @param target generation {@link Target} being processed. - * @return {@link GenerationContext} that can be provided to the given - * {@link Target}'s {@link Generator} to execute code generation. - */ - private GenerationContext createGenerationContext(Target target) { - GenerationContext context = new GenerationContext(target); - context.setStatisticsService(statisticsService); - context.setBasePackage(basePackage); - context.setProjectDirectory(project.getBasedir()); - context.setGeneratedSourceDirectory(generatedSourceRoot); - context.setMainSourceDirectory(mainSourceRoot); - context.setTestSourceDirectory(testSourceRoot); - context.setGeneratedTestSourceDirectory(generatedTestSourceRoot); - context.setEngine(engine); - context.setGroupId(project.getGroupId()); - context.setArtifactId(project.getArtifactId()); - context.setVersion(project.getVersion()); - context.setDescriptiveName(project.getName()); - if (project.getScm() != null) { - context.setScmUrl(project.getScm().getUrl()); - } - context.setPropertyVariables(propertyVariables); - - return context; - } - - /** - * Boolean value indicating whether this Mojo is being invoked to generate a Java-based project. - * - * @return - */ - protected boolean isGeneratingJavaProject() { - return "java".equalsIgnoreCase(this.language) && !"habushu".equals(this.getProject().getPackaging()); - } - - /** - * Boolean value indicating whether this Mojo is being invoked to generate a Python-based project. - * This may be explicitly specified via the {@link #language} configuration or if it is detected - * that the project uses a recent version of the Habushu Maven plugin. - * - * @return - */ - protected boolean isGeneratingPythonProject() { - return "python".equalsIgnoreCase(this.language) - || ("habushu".equals(this.project.getPackaging()) && !isLegacyHabushuProject()); - } - - /** - * Boolean value indicating whether this Mojo is being invoked on a project that is a legacy - * Habushu project. More specifically, the determination is based on if a version of the - * {@code org.technologybrewery.habushu:habushu-maven-plugin} with a version less than {@code 2.0.0} - * is included in the POM's {@code }. - * - * @return - */ - protected boolean isLegacyHabushuProject() { - Plugin habushuMavenPlugin = this.project.getPlugin("org.bitbucket.cpointe.habushu:habushu-maven-plugin"); - if (habushuMavenPlugin != null) { - ComparableVersion habushuVersion = new ComparableVersion(habushuMavenPlugin.getVersion()); - return habushuVersion.compareTo(new ComparableVersion("2.0.0")) < 0; - } - return false; - } - - /** - * Gets the normalized package folder name of the relevant Python project being generated that aligns with - * PEP-8 naming conventions (dashes may be in published package names, but in the actual package folder hierarchy, - * dashes should be replaced with underscores). - * - * @return - */ - protected String getPythonPackageFolderForProject() { - return StringUtils.replace(this.getProject().getArtifactId(), "-", "_"); - } - - /** - * Retrieves the compile path at which generated Java source files will be placed.
- * - * Pre-condition: The target project being generated is Java-based - * - * @return - * @throws IOException - */ - protected String getJavaCompilePathForGeneratedSource() throws IOException { - return new File(this.generatedSourceRoot, "java").getCanonicalPath(); - } - - /** - * Retrieves the location within this project from which local metadata definitions will be loaded. - * If {@link #localMetadataRoot} is not configured, this will default to "{@link #mainSourceRoot}/resources" - * (i.e. {@code src/main/resources}). - * - * @return - */ - protected File getLocalMetadataRoot() { - return localMetadataRoot != null ? localMetadataRoot : new File(mainSourceRoot, "resources"); - } - - public Map getFamilies() { - return families; - } - - public Map getProfiles() { - return profiles; - } - - public Map getTargets() { - return targets; - } - - public String getProfile() { - return profile; - } - - public void setProfile(String profile) { - this.profile = profile; - } - - public String getBasePackage() { - return basePackage; - } - - public void setBasePackage(String basePackage) { - this.basePackage = basePackage; - } - - public Map getPropertyVariables() { - return propertyVariables; - } - - public void setPropertyVariables(Map propertyVariables) { - this.propertyVariables = propertyVariables; - } - - public String getTargetsFileLocation() { - return targetsFileLocation; - } - - public void setTargetsFileLocation(String targetsFileLocation) { - this.targetsFileLocation = targetsFileLocation; - } - - public String getProfilesFileLocation() { - return profilesFileLocation; - } - - public void setProfilesFileLocation(String profilesFileLocation) { - this.profilesFileLocation = profilesFileLocation; - } - - public MavenProject getProject() { - return project; - } - - protected File getMainSourceRoot() { - return mainSourceRoot; - } - - protected File getGeneratedSourceRoot() { - return generatedSourceRoot; - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/PackageManager.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/PackageManager.java deleted file mode 100644 index 84aa8cf8..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/PackageManager.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.technologybrewery.fermenter.mda; - -import java.io.IOException; -import java.io.InputStream; -import java.net.JarURLConnection; -import java.net.URL; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class PackageManager { - - private static final Logger logger = LoggerFactory.getLogger(PackageManager.class); - - private static ThreadLocal threadBoundInstance = ThreadLocal.withInitial(PackageManager::new); - - private Map artifactIdToBasePackage = new HashMap<>(); - - private PackageManager() { - } - - private static PackageManager getInstance() { - return threadBoundInstance.get(); - } - - /** - * Returns a base package for a given artifact id. - * - * @param artifactId - * The name for which to look - * @return The returned base package or null if one does not exist - */ - public static String getBasePackage(String artifactId) { - return getInstance().artifactIdToBasePackage.get(artifactId); - } - - public static void addMapping(String artifactId, URL url, String defaultPackageName) { - try (InputStream stream = processURL(url)) { - Properties props = new Properties(); - props.load(stream); - - getInstance().artifactIdToBasePackage.put(artifactId, props.getProperty("basePackage")); - - } catch (IOException ex) { - logger.debug("Could not find package properties for artifactId '{}' at URL {}", artifactId, url.getPath()); - logger.debug("Using default package name ('{}') for artifactId '{}' instead", defaultPackageName, - artifactId); - getInstance().artifactIdToBasePackage.put(artifactId, defaultPackageName); - - } - } - - public static void addMapping(String artifactId, String basePackage) { - getInstance().artifactIdToBasePackage.put(artifactId, basePackage); - } - - - private static InputStream processURL(URL url) throws IOException { - String sUrl = url.toString(); - if (sUrl.indexOf(".jar") != -1) { - sUrl = "jar:" + url + "!/" + "package.properties"; - URL jarUrl = new URL(sUrl); - JarURLConnection jarConnection = (JarURLConnection) jarUrl.openConnection(); - return jarConnection.getInputStream(); - } - - return url.openStream(); - } - - /** - * Cleans up thread local resources. - */ - public static void cleanUp() { - threadBoundInstance.remove(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/TypeManager.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/TypeManager.java deleted file mode 100644 index 565c37dc..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/TypeManager.java +++ /dev/null @@ -1,146 +0,0 @@ -package org.technologybrewery.fermenter.mda; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.technologybrewery.fermenter.mda.element.Type; -import org.technologybrewery.fermenter.mda.generator.GenerationException; -import org.technologybrewery.fermenter.mda.util.JsonUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; - -/** - * Responsible for maintaining mappings from logical type names to implementation types. - */ -public class TypeManager { - - private static final String UNDEFINED_TYPE = ""; - private static final Logger logger = LoggerFactory.getLogger(TypeManager.class); - private static ThreadLocal threadBoundInstance = ThreadLocal.withInitial(TypeManager::new); - - private Map types = new HashMap<>(); - - /** - * Returns the type manager instance. - * - * @return type manager - */ - public static TypeManager getInstance() { - return threadBoundInstance.get(); - } - - public static void cleanUp() { - threadBoundInstance.remove(); - } - - private TypeManager() { - load(); - } - - /** - * Load in the metadata from the associated file - * - */ - protected void load() { - try { - Enumeration urls = getClass().getClassLoader().getResources("types.json"); - URL typesResource; - while (urls.hasMoreElements()) { - typesResource = urls.nextElement(); - logger.info("Loading types from: {}", typesResource); - processTypesFile(typesResource); - } - - } catch (IOException e) { - throw new GenerationException("Could not load types.json!", e); - } - } - - /** - * Allows local types to be loaded into the TypeManager. - * - * @param localTypes - * file with local types - */ - public void loadLocalTypes(File localTypes) { - try { - logger.info("Checking for local types at: {}...", localTypes.getCanonicalFile()); - - if (localTypes.exists()) { - URL localTypeUrl = localTypes.toURI().toURL(); - logger.info("Loading types from: {}", localTypeUrl); - processTypesFile(localTypeUrl); - } - - } catch (IOException e) { - throw new GenerationException("Could not load local types!", e); - } - } - - private void processTypesFile(URL typesResource) { - ObjectMapper objectMapper = JsonUtils.getObjectMapper(); - try (InputStream typesStream = typesResource.openStream()) { - - List loadedTypes = objectMapper.readValue(typesStream, new TypeReference>() { - }); - for (Type type : loadedTypes) { - types.put(type.getName(), type); - } - } catch (IOException e) { - throw new GenerationException("Unable to parse types.json", e); - } - } - - protected Map getTypeMap() { - return types; - } - - /** - * Returns the fully qualified implementation for a given type. - * - * @param name - * name of the type to lookup - * @return the fully qualified implementation name or so it's easier to debug in generated files - * when missing. A error will also be emitted to the log when is used. - */ - public static String getFullyQualifiedType(String name) { - String fullyQualifiedType = null; - Type type = getInstance().getTypeMap().get(name); - if (type == null) { - logger.error("Type {} could not be found during a request for fullyQualifiedImplementation!", name); - fullyQualifiedType = UNDEFINED_TYPE; - } else { - fullyQualifiedType = type.getFullyQualifiedImplementation(); - } - return fullyQualifiedType; - } - - /** - * Returns the short implementation for a given type. - * - * @param name - * name of the type to lookup - * @return the short implementation name or so it's easier to debug in generated files when - * missing. A error will also be emitted to the log when is used. - */ - public static String getShortType(String name) { - String shortType = null; - Type type = getInstance().getTypeMap().get(name); - if (type == null) { - logger.error("Type {} could not be found during a request for shortImplementation!", name); - shortType = UNDEFINED_TYPE; - } else { - shortType = type.getShortImplementation(); - } - return shortType; - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/ExpandedFamily.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/ExpandedFamily.java deleted file mode 100644 index 0fa91a78..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/ExpandedFamily.java +++ /dev/null @@ -1,75 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import com.google.common.collect.ImmutableList; -import org.technologybrewery.fermenter.mda.util.MessageTracker; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Represents a fully expanded version of the metadata in {@link Family}. For instance, it dereferences the profiles and - * included families to provide a full set to actual profiles referenced in a {@link Family}. - */ -public class ExpandedFamily { - - private static MessageTracker messageTracker = MessageTracker.getInstance(); - - protected Family Family; - - protected Map profiles = new HashMap<>(); - - protected Map includes = new HashMap<>(); - - protected boolean isDereferenced; - - public ExpandedFamily(Family Family) { - this.Family = Family; - } - - public String getName() { - return Family.getName(); - } - - public void addProfile(Profile profile) { - profiles.put(profile.getName(), profile); - } - - public List getProfiles() { - return ImmutableList.copyOf(profiles.values()); - } - - public void addReferencedFamily(ExpandedFamily Family) { - includes.put(Family.getName(), Family); - } - - public List getReferencedFamilies() { - return ImmutableList.copyOf(includes.values()); - } - - /** - * Looks at the profile references and Family references in this Family and expands them so they can be retrieved - * directly from this class. For instance, a profile reference to "fooProfile" becomes an actual reference to the - * "fooProfile" profile instance that will get returned by a call to getProfiles(). - * - * @param families - * full set of expanded families from the generator - * @param profiles - * full set of profiles from the generator - */ - public void dereference(Map families, Map profiles) { - if (!isDereferenced) { - isDereferenced = true; - - for (ProfileReference profileRef : Family.getProfileReferences()) { - ExpandedProfile profile = profiles.get(profileRef.getName()); - if (profile != null) { - addProfile(profile.profile); - } else { - messageTracker.addErrorMessage("Could not find profile '" + profileRef.getName() - + "' referenced by Family '" + getName() + "'!"); - } - } - } - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/ExpandedProfile.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/ExpandedProfile.java deleted file mode 100644 index bc4f6a6c..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/ExpandedProfile.java +++ /dev/null @@ -1,131 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.builder.CompareToBuilder; -import org.technologybrewery.fermenter.mda.util.MessageTracker; - -import com.google.common.collect.ImmutableList; - -/** - * Represents a fully expanded version of the metadata in {@link Profile}. For instance, it dereferences the targets and - * included profiles to provide a full set to actual targets referenced in a {@link Profile}. - */ -public class ExpandedProfile implements Comparable { - - private static MessageTracker messageTracker = MessageTracker.getInstance(); - - protected Profile profile; - - protected Map targets = new HashMap<>(); - - protected Map includes = new HashMap<>(); - - protected boolean isDereferenced; - - public ExpandedProfile(Profile profile) { - this.profile = profile; - } - - public String getName() { - return profile.getName(); - } - - public boolean isDeprecated() { return profile.isDeprecated(); } - - public String getWarningMessage() { return profile.getWarningMessage(); } - - public void addTarget(Target target) { - targets.put(target.getName(), target); - } - - public List getTargets() { - return ImmutableList.copyOf(targets.values()); - } - - public void addReferencedProfile(ExpandedProfile profile) { - includes.put(profile.getName(), profile); - } - - public List getReferencedProfiles() { - return ImmutableList.copyOf(includes.values()); - } - - /** - * Looks at the target references and profile references in this profile and expands them so they can be retrieved - * directly from this class. For instance, a target reference to "fooTarget" becomes an actual reference to the - * "fooTarget" target instance that will get returned by a call to getTargets(). - * - * @param profiles - * full set of expanded profiles from the generator - * @param targets - * full set of targets from the generator - */ - public void dereference(Map profiles, Map targets) { - if (!isDereferenced) { - isDereferenced = true; - - for (TargetReference targetRef : profile.getTargetReferences()) { - Target target = targets.get(targetRef.getName()); - if (target != null) { - addTarget(target); - } else { - messageTracker.addErrorMessage("Could not find target '" + targetRef.getName() - + "' referenced by profile '" + getName() + "'!"); - } - } - - dereferenceProfilesReferences(profiles, targets); - } - } - - private void transferTargetsFromProfile(String profileName, Map profiles, - Map targets) { - ExpandedProfile extendsProfile = (profiles != null) ? profiles.get(profileName) : null; - if (extendsProfile != null) { - // ensure that this profile has been dereferenced: - if (!extendsProfile.isDereferenced) { - extendsProfile.dereference(profiles, targets); - } - - Collection extendsTargets = extendsProfile.getTargets(); - for (Target t : extendsTargets) { - addTarget(t); - } - - } else { - messageTracker - .addErrorMessage("Profile '" + profileName + "' does not exist in profile '" + getName() + "'!"); - - } - } - - private void dereferenceProfilesReferences(Map profiles, Map targets) { - for (ProfileReference nameOnlyProfile : profile.profileReferences) { - String profileName = nameOnlyProfile.getName(); - if (StringUtils.isNotBlank(profileName)) { - if (profileName.equals(getName())) { - messageTracker.addWarningMessage("Profile '" + getName() + "' cannot include itself!"); - - } else { - transferTargetsFromProfile(profileName, profiles, targets); - - } - } - } - } - - /** - * {@inheritDoc} - */ - @Override - public int compareTo(ExpandedProfile other) { - CompareToBuilder compareToBuilder = new CompareToBuilder().append(this.getName(), other.getName()); - return compareToBuilder.toComparison(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/Family.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/Family.java deleted file mode 100644 index 41e7f938..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/Family.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import java.util.ArrayList; -import java.util.Collection; - -/** - * Holds generation family information to support MDA execution. A family - * represents a set of profiles that can be used to control generation directly - * or be included in other families. - */ -public class Family implements ValidatedElement { - - @JsonProperty(required = true) - protected String name; - - protected Collection profileReferences = new ArrayList<>(); - - @Override - public String getSchemaFileName() { - return "fermenter-2-profile-schema.json"; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Collection getProfileReferences() { - return profileReferences; - } - - public void setProfileReferences(Collection profileReferences) { - this.profileReferences = profileReferences; - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/FamilyReference.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/FamilyReference.java deleted file mode 100644 index eb900385..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/FamilyReference.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * A JSON reference to a {@link Family} by name. - */ -public class FamilyReference { - - @JsonProperty(required = true) - private String name; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/Profile.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/Profile.java deleted file mode 100644 index 570536bf..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/Profile.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import java.util.ArrayList; -import java.util.Collection; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Holds generation profile information to support MDA execution. A profile - * represents a set of targets that can be used to control generation directly - * or be included in other profiles. - */ -public class Profile implements ValidatedElement { - - @JsonProperty(required = true) - protected String name; - - @JsonProperty(required = false, defaultValue = "false") - protected boolean deprecated; - - @JsonProperty(required = false) - protected String warningMessage; - - protected Collection targetReferences = new ArrayList<>(); - - protected Collection profileReferences = new ArrayList<>(); - - protected Collection familyReferences = new ArrayList<>(); - - public String getName() { - return name; - } - - public boolean isDeprecated() { return deprecated; } - - public String getWarningMessage() { return warningMessage; } - public void setName(String name) { - this.name = name; - } - - public Collection getTargetReferences() { - return targetReferences; - } - - public void setTargetReferences(Collection targetReferences) { - this.targetReferences = targetReferences; - } - - public Collection getProfileReferences() { - return profileReferences; - } - - public void setProfileReferences(Collection includeReferences) { - this.profileReferences = includeReferences; - } - - public Collection getFamilyReferences() { - return familyReferences; - } - - public void setFamilyReferences(Collection familyReferences) { - this.familyReferences = familyReferences; - } - - /** - * {@inheritDoc} - */ - public String getSchemaFileName() { - return "fermenter-2-profile-schema.json"; - } - - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/ProfileReference.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/ProfileReference.java deleted file mode 100644 index fed57cdb..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/ProfileReference.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * A JSON reference to a {@link Profile} by name. - */ -public class ProfileReference { - - @JsonProperty(required = true) - private String name; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/Target.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/Target.java deleted file mode 100644 index cdb94903..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/Target.java +++ /dev/null @@ -1,96 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Holds generation target information to support MDA execution. A target - * represents the application of a generator to a specific template with - * additional information to control where the generated file will live, whether - * to overwrite an existing file, etc. - */ -public class Target implements ValidatedElement { - - @JsonProperty(required = true) - private String name; - - @JsonProperty(required = true) - private String templateName; - - @JsonProperty(required = true) - private String outputFile; - - @JsonProperty(required = true) - private String generator; - - @JsonProperty(required = false, defaultValue = "all") - private String metadataContext; - - @JsonProperty(required = false, defaultValue = "false") - private boolean overwritable; - - @JsonProperty(required = false, defaultValue = "main") - private String artifactType; - - public String getGenerator() { - return generator; - } - - public void setGenerator(String generator) { - this.generator = generator; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getOutputFile() { - return outputFile; - } - - public String getMetadataContext() { - return metadataContext; - } - - public void setMetadataContext(String metadataContext) { - this.metadataContext = metadataContext; - } - - public void setOutputFile(String outputFile) { - this.outputFile = outputFile; - } - - public boolean isOverwritable() { - return overwritable; - } - - public void setOverwritable(boolean overwritable) { - this.overwritable = overwritable; - } - - public String getTemplateName() { - return templateName; - } - - public void setTemplateName(String templateName) { - this.templateName = templateName; - } - - public String getArtifactType() { - return (artifactType != null) ? artifactType : "main"; - } - - public void setArtifactType(String artifactType) { - this.artifactType = artifactType; - } - - /** - * {@inheritDoc} - */ - public String getSchemaFileName() { - return "fermenter-2-target-schema.json"; - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/TargetReference.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/TargetReference.java deleted file mode 100644 index 4e985343..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/TargetReference.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * A JSON reference to a {@link Target} by name. - */ -public class TargetReference { - - @JsonProperty(required = true) - private String name; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/Type.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/Type.java deleted file mode 100644 index 762accb1..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/Type.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Holds type abstraction information to support MDA execution. A type represents the underlying implementation that - * will be used for a higher-level metamodel type. For instance, a metamodel 'decimal' type could be a java.lang.Float, - * java.lang.BigDecimal, etc. - */ -public class Type implements ValidatedElement { - - @JsonProperty(required = true) - private String name; - - @JsonProperty - private String fullyQualifiedImplementation; - - @JsonProperty - private String shortImplementation; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getFullyQualifiedImplementation() { - return fullyQualifiedImplementation; - } - - public void setFullyQualifiedImplementation(String fullyQualifiedImplementation) { - this.fullyQualifiedImplementation = fullyQualifiedImplementation; - } - - public String getShortImplementation() { - return shortImplementation; - } - - public void setShortImplementation(String shortImplementation) { - this.shortImplementation = shortImplementation; - } - - /** - * {@inheritDoc} - */ - public String getSchemaFileName() { - return "fermenter-2-type-schema.json"; - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/TypeDictionary.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/TypeDictionary.java deleted file mode 100644 index 1f4b95d9..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/TypeDictionary.java +++ /dev/null @@ -1,98 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import java.util.ArrayList; -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Holds type dictionary information to support MDA execution. A dictionary type - * specifies the name, the type and the description of the type available for - * Fields - */ -public class TypeDictionary implements ValidatedElement { - - @JsonProperty(required = true) - private String name; - - @JsonProperty(required = true) - private String type; - - @JsonProperty(required = false) - private String description; - - @JsonProperty(required = false) - private Integer minLength; - - @JsonProperty(required = false) - private Integer maxLength; - - @JsonProperty(required = false) - private List format = new ArrayList<>(); - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public Integer getMinLength() { - return minLength; - } - - public void setMinLength(Integer min) { - this.minLength = min; - } - - public Integer getMaxLength() { - return maxLength; - } - - public void setMaxLength(Integer max) { - this.maxLength = max; - } - - /** - * Gets all regex formats for the type - * - * @return - * a list of regex formats applicable for the type - */ - public List getFormat() { - return format; - } - - /** - * Multiple regex formats are allowed. A single, complete, and valid regex string per item in the list - * - * @param formats - */ - public void setFormat(List formats) { - this.format.addAll(formats); - } - - /** - * {@inheritDoc} - */ - public String getSchemaFileName() { - return "fermenter-2-type-dictionary-schema.json"; - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/ValidatedElement.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/ValidatedElement.java deleted file mode 100644 index 8aceba1a..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/element/ValidatedElement.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import java.io.IOException; -import java.net.URL; -import java.util.Enumeration; - -import org.technologybrewery.fermenter.mda.generator.GenerationException; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -/** - * Defines the contract and common functionality classes that represent json and can be validated by a json schema. - */ -public interface ValidatedElement { - - /** - * Returns a URL to the schema that can be used to validate json files for the implementing sub-class. - * - * @return URL to a json schema - */ - @JsonIgnore - public default URL getJsonSchemaUrl() { - Enumeration jsonSchema; - String schemaFileName = getSchemaFileName(); - try { - jsonSchema = Target.class.getClassLoader().getResources(schemaFileName); - - } catch (IOException e) { - throw new GenerationException("Could not find Fermenter json schema for '" + schemaFileName + "'!", e); - } - - return jsonSchema.nextElement(); - - } - - /** - * The name of the schema file used to validate a sub-class (e.g., foo-schema.json). - * - * @return schema name - */ - @JsonIgnore - public String getSchemaFileName(); - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/exception/FermenterException.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/exception/FermenterException.java deleted file mode 100644 index cf8f9130..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/exception/FermenterException.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.technologybrewery.fermenter.mda.exception; - -/** - * Specific exceptions relating to the generation process. - */ -public class FermenterException extends RuntimeException { - - private static final long serialVersionUID = 3211891635492782984L; - - /** - * {@inheritDoc} - */ - public FermenterException() { - super(); - } - - /** - * {@inheritDoc} - */ - public FermenterException(String message, Throwable cause) { - super(message, cause); - } - - /** - * {@inheritDoc} - */ - public FermenterException(String message) { - super(message); - } - - /** - * {@inheritDoc} - */ - public FermenterException(Throwable cause) { - super(cause); - } - - - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/AbstractGenerator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/AbstractGenerator.java deleted file mode 100644 index b130fee9..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/AbstractGenerator.java +++ /dev/null @@ -1,260 +0,0 @@ -package org.technologybrewery.fermenter.mda.generator; - -import java.io.File; -import java.io.FileWriter; -import java.io.Writer; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.text.WordUtils; -import org.apache.velocity.Template; -import org.apache.velocity.VelocityContext; - -import com.google.common.base.CaseFormat; -import org.technologybrewery.fermenter.mda.reporting.StatisticsService; - -/** - * Provides common generator functionality - specifically around writing files, substituting file name variables, and - * common VelocityContext setup. - */ -public abstract class AbstractGenerator implements Generator { - - protected static final String VERSION = "version"; - protected static final String ARTIFACT_ID = "artifactId"; - protected static final String GROUP_ID = "groupId"; - - protected static final String CAPITALIZED_CAMEL_CASED_ARTIFACT_ID = "capitalizedCamelCasedArtifactId"; - protected static final String CAMEL_CASED_ARTIFACT_ID = "camelCasedArtifactId"; - private static final String UPPER_UNDERSCORE_ARTIFACT_ID = "upperUnderscoreArtifactId"; - private static final String TEMPLATE_NAME = "templateName"; - - protected String metadataContext; - - protected final void generateFile(GenerationContext gc, VelocityContext vc) { - try { - Template template = gc.getEngine().getTemplate(gc.getTemplateName()); - long templateLastModified = template.getLastModified(); - File baseFile = getBaseFile(gc); - - String baseFileName = getOutputSubFolder() + gc.getOutputFile(); - String tempFileName = baseFileName + ".tmp"; - - File destinationFile = new File(baseFile, baseFileName); - File tempFile = new File(baseFile, tempFileName); - - StatisticsService statisticsService = gc.getStatisticsService(); - statisticsService.recordStats(template, destinationFile, vc); - - boolean isCleanWrite = false; - if (destinationFile.exists()) { - if (!gc.isOverwritable()) { - // never overwrite a CM-ed (by declaration) file - return; - } else if (destinationFile.lastModified() < templateLastModified) { - // if the template is newer that the destination file, just overwrite - isCleanWrite = true; - } - - } else { - isCleanWrite = true; - } - - File outputFile = (isCleanWrite || gc.isAppend()) ? destinationFile : tempFile; - - outputFile.getParentFile().mkdirs(); - - Writer fw = new FileWriter(outputFile, true); - template.merge(vc, fw); - fw.close(); - - if (!isCleanWrite) { - if (gc.isAppend()) { - return; - } - boolean isContentEqual = FileUtils.contentEquals(destinationFile, tempFile); - if (!isContentEqual) { - destinationFile.delete(); - tempFile.renameTo(destinationFile); - } else { - tempFile.deleteOnExit(); - } - } - - } catch (Exception ex) { - throw new GenerationException("Unable to generate file", ex); - } - } - - protected File getBaseFile(GenerationContext gc) { - File baseFile; - boolean isTest = "test".equalsIgnoreCase(gc.getArtifactType()); - if (gc.isOverwritable()) { - if (isTest) { - baseFile = gc.getGeneratedTestSourceDirectory(); - } else { - baseFile = gc.getGeneratedSourceDirectory(); - - } - } else { - if (isTest) { - baseFile = gc.getTestSourceDirectory(); - } else { - baseFile = gc.getMainSourceDirectory(); - } - } - return baseFile; - } - - /** - * Provides common velocity attributes from the project perspective. - * - * @param gc - * The generation context for this generator - * @return A defaulted {@link VelocityContext} instance - */ - protected VelocityContext getNewVelocityContext(GenerationContext gc) { - VelocityContext vc = new VelocityContext(); - // these are common attribute that are useful across context instances: - vc.put(GROUP_ID, gc.getGroupId()); - vc.put(ARTIFACT_ID, gc.getArtifactId()); - vc.put(VERSION, gc.getVersion()); - vc.put(TEMPLATE_NAME, gc.getTemplateName()); - - String camelCasedArtifactId = getCamelCasedArtifactId(gc); - vc.put(CAMEL_CASED_ARTIFACT_ID, camelCasedArtifactId); - vc.put(CAPITALIZED_CAMEL_CASED_ARTIFACT_ID, StringUtils.capitalize(camelCasedArtifactId)); - vc.put(UPPER_UNDERSCORE_ARTIFACT_ID, - CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, camelCasedArtifactId)); - return vc; - - } - - /** - * {@inheritDoc} - */ - @Override - public void setMetadataContext(String metadataContext) { - this.metadataContext = metadataContext; - } - - protected String deriveArtifactIdFromCamelCase(String camelCasedString) { - StringBuilder artifactId = new StringBuilder(); - String[] splitStrings = StringUtils.splitByCharacterTypeCamelCase(camelCasedString); - - boolean isFirst = true; - for (String segment : splitStrings) { - - if (isFirst) { - isFirst = false; - - } else { - artifactId.append('-'); - - } - - artifactId.append(StringUtils.uncapitalize(segment)); - - } - - return artifactId.toString(); - } - - private String getCamelCasedArtifactId(GenerationContext gc) { - String upperCaseSubsequentWords = WordUtils.capitalizeFully(gc.getArtifactId(), '-'); - String lowerCaseFirstLetter = WordUtils.uncapitalize(upperCaseSubsequentWords); - return lowerCaseFirstLetter.replace("-", ""); - } - - protected abstract String getOutputSubFolder(); - - protected final String replace(String targetVariableName, String original, String replacement) { - return StringUtils.replace(original, "${" + targetVariableName + "}", replacement); - } - - protected final String replaceBasePackage(String original, String basePackage) { - return StringUtils.replace(original, "${basePackage}", basePackage); - } - - /** - * Use replace(String targetVariableName, String original, String replacement) instead. - * - * @param original - * @param entityName - * @return - */ - @Deprecated - protected final String replaceEntityName(String original, String entityName) { - return StringUtils.replace(original, "${entityName}", entityName); - } - - /** - * Use replace(String targetVariableName, String original, String replacement) instead. - * - * @param original - * @param serviceName - * @return - */ - @Deprecated - protected final String replaceServiceName(String original, String serviceName) { - return StringUtils.replace(original, "${serviceName}", serviceName); - } - - /** - * Use replace(String targetVariableName, String original, String replacement) instead. - * - * @param original - * @param ruleName - * @return - */ - @Deprecated - protected final String replaceRuleName(String original, String ruleName) { - return StringUtils.replace(original, "${ruleName}", ruleName); - } - - /** - * Use replace(String targetVariableName, String original, String replacement) instead. - * - * @param original - * @param ruleGroupName - * @return - */ - @Deprecated - protected final String replaceRuleGroup(String original, String ruleGroupName) { - return StringUtils.replace(original, "${ruleGroupName}", ruleGroupName); - } - - /** - * Use replace(String targetVariableName, String original, String replacement) instead. - * - * @param original - * @param enumerationName - * @return - */ - @Deprecated - protected final String replaceEnumerationName(String original, String enumerationName) { - return StringUtils.replace(original, "${enumerationName}", enumerationName); - } - - /** - * Use replace(String targetVariableName, String original, String replacement) instead. - * - * @param original - * @param messageGroupName - * @return - */ - @Deprecated - protected final String replaceMessageGroupName(String original, String messageGroupName) { - return StringUtils.replace(original, "${messageGroupName}", messageGroupName); - } - - protected final String replaceArtifactId(String original, String artifactId) { - return StringUtils.replace(original, "${" + ARTIFACT_ID + "}", artifactId); - } - - protected final String replaceCapitalizedCamelCasedArtifactId(String original, - String capitalizedCamelCaseArtifactId) { - return StringUtils.replace(original, "${" + CAPITALIZED_CAMEL_CASED_ARTIFACT_ID + "}", - capitalizedCamelCaseArtifactId); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/AbstractModelAgnosticGenerator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/AbstractModelAgnosticGenerator.java deleted file mode 100644 index 62fecb28..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/AbstractModelAgnosticGenerator.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.technologybrewery.fermenter.mda.generator; - -import org.apache.velocity.VelocityContext; - -/** - * Generator that does not rely on the presence of any information contained within the meta-model. - */ -public abstract class AbstractModelAgnosticGenerator extends AbstractGenerator { - - @Override - public void generate(GenerationContext context) { - VelocityContext vc = getNewVelocityContext(context); - vc.put("basePackage", context.getBasePackage()); - - String fileName = context.getOutputFile(); - fileName = replaceBasePackage(fileName, context.getBasePackageAsPath()); - fileName = replaceArtifactId(fileName, context.getArtifactId()); - fileName = replaceCapitalizedCamelCasedArtifactId(fileName, - (String) vc.get(CAPITALIZED_CAMEL_CASED_ARTIFACT_ID)); - context.setOutputFile(fileName); - - generateFile(context, vc); - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/GenerationContext.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/GenerationContext.java deleted file mode 100644 index 08e7784c..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/GenerationContext.java +++ /dev/null @@ -1,206 +0,0 @@ -package org.technologybrewery.fermenter.mda.generator; - -import java.io.File; -import java.util.Collections; -import java.util.Map; - -import org.apache.velocity.app.VelocityEngine; -import org.technologybrewery.fermenter.mda.element.Target; -import org.technologybrewery.fermenter.mda.reporting.StatisticsService; - -public final class GenerationContext { - - private String templateName; - private String outputFile; - private boolean overwritable; - private String artifactType; - private boolean append; - private String basePackage; - private File projectDirectory; - private File mainSourceDirectory; - private File generatedSourceDirectory; - private File generatedTestSourceDirectory; - private File testSourceDirectory; - private VelocityEngine engine; - private String groupId; - private String artifactId; - private String version; - private String descriptiveName; - private String scmUrl; - private Map propertyVariables; - private StatisticsService statisticsService; - - public VelocityEngine getEngine() { - return engine; - } - - public void setEngine(VelocityEngine engine) { - this.engine = engine; - } - - public GenerationContext() { - super(); - } - - public GenerationContext(Target target) { - this(); - - this.templateName = target.getTemplateName(); - this.outputFile = target.getOutputFile(); - this.overwritable = target.isOverwritable(); - this.artifactType = target.getArtifactType(); - } - - public File getProjectDirectory() { - return projectDirectory; - } - - public void setProjectDirectory(File projectDirectory) { - this.projectDirectory = projectDirectory; - } - - public File getGeneratedSourceDirectory() { - return generatedSourceDirectory; - } - - public void setGeneratedSourceDirectory(File generatedSourceDirectory) { - this.generatedSourceDirectory = generatedSourceDirectory; - } - - public File getGeneratedTestSourceDirectory() { - return generatedTestSourceDirectory; - } - - public void setGeneratedTestSourceDirectory(File generatedTestSourceDirectory) { - this.generatedTestSourceDirectory = generatedTestSourceDirectory; - } - - public File getMainSourceDirectory() { - return mainSourceDirectory; - } - - public void setMainSourceDirectory(File mainSourceDirectory) { - this.mainSourceDirectory = mainSourceDirectory; - } - - public File getTestSourceDirectory() { - return testSourceDirectory; - } - - public void setTestSourceDirectory(File testSourceDirectory) { - this.testSourceDirectory = testSourceDirectory; - } - - public String getOutputFile() { - return outputFile; - } - - public void setOutputFile(String outputFile) { - this.outputFile = outputFile; - } - - public String getArtifactType() { - return artifactType; - } - - public void setArtifactType(String artifactType) { - this.artifactType = artifactType; - } - - public boolean isOverwritable() { - return overwritable; - } - - public void setOverwritable(boolean overwritable) { - this.overwritable = overwritable; - } - - public String getTemplateName() { - return templateName; - } - - public void setTemplateName(String templateName) { - this.templateName = templateName; - } - - public String getBasePackage() { - return basePackage; - } - - public String getBasePackageAsPath() { - return getBasePackage().replace('.', '/'); - } - - public void setBasePackage(String basePackage) { - this.basePackage = basePackage; - } - - public String getArtifactId() { - return artifactId; - } - - public void setArtifactId(String artifactId) { - this.artifactId = artifactId; - } - - public String getGroupId() { - return groupId; - } - - public void setGroupId(String groupId) { - this.groupId = groupId; - } - - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } - - public boolean isAppend() { - return append; - } - - public void setAppend(boolean append) { - this.append = append; - } - - public String getDescriptiveName() { - return descriptiveName; - } - - public void setDescriptiveName(String descriptiveName) { - this.descriptiveName = descriptiveName; - } - - public String getScmUrl() { - return scmUrl; - } - - public void setScmUrl(String scmUrl) { - this.scmUrl = scmUrl; - } - - /** - * Returns the property variables or an empty map for null-safe use. - * - * @return property variables. - */ - public Map getPropertyVariables() { - return propertyVariables != null ? propertyVariables : Collections.emptyMap(); - } - - public void setPropertyVariables(Map propertyVariables) { - this.propertyVariables = propertyVariables; - } - - public StatisticsService getStatisticsService() { - return statisticsService; - } - - public void setStatisticsService(StatisticsService statisticsService) { - this.statisticsService = statisticsService; - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/GenerationException.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/GenerationException.java deleted file mode 100644 index 183c6e21..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/GenerationException.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.technologybrewery.fermenter.mda.generator; - -public class GenerationException extends RuntimeException { - - private static final long serialVersionUID = -3898544317651420802L; - - public GenerationException() { - super(); - } - - public GenerationException(String arg0, Throwable arg1) { - super(arg0, arg1); - } - - public GenerationException(String arg0) { - super(arg0); - } - - public GenerationException(Throwable arg0) { - super(arg0); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/Generator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/Generator.java deleted file mode 100644 index cad9fd02..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/Generator.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.technologybrewery.fermenter.mda.generator; - -/** - * Defines contract for generating files. - */ -public interface Generator { - - /** - * Called to generate a file. - * - * @param context - * contextual information about the overall fermenter-mda environment - */ - void generate(GenerationContext context); - - /** - * Allows information about metadata to be passed into a generator. - * - * @param metadataContext - * the desired information (e.g., all, artifactId) - */ - void setMetadataContext(String metadataContext); - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/entity/AbstractAllEntitiesAwareGenerator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/entity/AbstractAllEntitiesAwareGenerator.java deleted file mode 100644 index b9fcc879..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/entity/AbstractAllEntitiesAwareGenerator.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.technologybrewery.fermenter.mda.generator.entity; - -import java.util.Collection; -import java.util.Map; - -import org.apache.velocity.VelocityContext; -import org.technologybrewery.fermenter.mda.generator.AbstractGenerator; -import org.technologybrewery.fermenter.mda.generator.GenerationContext; -import org.technologybrewery.fermenter.mda.metamodel.DefaultModelInstanceRepository; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceRepositoryManager; -import org.technologybrewery.fermenter.mda.metamodel.element.Entity; - -/** - * Abstract generator that provides all entities at once. This is often useful for creating factories where you need to - * register all entities with some class or resource. - */ -public abstract class AbstractAllEntitiesAwareGenerator extends AbstractGenerator { - - /** - * Generates with all entities in the "entities" variable of the Velocity context. - * - * {@inheritDoc} - */ - public void generate(GenerationContext context) { - VelocityContext vc = new VelocityContext(); - vc.put("prefix", context.getBasePackage()); - vc.put("basePackage", context.getBasePackage()); - - DefaultModelInstanceRepository metamodelRepository = ModelInstanceRepositoryManager - .getMetamodelRepository(DefaultModelInstanceRepository.class); - - Map entityMap = metamodelRepository.getEntitiesByContext(metadataContext); - Collection entities = entityMap.values(); - vc.put("entities", entities); - - String fileName = context.getOutputFile(); - fileName = replaceBasePackage(fileName, context.getBasePackageAsPath()); - context.setOutputFile(fileName); - - generateFile(context, vc); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/entity/AbstractAllOrderedEntitiesAwareGenerator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/entity/AbstractAllOrderedEntitiesAwareGenerator.java deleted file mode 100644 index c2f74217..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/entity/AbstractAllOrderedEntitiesAwareGenerator.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.technologybrewery.fermenter.mda.generator.entity; - -import java.util.Set; - -import org.apache.velocity.VelocityContext; -import org.technologybrewery.fermenter.mda.generator.AbstractGenerator; -import org.technologybrewery.fermenter.mda.generator.GenerationContext; -import org.technologybrewery.fermenter.mda.metamodel.DefaultModelInstanceRepository; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceRepositoryManager; -import org.technologybrewery.fermenter.mda.metamodel.element.Entity; - -/** - * Provides foundational functionality to generate across "all entities" with ordering based on dependencies within the - * entities (e.g., referenced objects first, leaf nodes last). Otherwise has the same characteristics as - * {@link AbstractAllEntitiesAwareGenerator}. - * - */ -public abstract class AbstractAllOrderedEntitiesAwareGenerator extends AbstractGenerator { - - /** - * Gets all entities for this the target's context in their dependency order. - * - * {@inheritDoc} - */ - public void generate(GenerationContext context) { - VelocityContext vc = new VelocityContext(); - vc.put("prefix", context.getBasePackage()); - vc.put("basePackage", context.getBasePackage()); - - DefaultModelInstanceRepository metamodelRepository = ModelInstanceRepositoryManager - .getMetamodelRepository(DefaultModelInstanceRepository.class); - - Set entities = metamodelRepository.getEntitiesByDependencyOrder(metadataContext); - vc.put("entities", entities); - - String fileName = context.getOutputFile(); - fileName = replaceBasePackage(fileName, context.getBasePackageAsPath()); - context.setOutputFile(fileName); - - generateFile(context, vc); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/entity/AbstractEntityGenerator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/entity/AbstractEntityGenerator.java deleted file mode 100644 index 49101f44..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/entity/AbstractEntityGenerator.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.technologybrewery.fermenter.mda.generator.entity; - -import java.util.Iterator; -import java.util.Map; - -import org.apache.velocity.VelocityContext; -import org.technologybrewery.fermenter.mda.generator.AbstractGenerator; -import org.technologybrewery.fermenter.mda.generator.GenerationContext; -import org.technologybrewery.fermenter.mda.generator.GenerationException; -import org.technologybrewery.fermenter.mda.metamodel.DefaultModelInstanceRepository; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceRepositoryManager; -import org.technologybrewery.fermenter.mda.metamodel.element.Entity; - -/** - * Iterates through each entity in the meta-model and enables the generation of - * a single file for each entity. - */ -public abstract class AbstractEntityGenerator extends AbstractGenerator { - - public void generate(GenerationContext context) throws GenerationException { - - DefaultModelInstanceRepository metamodelRepository = ModelInstanceRepositoryManager - .getMetamodelRepository(DefaultModelInstanceRepository.class); - - Map entityMap = metamodelRepository.getEntitiesByContext(metadataContext); - Iterator entities = entityMap.values().iterator(); - - String fileName; - String basefileName = context.getOutputFile(); - basefileName = replaceBasePackage(basefileName, context.getBasePackageAsPath()); - while (entities.hasNext()) { - Entity entity = (Entity) entities.next(); - - if (!generatePersistentEntitiesOnly() || (generatePersistentEntitiesOnly() && !entity.isTransient() - && !entity.isNonPersistentParentEntity() - )) { - VelocityContext vc = new VelocityContext(); - populateVelocityContext(vc, entity, context); - - fileName = replaceEntityName(basefileName, entity.getName()); - context.setOutputFile(fileName); - - generateFile(context, vc); - } - } - } - - /** - * An opportunity to populate the passed VelocityContext - * - * @param vc - * The VelocityContext to populate - * @param entity - * The Entity from information can be pulled - * @param generationContext - * The GenerationContext of this Generator - */ - protected abstract void populateVelocityContext(VelocityContext vc, Entity entity, - GenerationContext generationContext); - - /** - * If true, will trigger generation of persistent entities only. - * - * @return true to generate only peristent entities, false to generate - * persistent and transient entities - */ - protected abstract boolean generatePersistentEntitiesOnly(); - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/field/AbstractFieldGenerator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/field/AbstractFieldGenerator.java deleted file mode 100644 index 28c7c976..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/field/AbstractFieldGenerator.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.technologybrewery.fermenter.mda.generator.field; - -import java.util.List; -import java.util.Map; - -import org.apache.velocity.VelocityContext; -import org.technologybrewery.fermenter.mda.generator.AbstractGenerator; -import org.technologybrewery.fermenter.mda.generator.GenerationContext; -import org.technologybrewery.fermenter.mda.metamodel.DefaultModelInstanceRepository; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceRepositoryManager; -import org.technologybrewery.fermenter.mda.metamodel.element.BaseFieldDecorator; -import org.technologybrewery.fermenter.mda.metamodel.element.Entity; -import org.technologybrewery.fermenter.mda.metamodel.element.Field; - -public abstract class AbstractFieldGenerator extends AbstractGenerator { - - @Override - public void generate(GenerationContext context) { - DefaultModelInstanceRepository metamodelRepository = ModelInstanceRepositoryManager - .getMetamodelRepository(DefaultModelInstanceRepository.class); - String baseFileName = context.getOutputFile(); - baseFileName = replaceBasePackage(baseFileName, context.getBasePackageAsPath()); - - Map entityMap = metamodelRepository.getEntitiesByContext(metadataContext); - if (entityMap != null && !entityMap.isEmpty()) { - for (Entity entity : entityMap.values()) { - List entityFields = entity.getFields(); - for (Field field : entityFields) { - BaseFieldDecorator decoratedField = new BaseFieldDecorator(field); - if (decoratedField.hasLabel()) { - VelocityContext vc = getNewVelocityContext(context); - populateVelocityContext(vc, entity, field, context); - - String fileName = replace("entityName", baseFileName, entity.getName()); - fileName = replace("fieldName", fileName, field.getName()); - context.setOutputFile(fileName); - - generateFile(context, vc); - } - } - } - } - } - - /** - * An opportunity to populate the passed VelocityContext - * - * @param vc - * The VelocityContext to populate - * @param entity - * The Entity from information can be pulled - * @param generationContext - * The GenerationContext of this Generator - */ - protected abstract void populateVelocityContext(VelocityContext vc, Entity entity, - Field field, GenerationContext generationContext); - - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/message/AbstractMessageGroupGenerator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/message/AbstractMessageGroupGenerator.java deleted file mode 100644 index 1f73d8d7..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/message/AbstractMessageGroupGenerator.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.technologybrewery.fermenter.mda.generator.message; - -import java.util.Map; - -import org.apache.velocity.VelocityContext; -import org.technologybrewery.fermenter.mda.generator.AbstractGenerator; -import org.technologybrewery.fermenter.mda.generator.GenerationContext; -import org.technologybrewery.fermenter.mda.metamodel.DefaultModelInstanceRepository; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceRepositoryManager; -import org.technologybrewery.fermenter.mda.metamodel.element.MessageGroup; - -/** - * Iterates through each message group in the meta-model and enables the - * generation of a single file for each. - */ -public abstract class AbstractMessageGroupGenerator extends AbstractGenerator { - - /** - * {@inheritDoc} - */ - @Override - public void generate(GenerationContext context) { - DefaultModelInstanceRepository metadataRepository = ModelInstanceRepositoryManager - .getMetamodelRepository(DefaultModelInstanceRepository.class); - - Map messageGroups = metadataRepository.getMessageGroupsByContext(metadataContext); - - String fileName; - String baseFileName = context.getOutputFile(); - baseFileName = replaceBasePackage(baseFileName, context.getBasePackageAsPath()); - - for (MessageGroup messageGroup : messageGroups.values()) { - VelocityContext vc = new VelocityContext(); - populateVelocityContext(vc, messageGroup, context); - - fileName = replaceMessageGroupName(baseFileName, messageGroup.getName()); - context.setOutputFile(fileName); - - generateFile(context, vc); - } - } - - /** - * Enables subclasses to add any additional metadata to the provided - * {@link VelocityContext} to facilitate the generation of the provided - * {@link MessageGroup}. - * - * @param vc context - * @param messageGroup message group - * @param generationContext generation context - */ - protected abstract void populateVelocityContext(VelocityContext vc, MessageGroup messageGroup, - GenerationContext generationContext); - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/rule/AbstractRuleGenerator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/rule/AbstractRuleGenerator.java deleted file mode 100644 index 71717029..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/rule/AbstractRuleGenerator.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.technologybrewery.fermenter.mda.generator.rule; - -import java.util.Map; - -import org.apache.velocity.VelocityContext; -import org.technologybrewery.fermenter.mda.generator.AbstractGenerator; -import org.technologybrewery.fermenter.mda.generator.GenerationContext; -import org.technologybrewery.fermenter.mda.metamodel.DefaultModelInstanceRepository; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceRepositoryManager; -import org.technologybrewery.fermenter.mda.metamodel.element.Rule; - -/** - * Iterates through each rule in the meta-model and enables the generation of a single file for each rule. - */ -public abstract class AbstractRuleGenerator extends AbstractGenerator { - - /** - * {@inheritDoc} - */ - @Override - public void generate(GenerationContext context) { - DefaultModelInstanceRepository metadataRepository = ModelInstanceRepositoryManager - .getMetamodelRepository(DefaultModelInstanceRepository.class); - - Map rules = metadataRepository.getRulesByContext(metadataContext); - - String fileName; - String baseFileName = context.getOutputFile(); - baseFileName = replaceBasePackage(baseFileName, context.getBasePackageAsPath()); - - for (Rule rule : rules.values()) { - VelocityContext vc = new VelocityContext(); - populateVelocityContext(vc, rule, context); - - fileName = replaceRuleName(baseFileName, rule.getName()); - fileName = replaceRuleGroup(fileName, rule.getRuleGroup()); - - context.setOutputFile(fileName); - - generateFile(context, vc); - } - } - - /** - * Enables subclasses to add any additional metadata to the provided {@link VelocityContext} to facilitate the - * generation of the provided {@link Rule}. - * - * @param vc - * @param rule - * @param generationContext - */ - protected abstract void populateVelocityContext(VelocityContext vc, Rule rule, - GenerationContext generationContext); - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/service/AbstractServiceGenerator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/service/AbstractServiceGenerator.java deleted file mode 100644 index 3934b757..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/generator/service/AbstractServiceGenerator.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.technologybrewery.fermenter.mda.generator.service; - -import java.util.Map; - -import org.apache.velocity.VelocityContext; -import org.technologybrewery.fermenter.mda.generator.AbstractGenerator; -import org.technologybrewery.fermenter.mda.generator.GenerationContext; -import org.technologybrewery.fermenter.mda.metamodel.DefaultModelInstanceRepository; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceRepositoryManager; -import org.technologybrewery.fermenter.mda.metamodel.element.Service; - -/** - * Iterates through each service in the meta-model and enables the generation of a single file for each service. - */ -public abstract class AbstractServiceGenerator extends AbstractGenerator { - - /** - * {@inheritDoc} - */ - @Override - public void generate(GenerationContext context) { - DefaultModelInstanceRepository metadataRepository = ModelInstanceRepositoryManager - .getMetamodelRepository(DefaultModelInstanceRepository.class); - - Map services = metadataRepository.getServicesByContext(metadataContext); - - String fileName; - String baseFileName = context.getOutputFile(); - baseFileName = replaceBasePackage(baseFileName, context.getBasePackageAsPath()); - - for (Service service : services.values()) { - VelocityContext vc = new VelocityContext(); - populateVelocityContext(vc, service, context); - - fileName = replaceServiceName(baseFileName, service.getName()); - context.setOutputFile(fileName); - - generateFile(context, vc); - } - } - - /** - * Enables subclasses to add any additional metadata to the provided {@link VelocityContext} to facilitate the - * generation of the provided {@link Service}. - * - * @param vc - * @param service - * @param generationContext - */ - protected abstract void populateVelocityContext(VelocityContext vc, Service service, - GenerationContext generationContext); - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/AbstractMetamodelManager.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/AbstractMetamodelManager.java deleted file mode 100644 index ca9d3d8b..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/AbstractMetamodelManager.java +++ /dev/null @@ -1,364 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.JarURLConnection; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; - -import org.aeonbits.owner.KrauseningConfigFactory; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.StringUtils; -import org.technologybrewery.fermenter.mda.exception.FermenterException; -import org.technologybrewery.fermenter.mda.generator.GenerationException; -import org.technologybrewery.fermenter.mda.metamodel.element.Metamodel; -import org.technologybrewery.fermenter.mda.metamodel.element.MetamodelElement; -import org.technologybrewery.fermenter.mda.metamodel.element.NamespacedMetamodel; -import org.technologybrewery.fermenter.mda.util.JsonUtils; -import org.technologybrewery.fermenter.mda.util.MessageTracker; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.fasterxml.jackson.databind.ObjectMapper; - -/** - * The bulk of metamodel management in a single abstract class. This base - * functionality is intended to provide common loading and and accessibility of - * metadata related to a specific metamodel. - * - * @param An instance of {@link NamespacedMetamodel} - */ -public abstract class AbstractMetamodelManager { - - private static final Logger logger = LoggerFactory.getLogger(AbstractMetamodelManager.class); - - private static final String METAMODEL_SUFFIX = "json"; - private Map> metadataByPackageMap = new HashMap<>(); - private Map> metadataByArtifactIdMap = new HashMap<>(); - private Map completeMetadataMap = new HashMap<>(); - - private static MessageTracker messageTracker = MessageTracker.getInstance(); - - protected ModelRepositoryConfiguration repoConfiguration; - - protected MetamodelConfig config = KrauseningConfigFactory.create(MetamodelConfig.class); - - protected boolean hasDirectoryModels; - protected boolean hasJarModels; - protected String delayedLocalDirectoryWarning; - - /** - * Resets this instance to ensure a clean set of metadata is available. - */ - public void reset() { - metadataByPackageMap = new HashMap<>(); - metadataByArtifactIdMap = new HashMap<>(); - completeMetadataMap = new HashMap<>(); - } - - /** - * Validation occurs after the loading of all metadata to ensure that we can - * access all metadata in a safe fashion, without having to worry to about what - * is already loaded and what needs to be loaded. - */ - protected final void validate() { - for (String packageName : metadataByPackageMap.keySet()) { - Collection metadataItems = getMetadataMap(packageName).values(); - validateElements(metadataItems); - } - } - - /** - * Performs validation on a collection of <{@link MetamodelElement} instances. - * - * @param elements The instances to validate - */ - protected static void validateElements(Collection elements) { - if (!CollectionUtils.isEmpty(elements)) { - for (T element : elements) { - element.validate(); - } - } - } - - public void loadMetadata(ModelInstanceUrl modelInstanceUrl, ModelRepositoryConfiguration repoConfiguration) { - this.repoConfiguration = repoConfiguration; - if (StringUtils.isBlank(modelInstanceUrl.getUrl())) { - messageTracker.addErrorMessage("Model instance for artifactId '" + modelInstanceUrl.getArtifactId() - + "' can not be found! Please ensure the proper jar is on your classpath."); - - } else { - List resources = null; - - try { - resources = getMetadataResources(modelInstanceUrl.getUrl()); - - } catch (IOException | URISyntaxException e) { - logger.error("Problem encountered loading model instances for " + modelInstanceUrl.getArtifactId(), e); - messageTracker.addWarningMessage("No " + getMetadataLocation() + " metadata found for '" - + modelInstanceUrl.getArtifactId() + "', skipping..."); - - } - - if (resources == null || (!hasJarModels && !hasDirectoryModels)) { - if (delayedLocalDirectoryWarning != null) { - logger.warn(delayedLocalDirectoryWarning); - } - return; - } - - for (URL resource : resources) { - InputStream is = null; - try { - is = resource.openStream(); - loadMetamodelFile(is, modelInstanceUrl.getArtifactId(), resource); - - } catch (IOException | GenerationException e) { - logger.error("Problem encountered loading model instance " + resource.toExternalForm(), e); - messageTracker.addErrorMessage("Problem loading" + resource.toExternalForm() - + " model instance found in '" + modelInstanceUrl.getArtifactId() + "', skipping..."); - - } finally { - IOUtils.closeQuietly(is); - - } - } - - postLoadMetamodel(); - } - } - - protected List getMetadataResources(String name) throws IOException, URISyntaxException { - List metadataResources = null; - if (name.contains(".jar")) { - metadataResources = getMetadataResourceFromJar(name); - } else { - metadataResources = getMetadataResourcesFromDirectory(name); - } - return metadataResources; - } - - private List getMetadataResourceFromJar(String name) throws IOException { - List metadataResources = new ArrayList<>(); - name = "jar:" + name + "!/"; - URL jarUrl = new URL(name); - JarURLConnection jarConnection = (JarURLConnection) jarUrl.openConnection(); - JarFile file = jarConnection.getJarFile(); - Enumeration e = file.entries(); - while (e.hasMoreElements()) { - JarEntry newEntry = e.nextElement(); - String entryName = newEntry.getName(); - if (entryName.startsWith(this.getMetadataLocation()) && entryName.endsWith("." + METAMODEL_SUFFIX)) { - metadataResources.add(new URL(name + newEntry.getName())); - hasJarModels = true; - } - } - - return metadataResources; - } - - private List getMetadataResourcesFromDirectory(String name) throws URISyntaxException, IOException { - List metadataResources = new ArrayList<>(); - if(!name.endsWith("/")) { - name += "/"; - } - File metamodelDir = new File(new URI(name + this.getMetadataLocation())); - if (metamodelDir.isDirectory()) { - String[] suffixFilter = { METAMODEL_SUFFIX }; - Collection files = FileUtils.listFiles(metamodelDir, suffixFilter, true); - if (CollectionUtils.isNotEmpty(files)) { - for (File file : files) { - metadataResources.add(file.toURI().toURL()); - hasDirectoryModels = true; - } - } - - } else { - delayedLocalDirectoryWarning = metamodelDir.getCanonicalPath() + " is not a valid directory!"; - - } - - return metadataResources; - } - - /** - * Returns the location *within* the base metadata directory to search for - * metadata related to this specific metamodel. - * - * @return relative path (e.g., ./entities) - */ - protected abstract String getMetadataLocation(); - - private void loadMetamodelFile(InputStream stream, String artifactId, URL resource) { - ObjectMapper objectMapper = JsonUtils.getObjectMapper(); - try { - T instance = objectMapper.readValue(stream, getMetamodelClass()); - ((MetamodelElement) instance).setFileUrl(resource); - addMetadataElement(instance, artifactId); - - } catch (IOException e) { - throw new FermenterException("Problem reading metamodel!", e); - - } - - } - - /** - * The metamodel class into which metadata should be read. - * - * @return metamodel deserialization target - */ - protected abstract Class getMetamodelClass(); - - /** - * The metamodel name for use in logger output (e.g., Enumeration, Entity). - * - * @return metamodel string descriptor - */ - protected abstract String getMetamodelDescription(); - - protected void postLoadMetamodel() { - if (logger.isInfoEnabled()) { - logger.info("Loaded " + completeMetadataMap.size() + " " + getMetamodelDescription() + "(s)"); - } - } - - protected Map getMetadataMap(String packageName) { - return metadataByPackageMap.get(packageName); - } - - public Map getMetadataByArtifactIdMap(String artifactId) { - return metadataByArtifactIdMap.get(artifactId); - } - - protected Map getCompleteMetadataMap() { - return completeMetadataMap; - } - - protected void addMetadataElement(T element, String artifactId) { - String packageName = element.getPackage(); - String name = element.getName(); - Map packageMap = getMetadataMap(packageName); - if (packageMap == null) { - packageMap = new HashMap<>(); - metadataByPackageMap.put(packageName, packageMap); - } else if (packageMap.containsKey(name)) { - logger.warn("Metamodel " + name + " exists for package " + packageName + ". Replacing..."); - messageTracker.addWarningMessage("Metamodel " + name + " exists for package " + packageName + ". Replacing..."); - } - packageMap.put(name, element); - - Map artifactIdMap = getMetadataByArtifactIdMap(artifactId); - if (artifactIdMap == null) { - artifactIdMap = new HashMap<>(); - metadataByArtifactIdMap.put(artifactId, artifactIdMap); - } else if (artifactIdMap.containsKey(name)) { - logger.warn("Metamodel " + name + " exists for artifact Id " + artifactId + ". Replacing..."); - messageTracker.addWarningMessage("Metamodel " + name + " exists for artifact Id " + artifactId + ". Replacing..."); - } - artifactIdMap.put(name, element); - - if (getCompleteMetadataMap().containsKey(name)) { - logger.warn("Metamodel " + name + " exists. Replacing..."); - messageTracker.addWarningMessage("Metamodel " + name + " exists. Replacing..."); - } - completeMetadataMap.put(name, element); - - } - - /** - * Returns a metadata instance of this metamodel by package name and element - * name. - * - * @param packageName package - * @param name name of element - * @return instance of element or null if no instance exists - */ - public T getMetadataElementByPackageAndName(String packageName, String name) { - Map metadataMap = getMetadataMap(packageName); - return (metadataMap != null) ? metadataMap.get(name) : null; - } - - /** - * Returns a metadata instance of this metamodel by artifact id and element - * name. - * - * @param artifactId artifact id - * @param name name of element - * @return instance of element or null if no instance exists - */ - public T getMetadataElementByArtifactIdAndName(String artifactId, String name) { - Map metadataMap = getMetadataByArtifactIdMap(artifactId); - return (metadataMap != null) ? metadataMap.get(name) : null; - } - - /** - * Returns all metadata instances of this metamodel by package name. - * - * @param packageName package - * @return instance of element or an empty map is no instances exist - */ - public Map getMetadataElementByPackage(String packageName) { - Map byPackageMap = getMetadataMap(packageName); - return (byPackageMap != null) ? byPackageMap : Collections.emptyMap(); - } - - /** - * Returns all metadata instances of this metamodel (regardless of package - * name). - * - * @return instance of element or an empty map is no instances exist - */ - public Map getMetadataElementWithoutPackage() { - return completeMetadataMap; - } - - /** - * Retrieves services based on a generation context. - * - * @param context type of generation target context being used - * @return map of services - */ - public Map getMetadataElementByContext(String context) { - Map metamodelInstanceMap; - if (ModelContext.useLocalModelInstancesOnly(context)) { - metamodelInstanceMap = getMetadataByArtifactIdMap(repoConfiguration.getArtifactId()); - - } else if (ModelContext.useTargetedModelInstances(context)) { - metamodelInstanceMap = new HashMap<>(); - List targetedArtifactIds = repoConfiguration.getTargetModelInstances(); - for (String artifactId : targetedArtifactIds) { - Map targetedModelMap = getMetadataByArtifactIdMap(artifactId); - if (targetedModelMap == null || targetedModelMap.size() == 0) { - logger.debug("No instances were found for targeted artifactId '" + artifactId + "'"); - } else { - metamodelInstanceMap.putAll(targetedModelMap); - } - } - - } else { - throw new GenerationException("Invalid context being requested '" + context + "'!"); - - } - - if (metamodelInstanceMap == null) { - metamodelInstanceMap = Collections.emptyMap(); - } - - return metamodelInstanceMap; - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/AbstractModelInstanceRepository.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/AbstractModelInstanceRepository.java deleted file mode 100644 index 67bc507b..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/AbstractModelInstanceRepository.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel; - -/** - * Provides common methods needed for exposing model instances. - */ -public abstract class AbstractModelInstanceRepository implements ModelInstanceRepository { - - protected ModelRepositoryConfiguration config; - - /** - * Instantiates this instance with any applicable properties. - * - * @param properties - * any applicable properties - */ - public AbstractModelInstanceRepository(ModelRepositoryConfiguration config) { - this.config = config; - - } - - /** - * Returns the base package under which this repository was instantiated. - * - * @return base package name - */ - public String getBasePackage() { - return config.getBasePackage(); - - } - - /** - * Returns the artifact id. - * - * @return artifact id - */ - public String getArtifactId() { - return config.getArtifactId(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/DefaultModelInstanceRepository.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/DefaultModelInstanceRepository.java deleted file mode 100644 index 8dfdc9f4..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/DefaultModelInstanceRepository.java +++ /dev/null @@ -1,472 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.technologybrewery.fermenter.mda.generator.GenerationException; -import org.technologybrewery.fermenter.mda.metamodel.element.DictionaryType; -import org.technologybrewery.fermenter.mda.metamodel.element.Entity; -import org.technologybrewery.fermenter.mda.metamodel.element.Enumeration; -import org.technologybrewery.fermenter.mda.metamodel.element.MessageGroup; -import org.technologybrewery.fermenter.mda.metamodel.element.Rule; -import org.technologybrewery.fermenter.mda.metamodel.element.Service; -import org.technologybrewery.fermenter.mda.util.MessageTracker; - -/** - * Default implementation to serve up model instances of a specific metamodel type. - */ -public class DefaultModelInstanceRepository extends AbstractModelInstanceRepository { - - private static final Log log = LogFactory.getLog(DefaultModelInstanceRepository.class); - - private EnumerationModelInstanceManager enumerationManager = EnumerationModelInstanceManager.getInstance(); - private EntityModelInstanceManager entityManager = EntityModelInstanceManager.getInstance(); - private ServiceModelInstanceManager serviceManager = ServiceModelInstanceManager.getInstance(); - private DictionaryModelInstanceManager dictionaryManager = DictionaryModelInstanceManager.getInstance(); - private MessageGroupModelInstanceManager messageGroupManager = MessageGroupModelInstanceManager.getInstance(); - private RuleModelInstanceManager ruleManager = RuleModelInstanceManager.getInstance(); - - /** - * Creates a new instance w/ the base package of the current project. This package name will become the default - * package where no other is specified. - * - * @param config - * configuration - */ - public DefaultModelInstanceRepository(ModelRepositoryConfiguration config) { - super(config); - - } - - /** - * {@inheritDoc} - */ - @Override - public void load() { - enumerationManager.reset(); - dictionaryManager.reset(); - serviceManager.reset(); - entityManager.reset(); - messageGroupManager.reset(); - ruleManager.reset(); - - Collection modelInstanceUrls = config.getMetamodelInstanceLocations().values(); - for (ModelInstanceUrl modelInstanceUrl : modelInstanceUrls) { - long start = System.currentTimeMillis(); - enumerationManager.loadMetadata(modelInstanceUrl, config); - dictionaryManager.loadMetadata(modelInstanceUrl, config); - serviceManager.loadMetadata(modelInstanceUrl, config); - entityManager.loadMetadata(modelInstanceUrl, config); - messageGroupManager.loadMetadata(modelInstanceUrl, config); - ruleManager.loadMetadata(modelInstanceUrl, config); - - if (log.isInfoEnabled()) { - long stop = System.currentTimeMillis(); - log.info("Metamodel instances for artifactId '" + modelInstanceUrl.getArtifactId() - + "' have been loaded - " + (stop - start) + "ms"); - } - } - } - - public Set getArtifactIds() { - Set artifactIds = new HashSet<>(); - Collection urls = config.getMetamodelInstanceLocations().values(); - for (ModelInstanceUrl url : urls) { - artifactIds.add(url.getArtifactId()); - } - return artifactIds; - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - for (Enumeration enumeration : enumerationManager.getMetadataElementWithoutPackage().values()) { - enumeration.validate(); - } - - for (DictionaryType dictionaryType : dictionaryManager.getMetadataElementWithoutPackage().values()) { - dictionaryType.validate(); - } - - for (Service service : serviceManager.getMetadataElementWithoutPackage().values()) { - service.validate(); - } - - for (Entity entity : entityManager.getMetadataElementWithoutPackage().values()) { - entity.validate(); - } - - for (MessageGroup messageGroup : messageGroupManager.getMetadataElementWithoutPackage().values()) { - messageGroup.validate(); - } - - for (Rule rule : ruleManager.getMetadataElementWithoutPackage().values()) { - rule.validate(); - } - - MessageTracker messageTracker = MessageTracker.getInstance(); - messageTracker.emitMessages(log); - - if (messageTracker.hasErrors()) { - throw new GenerationException( - "Encountered one or more error! Please check your Maven output for details."); - } - - } - - /** - * Gets an enumeration by name from the current package. - * - * @param name - * name of the enumeration to look up - * @return instance of the {@link Enumeration} or null if none is found with the request name - */ - public Enumeration getEnumeration(String name) { - return enumerationManager.getMetadataElementByPackageAndName(config.getBasePackage(), name); - - } - - /** - * Gets an enumeration by name from the current package. - * - * @param name - * name of the enumeration to look up - * @param packageName - * the package in which to look for the request element - * @return instance of the {@link Enumeration} or null if none is found with the request name - */ - public Enumeration getEnumeration(String packageName, String name) { - return enumerationManager.getMetadataElementByPackageAndName(packageName, name); - - } - - /** - * Gets all enumerations from the specified package. - * - * @param packageName - * the requested package - * @return all enumerations within the request package, keyed by name - */ - public Map getEnumerations(String packageName) { - return enumerationManager.getMetadataElementByPackage(packageName); - } - - /** - * Gets all enumerations from the specified artifact id. - * - * @param artifactId - * the requested artifact id - * @return all enumerations within the request artifact id, keyed by name - */ - public Map getEnumerationsByArtifactId(String artifactId) { - return enumerationManager.getMetadataByArtifactIdMap(artifactId); - } - - /** - * Retrieves enumerations based on a generation context. - * - * @param context - * type of generation target context being used - * @return map of enumerations - */ - public Map getEnumerationsByContext(String context) { - return enumerationManager.getMetadataElementByContext(context); - } - - /** - * Gets a dictionary type by name from the current package. - * - * @param name - * name of the dictionary type to look up. - * @return instance of the {@link DictionaryType} or null if none is found with the request name. - */ - public DictionaryType getDictionaryType(String name) { - return dictionaryManager.getMetadataElementByPackageAndName(config.getBasePackage(), name); - } - - /** - * Gets all dictionary types from the current package. - * - * @return all dictionary types within the current package, keyed by name. - */ - public Map getDictionaryTypes() { - return dictionaryManager.getMetadataElementWithoutPackage(); - } - - /** - * Gets all dictionary types from the specified artifact id. - * - * @param artifactId - * the requested artifact id. - * @return all dictionary types within the request artifact id, keyed by name. - */ - public Map getDictionaryTypesByArtifactId(String artifactId) { - return dictionaryManager.getMetadataByArtifactIdMap(artifactId); - } - - /** - * Retrieves dictionary types based on a generation context. - * - * @param context - * type of generation target context being used. - * @return map of dictionary types. - */ - public Map getDictionaryTypesByContext(String context) { - return dictionaryManager.getMetadataElementByContext(context); - } - - /** - * Gets an service by name from the current package. - * - * @param name - * name of the service to look up. - * @return instance of the {@link Service} or null if none is found with the request name. - */ - public Service getService(String name) { - return serviceManager.getMetadataElementByPackageAndName(config.getBasePackage(), name); - - } - - /** - * Gets an service by name from the current package. - * - * @param name - * name of the service to look up. - * @param packageName - * the package in which to look for the request element. - * @return instance of the {@link Service} or null if none is found with the request name. - */ - public Service getService(String packageName, String name) { - return serviceManager.getMetadataElementByPackageAndName(packageName, name); - - } - - /** - * Gets all services from the specified package. - * - * @param packageName - * the requested package - * @return all services within the request package, keyed by name - */ - public Map getServices(String packageName) { - return serviceManager.getMetadataElementByPackage(packageName); - } - - /** - * Gets all services from the specified artifact id. - * - * @param artifactId - * the requested artifact id - * @return all services within the request artifact id, keyed by name - */ - public Map getServicesByArtifactId(String artifactId) { - return serviceManager.getMetadataByArtifactIdMap(artifactId); - } - - /** - * Retrieves services based on a generation context. - * - * @param context - * type of generation target context being used - * @return map of services - */ - public Map getServicesByContext(String context) { - return serviceManager.getMetadataElementByContext(context); - } - - /** - * Gets an entity by name from the current package. - * - * @param name - * name of the entity to look up - * @return instance of the {@link Entity} or null if none is found with the request name - */ - public Entity getEntity(String name) { - return entityManager.getMetadataElementByPackageAndName(config.getBasePackage(), name); - - } - - /** - * Gets an entity by name from the current package. - * - * @param name - * name of the entity to look up - * @param packageName - * the package in which to look for the request element - * @return instance of the {@link Entity} or null if none is found with the request name - */ - public Entity getEntity(String packageName, String name) { - return entityManager.getMetadataElementByPackageAndName(packageName, name); - - } - - /** - * Gets all entities from the specified package. - * - * @param packageName - * the requested package - * @return all entities within the request package, keyed by name - */ - public Map getEntities(String packageName) { - return entityManager.getMetadataElementByPackage(packageName); - } - - /** - * Gets all entities from the specified artifact id. - * - * @param artifactId - * the requested artifact id - * @return all entities within the request artifact id, keyed by name - */ - public Map getEntitiesByArtifactId(String artifactId) { - return entityManager.getMetadataByArtifactIdMap(artifactId); - } - - /** - * Retrieves entities based on a generation context. - * - * @param context - * type of generation target context being used - * @return map of entities - */ - public Map getEntitiesByContext(String context) { - return entityManager.getMetadataElementByContext(context); - } - - /** - * Gets all entities ordered by their intrinsic dependencies. References are upstream, relations downstream, - * otherwise they are equal. - * - * @param context - * type of generation target context being used - * @return all entities within the request package - */ - public Set getEntitiesByDependencyOrder(String context) { - return entityManager.getNamesByDependencyOrder(context); - } - - /** - * Gets an message group by name from the current package. - * - * @param name - * name of the message group to look up - * @return instance of the {@link MessageGroup} or null if none is found with the request name - */ - public MessageGroup getMessageGroup(String name) { - return messageGroupManager.getMetadataElementByPackageAndName(config.getBasePackage(), name); - - } - - /** - * Gets an message group by name from the passed package. - * - * @param name - * name of the message group to look up - * @param packageName - * the package in which to look for the request element - * @return instance of the {@link MessageGroup} or null if none is found with the request name - */ - public MessageGroup getMessageGroup(String packageName, String name) { - return messageGroupManager.getMetadataElementByPackageAndName(packageName, name); - - } - - /** - * Gets all message groups from the specified package. - * - * @param packageName - * the requested package - * @return all message groups within the request package, keyed by name - */ - public Map getMessageGroups(String packageName) { - return messageGroupManager.getMetadataElementByPackage(packageName); - } - - /** - * Gets all message groups from the specified artifact id. - * - * @param artifactId - * the requested artifact id - * @return all message groups within the request artifact id, keyed by name - */ - public Map getMessageGroupsByArtifactId(String artifactId) { - return messageGroupManager.getMetadataByArtifactIdMap(artifactId); - } - - /** - * Retrieves message groups based on a generation context. - * - * @param context - * type of generation target context being used - * @return map of message groups - */ - public Map getMessageGroupsByContext(String context) { - return messageGroupManager.getMetadataElementByContext(context); - } - - /** - * Gets a rule by name from the current package. - * - * @param name - * name of the rule to look up. - * @return instance of the {@link Rule} or null if none is found with the request name. - */ - public Rule getRule(String name) { - return ruleManager.getMetadataElementByPackageAndName(config.getBasePackage(), name); - - } - - /** - * Gets an rule by name from the current package. - * - * @param name - * name of the rule to look up. - * @param packageName - * the package in which to look for the request element. - * @return instance of the {@link Rule} or null if none is found with the request name. - */ - public Rule getRule(String packageName, String name) { - return ruleManager.getMetadataElementByPackageAndName(packageName, name); - - } - - /** - * Gets all rules from the specified package. - * - * @param packageName - * the requested package - * @return all rules within the request package, keyed by name - */ - public Map getRules(String packageName) { - return ruleManager.getMetadataElementByPackage(packageName); - } - - /** - * Gets all rules from the specified artifact id. - * - * @param artifactId - * the requested artifact id - * @return all rules within the request artifact id, keyed by name - */ - public Map getRulesByArtifactId(String artifactId) { - return ruleManager.getMetadataByArtifactIdMap(artifactId); - } - - /** - * Retrieves rules based on a generation context. - * - * @param context - * type of generation target context being used - * @return map of rules - */ - public Map getRulesByContext(String context) { - return ruleManager.getMetadataElementByContext(context); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/DictionaryModelInstanceManager.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/DictionaryModelInstanceManager.java deleted file mode 100644 index dda0b9d1..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/DictionaryModelInstanceManager.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel; - -import org.technologybrewery.fermenter.mda.metamodel.element.DictionaryType; -import org.technologybrewery.fermenter.mda.metamodel.element.DictionaryTypeElement; - -/** - * Responsible for maintaining the list of dictionary type model instances elements in the system. - */ -class DictionaryModelInstanceManager extends AbstractMetamodelManager { - - private static ThreadLocal threadBoundInstance = ThreadLocal - .withInitial(DictionaryModelInstanceManager::new); - - /** - * Returns the singleton instance of this class. - * - * @return singleton - */ - public static DictionaryModelInstanceManager getInstance() { - return threadBoundInstance.get(); - } - - /** - * {@inheritDoc} - */ - @Override - public void reset() { - super.reset(); - threadBoundInstance.remove(); - } - - /** - * Prevent instantiation of this singleton from outside this class. - */ - private DictionaryModelInstanceManager() { - super(); - } - - @Override - protected String getMetadataLocation() { - return config.getDictionaryTypesRelativePath(); - } - - @Override - protected Class getMetamodelClass() { - return DictionaryTypeElement.class; - } - - @Override - protected String getMetamodelDescription() { - return DictionaryType.class.getSimpleName(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/EntityComparator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/EntityComparator.java deleted file mode 100644 index 38e1c622..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/EntityComparator.java +++ /dev/null @@ -1,126 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.Map; - -import org.apache.commons.collections4.CollectionUtils; -import org.technologybrewery.fermenter.mda.metamodel.element.Entity; -import org.technologybrewery.fermenter.mda.metamodel.element.Reference; -import org.technologybrewery.fermenter.mda.metamodel.element.Relation; - -/** - * Comparator that orders entities based on their dependencies. Referenced objects will be first, leaf nodes will be - * last. Ties are sorted alphabetically. - */ -public class EntityComparator implements Comparator { - - private Map> referencedObjects; - - /** - * New instance that takes an inverted list of objects and *which* entities reference them. - * - * @param referencedObjects - * inverted reference list - */ - public EntityComparator(Map> referencedObjects) { - this.referencedObjects = referencedObjects; - } - - /** - * {@inheritDoc} - */ - @Override - public int compare(Entity o1, Entity o2) { - int compareValue = 0; - - if (o1 != o2) { - if (referencedObjects.containsKey(o1.getName()) && !referencedObjects.containsKey(o2.getName())) { - // if o1 has references to it, but o2 does not, then o1 is less than: - compareValue = -1; - - } else if (referencedObjects.containsKey(o2.getName()) && !referencedObjects.containsKey(o1.getName())) { - // if o2 has references to it, but o1 does not, then o1 is less than: - compareValue = 1; - - } else { - // otherwise, do a deeper comparison: - compareValue = compareAgainstReference(o1, o2, compareValue); - - compareValue = compareAgainstRelations(o1, o2, compareValue); - - compareValue = orderAlphabetically(o1, o2, compareValue); - - } - - } - - return compareValue; - } - - protected int orderAlphabetically(Entity o1, Entity o2, int compareValue) { - if (compareValue == 0) { - compareValue = o1.getName().compareTo(o2.getName()); - } - return compareValue; - } - - protected int compareAgainstRelations(Entity o1, Entity o2, int compareValue) { - compareValue = compareRelationsAssumingO1IsParent(o1, o2, compareValue); - compareValue = compareRelationsAssumingO1IsChild(o1, o2, compareValue); - - return compareValue; - } - - protected int compareRelationsAssumingO1IsChild(Entity o1, Entity o2, int compareValue) { - if (compareValue == 0) { - List o2Relations = o2.getRelations(); - if (CollectionUtils.isNotEmpty(o2Relations)) { - for (Relation relation : o2Relations) { - if (relation.getPackage().equals(o1.getPackage()) && relation.getType().equals(o1.getName())) { - compareValue = 1; - break; - } - } - } - } - return compareValue; - } - - protected int compareRelationsAssumingO1IsParent(Entity o1, Entity o2, int compareValue) { - List o1Relations = o1.getRelations(); - if (CollectionUtils.isNotEmpty(o1Relations)) { - for (Relation relation : o1Relations) { - if (relation.getPackage().equals(o2.getPackage()) && relation.getType().equals(o2.getName())) { - compareValue = -1; - break; - } - } - } - return compareValue; - } - - protected int compareAgainstReference(Entity o1, Entity o2, int compareValue) { - List referencesToEntity = referencedObjects.getOrDefault(o1.getName(), Collections.emptyList()); - if (referencesToEntity.contains(o2.getName())) { - compareValue = -1; - - } else { - List o1References = o1.getReferences(); - if (CollectionUtils.isNotEmpty(o1References)) { - for (Reference reference : o1References) { - if (reference.getPackage().equals(o2.getPackage()) && reference.getType().equals(o2.getName())) { - compareValue = 1; - break; - - } - } - } - - } - - return compareValue; - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/EntityModelInstanceManager.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/EntityModelInstanceManager.java deleted file mode 100644 index 36c5e8db..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/EntityModelInstanceManager.java +++ /dev/null @@ -1,154 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; - -import org.technologybrewery.fermenter.mda.generator.GenerationException; -import org.technologybrewery.fermenter.mda.metamodel.element.Entity; -import org.technologybrewery.fermenter.mda.metamodel.element.EntityElement; -import org.technologybrewery.fermenter.mda.metamodel.element.Reference; -import org.technologybrewery.fermenter.mda.metamodel.element.Relation; -import org.technologybrewery.fermenter.mda.metamodel.element.RelationElement; - -/** - * Responsible for maintaining the list of entity model instances elements in the system. - */ -class EntityModelInstanceManager extends AbstractMetamodelManager { - - private static ThreadLocal threadBoundInstance = ThreadLocal - .withInitial(EntityModelInstanceManager::new); - - /** - * Returns the singleton instance of this class. - * - * @return singleton - */ - public static EntityModelInstanceManager getInstance() { - return threadBoundInstance.get(); - } - - /** - * {@inheritDoc} - */ - @Override - public void reset() { - super.reset(); - threadBoundInstance.remove(); - } - - /** - * Prevent instantiation of this singleton from outside this class. - */ - private EntityModelInstanceManager() { - super(); - } - - @Override - protected String getMetadataLocation() { - return config.getEntitiesRelativePath(); - } - - @Override - protected Class getMetamodelClass() { - return EntityElement.class; - } - - @Override - protected String getMetamodelDescription() { - return Entity.class.getSimpleName(); - } - - /** - * Returns the set of dependencies in a manner that is ordered by references and relations such that referential - * integrity will be respected. - * - * @param context - * type of generation target context being used - * @return ordered entities - */ - public Set getNamesByDependencyOrder(String context) { - Map> referencedObjects = new HashMap<>(); - - Map rawEntities = this.getMetadataElementByContext(context); - - for (Entity rawEntity : rawEntities.values()) { - List references = rawEntity.getReferences(); - for (Reference reference : references) { - String type = reference.getType(); - List inboundReferences = referencedObjects.computeIfAbsent(type, f -> new ArrayList<>()); - inboundReferences.add(rawEntity.getName()); - } - } - - Set dependencyOrderedEntities = new TreeSet<>(new EntityComparator(referencedObjects)); - - for (Entity rawEntity : rawEntities.values()) { - dependencyOrderedEntities.add(rawEntity); - } - - return dependencyOrderedEntities; - } - - /** - * Iterate over loaded domains and register each relation on its parent. This enables bi-directional referencing of - * relations. It is also important to note that while referring to a parent from a child is very similar to a - * reference, it is typically not similar enough to assume that it will be implemented in this fashion. Separating - * them into their own collection ensures that they can be dealt with as appropriate for the target implementation. - */ - - protected void postLoadMetamodel() { - - super.postLoadMetamodel(); - - EntityElement entity; - EntityElement childEntity; - RelationElement relation; - String relationType; - List relationMap; - Iterator entityMapIterator; - Iterator relationValueInterator; - - // Get the complete metadata map - if I get only get current application, client transfer objects does not get - // generated with parent references - Map entityMap = getTargetMetadataMap(); - entityMapIterator = (entityMap != null) ? entityMap.values().iterator() : Collections.emptyIterator(); - while (entityMapIterator.hasNext()) { - entity = (EntityElement) entityMapIterator.next(); - relationMap = entity.getRelations(); - - relationValueInterator = (relationMap != null) ? relationMap.iterator() : Collections.emptyIterator(); - while (relationValueInterator.hasNext()) { - relation = (RelationElement) relationValueInterator.next(); - relationType = relation.getType(); - // TODO: check 1-M and 1-1 only: - childEntity = (EntityElement) entityMap.get(relationType); - if (childEntity != null) { - childEntity.addInverseRelation(entity); - } else { - throw new GenerationException("Could not find a relation to entity: " + relationType); - } - } - - } - } - - private Map getTargetMetadataMap() { - Map entityMap = new HashMap<>(); - - List targetedArtifactIds = repoConfiguration.getTargetModelInstances(); - for (String artifactId : targetedArtifactIds) { - Map targetedModelMap = getMetadataByArtifactIdMap(artifactId); - if (targetedModelMap != null) { - entityMap.putAll(targetedModelMap); - } - } - return entityMap; - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/EnumerationModelInstanceManager.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/EnumerationModelInstanceManager.java deleted file mode 100644 index 6275b41f..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/EnumerationModelInstanceManager.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel; - -import org.technologybrewery.fermenter.mda.metamodel.element.Enumeration; -import org.technologybrewery.fermenter.mda.metamodel.element.EnumerationElement; - -/** - * Responsible for maintaining the list of enumeration model instances elements in the system. - */ -class EnumerationModelInstanceManager extends AbstractMetamodelManager { - - private static ThreadLocal threadBoundInstance = ThreadLocal - .withInitial(EnumerationModelInstanceManager::new); - - /** - * Returns the singleton instance of this class. - * - * @return singleton - */ - public static EnumerationModelInstanceManager getInstance() { - return threadBoundInstance.get(); - } - - /** - * {@inheritDoc} - */ - @Override - public void reset() { - super.reset(); - threadBoundInstance.remove(); - } - - /** - * Prevent instantiation of this singleton from outside this class. - */ - private EnumerationModelInstanceManager() { - super(); - } - - @Override - protected String getMetadataLocation() { - return config.getEnumerationsRelativePath(); - } - - @Override - protected Class getMetamodelClass() { - return EnumerationElement.class; - } - - @Override - protected String getMetamodelDescription() { - return Enumeration.class.getSimpleName(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/MessageGroupModelInstanceManager.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/MessageGroupModelInstanceManager.java deleted file mode 100644 index 888e3ecc..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/MessageGroupModelInstanceManager.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel; - -import org.technologybrewery.fermenter.mda.metamodel.element.MessageGroup; -import org.technologybrewery.fermenter.mda.metamodel.element.MessageGroupElement; - -/** - * Responsible for maintaining the list of message group model instances elements in the system. - */ -class MessageGroupModelInstanceManager extends AbstractMetamodelManager { - - private static ThreadLocal threadBoundInstance = ThreadLocal - .withInitial(MessageGroupModelInstanceManager::new); - - /** - * Returns the singleton instance of this class. - * - * @return singleton - */ - public static MessageGroupModelInstanceManager getInstance() { - return threadBoundInstance.get(); - } - - /** - * {@inheritDoc} - */ - @Override - public void reset() { - super.reset(); - threadBoundInstance.remove(); - } - - /** - * Prevent instantiation of this singleton from outside this class. - */ - private MessageGroupModelInstanceManager() { - super(); - } - - @Override - protected String getMetadataLocation() { - return config.getMessageGroupsRelativePath(); - } - - @Override - protected Class getMetamodelClass() { - return MessageGroupElement.class; - } - - @Override - protected String getMetamodelDescription() { - return MessageGroup.class.getSimpleName(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/MetadataUrlResolver.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/MetadataUrlResolver.java deleted file mode 100644 index 91c67373..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/MetadataUrlResolver.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel; - -import java.util.List; - -/** - * Defines the contract for a resolver that can provide access to metadata. - * - * NOTE: This is a legacy concept that will likely be removed completely once we convert everything - */ -public interface MetadataUrlResolver { - - static final String METADATA_LOCATION_PREFIX = "metadata."; - static final String METADATA_LOCATIONS = METADATA_LOCATION_PREFIX + "locations"; - - List getMetadataURLs(ModelRepositoryConfiguration config); - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/MetamodelConfig.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/MetamodelConfig.java deleted file mode 100644 index a2524095..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/MetamodelConfig.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel; - -import org.aeonbits.owner.KrauseningConfig; -import org.aeonbits.owner.KrauseningConfig.KrauseningSources; - -/** - * Configuration values for the metamodel processing. - */ -@KrauseningSources("metamodel.properties") -public interface MetamodelConfig extends KrauseningConfig { - - /** - * Returns the locations within src/main/resources where enumeration model instances can be found. - * - * @return path location to enumerations - */ - @Key("enumerations.relative.path") - @DefaultValue("enumerations") - public String getEnumerationsRelativePath(); - - /** - * Returns the locations within src/main/resources where service model instances can be found. - * - * @return path location to services - */ - @Key("services.relative.path") - @DefaultValue("services") - public String getServicesRelativePath(); - - /** - * Returns the locations within src/main/resources where entity model instances can be found. - * - * @return path location to entities - */ - @Key("entities.relative.path") - @DefaultValue("entities") - public String getEntitiesRelativePath(); - - /** - * Returns the locations within src/main/resources where dictionary type model instances can be found. - * - * @return path location to dictionary types - */ - @Key("dictionary.types.relative.path") - @DefaultValue("dictionaryTypes") - public String getDictionaryTypesRelativePath(); - - /** - * Returns the locations within src/main/resources where message group model instances can be found. - * - * @return path location to message groups - */ - @Key("message.groups.relative.path") - @DefaultValue("message-groups") - public String getMessageGroupsRelativePath(); - - /** - * Returns the metadata resolver to use to lookup metadata. - * - * @return url resolver class - */ - @Key("metadata.url.resolver") - @DefaultValue("org.technologybrewery.fermenter.mda.metamodel.DefaultUrlResolver") - public String getUrlResolver(); - - /** - * Returns the locations within src/main/resources where rule model instances can be found. - * - * @return path location to rules - */ - @Key("rules.relative.path") - @DefaultValue("rules") - public String getRulesRelativePath(); -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ModelContext.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ModelContext.java deleted file mode 100644 index 931d5dfc..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ModelContext.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel; - -import org.apache.commons.lang3.StringUtils; -import org.technologybrewery.fermenter.mda.util.MessageTracker; - -/** - * Defines the different contexts that can be used by a target. - * - *
- * * ALL -      Indicates that all model instances registered in the plugin's metadataDependencies will be used.
- * * LOCAL -    Indicates that only model instances that lives in the current artifactId will be used. 
- * * TARGETED - Indicates that only model instances that are part of the registered artifactIds in the plugin's 
- *              targetModelInstances will be used.
- * 
- */ -public enum ModelContext { - ALL, LOCAL, TARGETED; - - /** - * Determines whether or not a context setting denotes should only use local model instances. - * @param modelInstanceContext context to check - * @return true if local only - */ - public static boolean useLocalModelInstancesOnly(String modelInstanceContext) { - boolean useLocalModelInstnacesOnly; - if (StringUtils.isBlank(modelInstanceContext) - || ALL.equalsIgnoreCase(modelInstanceContext) - || TARGETED.equalsIgnoreCase(modelInstanceContext)) { - useLocalModelInstnacesOnly = false; - - } else if (LOCAL.equalsIgnoreCase(modelInstanceContext)) { - useLocalModelInstnacesOnly = true; - - } else { - MessageTracker messageTracker = MessageTracker.getInstance(); - messageTracker.addErrorMessage("An invalid model instance context of '" + modelInstanceContext - + "' has been specified. Using 'all' instead - BUT YOU NEED TO FIX THIS ON THE TARGET"); - useLocalModelInstnacesOnly = false; - } - - return useLocalModelInstnacesOnly; - } - - - /** - * Determines whether or not a context setting denotes should only use targeted model instances. - * @param modelInstanceContext context to check - * @return true if targeted only - */ - public static boolean useTargetedModelInstances(String metadataContext) { - return (TARGETED.equalsIgnoreCase(metadataContext)); - } - - /** - * Checks string equality, ignoring case, with the name of the enum. - * @param value string to compare - * @return equality result - */ - public boolean equalsIgnoreCase(String value) { - return this.name().equalsIgnoreCase(value); - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ModelInstanceRepository.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ModelInstanceRepository.java deleted file mode 100644 index 6cbc7f7b..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ModelInstanceRepository.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel; - -/** - * Common interface between legacy and new model instance repositories to allow them to more easily interact. - */ -public interface ModelInstanceRepository { - - /** - * Loads all metadata and will be invoked immediately after instantiating this instance in the templated workflow. - */ - public abstract void load(); - - /** - * Validates all metadata and will be invoked immediately after loading in the templated workflow. - */ - public abstract void validate(); - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ModelInstanceRepositoryManager.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ModelInstanceRepositoryManager.java deleted file mode 100644 index 5d2addba..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ModelInstanceRepositoryManager.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel; - -import java.util.HashMap; -import java.util.Map; - -/** - * Container and lookup capability for different {@link ModelInstanceRepository} repositories. - */ -public final class ModelInstanceRepositoryManager { - - private static ThreadLocal> threadBoundInstance = ThreadLocal.withInitial(HashMap::new); - - private ModelInstanceRepositoryManager() { - // prevent private instantiation of all static class - } - - /** - * Adds a repository. Only one repository of each type will be kept. - * - * @param respository - * repository to add - */ - public static void setRepository(ModelInstanceRepository respository) { - Map instanceMap = threadBoundInstance.get(); - instanceMap.put(respository.getClass().toString(), respository); - } - - /** - * Returns the stored repository for a given class. - * - * @param type - * class to lookup - * @return instance of that class - */ - public static V getMetamodelRepository(Class type) { - Map instanceMap = threadBoundInstance.get(); - return type.cast(instanceMap.get(type.toString())); - } - - /** - * For testing only. - */ - static void clear() { - threadBoundInstance.remove(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ModelInstanceUrl.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ModelInstanceUrl.java deleted file mode 100644 index f1b5b265..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ModelInstanceUrl.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel; - -import com.google.common.base.MoreObjects; - -/** - * Stores information about a specific location of model instances. - */ -public class ModelInstanceUrl { - - private String artifactId; - private String url; - - /** - * New instance - * @param artifactId artifact id - * @param url url to artifact id - */ - public ModelInstanceUrl(String artifactId, String url) { - this.artifactId = artifactId; - this.url = url; - } - - /** - * Returns the artifactId for this resource (jar or local module). - * @return artifactId - */ - public String getArtifactId() { - return artifactId; - } - - /** - * Sets the artifactId for this resource (jar or local module). - * @param artifactId artifact id - */ - public void setArtifactId(String artifactId) { - this.artifactId = artifactId; - } - - /** - * Returns the location of the artifact (jar or path to directory). - * @return location - */ - public String getUrl() { - return url; - } - - /** - * Sets the location of the artifact (jar or path to directory). - * @param url location - */ - public void setUrl(String url) { - this.url = url; - } - - /** - * {@inheritDoc} - */ - @Override - public String toString() { - return MoreObjects.toStringHelper(this).add("artifactId", artifactId).add("url", url).toString(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ModelRepositoryConfiguration.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ModelRepositoryConfiguration.java deleted file mode 100644 index 04af0e01..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ModelRepositoryConfiguration.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Provides configuration information to the a {@link ModelInstanceRepository}. - */ -public class ModelRepositoryConfiguration { - - private String artifactId; - private String basePackage; - private List targetModelInstances = new ArrayList<>(); - private Map metamodelInstanceLocations = new HashMap<>(); - - /** - * The name (i.e., artifact id) of the current project. - * @return artifact id - */ - public String getArtifactId() { - return artifactId; - } - - public void setArtifactId(String artifactId) { - this.artifactId = artifactId; - } - - public String getBasePackage() { - return basePackage; - } - - public void setBasePackage(String basePackage) { - this.basePackage = basePackage; - } - - public List getTargetModelInstances() { - return targetModelInstances; - } - - public void setTargetModelInstances(List targetModelInstances) { - this.targetModelInstances = targetModelInstances; - } - - public Map getMetamodelInstanceLocations() { - return metamodelInstanceLocations; - } - - public void setMetamodelInstanceLocations(Map metamodelInstanceLocations) { - this.metamodelInstanceLocations = metamodelInstanceLocations; - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/RuleModelInstanceManager.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/RuleModelInstanceManager.java deleted file mode 100644 index 79e84da7..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/RuleModelInstanceManager.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel; - -import org.technologybrewery.fermenter.mda.metamodel.element.Rule; -import org.technologybrewery.fermenter.mda.metamodel.element.RuleElement; - -/** - * Responsible for maintaining the list of rule model instances elements in the system. - */ -class RuleModelInstanceManager extends AbstractMetamodelManager { - - private static ThreadLocal threadBoundInstance = ThreadLocal - .withInitial(RuleModelInstanceManager::new); - - /** - * Returns the singleton instance of this class. - * - * @return singleton - */ - public static RuleModelInstanceManager getInstance() { - return threadBoundInstance.get(); - } - - /** - * {@inheritDoc} - */ - @Override - public void reset() { - super.reset(); - threadBoundInstance.remove(); - } - - /** - * Prevent instantiation of this singleton from outside this class. - */ - private RuleModelInstanceManager() { - super(); - } - - @Override - protected String getMetadataLocation() { - return config.getRulesRelativePath(); - } - - @Override - protected Class getMetamodelClass() { - return RuleElement.class; - } - - @Override - protected String getMetamodelDescription() { - return Rule.class.getSimpleName(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ServiceModelInstanceManager.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ServiceModelInstanceManager.java deleted file mode 100644 index 6272ccd1..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/ServiceModelInstanceManager.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel; - -import org.technologybrewery.fermenter.mda.metamodel.element.Service; -import org.technologybrewery.fermenter.mda.metamodel.element.ServiceElement; - -/** - * Responsible for maintaining the list of service model instances elements in the system. - */ -class ServiceModelInstanceManager extends AbstractMetamodelManager { - - private static ThreadLocal threadBoundInstance = ThreadLocal - .withInitial(ServiceModelInstanceManager::new); - - /** - * Returns the singleton instance of this class. - * - * @return singleton - */ - public static ServiceModelInstanceManager getInstance() { - return threadBoundInstance.get(); - } - - /** - * {@inheritDoc} - */ - @Override - public void reset() { - super.reset(); - threadBoundInstance.remove(); - } - - /** - * Prevent instantiation of this singleton from outside this class. - */ - private ServiceModelInstanceManager() { - super(); - } - - @Override - protected String getMetadataLocation() { - return config.getServicesRelativePath(); - } - - @Override - protected Class getMetamodelClass() { - return ServiceElement.class; - } - - @Override - protected String getMetamodelDescription() { - return Service.class.getSimpleName(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseConfigurationItemDecorator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseConfigurationItemDecorator.java deleted file mode 100644 index 3ec68698..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseConfigurationItemDecorator.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -/** - * Provides baseline decorator functionality for {@link ConfigurationItem}. - * - * The goal is to make it easier to apply the decorator pattern in various implementations of generators (e.g., Java, - * Typescript, Dart) so that each concrete decorator only has to decorate those aspects of the class that are needed, - * not all the pass-through methods that each decorator would otherwise need to implement (that add no real value). - */ -public class BaseConfigurationItemDecorator implements ConfigurationItem { - - protected ConfigurationItem wrapped; - - /** - * New decorator for {@link ConfigurationItem}. - * - * @param configurationItemToDecorate - * instance to decorate - */ - public BaseConfigurationItemDecorator(ConfigurationItem configurationItemToDecorate) { - MetamodelUtils.validateWrappedInstanceIsNonNull(getClass(), configurationItemToDecorate); - wrapped = configurationItemToDecorate; - } - - /** - * {@inheritDoc} - */ - @Override - public String getKey() { - return wrapped.getKey(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getValue() { - return wrapped.getValue(); - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - wrapped.validate(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseEntityDecorator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseEntityDecorator.java deleted file mode 100644 index c26822a8..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseEntityDecorator.java +++ /dev/null @@ -1,221 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.commons.collections4.MapUtils; - -/** - * Provides baseline decorator functionality for {@link Entity}. - * - * The goal is to make it easier to apply the decorator pattern in various implementations of generators (e.g., Java, - * Typescript, Dart) so that each concrete decorator only has to decorate those aspects of the class that are - * needed, not all the pass-through methods that each decorator would otherwise need to implement (that add no real value). - */ -public class BaseEntityDecorator implements Entity { - - protected Entity wrapped; - - /** - * New decorator for {@link Entity}. - * - * @param entityToDecorate - * instance to decorate - */ - public BaseEntityDecorator(Entity entityToDecorate) { - MetamodelUtils.validateWrappedInstanceIsNonNull(getClass(), entityToDecorate); - wrapped = entityToDecorate; - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return wrapped.getName(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getPackage() { - return wrapped.getPackage(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getFileName() { - return wrapped.getFileName(); - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - wrapped.validate(); - - } - - /** - * {@inheritDoc} - */ - @Override - public String getDocumentation() { - return wrapped.getDocumentation(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getTable() { - return wrapped.getTable(); - } - - /** - * {@inheritDoc} - */ - @Override - public LockStrategy getLockStrategy() { - return wrapped.getLockStrategy(); - } - - /** - * {@inheritDoc} - */ - @Override - public Boolean isTransient() { - return wrapped.isTransient(); - } - - /** - * {@inheritDoc} - */ - @Override - public Boolean isNonPersistentParentEntity() { - return wrapped.isNonPersistentParentEntity(); - } - - /** - * {@inheritDoc} - */ - @Override - public Boolean isChildOfNonPersistentParentEntity() { - return wrapped.isChildOfNonPersistentParentEntity(); - } - - /** - * {@inheritDoc} - */ - @Override - public Parent getParent() { - Parent wrappedParent = null; - if (wrapped.getParent() != null) { - wrappedParent = new BaseParentDecorator(wrapped.getParent()); - } - return wrappedParent; - } - - /** - * Does this entity have a parent? - * - * @return true is it has a parent, false if it does not - */ - public boolean hasParent() { - return wrapped.getParent() != null; - } - - /** - * {@inheritDoc} - */ - @Override - public Field getIdentifier() { - Field wrappedIdentifier = null; - if (wrapped.getIdentifier() != null) { - wrappedIdentifier = new BaseFieldDecorator(wrapped.getIdentifier()); - } - return wrappedIdentifier; - } - - /** - * Does this entity have an identifier? - * - * @return true is it has an identifier, false if it does not - */ - public boolean hasIdentifier() { - return wrapped.getIdentifier() != null; - } - - /** - * {@inheritDoc} - */ - @Override - public List getFields() { - List wrappedFields = new ArrayList<>(); - for (Field field : wrapped.getFields()) { - Field wrappedField = new BaseFieldDecorator(field); - wrappedFields.add(wrappedField); - } - - return wrappedFields; - } - - /** - * {@inheritDoc} - */ - @Override - public List getReferences() { - List wrappedReferences = new ArrayList<>(); - for (Reference reference : wrapped.getReferences()) { - Reference wrappedReference = new BaseReferenceDecorator(reference); - wrappedReferences.add(wrappedReference); - } - - return wrappedReferences; - } - - /** - * {@inheritDoc} - */ - @Override - public List getRelations() { - List wrappedRelations = new ArrayList<>(); - for (Relation relation : wrapped.getRelations()) { - Relation wrappedRelation = new BaseRelationDecorator(relation); - wrappedRelations.add(wrappedRelation); - } - - return wrappedRelations; - } - - /** - * {@inheritDoc} - */ - @Override - public Relation getRelation(String type) { - Map relationsByType = new HashMap<>(); - MapUtils.populateMap(relationsByType, getRelations(), Relation::getType); - return relationsByType.get(type); - } - - /** - * {@inheritDoc} - */ - @Override - public List getInverseRelations() { - List wrappedInverseRelations = new ArrayList<>(); - for (Entity inverseRelation : wrapped.getInverseRelations()) { - Entity wrappedInverseRelation = new BaseEntityDecorator(inverseRelation); - wrappedInverseRelations.add(wrappedInverseRelation); - } - - return wrappedInverseRelations; - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseEnumDecorator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseEnumDecorator.java deleted file mode 100644 index fed8bc04..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseEnumDecorator.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -/** - * Provides baseline decorator functionality for {@link Enum}. - * - * The goal is to make it easier to apply the decorator pattern in various implementations of generators (e.g., Java, - * Typescript, Dart) so that each concrete decorator only has to decorate those aspects of the class that are - * needed, not all the pass-through methods that each decorator would otherwise need to implement (that add no real value). - */ -public class BaseEnumDecorator implements Enum { - - protected Enum wrapped; - - /** - * New decorator for {@link Enum}. - * - * @param enumToDecorate - * instance to decorate - */ - public BaseEnumDecorator(Enum enumToDecorate) { - MetamodelUtils.validateWrappedInstanceIsNonNull(getClass(), enumToDecorate); - wrapped = enumToDecorate; - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return wrapped.getName(); - } - - /** - * {@inheritDoc} - */ - @Override - public Integer getValue() { - return wrapped.getValue(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseEnumertionDecorator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseEnumertionDecorator.java deleted file mode 100644 index 439b0309..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseEnumertionDecorator.java +++ /dev/null @@ -1,88 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.List; - -/** - * Provides baseline decorator functionality for {@link Enumeration}. - * - * The goal is to make it easier to apply the decorator pattern in various implementations of generators (e.g., Java, - * Typescript, Dart) so that each concrete decorator only has to decorate those aspects of the class that are - * needed, not all the pass-through methods that each decorator would otherwise need to implement (that add no real value). - */ -public class BaseEnumertionDecorator implements Enumeration { - - protected Enumeration wrapped; - - /** - * New decorator for {@link Enumeration}. - * - * @param enumerationToDecorate - * instance to decorate - */ - public BaseEnumertionDecorator(Enumeration enumerationToDecorate) { - MetamodelUtils.validateWrappedInstanceIsNonNull(getClass(), enumerationToDecorate); - wrapped = enumerationToDecorate; - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return wrapped.getName(); - } - - @Override - public String getFileName() { - return wrapped.getFileName(); - } - /** - * {@inheritDoc} - */ - @Override - public String getPackage() { - return wrapped.getPackage(); - } - - /** - * {@inheritDoc} - */ - @Override - public List getEnums() { - return wrapped.getEnums(); - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - wrapped.validate(); - - } - - /** - * {@inheritDoc} - */ - @Override - public Integer getMaxLength() { - return wrapped.getMaxLength(); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean isNamed() { - return wrapped.isNamed(); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean isValued() { - return wrapped.isValued(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseFieldDecorator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseFieldDecorator.java deleted file mode 100644 index 9bde780b..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseFieldDecorator.java +++ /dev/null @@ -1,270 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import org.technologybrewery.fermenter.mda.metamodel.DefaultModelInstanceRepository; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceRepositoryManager; - -import java.util.Collection; - -/** - * Provides baseline decorator functionality for {@link Field}. - * - * The goal is to make it easier to apply the decorator pattern in various implementations of generators (e.g., Java, - * Typescript, Dart) so that each concrete decorator only has to decorate those aspects of the class that are needed, - * not all the pass-through methods that each decorate requires by default. - */ -public class BaseFieldDecorator implements Field { - - // TODO: remove convenience methods once the TypeDictionary is complete - // (FER-57): - protected static final Integer DEFAULT_SCALE = 5; - - protected Field wrapped; - - /** - * New decorator for {@link Field}. - * - * @param fieldToDecorate - * instance to decorate - */ - public BaseFieldDecorator(Field fieldToDecorate) { - MetamodelUtils.validateWrappedInstanceIsNonNull(getClass(), fieldToDecorate); - wrapped = fieldToDecorate; - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return wrapped.getName(); - } - - @Override - public String getFileName() { - return wrapped.getFileName(); - } - - /** - * Capitalizes field name. - * - * @return the name of the field, capitalized - */ - public String getUppercasedName() { - return getName().toUpperCase(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getPackage() { - return wrapped.getPackage(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getDocumentation() { - return wrapped.getDocumentation(); - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - wrapped.validate(); - - } - - /** - * {@inheritDoc} - */ - @Override - public String getType() { - return wrapped.getType(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getColumn() { - return wrapped.getColumn(); - } - - /** - * {@inheritDoc} - */ - @Override - public Validation getValidation() { - Validation validation = wrapped.getValidation() != null ? wrapped.getValidation() : new ValidationElement(); - return new BaseValidationDecorator(validation); - } - - /** - * {@inheritDoc} - */ - @Override - public Boolean isRequired() { - Boolean wrappedValue = wrapped.isRequired(); - return (wrappedValue != null) ? wrappedValue : Boolean.FALSE; - } - - /** - * {@inheritDoc} - */ - @Override - public Boolean isTransient() { - return wrapped.isTransient(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getLabel() { - return wrapped.getLabel(); - } - - /** - * Returns whether or not this field has a label. - * - * @return has a label - */ - public boolean hasLabel() { - return (getLabel() != null); - } - - /** - * {@inheritDoc} - */ - @Override - public String getDefaultValue() { - return wrapped.getDefaultValue(); - } - - /** - * Returns whether or not this field has a default value. - * - * @return has a default value - */ - public boolean hasDefaultValue() { - return (getDefaultValue() != null); - } - - /** - * {@inheritDoc} - */ - @Override - public Generator getGenerator() { - return wrapped.getGenerator(); - } - - /** - * Returns whether or not this field has a generator. - * - * @return has a generator - */ - public boolean hasGenerator() { - return (getGenerator() != null); - } - - // TODO: remove convenience methods once the TypeDictionary is complete - // (FER-57): - public Integer getMaxLength() { - return (getValidation() != null) ? getValidation().getMaxLength() : null; - } - - // TODO: remove convenience methods once the TypeDictionary is complete - // (FER-57): - public boolean hasMaxLength() { - return getMaxLength() != null ? true : false; - } - - // TODO: remove convenience methods once the TypeDictionary is complete - // (FER-57): - public Integer getMinLength() { - return (getValidation() != null) ? getValidation().getMinLength() : null; - } - - // TODO: remove convenience methods once the TypeDictionary is complete - // (FER-57): - public boolean hasMinLength() { - return getMinLength() != null ? true : false; - } - - // TODO: remove convenience methods once the TypeDictionary is complete - // (FER-57): - public String getMaxValue() { - return (getValidation() != null) ? getValidation().getMaxValue() : null; - } - - // TODO: remove convenience methods once the TypeDictionary is complete - // (FER-57): - public boolean hasMaxValue() { - return getMaxValue() != null ? true : false; - } - - // TODO: remove convenience methods once the TypeDictionary is complete - // (FER-57): - public String getMinValue() { - return (getValidation() != null) ? getValidation().getMinValue() : null; - } - - // TODO: remove convenience methods once the TypeDictionary is complete - // (FER-57): - public boolean hasMinValue() { - return getMinValue() != null ? true : false; - } - - // TODO: remove convenience methods once the TypeDictionary is complete - // (FER-57): - public Integer getScale() { - return (hasScale()) ? getValidation().getScale() : DEFAULT_SCALE; - } - - // TODO: remove convenience methods once the TypeDictionary is complete - // (FER-57): - public boolean hasScale() { - return getValidation() != null && getValidation().getScale() != null; - } - - // TODO: remove convenience methods once the TypeDictionary is complete - // (FER-57): - public Collection getFormats() { - return (hasFormats()) ? getValidation().getFormats() : null; - } - - // TODO: remove convenience methods once the TypeDictionary is complete - // (FER-57): - public boolean hasFormats() { - return getValidation() != null && getValidation().getFormats() != null; - } - - /** - * Returns whether or not this field refers to an entity. - * - * @return is an entity - */ - public boolean isEntity() { - return MetamodelType.ENTITY.equals(MetamodelType.getMetamodelType(getPackage(), getType())); - } - - /** - * Helper method that returns if this field models a named {@link Enumeration}. - * - * @return if this field is a named {@link Enumeration}. - */ - public boolean isNamedEnumeration() { - Enumeration enumeration = getModelInstanceRepository().getEnumeration(getPackage(), getType()); - return enumeration != null && enumeration.isNamed(); - } - - private DefaultModelInstanceRepository getModelInstanceRepository() { - return ModelInstanceRepositoryManager - .getMetamodelRepository(DefaultModelInstanceRepository.class); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseMessageDecorator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseMessageDecorator.java deleted file mode 100644 index 5c0d579e..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseMessageDecorator.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -/** - * Provides baseline decorator functionality for {@link Message}. - * - * The goal is to make it easier to apply the decorator pattern in various implementations of generators (e.g., Java, - * Typescript, Dart) so that each concrete decorator only has to decorate those aspects of the class that are - * needed, not all the pass-through methods that each decorator would otherwise need to implement (that add no real value). - */ -public class BaseMessageDecorator implements Message { - - protected Message wrapped; - - /** - * New decorator for {@link Message}. - * - * @param messageToDecorate - * instance to decorate - */ - public BaseMessageDecorator(Message messageToDecorate) { - MetamodelUtils.validateWrappedInstanceIsNonNull(getClass(), messageToDecorate); - wrapped = messageToDecorate; - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return wrapped.getName(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getText() { - return wrapped.getText(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseMessageGroupDecorator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseMessageGroupDecorator.java deleted file mode 100644 index 3c2ba2fe..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseMessageGroupDecorator.java +++ /dev/null @@ -1,83 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.lang3.StringUtils; - -/** - * Provides baseline decorator functionality for {@link MessageGroup}. - * - * The goal is to make it easier to apply the decorator pattern in various implementations of generators (e.g., Java, - * Typescript, Dart) so that each concrete decorator only has to decorate those aspects of the class that are - * needed, not all the pass-through methods that each decorator would otherwise need to implement (that add no real value). - */ -public class BaseMessageGroupDecorator implements MessageGroup { - - protected MessageGroup wrapped; - - /** - * New decorator for {@link MessageGroup}. - * - * @param messageGroupToDecorate - * instance to decorate - */ - public BaseMessageGroupDecorator(MessageGroup messageGroupToDecorate) { - MetamodelUtils.validateWrappedInstanceIsNonNull(getClass(), messageGroupToDecorate); - wrapped = messageGroupToDecorate; - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return wrapped.getName(); - } - - /** - * Returns the Capitalized name. - * - * @return capitalized name - */ - public String getCapitalizedName() { - return StringUtils.capitalize(getName()); - } - - @Override - public String getFileName() { - return wrapped.getFileName(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getPackage() { - return wrapped.getPackage(); - } - - /** - * {@inheritDoc} - */ - @Override - public List getMessages() { - List wrappedMessages = new ArrayList<>(); - for (Message message : wrapped.getMessages()) { - Message wrappedMessage = new BaseMessageDecorator(message); - wrappedMessages.add(wrappedMessage); - } - - return wrappedMessages; - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - wrapped.validate(); - - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseOperationDecorator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseOperationDecorator.java deleted file mode 100644 index 6fdb7fa9..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseOperationDecorator.java +++ /dev/null @@ -1,95 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.ArrayList; -import java.util.List; - -/** - * Provides baseline decorator functionality for {@link Operation}. - * - * The goal is to make it easier to apply the decorator pattern in various implementations of generators (e.g., Java, - * Typescript, Dart) so that each concrete decorator only has to decorate those aspects of the class that are - * needed, not all the pass-through methods that each decorator would otherwise need to implement (that add no real value). - */ -public class BaseOperationDecorator implements Operation { - - protected Operation wrapped; - - /** - * New decorator for {@link Operation}. - * - * @param operationToDecorate - * instance to decorate - */ - public BaseOperationDecorator(Operation operationToDecorate) { - MetamodelUtils.validateWrappedInstanceIsNonNull(getClass(), operationToDecorate); - wrapped = operationToDecorate; - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return wrapped.getName(); - } - - @Override - public String getFileName() { - return wrapped.getFileName(); - } - /** - * {@inheritDoc} - */ - @Override - public String getDocumentation() { - return wrapped.getDocumentation(); - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - wrapped.validate(); - - } - - /** - * {@inheritDoc} - */ - @Override - public String getTransactionAttribute() { - return wrapped.getTransactionAttribute(); - } - - /** - * {@inheritDoc} - */ - @Override - public Return getReturn() { - return new BaseReturnDecorator(wrapped.getReturn()); - } - - /** - * {@inheritDoc} - */ - @Override - public List getParameters() { - List wrappedParameters = new ArrayList<>(); - for (Parameter parameter : wrapped.getParameters()) { - Parameter wrappedParameter = new BaseParameterDecorator(parameter); - wrappedParameters.add(wrappedParameter); - } - - return wrappedParameters; - } - - /** - * {@inheritDoc} - */ - @Override - public Boolean isCompressedWithGZip() { - return wrapped.isCompressedWithGZip() != null && wrapped.isCompressedWithGZip(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseParameterDecorator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseParameterDecorator.java deleted file mode 100644 index e23cd81b..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseParameterDecorator.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -/** - * Provides baseline decorator functionality for {@link Parameter}. - * - * The goal is to make it easier to apply the decorator pattern in various implementations of generators (e.g., Java, - * Typescript, Dart) so that each concrete decorator only has to decorate those aspects of the class that are - * needed, not all the pass-through methods that each decorator would otherwise need to implement (that add no real value). - */ -public class BaseParameterDecorator implements Parameter { - - protected Parameter wrapped; - - /** - * New decorator for {@link Parameter}. - * - * @param parameterToDecorate - * instance to decorate - */ - public BaseParameterDecorator(Parameter parameterToDecorate) { - MetamodelUtils.validateWrappedInstanceIsNonNull(getClass(), parameterToDecorate); - wrapped = parameterToDecorate; - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return wrapped.getName(); - } - - @Override - public String getFileName() { - return wrapped.getFileName(); - } - /** - * {@inheritDoc} - */ - @Override - public String getPackage() { - return wrapped.getPackage(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getDocumentation() { - return wrapped.getDocumentation(); - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - wrapped.validate(); - - } - - /** - * {@inheritDoc} - */ - @Override - public String getType() { - return wrapped.getType(); - } - - /** - * {@inheritDoc} - */ - @Override - public Boolean isMany() { - return wrapped.isMany() != null && wrapped.isMany(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseParentDecorator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseParentDecorator.java deleted file mode 100644 index f9c6fa5f..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseParentDecorator.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -/** - * Provides baseline decorator functionality for {@link Parent}. - * - * The goal is to make it easier to apply the decorator pattern in various implementations of generators (e.g., Java, - * Typescript, Dart) so that each concrete decorator only has to decorate those aspects of the class that are - * needed, not all the pass-through methods that each decorator would otherwise need to implement (that add no real value). - */ -public class BaseParentDecorator implements Parent { - - protected Parent wrapped; - - /** - * New decorator for {@link Parent}. - * - * @param parentToDecorate - * instance to decorate - */ - public BaseParentDecorator(Parent parentToDecorate) { - MetamodelUtils.validateWrappedInstanceIsNonNull(getClass(), parentToDecorate); - wrapped = parentToDecorate; - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return wrapped.getName(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getPackage() { - return wrapped.getPackage(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getFileName() { - return wrapped.getFileName(); - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - wrapped.validate(); - - } - - /** - * {@inheritDoc} - */ - @Override - public String getType() { - return wrapped.getType(); - } - - /** - * {@inheritDoc} - */ - @Override - public InheritanceStrategy getInheritanceStrategy() { - return wrapped.getInheritanceStrategy(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseReferenceDecorator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseReferenceDecorator.java deleted file mode 100644 index 4d056edd..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseReferenceDecorator.java +++ /dev/null @@ -1,106 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.ArrayList; -import java.util.List; - -/** - * Provides baseline decorator functionality for {@link Reference}. - * - * The goal is to make it easier to apply the decorator pattern in various implementations of generators (e.g., Java, - * Typescript, Dart) so that each concrete decorator only has to decorate those aspects of the class that are needed, - * not all the pass-through methods that each decorate requires by default. - */ -public class BaseReferenceDecorator implements Reference { - - protected Reference wrapped; - - /** - * New decorator for {@link Reference}. - * - * @param referenceToDecorate - * instance to decorate - */ - public BaseReferenceDecorator(Reference referenceToDecorate) { - MetamodelUtils.validateWrappedInstanceIsNonNull(getClass(), referenceToDecorate); - wrapped = referenceToDecorate; - } - - /** - * {@inheritDoc} - */ - @Override - public String getPackage() { - return wrapped.getPackage(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return wrapped.getName(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getType() { - return wrapped.getType(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getDocumentation() { - return wrapped.getDocumentation(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getLocalColumn() { - return wrapped.getLocalColumn(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getFileName() { - return wrapped.getFileName(); - } - - /** - * {@inheritDoc} - */ - @Override - public Boolean isRequired() { - return wrapped.isRequired(); - } - - /** - * {@inheritDoc} - */ - @Override - public List getForeignKeyFields() { - List wrappedFields = new ArrayList<>(); - for (Field foreignKeyField : wrapped.getForeignKeyFields()) { - Field wrappedForeignKeyField = new BaseFieldDecorator(foreignKeyField); - wrappedFields.add(wrappedForeignKeyField); - } - - return wrappedFields; - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - wrapped.validate(); - - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseRelationDecorator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseRelationDecorator.java deleted file mode 100644 index 889cd666..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseRelationDecorator.java +++ /dev/null @@ -1,81 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -/** - * Provides baseline decorator functionality for {@link Relation}. - * - * The goal is to make it easier to apply the decorator pattern in various implementations of generators (e.g., Java, - * Typescript, Dart) so that each concrete decorator only has to decorate those aspects of the class that are needed, - * not all the pass-through methods that each decorate requires by default. - */ -public class BaseRelationDecorator implements Relation { - - protected Relation wrapped; - - /** - * New decorator for {@link Relation}. - * - * @param relationToDecorate - * instance to decorate - */ - public BaseRelationDecorator(Relation relationToDecorate) { - MetamodelUtils.validateWrappedInstanceIsNonNull(getClass(), relationToDecorate); - wrapped = relationToDecorate; - } - - /** - * {@inheritDoc} - */ - @Override - public String getPackage() { - return wrapped.getPackage(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getType() { - return wrapped.getType(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getDocumentation() { - return wrapped.getDocumentation(); - } - - /** - * {@inheritDoc} - */ - @Override - public Multiplicity getMultiplicity() { - return wrapped.getMultiplicity(); - } - - /** - * {@inheritDoc} - */ - @Override - public FetchMode getFetchMode() { - return wrapped.getFetchMode(); - } - - /** - * {@inheritDoc} - */ - @Override - public Field getParentIdentifier(String parentEntityName) { - return wrapped.getParentIdentifier(parentEntityName); - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - wrapped.validate(); - - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseReturnDecorator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseReturnDecorator.java deleted file mode 100644 index d16b12c5..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseReturnDecorator.java +++ /dev/null @@ -1,103 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -/** - * Provides baseline decorator functionality for {@link Return}. - * - * The goal is to make it easier to apply the decorator pattern in various implementations of generators (e.g., Java, - * Typescript, Dart) so that each concrete decorator only has to decorate those aspects of the class that are - * needed, not all the pass-through methods that each decorator would otherwise need to implement (that add no real value). - */ -public class BaseReturnDecorator implements Return { - - protected Return wrapped; - - /** - * New decorator for {@link Return}. - * - * @param returnToDecorate - * instance to decorate - */ - public BaseReturnDecorator(Return returnToDecorate) { - MetamodelUtils.validateWrappedInstanceIsNonNull(getClass(), returnToDecorate); - wrapped = returnToDecorate; - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return wrapped.getName(); - } - - @Override - public String getFileName() { - return wrapped.getFileName(); - } - /** - * {@inheritDoc} - */ - @Override - public String getPackage() { - return wrapped.getPackage(); - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - wrapped.validate(); - - } - - /** - * {@inheritDoc} - */ - @Override - public String getType() { - return wrapped.getType(); - } - - /** - * {@inheritDoc} - */ - @Override - public Boolean isMany() { - return wrapped.isMany() != null && wrapped.isMany(); - } - - /** - * Determines whether or not the return value is an entity. - * - * @return is entity? - */ - public boolean isEntity() { - return MetamodelType.ENTITY.equals(MetamodelType.getMetamodelType(getPackage(), getType())); - } - - /** - * Determines whether or not the return value is an enumeration. - * - * @return is enumeration? - */ - public boolean isEnumeration() { - return MetamodelType.ENUMERATION.equals(MetamodelType.getMetamodelType(getPackage(), getType())); - } - - /** - * {@inheritDoc} - */ - @Override - public String getResponseEncoding() { - return wrapped.getResponseEncoding(); - } - - /** - * {@inheritDoc} - */ - @Override - public Boolean isPagedResponse() { - return wrapped.isPagedResponse(); - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseRuleDecorator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseRuleDecorator.java deleted file mode 100644 index 09ad7e43..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseRuleDecorator.java +++ /dev/null @@ -1,103 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.ArrayList; -import java.util.List; - -/** - * Provides baseline decorator functionality for {@link Rule}. - * - * The goal is to make it easier to apply the decorator pattern in various implementations of generators (e.g., Java, - * Typescript, Dart) so that each concrete decorator only has to decorate those aspects of the class that are - * needed, not all the pass-through methods that each decorator would otherwise need to implement (that add no real value). - */ -public class BaseRuleDecorator implements Rule { - - protected Rule wrapped; - - /** - * New decorator for {@link Rule}. - * - * @param ruleToDecorate - * instance to decorate - */ - public BaseRuleDecorator(Rule ruleToDecorate) { - MetamodelUtils.validateWrappedInstanceIsNonNull(getClass(), ruleToDecorate); - wrapped = ruleToDecorate; - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return wrapped.getName(); - } - - @Override - public String getFileName() { - return wrapped.getFileName(); - } - /** - * {@inheritDoc} - */ - @Override - public String getPackage() { - return wrapped.getPackage(); - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - wrapped.validate(); - - } - - /** - * {@inheritDoc} - */ - @Override - public String getDocumentation() { - return wrapped.getDocumentation(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getDefaultStatement() { - return wrapped.getDefaultStatement(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getDefaultProcessing() { - return wrapped.getDefaultProcessing(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getRuleGroup() { - return wrapped.getRuleGroup(); - } - - /** - * {@inheritDoc} - */ - @Override - public List getOperations() { - List wrappedOperations = new ArrayList<>(); - for (Operation operation : wrapped.getOperations()) { - Operation wrappedOperation = new BaseOperationDecorator(operation); - wrappedOperations.add(wrappedOperation); - } - - return wrappedOperations; - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseServiceDecorator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseServiceDecorator.java deleted file mode 100644 index 525ab6fe..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseServiceDecorator.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.ArrayList; -import java.util.List; - -/** - * Provides baseline decorator functionality for {@link Service}. - * - * The goal is to make it easier to apply the decorator pattern in various implementations of generators (e.g., Java, - * Typescript, Dart) so that each concrete decorator only has to decorate those aspects of the class that are - * needed, not all the pass-through methods that each decorator would otherwise need to implement (that add no real value). - */ -public class BaseServiceDecorator implements Service { - - protected Service wrapped; - - /** - * New decorator for {@link Service}. - * - * @param serviceToDecorate - * instance to decorate - */ - public BaseServiceDecorator(Service serviceToDecorate) { - MetamodelUtils.validateWrappedInstanceIsNonNull(getClass(), serviceToDecorate); - wrapped = serviceToDecorate; - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return wrapped.getName(); - } - - @Override - public String getFileName() { - return wrapped.getFileName(); - } - /** - * {@inheritDoc} - */ - @Override - public String getPackage() { - return wrapped.getPackage(); - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - wrapped.validate(); - - } - - /** - * {@inheritDoc} - */ - @Override - public String getDocumentation() { - return wrapped.getDocumentation(); - } - - /** - * {@inheritDoc} - */ - @Override - public List getOperations() { - List wrappedOperations = new ArrayList<>(); - for (Operation operation : wrapped.getOperations()) { - Operation wrappedOperation = new BaseOperationDecorator(operation); - wrappedOperations.add(wrappedOperation); - } - - return wrappedOperations; - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseValidationDecorator.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseValidationDecorator.java deleted file mode 100644 index 99c383bd..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/BaseValidationDecorator.java +++ /dev/null @@ -1,120 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.Collection; - -/** - * Provides baseline decorator functionality for {@link Validation}. - * - * The goal is to make it easier to apply the decorator pattern in various implementations of generators (e.g., Java, - * Typescript, Dart) so that each concrete decorator only has to decorate those aspects of the class that are - * needed, not all the pass-through methods that each decorator would otherwise need to implement (that add no real value). - */ -public class BaseValidationDecorator implements Validation { - - protected Validation wrapped; - - /** - * New decorator for {@link Validation}. - * - * @param validationToDecorate - * instance to decorate - */ - public BaseValidationDecorator(Validation validationToDecorate) { - MetamodelUtils.validateWrappedInstanceIsNonNull(getClass(), validationToDecorate); - wrapped = validationToDecorate; - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return wrapped.getName(); - } - - @Override - public String getFileName() { - return wrapped.getFileName(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getPackage() { - return wrapped.getPackage(); - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - wrapped.validate(); - - } - - /** - * {@inheritDoc} - */ - @Override - public String getDocumentation() { - return wrapped.getDocumentation(); - } - - /** - * {@inheritDoc} - */ - @Override - public Boolean isEnumerationType() { - return wrapped.isEnumerationType(); - } - - /** - * {@inheritDoc} - */ - @Override - public Integer getMaxLength() { - return wrapped.getMaxLength(); - } - - /** - * {@inheritDoc} - */ - @Override - public Integer getMinLength() { - return wrapped.getMinLength(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getMaxValue() { - return wrapped.getMaxValue(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getMinValue() { - return wrapped.getMinValue(); - } - - /** - * {@inheritDoc} - */ - @Override - public Integer getScale() { - return wrapped.getScale(); - } - - /** - * {@inheritDoc} - */ - @Override - public Collection getFormats() { - return wrapped.getFormats(); - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ConfigurationItem.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ConfigurationItem.java deleted file mode 100644 index 67e5cb72..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ConfigurationItem.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -/** - * Defines the contract for a configuration item. - */ -public interface ConfigurationItem extends Validatable { - - /** - * Returns the configuration key. - * - * @return configuration key - */ - String getKey(); - - /** - * Returns the configuration value. - * - * @return configuration value - */ - String getValue(); - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ConfigurationItemElement.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ConfigurationItemElement.java deleted file mode 100644 index b98cbec9..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ConfigurationItemElement.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import org.apache.commons.lang3.StringUtils; -import org.technologybrewery.fermenter.mda.util.MessageTracker; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; - -/** - * Represents a configuration item. - */ -@JsonPropertyOrder({ "key", "value" }) -public class ConfigurationItemElement implements ConfigurationItem { - - protected static MessageTracker messageTracker = MessageTracker.getInstance(); - - @JsonInclude(Include.NON_NULL) - private String key; - - @JsonInclude(Include.NON_NULL) - private String value; - - /** - * {@inheritDoc} - */ - @Override - public String getKey() { - return key; - } - - /** - * Sets the configuration item key. - * - * @param key - */ - public void setKey(String key) { - this.key = key; - } - - /** - * {@inheritDoc} - */ - @Override - public String getValue() { - return value; - } - - /** - * Sets the configuration item value. - * - * @param key - */ - public void setValue(String value) { - this.value = value; - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - if (StringUtils.isBlank(getKey())) { - messageTracker.addErrorMessage("A key is required for each configuration item!"); - } - - if (StringUtils.isBlank(getValue())) { - messageTracker.addErrorMessage("A value is required for each configuration item!"); - } - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/DictionaryType.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/DictionaryType.java deleted file mode 100644 index 594e69fb..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/DictionaryType.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.List; - -/** - * Defines the contract for a dictionary type. - */ -public interface DictionaryType extends Validation { - - /** - * Returns the base type for the dictionary type. - * - * @return type - */ - String getType(); - - /** - * Returns the formats applicable for the dictionary type. - * - * @return formats - */ - List getFormats(); -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/DictionaryTypeElement.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/DictionaryTypeElement.java deleted file mode 100644 index 846e244c..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/DictionaryTypeElement.java +++ /dev/null @@ -1,130 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.lang3.StringUtils; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; - -/** - * Represents a type in the dictionary. - */ -@JsonPropertyOrder({ "name" }) -public class DictionaryTypeElement extends ValidationElement implements DictionaryType { - - /** - * Formats applicable to the dictionary type. - */ - @JsonInclude(Include.NON_NULL) - private List formats = new ArrayList<>(); - - /** - * Indicate the base type of the dictionary type. - */ - @JsonInclude(Include.NON_NULL) - private String type; - - /** - * {@inheritDoc} - */ - @Override - public String getType() { - return type; - } - - /** - * {@inheritDoc} - */ - @Override - public List getFormats() { - return formats; - } - - /** - * Sets the base type for the dictionary type. - * - * @param type - * base type - */ - public void setType(String type) { - this.type = type; - } - - /** - * Sets the format(s) for the dictionary type. - * - * @param formats - * list of formats for the type - */ - public void setFormats(List formats) { - this.formats.addAll(formats); - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - super.validate(); - - // name of the dictionary type is required - if (null == getName()) { - messageTracker.addErrorMessage("Dictionary type name is not specified."); - } - - // base type of the dictionary type is required - if (null == getType()) { - messageTracker.addErrorMessage("Dictionary base type is not specified."); - } - - // min length is not require but if one is specified, only positive length is allowed - if (null != getMinLength()) { - if (getMinLength() < 0) { - messageTracker.addErrorMessage("Dictionary type min length is less than zero."); - } - } - - // max length is not require but if one is specified, it must be non zero and positive - if (null != getMaxLength()) { - if (getMaxLength() <= 0) { - messageTracker.addErrorMessage("Dictionary type max length is less than or equal to zero."); - } - } - - // max must be >= min - if (null != getMinLength() && null != getMaxLength()) { - if (getMaxLength() < getMinLength()) { - messageTracker.addErrorMessage("Dictionary type max length is less than min length."); - } - } - - // type format must be non-empty - for (String format : getFormats()) { - if (StringUtils.isBlank(format)) { - messageTracker.addErrorMessage("Dictionary type format is empty."); - } - } - } - - /** - * {@inheritDoc} - */ - @Override - public String getSchemaFileName() { - return "fermenter-2-type-dictionary-schema.json"; - } - - /** - * Determines if any validation constraint information has been configured. - * - * @return true if configured - */ - public boolean hasValue() { - return this.getMaxLength() != null || this.getMinLength() != null || this.getMaxValue() != null - || this.getMinValue() != null || this.getScale() != null || this.getDocumentation() != null - || getType() != null || getFormats() != null; - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Entity.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Entity.java deleted file mode 100644 index 622a582b..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Entity.java +++ /dev/null @@ -1,171 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.List; - -import org.apache.commons.lang3.StringUtils; - -import com.fasterxml.jackson.annotation.JsonValue; - -/** - * Defines the contract for a entity that contains fields and associations. - */ -public interface Entity extends NamespacedMetamodel { - - /** - * Returns service-level documentation. - * - * @return service documentation - */ - String getDocumentation(); - - /** - * Returns the name of the table mapped to this entity. - * - * @return table name - */ - String getTable(); - - /** - * Returns the lock strategy for the table. (e.g., optimistic, pessimistic, none) - * - * @return lock strategy - */ - LockStrategy getLockStrategy(); - - /** - * Determines whether this is a persistent or transient object. By default, all entities as persistent. - * - * @return transient nature of this instance - */ - Boolean isTransient(); - - /** - * Returns whether this entity has been marked as the parent of any other entity and the defined inheritance - * strategy indicates that this parent entity is non-persistent.
- *
- * NOTE: While somewhat similar, this models a different concept than {@link Entity#isTransient()}. Transient - * entities have *no* persistent state, while non-persistent parent entities may have persistent fields declared - * within them, but the parent entities are not directly persisted (their concrete child subclasses are). - * - * @return - */ - Boolean isNonPersistentParentEntity(); - - /** - * Returns true when parent is marked as non persistent - * - * @return - */ - Boolean isChildOfNonPersistentParentEntity(); - - /** - * Returns information about a parent entity. - * - * @return parent entity info - */ - Parent getParent(); - - /** - * Returns the identifier for this instance. If you want to use a multi-part key, we recommend treating those values - * as a business keys and maintain a single programmatic key. This makes generation substantially more - * straightforward in these situations. - * - * @return identifier - */ - Field getIdentifier(); - - /** - * Returns fields for this instance. - * - * @return list of fields - */ - List getFields(); - - /** - * Returns references for this instance. - * - * @return list of references - */ - List getReferences(); - - /** - * Returns relations for this instance. - * - * @return list of relations - */ - List getRelations(); - - Relation getRelation(String type); - - /** - * Returns the entities that have specified this entity as a relation - * - * @param type - * @return - */ - List getInverseRelations(); - - /** - * Enumerated values representing allowed lock strategies. - */ - public enum LockStrategy { - OPTIMISTIC("optimistic"), NONE("none"); - - private String value; - - private LockStrategy(String value) { - this.value = value; - } - - /** - * Returns the instance for the passed strategy value (ignoring case). - * - * @param value - * string representation - * @return instance - */ - public static LockStrategy fromString(String value) { - LockStrategy matchedStrategy = null; - for (LockStrategy strategy : LockStrategy.values()) { - if (StringUtils.equalsIgnoreCase(strategy.value, value)) { - matchedStrategy = strategy; - break; - } - } - - return matchedStrategy; - } - - /** - * {@inheritDoc} - */ - @JsonValue - @Override - public String toString() { - return value; - } - - /** - * A comma-separated list of valid options. - * - * @return valid options - */ - public static String options() { - StringBuilder sb = new StringBuilder(); - boolean isFirst = true; - for (LockStrategy strategy : values()) { - if (!isFirst) { - sb.append(", "); - } - - sb.append(strategy.toString()); - - isFirst = false; - } - - return sb.toString(); - } - - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/EntityElement.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/EntityElement.java deleted file mode 100644 index f8384711..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/EntityElement.java +++ /dev/null @@ -1,340 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.commons.lang3.StringUtils; -import org.technologybrewery.fermenter.mda.metamodel.DefaultModelInstanceRepository; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceRepositoryManager; -import org.technologybrewery.fermenter.mda.metamodel.element.Parent.InheritanceStrategy; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.google.common.base.MoreObjects; - -/** - * Represents a entity contains at least one operation. - */ -@JsonPropertyOrder({ "package", "name", "transient", "table", "lockStrategy", "documentation", "parent", "identifier", - "fields", "references", "relations" }) -public class EntityElement extends NamespacedMetamodelElement implements Entity { - - @JsonInclude(Include.NON_NULL) - protected String documentation; - - @JsonInclude(Include.NON_NULL) - protected String table; - - @JsonInclude(Include.NON_NULL) - protected LockStrategy lockStrategy; - - @JsonInclude(Include.NON_NULL) - @JsonProperty(value = "transient") - protected Boolean transientEntity; - - @JsonInclude(Include.NON_NULL) - protected Parent parent; - - @JsonInclude(Include.NON_NULL) - protected Field identifier; - - @JsonInclude(Include.NON_EMPTY) - protected List fields = new ArrayList<>(); - - @JsonInclude(Include.NON_EMPTY) - protected List references = new ArrayList<>(); - - @JsonInclude(Include.NON_EMPTY) - protected List relations = new ArrayList<>(); - - @JsonIgnore - protected List inverseRelations = new ArrayList<>(); - - /** - * {@inheritDoc} - */ - @Override - public String getDocumentation() { - return documentation; - } - - /** - * {@inheritDoc} - */ - @Override - public String getTable() { - return table; - } - - /** - * {@inheritDoc} - */ - @Override - public LockStrategy getLockStrategy() { - return lockStrategy; - } - - /** - * {@inheritDoc} - */ - @Override - @JsonInclude(Include.NON_NULL) - public Boolean isTransient() { - return transientEntity; - } - - /** - * {@inheritDoc} - */ - @Override - @JsonIgnore - public Boolean isNonPersistentParentEntity() { - - DefaultModelInstanceRepository metadataRepository = ModelInstanceRepositoryManager - .getMetamodelRepository(DefaultModelInstanceRepository.class); - - for (String artifactId : metadataRepository.getArtifactIds()) { - Map allEntities = metadataRepository.getEntitiesByArtifactId(artifactId); - if (allEntities != null) { - for (Entity entity : allEntities.values()) { - Parent foundParent = entity.getParent(); - if (foundParent != null && getName().equals(foundParent.getType()) - && InheritanceStrategy.MAPPED_SUPERCLASS.equals(foundParent.getInheritanceStrategy())) { - // any one match is enough to know this is used as a non-persistent parent entity: - return Boolean.TRUE; - } - } - } - } - return Boolean.FALSE; - } - - /** - * {@inheritDoc} - */ - @JsonIgnore - public Boolean isChildOfNonPersistentParentEntity() { - return (getParent() == null) ? Boolean.FALSE - : Parent.InheritanceStrategy.MAPPED_SUPERCLASS.equals(getParent().getInheritanceStrategy()); - } - - /** - * {@inheritDoc} - */ - @Override - public Parent getParent() { - return parent; - } - - /** - * {@inheritDoc} - */ - @Override - public Field getIdentifier() { - return identifier; - } - - /** - * {@inheritDoc} - */ - @Override - public List getFields() { - return fields; - } - - /** - * {@inheritDoc} - */ - @Override - public List getReferences() { - return references; - } - - /** - * {@inheritDoc} - */ - @Override - public List getRelations() { - return relations; - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - if (StringUtils.isBlank(getName())) { - messageTracker.addErrorMessage("A service has been specified without a name!"); - - } - - if (lockStrategy == null) { - lockStrategy = LockStrategy.OPTIMISTIC; - } - - if (transientEntity == null) { - transientEntity = Boolean.FALSE; - } - - if (parent != null) { - parent.validate(); - } - - for (Field field : fields) { - field.validate(); - } - - for (Reference reference : references) { - reference.validate(); - } - - for (Relation relation : relations) { - relation.validate(); - } - - } - - /** - * {@inheritDoc} - */ - @Override - public String getSchemaFileName() { - return "fermenter-2-entity-schema.json"; - } - - /** - * Sets the documentation value. - * - * @param documentation - * documentation text - */ - public void setDocumentation(String documentation) { - this.documentation = documentation; - } - - /** - * Sets the table value. - * - * @param table - * table text - */ - public void setTable(String table) { - this.table = table; - } - - /** - * Sets the lock strategy for this instance. - * - * @param strategy - * strategy - */ - public void setLockStrategy(String strategy) { - this.lockStrategy = LockStrategy.fromString(strategy); - - if (StringUtils.isNoneBlank(strategy) && this.lockStrategy == null) { - messageTracker.addErrorMessage("Could not map lock strategy '" + strategy - + "' to one of the known lock strategy types! (" + LockStrategy.options() + ") "); - } - } - - /** - * Sets the transient value. - * - * @param tranientEntity - * transient setting object - */ - public void setTransient(Boolean tranientEntity) { - this.transientEntity = tranientEntity; - } - - /** - * Sets the parent value. - * - * @param parent - * parent object - */ - public void setParent(Parent parent) { - this.parent = parent; - } - - /** - * Sets the identifier value. - * - * @param identifier - * identifier object - */ - public void setIdentifier(Field identifier) { - this.identifier = identifier; - } - - /** - * Adds a field to this entity. - * - * @param field - * field to add - */ - public void addField(Field field) { - fields.add(field); - } - - /** - * Adds a reference to this entity. - * - * @param reference - * reference to add - */ - public void addReference(Reference reference) { - references.add(reference); - } - - /** - * Adds a relation to this entity. - * - * @param relation - * relation to add - */ - public void addRelation(Relation relation) { - relations.add(relation); - } - - /** - * {@inheritDoc} - */ - @Override - public List getInverseRelations() { - if (inverseRelations == null) { - inverseRelations = new ArrayList<>(); - } - return inverseRelations; - } - - public void addInverseRelation(Entity reverseRelation) { - getInverseRelations().add(reverseRelation); - } - - /** - * {@inheritDoc} - */ - @Override - public Relation getRelation(String type) { - for (Relation relation : getRelations()) { - if (relation.getType().equals(type)) { - return relation; - } - } - return null; - } - - /** - * {@inheritDoc} - */ - @Override - public String toString() { - return MoreObjects.toStringHelper(this).add("package", getPackage()).add("name", name).toString(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Enum.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Enum.java deleted file mode 100644 index 1dc5c359..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Enum.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -/** - * Contract for a constant defined within an {@link Enumeration}. - */ -public interface Enum { - - /** - * The name of this enumeration. - * - * @return Returns the name. - */ - public String getName(); - - /** - * The value of this enumeration (optional). For example, for a MonthOfYear enumeration, you might have a enum - * January with a value of 1. If you want a multi-valued enumeration, please use a Reference instead. - * - * @return Value of the enumeration - */ - public Integer getValue(); - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/EnumElement.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/EnumElement.java deleted file mode 100644 index 8577d1f1..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/EnumElement.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; - -/** - * Represents a constant that is defined within a specific {@link EnumerationElement}. - */ -public class EnumElement extends MetamodelElement implements Enum { - - @JsonInclude(Include.NON_NULL) - private Integer value; - - /** - * Gets the value for this enum. - * - * @return value - */ - public Integer getValue() { - return value; - } - - /** - * Sets value for this enum. - * @param value enum value - */ - public void setValue(Integer value) { - this.value = value; - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - // nothing specific to validate that isn't handled at JSON load time already - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Enumeration.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Enumeration.java deleted file mode 100644 index ec5d759c..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Enumeration.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.List; - -/** - * Defines the contract for an enumeration that contains multiple constants (i.e., enums). - */ -public interface Enumeration extends NamespacedMetamodel { - - /** - * Returns the longest size of the enum constants provided in this model to all this type to have a restricted size - * in input or persistence contexts. - * - * @return length of longest enum - */ - Integer getMaxLength(); - - /** - * Returns the enum instances within this enumeration. - * - * @return enums - */ - List getEnums(); - - /** - * Returns true if the constants are named (no values associated). - * - * @return true if named - */ - boolean isNamed(); - - /** - * Returns true if the constants are valued (values associated). - * - * @return true if values - */ - boolean isValued(); - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/EnumerationElement.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/EnumerationElement.java deleted file mode 100644 index ccf00001..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/EnumerationElement.java +++ /dev/null @@ -1,112 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.collections4.CollectionUtils; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; - -/** - * Represents a enumeration of declared constants. - */ -@JsonPropertyOrder({ "package", "name" }) -public class EnumerationElement extends NamespacedMetamodelElement implements Enumeration { - - @JsonProperty(required = true) - protected List enums = new ArrayList<>(); - protected Integer maxLength; - protected boolean isNamed = true; - - /** - * {@inheritDoc} - */ - @Override - @JsonIgnore - public Integer getMaxLength() { - if (maxLength == null) { - List enumList = getEnums(); - String name; - int currentLength; - int maxiumLength = 0; - for (Enum e : enumList) { - name = e.getName(); - currentLength = name.length(); - if (currentLength > maxiumLength) { - maxiumLength = currentLength; - } - } - - maxLength = maxiumLength; - } - return maxLength; - } - - /** - * Return the list of constants for this enumeration. - * - * @return constants - */ - public List getEnums() { - return enums; - } - - /** - * Adds a constant to this enumeration. - * - * @param contant - * the constant to add - */ - public void addEnums(EnumElement contant) { - enums.add(contant); - } - - /** - * {@inheritDoc} - */ - @JsonIgnore - @Override - public boolean isNamed() { - return isNamed; - } - - /** - * {@inheritDoc} - */ - @JsonIgnore - @Override - public boolean isValued() { - return !isNamed; - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - super.validate(); - - if (CollectionUtils.isEmpty(enums)) { - messageTracker.addWarningMessage("Enumeration " + getName() + " does NOT contain any enum constants!"); - } - - for (Enum enumInstance : enums) { - if (enumInstance.getValue() != null) { - isNamed = false; - break; - } - } - - } - - /** - * {@inheritDoc} - */ - @Override - public String getSchemaFileName() { - return "fermenter-2-enumeration-schema.json"; - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Field.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Field.java deleted file mode 100644 index eb0c9ca6..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Field.java +++ /dev/null @@ -1,127 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import org.apache.commons.lang3.StringUtils; - -import com.fasterxml.jackson.annotation.JsonValue; - -public interface Field extends Metamodel { - - /** - * @return Returns the column. - */ - String getColumn(); - - /** - * Returns documentation for the field. - * - * @return description of the field - */ - String getDocumentation(); - - /** - * Package for the type. - * - * @return Returns the type package - */ - String getPackage(); - - /** - * Field type (simple type, type dictionary type, or enumeration). - * - * @return Returns the type. - */ - String getType(); - - /** - * Returns validation constraints for this field. - * - * @return validation rules - */ - Validation getValidation(); - - /** - * @return Returns the required. - */ - Boolean isRequired(); - - /** - * @return Returns the transientValue. - */ - Boolean isTransient(); - - /** - * @return Returns the default value. - */ - String getDefaultValue(); - - /** - * @return Returns the label value. - */ - String getLabel(); - - - /** - * @return Returns the generator. - */ - Generator getGenerator(); - - enum Generator { - UUID("uuid"), IDENTITY("identity"), ASSIGNED("assigned"), AUTO("auto"); - - private String value; - - private Generator(String value) { - this.value = value; - } - - /** - * Returns the instance for the passed generator value (ignoring case). - * - * @param value string representation - * @return instance - */ - public static Generator fromString(String value) { - Generator matchedGenerator = null; - for (Generator generator : Generator.values()) { - if (StringUtils.equalsIgnoreCase(generator.value, value)) { - matchedGenerator = generator; - break; - } - } - - return matchedGenerator; - } - - /** - * {@inheritDoc} - */ - @JsonValue - @Override - public String toString() { - return value; - } - - /** - * A comma-separated list of valid options. - * - * @return valid options - */ - public static String options() { - StringBuilder sb = new StringBuilder(); - boolean isFirst = true; - for (Generator generator : values()) { - if (!isFirst) { - sb.append(", "); - } - - sb.append(generator.toString()); - - isFirst = false; - } - - return sb.toString(); - } - - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/FieldElement.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/FieldElement.java deleted file mode 100644 index 1d12927c..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/FieldElement.java +++ /dev/null @@ -1,258 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import org.apache.commons.lang3.StringUtils; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.google.common.base.MoreObjects; - -/** - * Represents a field on an entity. - */ -@JsonPropertyOrder({ "package", "name", "documentation", "type", "transient" }) -public class FieldElement extends MetamodelElement implements Field { - - // see getter for JSON configuration - // (internal field name does not match the external API name due to keyword collision): - protected String packageName; - - @JsonInclude(Include.NON_NULL) - protected String type; - - @JsonInclude(Include.NON_NULL) - protected String column; - - @JsonInclude(Include.NON_NULL) - protected Validation validation; - - @JsonInclude(Include.NON_NULL) - protected String documentation; - - @JsonInclude(Include.NON_NULL) - protected Boolean required; - - @JsonInclude(Include.NON_NULL) - protected Generator generator; - - @JsonInclude(Include.NON_NULL) - protected String defaultValue; - - // see getter for JSON configuration - // (internal field name does not match the external API name due to keyword collision): - protected Boolean isTransient; - - @JsonInclude(Include.NON_NULL) - protected String label; - - /** - * {@inheritDoc} - */ - @Override - public String getType() { - return type; - } - - /** - * {@inheritDoc} - */ - @JsonInclude(Include.NON_NULL) - @JsonProperty(value = NamespacedMetamodelElement.PACKAGE, required = false) - @Override - public String getPackage() { - return packageName; - } - - /** - * {@inheritDoc} - */ - @Override - public String getColumn() { - return column; - } - - /** - * {@inheritDoc} - */ - @Override - public Validation getValidation() { - return validation; - } - - /** - * {@inheritDoc} - */ - @Override - @JsonInclude(Include.NON_NULL) - public Boolean isRequired() { - return required; - } - - /** - * {@inheritDoc} - */ - @Override - public String getDocumentation() { - return documentation; - } - - /** - * {@inheritDoc} - */ - @Override - public Generator getGenerator() { - return generator; - } - - /** - * {@inheritDoc} - */ - @JsonInclude(Include.NON_NULL) - @JsonProperty(value = "transient", required = false) - @Override - public Boolean isTransient() { - return this.isTransient; - } - - /** - * {@inheritDoc} - */ - @Override - public String getLabel() { - return this.label; - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - // TODO: validate this refers to a valid type (once type dictionary is present) - } - - /** - * Sets the packageName of the field type. - * - * @param packageName - * namespace/package of the element - */ - public void setPackage(String packageName) { - this.packageName = packageName; - } - - /** - * Sets the type of the metadata element. - * - * @param type - * type to set - */ - public void setType(String type) { - this.type = type; - } - - /** - * Sets the column value. - * - * @param column - * column value - */ - public void setColumn(String column) { - this.column = column; - } - - /** - * Sets the field validation constraints. - * - * @param validation - * field type - */ - public void setType(Validation validation) { - this.validation = validation; - } - - /** - * Sets the documentation value. - * - * @param documentation - * documentation text - */ - public void setDocumentation(String documentation) { - this.documentation = documentation; - } - - /** - * Sets the required value. - * - * @param required - * required value - */ - public void setRequired(Boolean required) { - this.required = required; - } - - /** - * Sets the Validation . - * - * @param validation - * validation value - */ - public void setValidation(Validation validation) { - this.validation = validation; - } - - /** - * Sets the transientValue. - * - * @param transientValue - * transient value - */ - public void setTransient(Boolean transientValue) { - this.isTransient = transientValue != null ? transientValue : Boolean.FALSE; - } - - /** - * Sets the label. - * - * @param label - * label value - */ - public void setLabel(String label) { - this.label = label; - } - - /** - * Sets the generator. - * - * @param generator - * generator - */ - public void setGenerator(String generator) { - this.generator = Generator.fromString(generator); - - if (StringUtils.isNoneBlank(generator) && this.generator == null) { - messageTracker.addErrorMessage("Could not map generator '" + generator - + "' to one of the known generator types! (" + Generator.options() + ") "); - } - } - - /** - * {@inheritDoc} - */ - @Override - public String getDefaultValue() { - return defaultValue; - } - - public void setDefaultValue(String defaultValue) { - this.defaultValue = defaultValue; - } - - /** - * {@inheritDoc} - */ - @Override - public String toString() { - return MoreObjects.toStringHelper(this).add("name", name).toString(); - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ForeignKeyFieldElement.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ForeignKeyFieldElement.java deleted file mode 100644 index 4c9c948d..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ForeignKeyFieldElement.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -/** - * Adds the concept of a parent column for mapping foreign key fields. - */ -public class ForeignKeyFieldElement extends FieldElement { - - private String parentColumn; - - /** - * Returns the name of the parent column. - * - * @return parent column name - */ - public String getParentColumn() { - // for convenience, just return the column name if an override has not been set: - return (parentColumn != null) ? parentColumn : getColumn(); - } - - /** - * Sets the name of the parent column. - * - * @param parentColumn - * parent column name - */ - public void setParentColumn(String parentColumn) { - this.parentColumn = parentColumn; - } - - /** - * Returns the name of the child column. - * - * @return parent column name - */ - public String getChildColumn() { - return getColumn(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Message.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Message.java deleted file mode 100644 index 537dfd62..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Message.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -/** - * Contract for a user-facing message defined within a {@link MessageGroup}. - */ -public interface Message { - - /** - * The name of the message. - * - * @return message name - */ - public String getName(); - - /** - * The text of the message. - * - * @return Value of the text - */ - public String getText(); - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MessageElement.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MessageElement.java deleted file mode 100644 index b2252e2c..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MessageElement.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; - -/** - * Represents a constant that is defined within a specific {@link MessageGroupElement}. - */ -@JsonPropertyOrder({ "name", "text"}) -public class MessageElement extends MetamodelElement implements Message { - - @JsonProperty(required = true) - private String text; - - /** - * Returns the message text. - * - * @return message text - */ - public String getText() { - return text; - } - - /** - * Sets the message text. - * - * @param text - * message text - */ - public void setText(String text) { - this.text = text; - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - // nothing specific to validate that isn't handled at JSON load time already - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MessageGroup.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MessageGroup.java deleted file mode 100644 index 3b9815ad..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MessageGroup.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.List; - -/** - * Defines the contract for a messages that contains message formulas for returning information back to the user. - */ -public interface MessageGroup extends NamespacedMetamodel { - - /** - * Returns the {@link Message} instances within this message group. - * - * @return messages - */ - List getMessages(); - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MessageGroupElement.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MessageGroupElement.java deleted file mode 100644 index e33e8ce8..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MessageGroupElement.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.ArrayList; -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; - -/** - * Represents a group of messages. - */ -@JsonPropertyOrder({ "package", "name", "messages"}) -public class MessageGroupElement extends NamespacedMetamodelElement implements MessageGroup { - - @JsonProperty(required = true) - protected List messages = new ArrayList<>(); - - /** - * Return the list of messages for this group. - * - * @return constants - */ - @Override - public List getMessages() { - return messages; - } - - /** - * Adds a message to this group. - * - * @param message - * the message to add - */ - public void addMessage(Message message) { - messages.add(message); - } - - /** - * {@inheritDoc} - */ - @Override - public String getSchemaFileName() { - return "fermenter-2-message-group-schema.json"; - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Metamodel.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Metamodel.java deleted file mode 100644 index ccce651f..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Metamodel.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -/** - * Provides the base interface of any metamodel object - it has to at least have a name and be validatable. - */ -public interface Metamodel extends Validatable { - - String getFileName(); - - /** - * Returns the name of the metadata element. - * - * @return name - */ - String getName(); - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MetamodelElement.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MetamodelElement.java deleted file mode 100644 index 605f349e..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MetamodelElement.java +++ /dev/null @@ -1,124 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.net.URL; -import java.util.Objects; - -import org.apache.commons.lang3.StringUtils; -//import org.apache.commons.collections4.CollectionUtils; -import org.technologybrewery.fermenter.mda.util.MessageTracker; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.google.common.base.MoreObjects; - -/** - * Implements the contract for a basic metamodel element. - */ -public abstract class MetamodelElement implements Metamodel { - - protected static MessageTracker messageTracker = MessageTracker.getInstance(); - - @JsonProperty(required = true) - @JsonInclude(Include.NON_NULL) - protected String name; - - @JsonIgnore - protected URL fileUrl; - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return name; - } - - /** - * Sets the name of the metadata element. - * - * @param name name to set - */ - public void setName(String name) { - this.name = name; - } - - /** - * Sets the URL of the file used for this root element, if one exists (e.g., an - * Enumeration will have one, but an Operation will not because it doesn't sit - * in the root of a model file). - * - * @param file {@link URL} of the file containing this root instance - */ - public void setFileUrl(URL file) { - this.fileUrl = file; - } - - /** - * Returns the name of the file used for this root element as a valid URL. - */ - @JsonIgnore - public String getFileName() { - return fileUrl != null ? fileUrl.getFile() : null; - } - - @Override - public void validate() { - String localFileName; - if (StringUtils.isBlank(getName())) { - messageTracker.addErrorMessage("Name is a required attribute!"); - - } else if ((localFileName = getFileName()) != null) { - // NB localFileName is represented as a URL and will only have '/' path - // separators regardless of the underlying OS - String strippedFileName = localFileName.substring(localFileName.lastIndexOf("/") + 1, - localFileName.lastIndexOf('.')); - if (!getName().equals(strippedFileName)) { - messageTracker.addErrorMessage("The file name must match the element name! Expected: '" + getName() - + "', but found: '**" + strippedFileName + "**.json' (file: " + localFileName + ")"); - } - } - } - - /** - * {@inheritDoc} - */ - @Override - public int hashCode() { - return Objects.hashCode(name); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean equals(Object obj) { - boolean areEqual; - if (obj == null) { - areEqual = false; - - } else if (obj == this) { - areEqual = true; - - } else if (obj.getClass() != getClass()) { - areEqual = false; - - } else { - Metamodel other = (Metamodel) obj; - areEqual = Objects.equals(this.name, other.getName()); - - } - - return areEqual; - } - - /** - * {@inheritDoc} - */ - @Override - public String toString() { - return MoreObjects.toStringHelper(this).add("name", name).toString(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MetamodelType.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MetamodelType.java deleted file mode 100644 index 38d9013b..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MetamodelType.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import org.technologybrewery.fermenter.mda.metamodel.DefaultModelInstanceRepository; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceRepositoryManager; - -/** - * Defines the different types of metamodels you can have while also encapsulating a mechanism to determine - * a type for a given package and name combination. - */ -public enum MetamodelType { - - SIMPLE_TYPE, ENUMERATION, ENTITY, DICTIONARY_TYPE; - - /** - * Returns the metamodel type for the passed package and name combination. - * - * @param packageName - * package name - * @param name - * name of instance - * @return metamodel type - */ - public static MetamodelType getMetamodelType(String packageName, String name) { - MetamodelType metamodelType = null; - DefaultModelInstanceRepository modelInstanceRepository = getModelInstanceRepository(); - - String lookupPackageName = packageName == null ? modelInstanceRepository.getBasePackage() : packageName; - - if (modelInstanceRepository.getDictionaryType(name) != null) { - metamodelType = MetamodelType.DICTIONARY_TYPE; - - } else if (modelInstanceRepository.getEnumeration(lookupPackageName, name) != null) { - metamodelType = MetamodelType.ENUMERATION; - - } else if (modelInstanceRepository.getEntity(lookupPackageName, name) != null) { - metamodelType = MetamodelType.ENTITY; - - } else if (!"void".equals(name)) { - metamodelType = MetamodelType.SIMPLE_TYPE; - - } - - return metamodelType; - } - - static DefaultModelInstanceRepository getModelInstanceRepository() { - return ModelInstanceRepositoryManager - .getMetamodelRepository(DefaultModelInstanceRepository.class); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MetamodelUtils.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MetamodelUtils.java deleted file mode 100644 index 39347a96..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/MetamodelUtils.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -/** - * Common utility methods that are leverages across metamodel classes. - */ -public final class MetamodelUtils { - - protected MetamodelUtils() { - // prevent instantiation of all static class - } - - /** - * Checks that a instance that will be wrapped by a decorator is not null and provides a consistent error response. - * - * @param wrapperClass - * class that is being wrapped - * @param wrappedInstance - * instance that is being wrapped - */ - public static void validateWrappedInstanceIsNonNull(Class wrapperClass, Object wrappedInstance) { - if (wrappedInstance == null) { - throw new IllegalArgumentException( - wrapperClass.getSimpleName() + " must be instatiated with a non-null instance to wrap!"); - } - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/NamespacedMetamodel.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/NamespacedMetamodel.java deleted file mode 100644 index b5dbc3bb..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/NamespacedMetamodel.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -/** - * Defines the contract for a "first class" or "parent" metamodel instance that must have a package (namespace) in - * addition to a name. - */ -public interface NamespacedMetamodel extends Metamodel { - - /** - * Returns the package of the metadata element. - * - * @return package - */ - String getPackage(); - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/NamespacedMetamodelElement.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/NamespacedMetamodelElement.java deleted file mode 100644 index 5f4b009d..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/NamespacedMetamodelElement.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.Objects; - -import org.technologybrewery.fermenter.mda.element.ValidatedElement; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.google.common.base.MoreObjects; - -/** - * Implements the contract for a metamodel element that requires a package and - * name. - */ -public abstract class NamespacedMetamodelElement extends MetamodelElement - implements ValidatedElement, NamespacedMetamodel { - - protected static final String NAME = "name"; - protected static final String PACKAGE = "package"; - - @JsonInclude(Include.NON_NULL) - @JsonProperty(value = PACKAGE, required = true) - protected String packageName; - - /** - * {@inheritDoc} - */ - @Override - public String getPackage() { - return packageName; - } - - /** - * Sets the packageName of the metadata element. - * - * @param packageName namespace/package of the element - */ - public void setPackage(String packageName) { - this.packageName = packageName; - } - - /** - * Leverages both name and namespace to create a hash code. {@inheritDoc} - */ - @Override - public int hashCode() { - return Objects.hash(packageName, name); - } - - /** - * Leverages both name and namespace to perform equality. {@inheritDoc} - */ - @Override - public boolean equals(Object obj) { - boolean areEqual; - if (obj == null) { - areEqual = false; - - } else if (obj == this) { - areEqual = true; - - } else if (obj.getClass() != getClass()) { - areEqual = false; - - } else { - NamespacedMetamodelElement other = (NamespacedMetamodelElement) obj; - areEqual = Objects.equals(this.packageName, other.getPackage()) - && Objects.equals(this.name, other.getName()); - - } - - return areEqual; - } - - /** - * {@inheritDoc} - */ - @Override - public String toString() { - return MoreObjects.toStringHelper(this).add(PACKAGE, getPackage()).add(NAME, name).toString(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Operation.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Operation.java deleted file mode 100644 index a5f08678..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Operation.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.List; - -/** - * Defines the contract for an operation. - */ -public interface Operation extends Metamodel { - - /** - * Returns documentation for this operation. - * - * @return service documentation - */ - String getDocumentation(); - - /** - * Returns the transaction attribute of this operation. - * - * @return - */ - String getTransactionAttribute(); - - /** - * Provides information about what this operation returns. - * - * @return operation return info - */ - Return getReturn(); - - /** - * Returns the parameter instances within this operation. - * - * @return parameters - */ - List getParameters(); - - /** - * Returns whether or not this operation uses GZip compression. - * - * @return GZip compression - */ - Boolean isCompressedWithGZip(); -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/OperationElement.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/OperationElement.java deleted file mode 100644 index d7e4062c..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/OperationElement.java +++ /dev/null @@ -1,185 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.lang3.StringUtils; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; - -/** - * Represents an operation within a service. - */ -@JsonPropertyOrder({ "name" }) -public class OperationElement extends MetamodelElement implements Operation { - - @JsonInclude(Include.NON_NULL) - protected String documentation; - - @JsonInclude(Include.NON_NULL) - protected String transactionAttribute; - - @JsonProperty(value = "return", required = true) - protected Return returnElement; - - protected List parameters = new ArrayList<>(); - - @JsonInclude(Include.NON_NULL) - protected Boolean compressedWithGZip; - - @JsonInclude(Include.NON_NULL) - protected Boolean pagedResponse; - - /** - * {@inheritDoc} - */ - @Override - public String getDocumentation() { - return documentation; - } - - /** - * {@inheritDoc} - */ - @Override - public String getTransactionAttribute() { - return transactionAttribute; - } - - /** - * {@inheritDoc} - */ - @Override - public Return getReturn() { - return returnElement; - } - - /** - * {@inheritDoc} - */ - @Override - public List getParameters() { - return parameters; - } - - /** - * {@inheritDoc} - */ - @Override - public Boolean isCompressedWithGZip() { - return compressedWithGZip; - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - defaultTransactionAttribute(); - defaultCompressedWithGZip(); - defaultPagedResponse(); - defaultPageIndexAndSizeParamForPagedResponse(); - - if (returnElement != null) { - returnElement.validate(); - } - - for (Parameter parameter : parameters) { - parameter.validate(); - } - - validateTransactionAttribute(); - } - - private void defaultPageIndexAndSizeParamForPagedResponse() { - if(getReturn().isPagedResponse()) { - ParameterElement pageIndexParam = new ParameterElement(); - pageIndexParam.setName("startPage"); - pageIndexParam.setType("integer"); - pageIndexParam.setDocumentation("The index of the page being requested. Base zero. Must be a positive integer."); - pageIndexParam.setMany(false); - parameters.add(pageIndexParam); - - ParameterElement pageSizeParam = new ParameterElement(); - pageSizeParam.setName("count"); - pageSizeParam.setType("integer"); - pageSizeParam.setMany(false); - pageSizeParam.setDocumentation("The number of elements being requested. Must be a positive integer."); - parameters.add(pageSizeParam); - } - } - - private void defaultPagedResponse() { - if (pagedResponse == null) { - pagedResponse = Boolean.FALSE; - } - } - - private void defaultCompressedWithGZip() { - if (compressedWithGZip == null) { - compressedWithGZip = Boolean.FALSE; - } - } - - private void validateTransactionAttribute() { - if (!Transaction.isValidTransaction(getTransactionAttribute())) { - messageTracker.addErrorMessage("Transaction attribute must be '" + Transaction.REQUIRED + "', '" - + Transaction.REQUIRES_NEW + "', '" + Transaction.MANDATORY + "', '" + Transaction.NOT_SUPPORTED - + "', '" + Transaction.SUPPORTS + "' or '" + Transaction.NEVER + "'"); - } - - } - - private void defaultTransactionAttribute() { - if (StringUtils.isBlank(transactionAttribute)) { - if (name.startsWith("find") || name.startsWith("query") || name.startsWith("load")) { - transactionAttribute = Transaction.SUPPORTS.toString(); - } else { - transactionAttribute = Transaction.REQUIRED.toString(); - } - } - } - - /** - * Sets the return information for this operation. - * - * @param returnElement - * return info - */ - public void setReturn(Return returnElement) { - this.returnElement = returnElement; - } - - /** - * Sets the documentation for this operation. - * - * @param documentation - * operation documentation - */ - public void setDocumentation(String documentation) { - this.documentation = documentation; - } - - /** - * Sets the transaction attribute for this method. - * - * @param transactionAttribute - * transaction attribute - */ - public void setTransactionAttribute(String transactionAttribute) { - this.transactionAttribute = transactionAttribute; - } - - /** - * Sets compression for this operation. - * - * @param compress - * whether or not to compress - */ - public void setCompressedWithGZip(Boolean compress) { - this.compressedWithGZip = compress; - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Parameter.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Parameter.java deleted file mode 100644 index e4f8fb62..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Parameter.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -/** - * Defines the contract for operation parameters. - */ -public interface Parameter extends NamespacedMetamodel { - - /** - * Returns service-level documentation. - * - * @return service documentation - */ - String getDocumentation(); - - /** - * Returns the type of parameter. - * - * @return parameter type - */ - String getType(); - - /** - * Returns whether or not this returns many instances of the type or a single instance. - * - * @return is many? - */ - Boolean isMany(); - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ParameterElement.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ParameterElement.java deleted file mode 100644 index a4912b03..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ParameterElement.java +++ /dev/null @@ -1,127 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import org.apache.commons.lang3.StringUtils; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.google.common.base.MoreObjects; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; - -/** - * Represents a parameter in a service operation. - */ -@JsonPropertyOrder({ "name", "package", "type" }) -public class ParameterElement extends NamespacedMetamodelElement implements Parameter { - - @JsonProperty(required = true) - protected String type; - - @JsonInclude(Include.NON_NULL) - protected Boolean many; - - @JsonInclude(Include.NON_NULL) - protected String documentation; - - /** - * Override to make optional (for base types) and not write if null. - * - * {@inheritDoc} - */ - @JsonInclude(Include.NON_NULL) - @JsonProperty(value = PACKAGE, required = false) - @Override - public String getPackage() { - return super.getPackage(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getType() { - return type; - } - - /** - * {@inheritDoc} - * - * Default to false if no specific value is provided - */ - @Override - public Boolean isMany() { - return many; - } - - /** - * {@inheritDoc} - */ - @Override - public String getDocumentation() { - return documentation; - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - if (StringUtils.isBlank(getName())) { - messageTracker.addErrorMessage("A parameter has been specified without a name!"); - } - - if (StringUtils.isBlank(type)) { - messageTracker.addErrorMessage("Parameter " + getName() + " has been specified without a type!"); - } - - // default many when not specified: - if (many == null) { - many = Boolean.FALSE; - } - - } - - /** - * {@inheritDoc} - */ - @Override - public String getSchemaFileName() { - return "fermenter-2-service-schema.json"; - } - - /** - * Sets if this is a multiple instances of the specified type or just one. - * - * @param many - * collection or single instance - */ - public void setMany(Boolean many) { - this.many = many; - } - - /** - * Sets the type of the parameter. - * - * @param type - * parameter type - */ - public void setType(String type) { - this.type = type; - } - - /** - * Sets the documentation value. - * - * @param documentation - * documentation text - */ - public void setDocumentation(String documentation) { - this.documentation = documentation; - } - - @Override - public String toString() { - return MoreObjects.toStringHelper(this).add("type", getType()).add(PACKAGE, getPackage()).add(NAME, name).toString(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Parent.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Parent.java deleted file mode 100644 index dce46e93..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Parent.java +++ /dev/null @@ -1,90 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import org.apache.commons.lang3.StringUtils; - -import com.fasterxml.jackson.annotation.JsonValue; - -/** - * Defines the contract for an entity parent type. - */ -public interface Parent extends NamespacedMetamodel { - - /** - * Returns the type of parent. - * - * @return parent type - */ - String getType(); - - /** - * Returns inheritance strategy when considering this parent. - * - * @return inheritance strategy - */ - InheritanceStrategy getInheritanceStrategy(); - - /** - * Types of inheritance strategies that can be used when processing parent - * references. - */ - enum InheritanceStrategy { - - MAPPED_SUPERCLASS("mapped-superclass"); - - private String value; - - private InheritanceStrategy(String value) { - this.value = value; - } - - /** - * Returns the instance for the passed inheritance value (ignoring case). - * - * @param value string representation - * @return instance - */ - public static InheritanceStrategy fromString(String value) { - InheritanceStrategy matchedStrategy = null; - for (InheritanceStrategy strategy : InheritanceStrategy.values()) { - if (StringUtils.equalsIgnoreCase(strategy.value, value)) { - matchedStrategy = strategy; - break; - } - } - - return matchedStrategy; - } - - /** - * {@inheritDoc} - */ - @JsonValue - @Override - public String toString() { - return value; - } - - /** - * A comma-separated list of valid options. - * - * @return valid options - */ - public static String options() { - StringBuilder sb = new StringBuilder(); - boolean isFirst = true; - for (InheritanceStrategy strategy : values()) { - if (!isFirst) { - sb.append(", "); - } - - sb.append(strategy.toString()); - - isFirst = false; - } - - return sb.toString(); - } - - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ParentElement.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ParentElement.java deleted file mode 100644 index d8dda710..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ParentElement.java +++ /dev/null @@ -1,115 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import org.apache.commons.lang3.StringUtils; -import org.technologybrewery.fermenter.mda.metamodel.DefaultModelInstanceRepository; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceRepositoryManager; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.google.common.base.MoreObjects; - -/** - * Represents a enumeration of declared constants. - */ -@JsonPropertyOrder({ "package", "type" }) -public class ParentElement extends NamespacedMetamodelElement implements Parent { - - @JsonProperty(required = true) - protected String type; - - @JsonInclude(Include.NON_NULL) - protected InheritanceStrategy inheritanceStrategy; - - /** - * Override to make optional (for base types) and not write if null. - * - * {@inheritDoc} - */ - @JsonInclude(Include.NON_NULL) - @JsonProperty(value = PACKAGE, required = false) - @Override - public String getPackage() { - return super.getPackage(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getType() { - return type; - } - - /** - * {@inheritDoc} - */ - @Override - public InheritanceStrategy getInheritanceStrategy() { - return inheritanceStrategy; - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - - // default many when not specified: - if (inheritanceStrategy == null) { - inheritanceStrategy = InheritanceStrategy.MAPPED_SUPERCLASS; - } - - DefaultModelInstanceRepository modelRespository = ModelInstanceRepositoryManager - .getMetamodelRepository(DefaultModelInstanceRepository.class); - Entity parentEntity = modelRespository.getEntity(packageName, type); - if (parentEntity == null) { - messageTracker.addErrorMessage("Parent type of '" + type + "' could not be found!"); - } - - } - - /** - * {@inheritDoc} - */ - @Override - public String getSchemaFileName() { - return "fermenter-2-entity-schema.json"; - } - - /** - * Sets the parent type. - * - * @param type - * parent type - */ - public void setType(String type) { - this.type = type; - } - - /** - * Sets the inheritance strategy on for the return. - * - * @param inheritanceStrategy - * inheritance strategy - */ - public void setInheritanceStrategy(String inheritanceStrategy) { - this.inheritanceStrategy = InheritanceStrategy.fromString(inheritanceStrategy); - - if (StringUtils.isNoneBlank(inheritanceStrategy) && this.inheritanceStrategy == null) { - messageTracker.addErrorMessage("Could not map inheritance strategy '" + inheritanceStrategy - + "' to one of the known inheritance strategy types! (" + InheritanceStrategy.options() + ") "); - } - } - - /** - * {@inheritDoc} - */ - @Override - public String toString() { - return MoreObjects.toStringHelper(this).add("package", getPackage()).add("type", type) - .add("inheritanceStrategy", inheritanceStrategy).toString(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Reference.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Reference.java deleted file mode 100644 index ef2a2bd2..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Reference.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.List; - -/** - * Defines the contract for an entity referencing another entity. - */ -public interface Reference extends NamespacedMetamodel { - - /** - * Returns the type of reference. - * - * @return reference type - */ - String getType(); - - /** - * Returns reference-level documentation. - * - * @return reference documentation - */ - String getDocumentation(); - - /** - * @return Returns the required. - */ - Boolean isRequired(); - - /** - * Returns the column name in which the primary key will be stored in this referencing entity. - * - * @return local column name - */ - String getLocalColumn(); - - /** - * Gets the foreign keys associated with this reference plus all parent references - * @return List of foreign key fields - */ - List getForeignKeyFields(); - - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ReferenceElement.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ReferenceElement.java deleted file mode 100644 index 4d660130..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ReferenceElement.java +++ /dev/null @@ -1,168 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.technologybrewery.fermenter.mda.metamodel.DefaultModelInstanceRepository; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceRepositoryManager; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.google.common.base.MoreObjects; - -/** - * Represents a reference on an entity. - */ -@JsonPropertyOrder({ "name", "type", "package", "localColumn", "documentation", "required" }) -public class ReferenceElement extends NamespacedMetamodelElement implements Reference { - - @JsonInclude(Include.NON_NULL) - protected String type; - - @JsonInclude(Include.NON_NULL) - protected String documentation; - - @JsonInclude(Include.NON_NULL) - protected Boolean required; - - @JsonInclude(Include.NON_NULL) - protected String localColumn; - - @JsonIgnore - private List foreignKeys; - - /** - * {@inheritDoc} - */ - @Override - public String getType() { - return type; - } - - /** - * {@inheritDoc} - */ - @Override - @JsonInclude(Include.NON_NULL) - public Boolean isRequired() { - return required; - } - - /** - * {@inheritDoc} - */ - @Override - public String getDocumentation() { - return documentation; - } - - /** - * {@inheritDoc} - */ - @Override - public String getLocalColumn() { - return localColumn; - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - // TODO: validate this refers to a valid entity - } - - /** - * Sets the field type. - * - * @param type - * field type - */ - public void setType(String type) { - this.type = type; - } - - /** - * Sets the documentation value. - * - * @param documentation - * documentation text - */ - public void setDocumentation(String documentation) { - this.documentation = documentation; - } - - /** - * Sets the required value. - * - * @param required - * required value - */ - public void setRequired(Boolean required) { - this.required = required; - } - - /** - * Sets the local column value. - * - * @param localColumn - * localColumn value - */ - public void setLocalColumn(String localColumn) { - this.localColumn = localColumn; - } - - /** - * {@inheritDoc} - */ - @Override - public String toString() { - return MoreObjects.toStringHelper(this).add("name", name).toString(); - } - - @Override - public String getSchemaFileName() { - return "fermenter-2-service-schema.json"; - } - - /** - * {@inheritDoc} - */ - @Override - @JsonIgnore - public List getForeignKeyFields() { - if (foreignKeys == null) { - foreignKeys = new ArrayList<>(); - DefaultModelInstanceRepository metadataRepository = ModelInstanceRepositoryManager - .getMetamodelRepository(DefaultModelInstanceRepository.class); - - Map referenceEntities = metadataRepository.getEntities(getPackage()); - Entity entity = referenceEntities.get(getType()); - if (entity == null) { - throw new NullPointerException("Reference to '" + type + "' not found!"); - } - - Field fkidentifier = entity.getIdentifier(); - if (fkidentifier != null) { // can be null for transient - FieldElement newId = new FieldElement(); - newId.setType(fkidentifier.getType()); - newId.setName(fkidentifier.getName()); - - if (entity.isTransient() == null || !entity.isTransient()) { - newId.setColumn(this.localColumn != null ? this.localColumn : fkidentifier.getColumn()); - } - foreignKeys.add(newId); - } else { - if (entity.isTransient() == null || !entity.isTransient()) { - throw new NullPointerException("Reference to '" + type + "' does not have a Identifier!"); - } - } - - } - return foreignKeys; - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Relation.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Relation.java deleted file mode 100644 index f9ba3a10..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Relation.java +++ /dev/null @@ -1,201 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import org.apache.commons.lang3.StringUtils; - -import com.fasterxml.jackson.annotation.JsonValue; - -/** - * Defines the contract for an entity that a child of another entity. - */ -public interface Relation extends Validatable { - - /** - * Returns the type package of relation. - * - * @return relation type package - */ - String getPackage(); - - /** - * Returns the type of relation. - * - * @return relation type - */ - String getType(); - - /** - * Returns relation-level documentation. - * - * @return relation documentation - */ - String getDocumentation(); - - /** - * Returns multiplicity of this relation (e.g., 1-M, 1-1, M-M). - * - * @return multiplicity - */ - Multiplicity getMultiplicity(); - - /** - * Returns the fetch mode (eager or lazy) for this relation. - * - * @return fetch mode - */ - FetchMode getFetchMode(); - - /** - * Enumerated values representing multiplicity options. - */ - public enum Multiplicity { - - ONE_TO_MANY("1-M"), ONE_TO_ONE("1-1"), MANY_TO_MANY("M-M"); - - private String value; - - private Multiplicity(String value) { - this.value = value; - } - - /** - * Returns the instance for the passed multiplicity value (ignoring case). If no - * known match is found, null is returned. - * - * @param value string representation - * @return instance - */ - public static Multiplicity fromString(String value) { - Multiplicity matchedMultiplicity = null; - - if (StringUtils.isNotBlank(value)) { - String lowerCasedValue = value.toLowerCase(); - if ((ONE_TO_MANY.toString().equalsIgnoreCase(lowerCasedValue)) - || ("one-to-many".equals(lowerCasedValue)) || ("one-many".equals(lowerCasedValue))) { - matchedMultiplicity = ONE_TO_MANY; - - } else if ((ONE_TO_ONE.toString().equalsIgnoreCase(lowerCasedValue)) - || ("one-to-one".equals(lowerCasedValue)) || ("one-one".equals(lowerCasedValue))) { - matchedMultiplicity = ONE_TO_ONE; - - } else if ((MANY_TO_MANY.toString().equalsIgnoreCase(lowerCasedValue)) - || ("many-to-many".equals(lowerCasedValue)) || ("many-many".equals(lowerCasedValue))) { - matchedMultiplicity = MANY_TO_MANY; - - } - } - - return matchedMultiplicity; - } - - /** - * {@inheritDoc} - */ - @JsonValue - @Override - public String toString() { - return value; - } - - /** - * A comma-separated list of valid options. - * - * @return valid options - */ - public static String options() { - StringBuilder sb = new StringBuilder(); - boolean isFirst = true; - for (Multiplicity mode : values()) { - if (!isFirst) { - sb.append(", "); - } - - sb.append(mode.toString()); - - isFirst = false; - } - - return sb.toString(); - } - - } - - /** - * Enumerated values representing fetch mode options. - */ - public enum FetchMode { - - EAGER("eager"), LAZY("lazy"); - - private String value; - - private FetchMode(String value) { - this.value = value; - } - - /** - * Returns the instance for the passed fetch mode value (ignoring case). If no - * known match is found, null is returned. - * - * @param value string representation - * @return instance - */ - public static FetchMode fromString(String value) { - FetchMode matchedFetchMode = null; - - if (StringUtils.isNotBlank(value)) { - String lowerCasedValue = value.toLowerCase(); - if (EAGER.toString().equals(lowerCasedValue)) { - matchedFetchMode = EAGER; - - } else if (LAZY.toString().equals(lowerCasedValue)) { - matchedFetchMode = LAZY; - - } - } - - return matchedFetchMode; - } - - /** - * {@inheritDoc} - */ - @JsonValue - @Override - public String toString() { - return value; - } - - public String toUpperCase() { - return value.toUpperCase(); - } - - /** - * A comma-separated list of valid options. - * - * @return valid options - */ - public static String options() { - StringBuilder sb = new StringBuilder(); - boolean isFirst = true; - for (FetchMode mode : values()) { - if (!isFirst) { - sb.append(", "); - } - - sb.append(mode.toString()); - - isFirst = false; - } - - return sb.toString(); - } - - } - - /** - * Gets the key fields that the child class will reference for this relation - * @return The key fields - */ - public Field getParentIdentifier(String parentEntityName); - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/RelationElement.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/RelationElement.java deleted file mode 100644 index 8cb57e7c..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/RelationElement.java +++ /dev/null @@ -1,185 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.Map; - -import org.apache.commons.lang3.StringUtils; -import org.technologybrewery.fermenter.mda.metamodel.DefaultModelInstanceRepository; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceRepositoryManager; -import org.technologybrewery.fermenter.mda.util.MessageTracker; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.google.common.base.MoreObjects; - -/** - * Represents a reference on an entity. - */ -@JsonPropertyOrder({ "type", "package", "multiplicity" }) -public class RelationElement implements Relation { - - @JsonIgnore - private static MessageTracker messageTracker = MessageTracker.getInstance(); - - @JsonInclude(Include.NON_NULL) - @JsonProperty(value = NamespacedMetamodelElement.PACKAGE) - protected String packageName; - - @JsonInclude(Include.NON_NULL) - protected String type; - - @JsonInclude(Include.NON_NULL) - protected String documentation; - - @JsonInclude(Include.NON_NULL) - protected Multiplicity multiplicity; - - @JsonInclude(Include.NON_NULL) - protected FetchMode fetchMode; - - /** - * {@inheritDoc} - */ - @Override - public String getPackage() { - return packageName; - } - - /** - * {@inheritDoc} - */ - @Override - public String getType() { - return type; - } - - /** - * {@inheritDoc} - */ - @Override - public String getDocumentation() { - return documentation; - } - - /** - * {@inheritDoc} - */ - @Override - public Multiplicity getMultiplicity() { - return multiplicity; - } - - - /** - * {@inheritDoc} - */ - @Override - public FetchMode getFetchMode() { - return fetchMode; - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - // TODO: validate this refers to a valid entity - - if (multiplicity == null) { - multiplicity = Multiplicity.ONE_TO_MANY; - } - - if (fetchMode == null) { - fetchMode = FetchMode.EAGER; - } - } - - /** - * Sets the relation type package. - * - * @param package - * relation type package - */ - public void setPackage(String packageName) { - this.packageName = packageName; - } - - /** - * Sets the relation type. - * - * @param type - * relation type - */ - public void setType(String type) { - this.type = type; - } - - /** - * Sets the documentation value. - * - * @param documentation - * documentation text - */ - public void setDocumentation(String documentation) { - this.documentation = documentation; - } - - /** - * Sets the multiplicity value. - * - * @param multiplicityAsString - * multiplicity value - */ - public void setMultiplicity(String multiplicityAsString) { - this.multiplicity = Multiplicity.fromString(multiplicityAsString); - - if (StringUtils.isNoneBlank(multiplicityAsString) && multiplicity == null) { - messageTracker.addErrorMessage("Could not map multiplicity '" + multiplicityAsString - + "' to one of the known multiplicity types! (" + Multiplicity.options() + ") "); - } - } - - /** - * Sets the fetch mode value. - * - * @param fetchModeAsString - * fetch mode value - */ - public void setFetchMode(String fetchModeAsString) { - this.fetchMode = FetchMode.fromString(fetchModeAsString); - - if (StringUtils.isNoneBlank(fetchModeAsString) && fetchMode == null) { - messageTracker.addErrorMessage("Could not map fetch mode '" + fetchModeAsString - + "' to one of the known fetch mode types! (" + FetchMode.options() + ") "); - } - } - - /** - * {@inheritDoc} - */ - @Override - public Field getParentIdentifier(String parentEntityName) { - DefaultModelInstanceRepository metadataRepository = ModelInstanceRepositoryManager - .getMetamodelRepository(DefaultModelInstanceRepository.class); - Map entities = metadataRepository.getEntities(getPackage()); - Entity parentEntity = entities.get(parentEntityName); - - Field parentIdentifier = parentEntity.getIdentifier(); - ForeignKeyFieldElement newId = new ForeignKeyFieldElement(); - newId.setType(this.getType()); - newId.setColumn(parentIdentifier.getColumn()); - newId.setParentColumn(parentIdentifier.getColumn()); - return newId; - } - - /** - * {@inheritDoc} - */ - @Override - public String toString() { - return MoreObjects.toStringHelper(this).add("type", type).toString(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Return.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Return.java deleted file mode 100644 index e84bc1bf..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Return.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -/** - * Defines the contract for an operation return type. - */ -public interface Return extends NamespacedMetamodel { - - /** - * Returns the type of parameter. - * - * @return parameter type - */ - String getType(); - - /** - * Returns whether or not this returns many instances of the type or a - * single instance. - * - * @return is many? - */ - Boolean isMany(); - - /** - * Returns operation response encoding. - * - * @return response encoding - */ - String getResponseEncoding(); - - /** - * Returns whether or not this operation returns a paged response. - * - * @return isPagedResponse boolean - */ - Boolean isPagedResponse(); -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ReturnElement.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ReturnElement.java deleted file mode 100644 index cde4e5c8..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ReturnElement.java +++ /dev/null @@ -1,154 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import org.apache.commons.lang3.StringUtils; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.google.common.base.MoreObjects; - -/** - * Represents a enumeration of declared constants. - */ -@JsonPropertyOrder({ "package", "type" }) -public class ReturnElement extends NamespacedMetamodelElement implements Return { - - private static final String VOID = "void"; - - @JsonProperty(required = true) - protected String type; - - @JsonInclude(Include.NON_NULL) - protected Boolean many; - - @JsonInclude(Include.NON_NULL) - protected String responseEncoding; - - @JsonInclude(Include.NON_NULL) - private boolean pagedResponse; - - /** - * Override to make optional (for base types) and not write if null. - * - * {@inheritDoc} - */ - @JsonInclude(Include.NON_NULL) - @JsonProperty(value = PACKAGE, required = false) - @Override - public String getPackage() { - return super.getPackage(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getType() { - return type; - } - - /** - * {@inheritDoc} - * - * Default to false if no specific value is provided - */ - @Override - public Boolean isMany() { - return many; - } - - /** - * {@inheritDoc} - */ - @Override - public String getResponseEncoding() { - return responseEncoding; - } - - /** - * {@inheritDoc} - */ - @Override - public Boolean isPagedResponse() { - return pagedResponse; - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - // default return type when not specified: - if (StringUtils.isBlank(getType())) { - type = VOID; - } - - // default many when not specified: - if (many == null) { - many = Boolean.FALSE; - } - - if(isPagedResponse() && VOID.equals(getType())) { - messageTracker.addErrorMessage( - "Conflict: Operation " + getName() + " is marked as a paged response but return type is void."); - } - } - - /** - * {@inheritDoc} - */ - @Override - public String getSchemaFileName() { - return "fermenter-2-service-schema.json"; - } - - /** - * Sets whether or not the return type is many instances of the type or just one. - * - * @param many - * is many - */ - public void setMany(Boolean many) { - this.many = many; - } - - /** - * Sets the return type. - * - * @param type - * return type - */ - public void setType(String type) { - this.type = type; - } - - /** - * Sets the encoding on for the return. - * - * @param responseEncoding - * encoding - */ - public void setResponseEncoding(String responseEncoding) { - this.responseEncoding = responseEncoding; - } - - /** - * {@inheritDoc} - */ - @Override - public String toString() { - return MoreObjects.toStringHelper(this).add("package", getPackage()).add("type", type).add("many", many) - .toString(); - } - - /** - * Sets whether or not this operation has a paged response. - * - * @param pagedResponse - * whether or not the response will be a page of objects - */ - public void setPagedResponse(Boolean pagedResponse) { - this.pagedResponse = pagedResponse; - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Rule.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Rule.java deleted file mode 100644 index a3b95007..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Rule.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.List; - -/** - * Defines the contract for a rule that contains one or more operations. - */ -public interface Rule extends NamespacedMetamodel { - - /** - * Returns rule-level documentation. - * - * @return rule documentation - */ - String getDocumentation(); - - /** - * Returns rule-level defaultStatement. - * - * @return rule defaultStatement - */ - String getDefaultStatement(); - - /** - * Returns rule-level defaultProcessing. - * - * @return rule defaultProcessing - */ - String getDefaultProcessing(); - - /** - * Returns rule-level ruleGroup. - * - * @return rule ruleGroup - */ - String getRuleGroup(); - - /** - * Returns the operation instances within this rule. - * - * @return operations - */ - List getOperations(); - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/RuleElement.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/RuleElement.java deleted file mode 100644 index 8205455f..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/RuleElement.java +++ /dev/null @@ -1,120 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.collections4.CollectionUtils; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; - -/** - * Represents a rule contains at least one operation. - */ -@JsonPropertyOrder({ "package", "name" }) -public class RuleElement extends NamespacedMetamodelElement implements Rule { - - @JsonInclude(Include.NON_NULL) - protected String documentation; - - @JsonInclude(Include.NON_NULL) - protected String defaultStatement; - - @JsonInclude(Include.NON_NULL) - protected String defaultProcessing; - - @JsonInclude(Include.NON_NULL) - protected String ruleGroup; - - @JsonProperty(required = true) - protected List operations = new ArrayList<>(); - - /** - * {@inheritDoc} - */ - @Override - public String getDefaultStatement() { - return defaultStatement; - } - - /** - * {@inheritDoc} - */ - @Override - public String getDefaultProcessing() { - return defaultProcessing; - } - - /** - * {@inheritDoc} - */ - @Override - public String getRuleGroup() { - return ruleGroup; - } - - /** - * {@inheritDoc} - */ - @Override - public String getDocumentation() { - return documentation; - } - - /** - * {@inheritDoc} - */ - @Override - public List getOperations() { - return operations; - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - super.validate(); - - if (CollectionUtils.isEmpty(operations)) { - messageTracker.addWarningMessage("Rule " + getName() + " does NOT contain any operations!"); - } - - for (Operation operation : operations) { - operation.validate(); - } - - } - - /** - * {@inheritDoc} - */ - @Override - public String getSchemaFileName() { - System.out.println("fermenter-2-rule-schema.json reqested"); - return "fermenter-2-rule-schema.json"; - } - - /** - * Sets the documentation value. - * - * @param documentation - * documentation text - */ - public void setDocumentation(String documentation) { - this.documentation = documentation; - } - - /** - * Sets a list of operations. - * - * @param operations - * operations - */ - public void setOperations(List operations) { - this.operations = operations; - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Service.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Service.java deleted file mode 100644 index 676a132d..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Service.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.List; - -/** - * Defines the contract for a service that contains one or more operations. - */ -public interface Service extends NamespacedMetamodel { - - /** - * Returns service-level documentation. - * - * @return service documentation - */ - String getDocumentation(); - - /** - * Returns the operation instances within this service. - * - * @return operations - */ - List getOperations(); - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ServiceElement.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ServiceElement.java deleted file mode 100644 index ece4e483..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ServiceElement.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.collections4.CollectionUtils; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; - -/** - * Represents a service contains at least one operation. - */ -@JsonPropertyOrder({ "package", "name" }) -public class ServiceElement extends NamespacedMetamodelElement implements Service { - - @JsonInclude(Include.NON_NULL) - protected String documentation; - - @JsonProperty(required = true) - protected List operations = new ArrayList<>(); - - /** - * {@inheritDoc} - */ - @Override - public String getDocumentation() { - return documentation; - } - - /** - * {@inheritDoc} - */ - @Override - public List getOperations() { - return operations; - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - super.validate(); - - if (CollectionUtils.isEmpty(operations)) { - messageTracker.addWarningMessage("Service " + getName() + " does NOT contain any operations!"); - } - - for (Operation operation : operations) { - operation.validate(); - } - - } - - /** - * {@inheritDoc} - */ - @Override - public String getSchemaFileName() { - return "fermenter-2-service-schema.json"; - } - - /** - * Sets the documentation value. - * - * @param documentation - * documentation text - */ - public void setDocumentation(String documentation) { - this.documentation = documentation; - } - - /** - * Sets a list of operations. - * - * @param operations - * operations - */ - public void setOperations(List operations) { - this.operations = operations; - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Transaction.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Transaction.java deleted file mode 100644 index 0ad1c306..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Transaction.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.HashMap; -import java.util.Map; - -/** - * These transaction attribute constants are listed exactly as they are specified by the JEE specification. They are - * uppercased to eliminate the possibility of case-related issues when reading and translating these values. - */ -public enum Transaction { - REQUIRED("Required"), REQUIRES_NEW("RequiresNew"), MANDATORY("Mandatory"), NOT_SUPPORTED("NotSupported"), SUPPORTS( - "Supports"), NEVER("Never"); - - private String jtaName; - private static Map jtaNameMap = getJtaNameMap(); - - private Transaction(String jtaName) { - this.jtaName = jtaName; - } - - /** - * {@inheritDoc} - */ - @Override - public String toString() { - return jtaName; - } - - /** - * Returns whether or no the the transaction is a valid JTA name. - * - * @param transactionName - * JTA name - * @return whether it is valid - */ - public static boolean isValidTransaction(String transactionName) { - return jtaNameMap.containsKey(transactionName); - } - - /** - * Returns the enum for the given JTA name. - * - * @param transactionName - * JTA name - * @return matching enum or null if not found. - */ - public static Transaction getTransactionByJtaName(String transactionName) { - return jtaNameMap.get(transactionName); - } - - private static Map getJtaNameMap() { - if (jtaNameMap == null) { - jtaNameMap = new HashMap<>(); - for (Transaction transaction : Transaction.values()) { - jtaNameMap.put(transaction.jtaName, transaction); - } - - } - - return jtaNameMap; - - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Validatable.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Validatable.java deleted file mode 100644 index f0ec6413..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Validatable.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -/** - * Defines the contractor for validating a metamodel element. - */ -public interface Validatable { - - /** - * Ensure that the this metamodel element is in a valid state. For instance, if this element refers to another - * element, let's ensure that element exists. - */ - void validate(); - - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Validation.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Validation.java deleted file mode 100644 index e4df91ff..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/Validation.java +++ /dev/null @@ -1,105 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.util.Collection; - -import org.apache.commons.lang3.StringUtils; - -import com.fasterxml.jackson.annotation.JsonValue; - -public interface Validation extends NamespacedMetamodel { - - String getDocumentation(); - - Boolean isEnumerationType(); - - /** - * @return Returns the maxLength. - */ - Integer getMaxLength(); - - /** - * @return Returns the minLength. - */ - Integer getMinLength(); - - /** - * @return Returns the maxValue. - */ - String getMaxValue(); - - /** - * @return Returns the minValue. - */ - String getMinValue(); - - Integer getScale(); - - Collection getFormats(); - - enum BaseType { - STRING("string"), FLOAT("float"), DATE("date"), TIMESTAMP("timestamp"), LONG("long"), DOUBLE("double"), - INTEGER("integer"), SHORT("short"), NUMERIC_BOOLEAN("numeric_boolean"), BOOLEAN("boolean"), - BIG_DECIMAL("big_decimal"), CHARACTER("character"), BLOB("blob"), GEOSPATIAL_POINT("geospatial_point"), - UUID("uuid"); - - private String value; - - private BaseType(String value) { - this.value = value; - } - - /** - * Returns the instance for the passed strategy value (ignoring case). - * - * @param value string representation - * @return instance - */ - public static BaseType fromString(String value) { - BaseType matchedType = null; - for (BaseType type : BaseType.values()) { - if (StringUtils.equalsIgnoreCase(type.value, value)) { - matchedType = type; - break; - } - } - - return matchedType; - } - - /** - * {@inheritDoc} - */ - @JsonValue - @Override - public String toString() { - return value; - } - - /** - * A comma-separated list of valid options. - * - * @return valid options - */ - public static String options() { - StringBuilder sb = new StringBuilder(); - boolean isFirst = true; - for (BaseType type : values()) { - if (!isFirst) { - sb.append(", "); - } - - sb.append(type.toString()); - - isFirst = false; - } - - return sb.toString(); - } - - public static Boolean isSimpleType(String typeName) { - return BaseType.fromString(typeName) != null; - } - - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ValidationElement.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ValidationElement.java deleted file mode 100644 index 259dbb4a..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/metamodel/element/ValidationElement.java +++ /dev/null @@ -1,227 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel.element; - -import java.text.Format; -import java.util.Collection; - -import org.technologybrewery.fermenter.mda.metamodel.DefaultModelInstanceRepository; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceRepositoryManager; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.google.common.base.MoreObjects; - -/** - * Represents a enumeration of declared constants. - */ -@JsonPropertyOrder({ "package", "name" }) -public class ValidationElement extends NamespacedMetamodelElement implements Validation { - - @JsonInclude(Include.NON_NULL) - private String documentation; - - @JsonInclude(Include.NON_NULL) - private Integer maxLength; - - @JsonInclude(Include.NON_NULL) - private Integer minLength; - - /** - * Applies to both integers and floating point values, so use a String to store. - */ - @JsonInclude(Include.NON_NULL) - private String maxValue; - - /** - * Applies to both integers and floating point values, so use a String to store. - */ - @JsonInclude(Include.NON_NULL) - private String minValue; - - @JsonInclude(Include.NON_NULL) - private Integer scale; - - @JsonInclude(Include.NON_NULL) - private Collection formats; - - @JsonIgnore - private DefaultModelInstanceRepository repository = ModelInstanceRepositoryManager - .getMetamodelRepository(DefaultModelInstanceRepository.class); - - /** - * Override to make optional (for base types) and not write if null. - * - * {@inheritDoc} - */ - @JsonInclude(Include.NON_NULL) - @JsonProperty(value = PACKAGE, required = false) - @Override - public String getPackage() { - return super.getPackage(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getDocumentation() { - return documentation; - } - - /** - * {@inheritDoc} - */ - @Override - public Integer getMaxLength() { - if (maxLength == null && isEnumerationType()) { - Enumeration enumeration = repository.getEnumeration(getPackage(), getName()); - Integer enumerationMaxLength = enumeration.getMaxLength(); - if (enumerationMaxLength != null) { - maxLength = enumerationMaxLength; - - } - } - - return maxLength; - - } - - @Override - @JsonInclude(Include.NON_NULL) - public Integer getMinLength() { - return minLength; - } - - @Override - @JsonInclude(Include.NON_NULL) - public String getMaxValue() { - return maxValue; - } - - @Override - @JsonInclude(Include.NON_NULL) - public String getMinValue() { - return minValue; - } - - @Override - @JsonInclude(Include.NON_NULL) - public Integer getScale() { - return scale; - } - - @Override - @JsonInclude(Include.NON_NULL) - public Collection getFormats() { - return formats; - } - - /** - * {@inheritDoc} - */ - @Override - public void validate() { - - } - - /** - * Sets the documentation for this type. - * - * @param documentation description of the type - */ - public void setDocumentation(String documentation) { - this.documentation = documentation; - } - - /** - * Sets the maximum length of a string. - * - * @param maxLength string max length - */ - public void setMaxLength(Integer maxLength) { - this.maxLength = maxLength; - } - - /** - * Sets the minimum length of a string. - * - * @param minLength string min length - */ - public void setMinLength(Integer minLength) { - this.minLength = minLength; - } - - /** - * Sets the maximum value of a numeric type. - * - * @param maxValue numeric max value - */ - public void setMaxValue(String maxValue) { - this.maxValue = maxValue; - } - - /** - * Sets the minimum value of a numeric type. - * - * @param minValue numeric min value - */ - public void setMinValue(String minValue) { - this.minValue = minValue; - } - - /** - * Sets scale (number of places to right of decimal point). - * - * @param scale allowed places - */ - public void setScale(Integer scale) { - this.scale = scale; - } - - /** - * Format name for regular expression matching. - * - * @param formats format name (reference to {@link Format}). - */ - public void setFormats(Collection formats) { - this.formats = formats; - } - - /** - * {@inheritDoc} - */ - @Override - public String getSchemaFileName() { - return "fermenter-2-entity-schema.json"; - } - - /** - * {@inheritDoc} - */ - @Override - public String toString() { - return MoreObjects.toStringHelper(this).add("package", getPackage()).add("name", name).toString(); - } - - /** - * Determines if any validation constraint information has been configured. - * - * @return true if configured - */ - public boolean hasValue() { - return maxLength != null || minLength != null || maxValue != null || minValue != null || scale != null - || formats != null || documentation != null; - } - - /** - * {@inheritDoc} - */ - @Override - @JsonIgnore - public Boolean isEnumerationType() { - return repository.getEnumeration(getPackage(), getName()) != null; - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/reporting/FileStats.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/reporting/FileStats.java deleted file mode 100644 index 54795e56..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/reporting/FileStats.java +++ /dev/null @@ -1,124 +0,0 @@ -package org.technologybrewery.fermenter.mda.reporting; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; - -import java.util.Collection; - -/** - * Captures statistics about a single source code file generated by Fermenter. - */ -public final class FileStats { - private final String filePath; - private long size; - private long lineCount; - - @JsonCreator - public FileStats(@JsonProperty("filePath") String filePath) { - this.filePath = filePath; - } - - /** - * @return the absolute file system path of the generated file - */ - public String getFilePath() { - return filePath; - } - - /** - * @return the size in bytes of the generated file (NB not disk size) - */ - public long getSize() { - return size; - } - - /** - * @return the number of newlines in the generated file - */ - public long getLineCount() { - return lineCount; - } - - /** - * Adds bytes that will or would be written to the generated file - * - * @param bytesWritten the number of bytes written - */ - public void addBytesWritten(long bytesWritten) { - size += bytesWritten; - } - - /** - * Adds lines that will or would be written to the generated file - * - * @param lines the number of lines - */ - public void addLinesWritten(long lines) { - this.lineCount += lines; - } - - - @Override - public boolean equals(Object o) { - if (this == o) return true; - - if (o == null || getClass() != o.getClass()) return false; - - FileStats fileStats = (FileStats) o; - - return new EqualsBuilder() - .append(size, fileStats.size) - .append(lineCount, fileStats.lineCount) - .append(filePath, fileStats.filePath) - .isEquals(); - } - - @Override - public int hashCode() { - return new HashCodeBuilder(17, 37).append(filePath).toHashCode(); - } - - /** - * Combines a collection of individual file stats into one stats object that aggregates across the collection. - * - * @param statsToAggregate the FileStats to aggregate - * - * @return the aggregated file stats - */ - public static Aggregate aggregate(Collection statsToAggregate) { - int fileCount = statsToAggregate.size(); - long totalSize = 0L; - long totalLines = 0L; - for (FileStats eachFileStats : statsToAggregate) { - totalSize += eachFileStats.getSize(); - totalLines += eachFileStats.getLineCount(); - } - return new Aggregate(fileCount, totalSize, totalLines); - } - - public static final class Aggregate { - private final int fileCount; - private final long totalSize; - private final long totalLines; - - public Aggregate(int fileCount, long totalSize, long totalLines) { - this.fileCount = fileCount; - this.totalSize = totalSize; - this.totalLines = totalLines; - } - - public int getFileCount() { - return fileCount; - } - - public long getTotalSize() { - return totalSize; - } - - public long getTotalLines() { - return totalLines; - } - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/reporting/StatisticsService.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/reporting/StatisticsService.java deleted file mode 100644 index e626cd33..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/reporting/StatisticsService.java +++ /dev/null @@ -1,184 +0,0 @@ -package org.technologybrewery.fermenter.mda.reporting; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.commons.lang3.StringUtils; -import org.apache.maven.AbstractMavenLifecycleParticipant; -import org.apache.maven.execution.MavenSession; -import org.apache.velocity.Template; -import org.apache.velocity.VelocityContext; -import org.technologybrewery.fermenter.mda.GenerateSourcesMojo; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; -import java.io.File; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -/** - * Records reporting data during project execution and prints the resulting report at the end of the build. - * - * IMPLEMENTATION NOTES: - * In an ideal world, this is a singleton that is only created once for the entire Maven session and is injected - * into each {@link GenerateSourcesMojo} that executes for each module/sub-project. However, I was unable to figure - * out exactly how to pull that off given the Plexus and JSR330 annotations. I tried the naive approach of using - * {@link org.apache.maven.SessionScoped} and {@link javax.inject.Singleton}. In the latter case, the singleton is - * scoped to the Mojo execution and so gets created and destroyed each time. For the former (strangely), the object - * is recreated even more, and the object that's created at the very start of execution is inaccessible from the - * context of the Mojo. In both cases, the first instance created never records stats but is always the one to print - * stats. It would be nice to eventually figure out the best way to specify a bean that is created at the start of the - * Maven execution and is re-used throughout execution by each Mojo invoked. Note also that the confusion is - * compounded by Maven's switch from Plexus to JSR330 backed by Guice while maintaining the old Plexus annotations for - * compatibility. - */ -@Named -@Singleton -public final class StatisticsService extends AbstractMavenLifecycleParticipant { - private static final Logger logger = LoggerFactory.getLogger(StatisticsService.class); - private static final String STATS_KEY = "fermenter.generationStats"; - private static final String ENABLE_STATS = "fermenter.enableStatistics"; - - private final MavenSession session; - private final String uuid; - private boolean statsReportingEnabled; - - @Inject - public StatisticsService(MavenSession aSession) { - this.session = aSession; - String enabledString = (String) session.getSystemProperties().getOrDefault(ENABLE_STATS, "false"); - statsReportingEnabled = "true".equalsIgnoreCase(enabledString); - uuid = UUID.randomUUID().toString(); - } - - @Override - public void afterSessionEnd(MavenSession session) { - if (!session.getResult().hasExceptions() && statsReportingEnabled) { - FileStats.Aggregate totals = calculateFinalStats(); - logger.info("****************************************************************************"); - logger.info("* Fermenter Execution Report *"); - logger.info("*"); - logger.info("* Files generated: " + totals.getFileCount() + " files"); - logger.info("* Size of generated files: " + totals.getTotalSize() + " bytes"); - logger.info("* Lines generated : " + totals.getTotalLines() + " lines"); - logger.info("*"); - logger.info("*"); - logger.info("* Note: to find the real size of your project in bytes"); - logger.info("* 1. Delete build artifacts (e.g. `mvn clean`)"); - logger.info("* 2. Delete any package lock files (e.g. `find . -name poetry.lock -delete`)"); - logger.info("* 3. Run `ls -lR | grep -E '^-' | awk '{sum+=$5;} END{print sum}'`"); - logger.info("****************************************************************************"); - } - } - - /** - * Record a file that's being generated or would be generated by the generate-sources Mojo. Files that are not - * generated simply because they were already generated and have overwritable set to false are still recorded. - * - * @param template the velocity template used to generate the file - * @param destinationFile the final destination of the generated file - * @param vc the velocity context for generation - */ - public void recordStats(Template template, File destinationFile, VelocityContext vc) { - if (isStatsReportingEnabled()) { - StatsCollectingWriter fw = new StatsCollectingWriter(this, destinationFile); - template.merge(vc, fw); - fw.close(); - } - } - - /** - * Whether the reporting service is reporting on source generation statistics - * - * @return true if stats are being recorded - */ - public boolean isStatsReportingEnabled() { - return statsReportingEnabled; - } - - /** - * Enables or disables reporting on source generation statistics - * - * @param statsReportingEnabled whether stats are enabled - */ - public void setStatsReportingEnabled(boolean statsReportingEnabled) { - this.statsReportingEnabled = statsReportingEnabled; - } - - /** - * Adds recorded stats for a specific file to the total stats gathered for the session - * - * @param newStats the newly recorded stats - */ - synchronized void updateGeneratedFileStats(FileStats newStats) { - // NB: It would be much more efficient to just store the aggregated numbers, however currently python source - // files appear to be generated twice: once during generate-python-sources and once during generate-sources. - // this also defends against inaccurate details for poor Fermenter implementations that have duplicate - // targets/output files. - List allStats = readStatsFromSession(STATS_KEY + uuid); - if (!allStats.contains(newStats)) { - allStats.add(newStats); - } else { - logger.warn("Duplicate generation for " + newStats.getFilePath()); - } - writeStatsToSession(STATS_KEY + uuid, allStats); - } - - /** - * Reads all the stats stored in the session (across all keys) and aggregates them. - * - * @return aggregated stats - */ - FileStats.Aggregate calculateFinalStats() { - List allStats = new ArrayList<>(); - for (Object eachKey : session.getUserProperties().keySet()) { - if (eachKey instanceof String && ((String) eachKey).startsWith(STATS_KEY)) { - allStats.addAll(readStatsFromSession((String) eachKey)); - } - } - return FileStats.aggregate(allStats); - } - - /** - * Reads the stats that have been persisted to the Maven session - * - * @param key the key where the stats are stored in the session - * - * @return the stats currently stored in the Maven session - */ - private List readStatsFromSession(String key) { - List sessionStats = new ArrayList<>(); - try { - final ObjectMapper mapper = new ObjectMapper(); - final String json = (String) session.getUserProperties().get(key); - if (!StringUtils.isEmpty(json)) { - sessionStats = mapper.readValue(json, new TypeReference<>() {}); - } - } catch (JsonProcessingException e) { - if (isStatsReportingEnabled()) { - throw new RuntimeException("Unable to get generation stats from maven session", e); - } - } - return sessionStats; - } - - /** - * Persists the statistics recorded thus far to the Maven session - * - * @param key the key where the stats should be stored in the session - * @param stats the stats to store in the session - */ - private void writeStatsToSession(String key, List stats) { - try { - final ObjectMapper mapper = new ObjectMapper(); - String json = mapper.writeValueAsString(stats); - session.getUserProperties().setProperty(key, json); - } catch (JsonProcessingException e) { - throw new RuntimeException("Failed to persist updated generation statistics", e); - } - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/reporting/StatsCollectingWriter.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/reporting/StatsCollectingWriter.java deleted file mode 100644 index 026b7f76..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/reporting/StatsCollectingWriter.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.technologybrewery.fermenter.mda.reporting; - -import java.io.File; -import java.io.Writer; - -/** - * A {@link Writer} to be used with a {@link org.apache.velocity.Template} to capture statistics about the final result - * of template expansion. - */ -public final class StatsCollectingWriter extends Writer { - private final StatisticsService statisticsService; - private final FileStats stats; - - public StatsCollectingWriter(StatisticsService statisticsService, File destination) { - this.statisticsService = statisticsService; - stats = new FileStats(destination.getAbsolutePath()); - } - - @Override - public void write(char cbuf[], int off, int len) { - stats.addBytesWritten(len); - long lines = 0; - for (int i = 0; i < len; i++) { - char c = cbuf[i+off]; - if (c == '\n') { - lines++; - } - } - stats.addLinesWritten(lines); - } - - @Override - public void flush() { - } - - @Override - public void close() { - statisticsService.updateGeneratedFileStats(stats); - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/util/JsonUtils.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/util/JsonUtils.java deleted file mode 100644 index b64087b5..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/util/JsonUtils.java +++ /dev/null @@ -1,178 +0,0 @@ -package org.technologybrewery.fermenter.mda.util; - -import java.io.File; -import java.net.URL; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.technologybrewery.fermenter.mda.element.ValidatedElement; -import org.technologybrewery.fermenter.mda.generator.GenerationException; -import org.technologybrewery.fermenter.mda.metamodel.DefaultModelInstanceRepository; -import org.technologybrewery.fermenter.mda.metamodel.element.Enum; -import org.technologybrewery.fermenter.mda.metamodel.element.EnumElement; -import org.technologybrewery.fermenter.mda.metamodel.element.Field; -import org.technologybrewery.fermenter.mda.metamodel.element.FieldElement; -import org.technologybrewery.fermenter.mda.metamodel.element.Message; -import org.technologybrewery.fermenter.mda.metamodel.element.MessageElement; -import org.technologybrewery.fermenter.mda.metamodel.element.MessageGroup; -import org.technologybrewery.fermenter.mda.metamodel.element.MessageGroupElement; -import org.technologybrewery.fermenter.mda.metamodel.element.Operation; -import org.technologybrewery.fermenter.mda.metamodel.element.OperationElement; -import org.technologybrewery.fermenter.mda.metamodel.element.Parameter; -import org.technologybrewery.fermenter.mda.metamodel.element.ParameterElement; -import org.technologybrewery.fermenter.mda.metamodel.element.Parent; -import org.technologybrewery.fermenter.mda.metamodel.element.ParentElement; -import org.technologybrewery.fermenter.mda.metamodel.element.Reference; -import org.technologybrewery.fermenter.mda.metamodel.element.ReferenceElement; -import org.technologybrewery.fermenter.mda.metamodel.element.Relation; -import org.technologybrewery.fermenter.mda.metamodel.element.RelationElement; -import org.technologybrewery.fermenter.mda.metamodel.element.Return; -import org.technologybrewery.fermenter.mda.metamodel.element.ReturnElement; -import org.technologybrewery.fermenter.mda.metamodel.element.Validation; -import org.technologybrewery.fermenter.mda.metamodel.element.ValidationElement; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.module.SimpleModule; -import com.github.fge.jsonschema.SchemaVersion; -import com.github.fge.jsonschema.cfg.ValidationConfiguration; -import com.github.fge.jsonschema.core.report.ProcessingMessage; -import com.github.fge.jsonschema.core.report.ProcessingReport; -import com.github.fge.jsonschema.main.JsonSchemaFactory; -import com.github.fge.jsonschema.main.JsonValidator; - -/** - * Contains json utilities for Fermenter. - */ -public final class JsonUtils { - - private static final Log LOG = LogFactory.getLog(JsonUtils.class); - - private static final JsonUtils singletonInstance = new JsonUtils(); - - private ObjectMapper cachedObjectMapper; - - private JsonUtils() { - } - - /** - * Read a Json stream and validate it based on the pass type. - * - * @param jsonUrl - * stream to read - * @param class1 - * type to validate against - * @return instance of the type or a {@link GenerationException} - */ - public static T readAndValidateJsonByUrl(URL jsonUrl, Class type) { - try { - ObjectMapper objectMapper = singletonInstance.cachedObjectMapper; - T instance = objectMapper.readValue(jsonUrl, type); - boolean valid = isValid(objectMapper.readTree(jsonUrl), instance, new File(jsonUrl.getFile())); - if (!valid) { - if (LOG.isDebugEnabled()) { - LOG.debug(objectMapper.writeValueAsString(instance)); - } - throw new GenerationException(jsonUrl.toExternalForm() + " contained validation errors!"); - } - return instance; - - } catch (Exception e) { - throw new GenerationException("Problem reading json file: " + jsonUrl.toExternalForm(), e); - } - } - - /** - * Read a Json file and validate it based on the pass type. - * - * @param jsonFile - * file to read - * @param type - * type to validate against - * @return instance of the type or a {@link GenerationException} - */ - public static T readAndValidateJson(File jsonFile, Class type) { - try { - ObjectMapper objectMapper = singletonInstance.cachedObjectMapper; - T instance = objectMapper.readValue(jsonFile, type); - boolean valid = isValid(objectMapper.readTree(jsonFile), instance, jsonFile); - if (!valid) { - if (LOG.isDebugEnabled()) { - LOG.debug(objectMapper.writeValueAsString(instance)); - } - throw new GenerationException(jsonFile.getName() + " contained validation errors!"); - } - return instance; - - } catch (Exception e) { - throw new GenerationException("Problem reading json file: " + jsonFile, e); - } - } - - private static boolean isValid(JsonNode jsonInstance, T instance, File jsonFile) - throws Exception { - ProcessingReport report = null; - - ObjectMapper objectMapper = singletonInstance.cachedObjectMapper; - final ValidationConfiguration cfg = ValidationConfiguration.newBuilder() - .setDefaultVersion(SchemaVersion.DRAFTV4).freeze(); - JsonValidator validator = JsonSchemaFactory.newBuilder().setValidationConfiguration(cfg).freeze() - .getValidator(); - URL targetSchemaUrl = instance.getJsonSchemaUrl(); - JsonNode targetSchemaAsJsonNode = objectMapper.readTree(targetSchemaUrl); - - report = validator.validate(targetSchemaAsJsonNode, jsonInstance); - - if (!report.isSuccess()) { - for (ProcessingMessage processingMessage : report) { - LOG.error(" " + jsonFile.getName() + " contains the following error:\n" + processingMessage); - - } - } - - return report.isSuccess(); - } - - /** - * Allows the object mapper to be customized for extension purposes. If you are extending - * {@link DefaultModelInstanceRepository}, then you should call likely call getObjectMapper() first, then add on to - * it. If not, you will likely want to override with your object custom {@link ObjectMapper}. - * - * @param objectMapper - * {@link ObjectMapper} for loaded json files to use - */ - public static void setObjectMapper(ObjectMapper objectMapper) { - singletonInstance.cachedObjectMapper = objectMapper; - } - - /** - * Returns an {@link ObjectMapper} that has configurations for fermenter metamodel interfaces. - * - * @return ObjectMapper singleton - */ - public static ObjectMapper getObjectMapper() { - if (singletonInstance.cachedObjectMapper == null) { - - SimpleModule module = new SimpleModule(); - module.addAbstractTypeMapping(Enum.class, EnumElement.class); - module.addAbstractTypeMapping(Operation.class, OperationElement.class); - module.addAbstractTypeMapping(Return.class, ReturnElement.class); - module.addAbstractTypeMapping(Parameter.class, ParameterElement.class); - module.addAbstractTypeMapping(Parent.class, ParentElement.class); - module.addAbstractTypeMapping(Field.class, FieldElement.class); - module.addAbstractTypeMapping(Validation.class, ValidationElement.class); - module.addAbstractTypeMapping(Reference.class, ReferenceElement.class); - module.addAbstractTypeMapping(Relation.class, RelationElement.class); - module.addAbstractTypeMapping(MessageGroup.class, MessageGroupElement.class); - module.addAbstractTypeMapping(Message.class, MessageElement.class); - - ObjectMapper localMapper = new ObjectMapper(); - localMapper.registerModule(module); - - singletonInstance.cachedObjectMapper = localMapper; - } - - return singletonInstance.cachedObjectMapper; - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/util/MessageTracker.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/util/MessageTracker.java deleted file mode 100644 index 55ed85ed..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/util/MessageTracker.java +++ /dev/null @@ -1,149 +0,0 @@ -package org.technologybrewery.fermenter.mda.util; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.logging.Log; -import org.technologybrewery.fermenter.mda.GenerateSourcesHelper; - -/** - * Simple tracking class to allow bulk collection and reporting of error messages during the generation process. This - * allows us to collect a maximum number of issues without stopping the generation process and forcing multiple - * executions to work through errors one at a time. - */ -public class MessageTracker { - - private static ThreadLocal threadBoundInstance = ThreadLocal.withInitial(MessageTracker::new); - - boolean hasErrors; - private List orderedMessages = new ArrayList<>(); - - private MessageTracker() { - // private constructor to prevent instantiation - } - - /** - * Returns the singleton instance of this class. - * - * @return - */ - public static MessageTracker getInstance() { - return threadBoundInstance.get(); - } - - public static void cleanUp() { - threadBoundInstance.remove(); - } - - /** - * Clears the contents of the tracker. - */ - public void clear() { - hasErrors = false; - orderedMessages.clear(); - } - - /** - * Adds an error message to the tracker. - * - * @param errorMessage - * The message to add - */ - public void addErrorMessage(String errorMessage) { - orderedMessages.add(new ErrorMessage(errorMessage)); - hasErrors = true; - } - - /** - * Adds a warning message to the tracker. - * - * @param warningMessage - * The message to add - */ - public void addWarningMessage(String warningMessage) { - orderedMessages.add(new WarningMessage(warningMessage)); - } - - /** - * Returns whether or not errors have been added to the tracker. - * - * @return true if error exist - */ - public boolean hasErrors() { - return hasErrors; - } - - /** - * Logs all messages that have been encountered to the provided commons-logging {@link Log}. - * - * @param log - * commons-logging {@link Log} to use for logging collected messages. - */ - public void emitMessages(Log log) { - for (Message message : orderedMessages) { - message.log(log); - } - } - - /** - * Logs all messages that have been encountered to the provided {@link GenerateSourcesHelper.LoggerDelegate}, which further delegates - * logging to the build tool specific logger. - * - * @param loggerDelegate - * build tool specific logging implementation to which logging will be delegated. - */ - public void emitMessages(GenerateSourcesHelper.LoggerDelegate loggerDelegate) { - for (Message message : orderedMessages) { - message.log(loggerDelegate); - } - } - - abstract class Message { - - protected String value; - - public Message(String value) { - this.value = value; - } - - abstract void log(Log log); - - abstract void log(GenerateSourcesHelper.LoggerDelegate log); - } - - class WarningMessage extends Message { - - public WarningMessage(String value) { - super(value); - } - - @Override - void log(Log log) { - log.warn(value); - } - - @Override - void log(GenerateSourcesHelper.LoggerDelegate log) { - log.log(GenerateSourcesHelper.LoggerDelegate.LogLevel.WARN, value); - } - - } - - class ErrorMessage extends Message { - - public ErrorMessage(String value) { - super(value); - } - - @Override - void log(Log log) { - log.error(value); - } - - @Override - void log(GenerateSourcesHelper.LoggerDelegate log) { - log.log(GenerateSourcesHelper.LoggerDelegate.LogLevel.ERROR, value); - } - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/util/PriorityMessage.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/util/PriorityMessage.java deleted file mode 100644 index 0be6dbb3..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/util/PriorityMessage.java +++ /dev/null @@ -1,90 +0,0 @@ -package org.technologybrewery.fermenter.mda.util; - -/** - * An important message to be replayed to the user after the build. - */ -public class PriorityMessage { - private String message; - private String filePath; - private static final String EMPTY_LINE = "\n"; - - /** - * Default constructor for {@link PriorityMessage} with no arguments needed for serialization/deserialization. - */ - public PriorityMessage() { this(null, null); } - - /** - * Custom constructor for {@link PriorityMessage} that takes the message as an argument - * @param message - * {@link String} message - */ - public PriorityMessage(String message) { this(message, null); } - - /** - * Custom constructor for {@link PriorityMessage} that takes the message and file path as arguments - * @param message - * {@link String} message - * @param filePath - * {@link String} associated file path - */ - public PriorityMessage(String message, String filePath) { - this.message = message; - this.filePath = filePath; - } - - /** - * Creates a string representation of the {@link PriorityMessage} including the optional metadata when applicable. - * @return - * {@link String} representation of the message. - */ - @Override - public String toString() { - final StringBuilder finalMessage = new StringBuilder(); - - //adds the optional file path to the message if there is one - if (filePath != null && !filePath.isBlank()) { - finalMessage.append(filePath + ":" + EMPTY_LINE); - } - - finalMessage.append(this.message); - finalMessage.append(EMPTY_LINE); - - return finalMessage.toString(); - } - - /** - * Sets the message to be replayed to the user. - * @param message - * {@link String} message - */ - public void setMessage(String message) { - this.message = message; - } - - /** - * Returns the message to be replayed to the user. - * @return - * {@link String} message - */ - public String getMessage() { - return message; - } - - /** - * Sets the optional file path associated with the message. - * @param - * {@link String} filePath - */ - public void setFilePath(String filePath) { - this.filePath = filePath; - } - - /** - * Returns the optional file path associated with the message. - * @return - * {@link String} filepath - */ - public String getFilePath() { - return filePath; - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/util/PriorityMessageExecution.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/util/PriorityMessageExecution.java deleted file mode 100644 index 22b7757a..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/util/PriorityMessageExecution.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.technologybrewery.fermenter.mda.util; - -import org.apache.maven.AbstractMavenLifecycleParticipant; -import org.apache.maven.execution.MavenSession; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.inject.Named; -import javax.inject.Singleton; -import java.util.List; - -/** - * Class that extends {@link AbstractMavenLifecycleParticipant} and overrides the afterSessionEnd function. This allows - * for {@link PriorityMessage}'s to be replayed at the end of the maven build output. - */ -@Named -@Singleton -public class PriorityMessageExecution extends AbstractMavenLifecycleParticipant { - private static final Logger logger = LoggerFactory.getLogger(PriorityMessageExecution.class); - private static final String PRIORITYMESSAGES = "PriorityMessages"; - private static final String DIVIDER = "***********************************************************************\n"; - private static final String HEADER = "*** Fermenter High Priority Messages ***\n"; - private static final String EMPTY_LINE = "\n"; - - /** - * Override of the afterSessionEnd class from {@link AbstractMavenLifecycleParticipant}. This method is - * called after the maven build completes. This implementation loads all the {@link PriorityMessage}'s - * stored in the {@link MavenSession} and replays them to the user. - * @param session - * {@link MavenSession} used for retrieving the {@link PriorityMessage}'s from the user properties. - */ - @Override - public void afterSessionEnd(final MavenSession session) { - List messages = PriorityMessageService.getPriorityMessages(session); - - if (messages.size() > 0) { - final StringBuilder logMessage = new StringBuilder(); - logMessage.append(EMPTY_LINE); - logMessage.append(DIVIDER); - logMessage.append(HEADER); - logMessage.append(DIVIDER); - - messages.stream() - .map(Object::toString) - .forEach( message -> { - logMessage.append(message); - logMessage.append(EMPTY_LINE); - }); - - logMessage.append(DIVIDER); - logMessage.append(DIVIDER); - - logger.warn(logMessage.toString()); - session.getUserProperties().put(PRIORITYMESSAGES, ""); - } - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/util/PriorityMessageService.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/util/PriorityMessageService.java deleted file mode 100644 index 356dc839..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/util/PriorityMessageService.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.technologybrewery.fermenter.mda.util; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; - -import org.apache.commons.lang3.StringUtils; -import org.apache.maven.execution.MavenSession; -import org.apache.maven.plugin.internal.DefaultLegacySupport; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.List; - -/** - * Class to aid in adding and retrieving {@link PriorityMessage}'s to and from the {@link MavenSession}. - */ -public class PriorityMessageService { - private static final Logger logger = LoggerFactory.getLogger(PriorityMessageService.class); - private static final String PRIORITYMESSAGES = "PriorityMessages"; - private MavenSession session; - - /** - * Constructor that automatically sets the {@link MavenSession} to the current one. - */ - public PriorityMessageService() { - this.session = new DefaultLegacySupport().getSession(); - } - - /** - * Constructor used for testing to allow a different {@link MavenSession}. - * @param session - * {@link MavenSession} used for testing. - */ - public PriorityMessageService(MavenSession session) { - this.session = session; - } - - /** - * Method for adding a {@link PriorityMessage} to the associated {@link MavenSession}. - * @param priorityMessage - * {@link PriorityMessage} for storing the message to be replayed and its associated metadata. - */ - public void addPriorityMessage(final PriorityMessage priorityMessage) { - try { - final List messages = getPriorityMessages(this.session); - messages.add(priorityMessage); - - final ObjectMapper mapper = new ObjectMapper(); - final String json = mapper.writeValueAsString(messages); - this.session.getUserProperties().put(PRIORITYMESSAGES, json); - - } catch (JsonProcessingException e) { - logger.error("Unable to set priority message", e); - } - } - - /** - * Method for retrieving the current {@link PriorityMessage}'s from the {@link MavenSession} - * @param session - * {@link MavenSession} used for retrieving the {@link PriorityMessage}'s. - * @return - * {@link List} containing all the {@link PriorityMessage}'s found in the provided {@link MavenSession}. - */ - public static List getPriorityMessages(final MavenSession session) { - try { - final ObjectMapper mapper = new ObjectMapper(); - final String json = (String) session.getUserProperties().get(PRIORITYMESSAGES); - if (!StringUtils.isEmpty(json)) { - return mapper.readValue(json, new TypeReference>() {}); - } - } catch (JsonProcessingException e) { - logger.error("Unable to get priority messages", e); - } - return new ArrayList(); - } -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/xml/LoggingErrorHandler.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/xml/LoggingErrorHandler.java deleted file mode 100644 index 4b7d7c63..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/xml/LoggingErrorHandler.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.technologybrewery.fermenter.mda.xml; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.xml.sax.ErrorHandler; -import org.xml.sax.SAXException; -import org.xml.sax.SAXParseException; - -/** - * An ErrorHandler instance that records parsing events to a logger. - * This Commons Logging logger can be specified or defaulted the logger of - * this class. - */ -public class LoggingErrorHandler implements ErrorHandler { - - private Log log = LogFactory.getLog(LoggingErrorHandler.class); - private String fileName; - - /** - * New instance to log parser events - */ - public LoggingErrorHandler() { - } - - /** - * Creates a new instance that will use the passed logger to record - * parser errors. - * @param logInstance - */ - public LoggingErrorHandler(Log logInstance) { - if (log != null) { - this.log = logInstance; - } - } - - /** - * @see org.xml.sax.ErrorHandler#error(org.xml.sax.SAXParseException) - */ - public void error(SAXParseException spe) throws SAXException { - if (log.isErrorEnabled()) { - String msg = createLogMessage(spe); - log.error(msg); - } - - } - - /** - * @see org.xml.sax.ErrorHandler#fatalError(org.xml.sax.SAXParseException) - */ - public void fatalError(SAXParseException spe) throws SAXException { - if (log.isFatalEnabled()) { - String msg = createLogMessage(spe); - log.fatal(msg, spe); - } - - } - - /** - * @see org.xml.sax.ErrorHandler#warning(org.xml.sax.SAXParseException) - */ - public void warning(SAXParseException spe) throws SAXException { - if (log.isWarnEnabled()) { - String msg = createLogMessage(spe); - log.warn(msg); - } - - } - - /** - * Allows for the optional setting of file names to allow for more useful - * debug messages. If this is set, then the error handler is not thread - * safe. - * @param fileName The name of the file to use in output messages. - */ - public void setFileName(String fileName) { - this.fileName = fileName; - } - - protected String createLogMessage(SAXParseException spe) { - int lineNumber = spe.getLineNumber(); - int columnNumber = spe.getColumnNumber(); - String message = spe.getMessage(); - - StringBuffer sb = new StringBuffer(150); - sb.append("A parsing error occurred "); - if (!StringUtils.isBlank(fileName)) { - sb.append("in file '").append(fileName).append("' "); - } - sb.append("on line '").append(lineNumber). - append("' and column number '").append(columnNumber). - append("' - ").append(message); - - return sb.toString(); - } - -} diff --git a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/xml/TrackErrorsErrorHandler.java b/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/xml/TrackErrorsErrorHandler.java deleted file mode 100644 index 744e2f24..00000000 --- a/fermenter-mda/src/main/java/org/technologybrewery/fermenter/mda/xml/TrackErrorsErrorHandler.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.technologybrewery.fermenter.mda.xml; - -import org.apache.commons.logging.Log; -import org.xml.sax.SAXException; -import org.xml.sax.SAXParseException; - -public class TrackErrorsErrorHandler extends LoggingErrorHandler { - - private boolean errorsOccurred = false; - - public TrackErrorsErrorHandler(Log log) { - super(log); - } - - public void error(SAXParseException spe) throws SAXException { - super.error(spe); - setErrorsOccurred(); - } - - public void fatalError(SAXParseException spe) throws SAXException { - super.fatalError(spe); - setErrorsOccurred(); - } - - private void setErrorsOccurred() { - errorsOccurred = true; - } - - public boolean haveErrorsOccurred() { - return errorsOccurred; - } - -} diff --git a/fermenter-mda/src/main/resources/fermenter-2-entity-schema.json b/fermenter-mda/src/main/resources/fermenter-2-entity-schema.json deleted file mode 100644 index 3425a059..00000000 --- a/fermenter-mda/src/main/resources/fermenter-2-entity-schema.json +++ /dev/null @@ -1,186 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id": "#entity", - "title": "Entity", - "type": "object", - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "package": { - "type": "string" - }, - "documentation": { - "type": "string" - }, - "table": { - "type": "string" - }, - "transient": { - "type": "boolean" - }, - "parent": { - "type": "object", - "properties": { - "package": { - "type": "string" - }, - "type": { - "type": "string" - }, - "inheritanceStrategy": { - "type": "string" - } - }, - "required": [ - "type" - ] - }, - "identifier": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "package": { - "type": "string" - }, - "type": { - "type": "string" - }, - "column": { - "type": "string" - }, - "documentation": { - "type": "string" - }, - "generator": { - "type": "string" - } - }, - "required": [ - "name","type" - ] - }, - "fields": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "package": { - "type": "string" - }, - "type": { - "type": "string" - }, - "validation": { - "type": "object", - "properties": { - "maxLength": { - "type": "integer" - }, - "minLength": { - "type": "integer" - }, - "maxValue": { - "type": "string" - }, - "minValue": { - "type": "string" - }, - "scale": { - "type": "integer" - }, - "formats": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "column": { - "type": "string" - }, - "documentation": { - "type": "string" - }, - "required": { - "type": "boolean" - }, - "transient": { - "type": "boolean" - }, - "defaultValue": { - "type": "string" - } - }, - "required": [ - "name","type" - ] - } - }, - "references": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "type": { - "type": "string" - }, - "package": { - "type": "string" - }, - "localColumn": { - "type": "string" - }, - "documentation": { - "type": "string" - }, - "required": { - "type": "boolean" - } - }, - "required": [ - "name","type" - ] - } - }, - "relations": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "package": { - "type": "string" - }, - "documentation": { - "type": "string" - }, - "multiplicity": { - "type": "string" - }, - "fetchMode": { - "type": "string" - } - }, - "required": [ - "name","type" - ] - } - } - }, - "required": [ - "name", "package" - ] -} \ No newline at end of file diff --git a/fermenter-mda/src/main/resources/fermenter-2-enumeration-schema.json b/fermenter-mda/src/main/resources/fermenter-2-enumeration-schema.json deleted file mode 100644 index fb180398..00000000 --- a/fermenter-mda/src/main/resources/fermenter-2-enumeration-schema.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id": "#enumeration", - "title": "Enumeration", - "type": "object", - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "package": { - "type": "string" - }, - "enums": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "integer" - } - } - }, - "required": [ - "name" - ] - } - }, - "required": [ - "name", "package" - ] -} \ No newline at end of file diff --git a/fermenter-mda/src/main/resources/fermenter-2-family-schema.json b/fermenter-mda/src/main/resources/fermenter-2-family-schema.json deleted file mode 100644 index ec1d3bd3..00000000 --- a/fermenter-mda/src/main/resources/fermenter-2-family-schema.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id": "#family", - "title": "Family", - "type": "object", - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "profileReferences": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - } - }, - "required": [ - "name" - ] - } - }, - "required": [ - "name" - ] -} \ No newline at end of file diff --git a/fermenter-mda/src/main/resources/fermenter-2-message-group-schema.json b/fermenter-mda/src/main/resources/fermenter-2-message-group-schema.json deleted file mode 100644 index ec0e12d9..00000000 --- a/fermenter-mda/src/main/resources/fermenter-2-message-group-schema.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id": "#messageGroup", - "title": "MessageGroup", - "type": "object", - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "package": { - "type": "string" - }, - "messages": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "text": { - "type": "string" - } - } - }, - "required": [ - "key", "text" - ] - } - }, - "required": [ - "name", "package" - ] -} \ No newline at end of file diff --git a/fermenter-mda/src/main/resources/fermenter-2-profile-schema.json b/fermenter-mda/src/main/resources/fermenter-2-profile-schema.json deleted file mode 100644 index ffc9ba81..00000000 --- a/fermenter-mda/src/main/resources/fermenter-2-profile-schema.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id": "#profile", - "title": "Profile", - "type": "object", - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "targetReferences": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - } - }, - "required": [ - "name" - ] - }, - "profileReferences": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - } - }, - "required": [ - "name" - ] - },"familyReferences": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - } - }, - "required": [ - "name" - ] - }, - "deprecated": { - "type": "boolean" - }, - "warningMessage": { - "type": ["string", "null"] - } - }, - "required": [ - "name" - ] -} diff --git a/fermenter-mda/src/main/resources/fermenter-2-rule-schema.json b/fermenter-mda/src/main/resources/fermenter-2-rule-schema.json deleted file mode 100644 index b6d00cc2..00000000 --- a/fermenter-mda/src/main/resources/fermenter-2-rule-schema.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id": "#rule", - "title": "Rule", - "type": "object", - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "package": { - "type": "string" - }, - "documentation": { - "type": "string" - }, - "defaultStatement": { - "type": "string" - }, - "defaultProcessing": { - "type": "string" - }, - "operations": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "documentation": { - "type": "string" - }, - "transactionAttribute": { - "type": "string" - }, - "compressedWithGzip": { - "type": "boolean" - } - }, - "return": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "package": { - "type": "string" - }, - "many": { - "type": "boolean" - }, - "responseEncoding": { - "type": "string" - } - }, - "required": [ - "type" - ] - }, - "parameters": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "type": { - "type": "string" - }, - "package": { - "type": "string" - }, - "defaultStatement": { - "type": "string" - }, - "many": { - "type": "boolean" - }, - "documentation": { - "type": "string" - } - }, - "required": [ - "name", "type" - ] - } - } - }, - "required": [ - "name", "return" - ] - } - }, - "required": [ - "name", "package", "operations" - ] -} \ No newline at end of file diff --git a/fermenter-mda/src/main/resources/fermenter-2-service-schema.json b/fermenter-mda/src/main/resources/fermenter-2-service-schema.json deleted file mode 100644 index edd3dec7..00000000 --- a/fermenter-mda/src/main/resources/fermenter-2-service-schema.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id": "#service", - "title": "Service", - "type": "object", - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "package": { - "type": "string" - }, - "documentation": { - "type": "string" - }, - "operations": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "documentation": { - "type": "string" - }, - "transactionAttribute": { - "type": "string" - }, - "compressedWithGzip": { - "type": "boolean" - } - }, - "return": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "package": { - "type": "string" - }, - "many": { - "type": "boolean" - }, - "responseEncoding": { - "type": "string" - } - }, - "required": [ - "type" - ] - }, - "parameters": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "type": { - "type": "string" - }, - "package": { - "type": "string" - }, - "many": { - "type": "boolean" - }, - "documentation": { - "type": "string" - } - }, - "required": [ - "name", "type" - ] - } - } - }, - "required": [ - "name", "return" - ] - } - }, - "required": [ - "name", "package", "operations" - ] -} \ No newline at end of file diff --git a/fermenter-mda/src/main/resources/fermenter-2-target-schema.json b/fermenter-mda/src/main/resources/fermenter-2-target-schema.json deleted file mode 100644 index b26b7d47..00000000 --- a/fermenter-mda/src/main/resources/fermenter-2-target-schema.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id":"#target", - "title": "Target", - "type": "object", - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "templateName": { - "type": "string" - }, - "outputFile": { - "type": "string" - }, - "generator": { - "type": "string" - }, - "metadataContext": { - "type": ["string", "null"] - }, - "overwritable": { - "type": ["boolean", "null"] - }, - "artifactType": { - "type": ["string", "null"] - } - }, - "required": ["name", "templateName", "outputFile", "generator"] -} \ No newline at end of file diff --git a/fermenter-mda/src/main/resources/fermenter-2-type-dictionary-schema.json b/fermenter-mda/src/main/resources/fermenter-2-type-dictionary-schema.json deleted file mode 100644 index bd71f6ae..00000000 --- a/fermenter-mda/src/main/resources/fermenter-2-type-dictionary-schema.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id":"#typeDictionary", - "title": "TypeDictionary", - "type": "object", - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "type": { - "type": "string" - }, - "description": { - "type": ["string", "null"] - }, - "minLength": { - "type": ["integer", "null"] - }, - "maxLength": { - "type": ["integer", "null"] - }, - "formats": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": ["name", "type"] -} \ No newline at end of file diff --git a/fermenter-mda/src/main/resources/fermenter-2-type-schema.json b/fermenter-mda/src/main/resources/fermenter-2-type-schema.json deleted file mode 100644 index 1878af03..00000000 --- a/fermenter-mda/src/main/resources/fermenter-2-type-schema.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id":"#type", - "title": "Type", - "type": "object", - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "fullyQualifiedImplementation": { - "type": "string" - }, - "shortImplementation": { - "type": "string" - } - }, - "required": ["name"] -} \ No newline at end of file diff --git a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/LanguageSpecificPluginConfigSteps.java b/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/LanguageSpecificPluginConfigSteps.java deleted file mode 100644 index cd1c2476..00000000 --- a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/LanguageSpecificPluginConfigSteps.java +++ /dev/null @@ -1,88 +0,0 @@ -package org.technologybrewery.fermenter.mda; - -import cucumber.api.java.After; -import cucumber.api.java.Before; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; -import org.apache.maven.plugin.MojoExecutionException; -import org.junit.Assert; - -import java.io.File; -import java.io.IOException; - -public class LanguageSpecificPluginConfigSteps { - - private MojoTestCaseWrapper mojoTestCase = new MojoTestCaseWrapper(); - - protected File mavenProjectBaseDir; - - protected GenerateSourcesMojo generateSourcesMojo; - - private boolean validationFailure; - - @Before("@languageSpecificPluginConfig") - public void configureMavenPluginTestHarness() throws Exception { - mojoTestCase.configurePluginTestHarness(); - } - - @After("@languageSpecificPluginConfig") - public void tearDownMavenPluginTestHarness() throws Exception { - mojoTestCase.tearDownPluginTestHarness(); - } - - @Given("^a Maven project named \"([^\"]*)\" with Fermenter Maven plugin configuration$") - public void a_Maven_project_named_with_Fermenter_Maven_plugin_configuration(String projectName) throws Throwable { - mavenProjectBaseDir = new File("src/test/resources/plugin-testing-harness-pom-files/", projectName); - } - - @When("^the project's pom\\.xml is processed$") - public void the_project_s_pom_xml_is_processed() throws Throwable { - generateSourcesMojo = (GenerateSourcesMojo) mojoTestCase.lookupConfiguredMojo(new File(mavenProjectBaseDir, "pom.xml"), "generate-sources"); - generateSourcesMojo.updateMojoConfigsBasedOnLanguage(); - } - - @When("^the Fermenter Maven plugin configuration is validated$") - public void the_Fermenter_Maven_plugin_configuration_is_validated() throws Throwable { - generateSourcesMojo.validateMojoConfigs(); - } - - @Then("^Fermenter Maven plugin uses \"([^\"]*)\" as the main source root folder, \"([^\"]*)\" as the generated source root folder, and \"([^\"]*)\" as the base package$") - public void fermenter_Maven_plugin_uses_as_the_main_source_root_folder_as_the_generated_source_root_folder_and_as_the_base_package(String mainSourceRoot, String generatedSourceRoot, String namespace) throws Throwable { - validatePluginConfig(generateSourcesMojo.getMainSourceRoot(), - new File(mavenProjectBaseDir, mainSourceRoot), "mainSourceRoot"); - validatePluginConfig(generateSourcesMojo.getGeneratedSourceRoot(), - new File(mavenProjectBaseDir, generatedSourceRoot), "generatedSourceRoot"); - Assert.assertEquals("Namespace/base package did not match the expected value", namespace, - generateSourcesMojo.getBasePackage()); - } - - @Then("^Fermenter Maven plugin uses \"([^\"]*)\" as the local metadata root folder$") - public void fermenter_Maven_plugin_uses_as_the_local_metadata_root_folder(String localMetadataRoot) throws Throwable { - // Write code here that turns the phrase above into concrete actions - validatePluginConfig(generateSourcesMojo.getLocalMetadataRoot(), - new File(mavenProjectBaseDir, localMetadataRoot), "localMetadataRoot"); - } - - protected void validatePluginConfig(File actualPluginConfigFile, File expectedPluginConfigFile, String configDescription) throws IOException { - Assert.assertNotNull(String.format("%s was unexpectedly null", configDescription), actualPluginConfigFile); - Assert.assertEquals(String.format("%s path did not equal expected value", configDescription), - expectedPluginConfigFile.getCanonicalPath(), actualPluginConfigFile.getCanonicalPath()); - } - - @When("^the invalid Fermenter Maven plugin configuration is attempted to be validated$") - public void the_invalid_Fermenter_Maven_plugin_configuration_is_attempted_to_be_validated() throws Throwable { - try { - generateSourcesMojo.validateMojoConfigs(); - validationFailure = false; - } catch (MojoExecutionException e) { - validationFailure = true; - } - } - - @Then("^a validation error is detected$") - public void a_validation_error_is_detected() throws Throwable { - Assert.assertEquals("No validation error was detected", true, validationFailure); - } - -} diff --git a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/MojoTestCaseWrapper.java b/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/MojoTestCaseWrapper.java deleted file mode 100644 index 8d92d161..00000000 --- a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/MojoTestCaseWrapper.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.technologybrewery.fermenter.mda; - -import org.apache.maven.DefaultMaven; -import org.apache.maven.Maven; -import org.apache.maven.execution.*; -import org.apache.maven.plugin.Mojo; -import org.apache.maven.plugin.testing.AbstractMojoTestCase; -import org.apache.maven.project.MavenProject; -import org.apache.maven.project.ProjectBuilder; -import org.apache.maven.project.ProjectBuildingRequest; -import org.apache.maven.session.scope.internal.SessionScope; -import org.eclipse.aether.DefaultRepositorySystemSession; -import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory; -import org.eclipse.aether.repository.LocalRepository; - -import java.io.File; -import java.util.Arrays; - -/** - * Wraps the default behavior provided by the Maven plugin testing harness through {@link AbstractMojoTestCase} to - * set standard Maven defaults on any {@link Mojo}s that are created and reduce the amount of mock stubs required. - *

- * This class is largely adapted from the testing approach developed by the license-audit-maven-plugin's - * {@code BetterAbstractMojoTestCase} (https://github.com/ahgittin/license-audit-maven-plugin) - */ -public class MojoTestCaseWrapper extends AbstractMojoTestCase { - public void configurePluginTestHarness() throws Exception { - super.setUp(); - } - - public void tearDownPluginTestHarness() throws Exception { - super.tearDown(); - } - - /** - * Creates a new {@link MavenSession} with standard defaults populated. - * - * @return - * @throws Exception - */ - public MavenSession newMavenSession() throws Exception { - MavenExecutionRequest request = new DefaultMavenExecutionRequest(); - MavenExecutionResult result = new DefaultMavenExecutionResult(); - - // Populates sensible defaults, including repository basedir and remote repos - MavenExecutionRequestPopulator populator = getContainer().lookup(MavenExecutionRequestPopulator.class); - populator.populateDefaults(request); - - // Enables the usage of Java system properties for interpolation and profile activation - request.setSystemProperties(System.getProperties()); - - // Ensures that the repo session in the maven session - // has a repo manager and it points at the local repo - DefaultMaven maven = (DefaultMaven) getContainer().lookup(Maven.class); - DefaultRepositorySystemSession repoSession = - (DefaultRepositorySystemSession) maven.newRepositorySession(request); - repoSession.setLocalRepositoryManager( - new SimpleLocalRepositoryManagerFactory().newInstance(repoSession, - new LocalRepository(request.getLocalRepository().getBasedir()))); - - @SuppressWarnings("deprecation") - MavenSession session = new MavenSession(getContainer(), - repoSession, - request, result); - return session; - - } - - /** - * Extends the parent implementation of this method to delegate to the new {@link #newMavenSession()} introduced - * in {@link MojoTestCaseWrapper}, which sets the defaults that are normally expected by Maven - */ - @Override - protected MavenSession newMavenSession(MavenProject project) { - MavenSession session; - try { - session = newMavenSession(); - // seed the session so it can be injected during initialization - SessionScope sessionScope = getContainer().lookup(SessionScope.class); - sessionScope.enter(); - sessionScope.seed(MavenSession.class, session); - } catch (Exception e) { - throw new RuntimeException(e); - } - session.setCurrentProject(project); - session.setProjects(Arrays.asList(project)); - return session; - } - - /** - * Creates and appropriately configures the {@link Mojo} responsible for executing the given - * plugin goal as defined within the given {@code pom.xml} {@link File}. - * - * @param pom {@code pom.xml} file defining desired plugin and configuration to test. - * @param goal target plugin goal for which to create the associated {@link Mojo} - * @return - * @throws Exception - */ - public Mojo lookupConfiguredMojo(File pom, String goal) throws Exception { - assertNotNull(pom); - assertTrue(pom.exists()); - - ProjectBuildingRequest buildingRequest = newMavenSession().getProjectBuildingRequest(); - ProjectBuilder projectBuilder = lookup(ProjectBuilder.class); - MavenProject project = projectBuilder.build(pom, buildingRequest).getProject(); - - return lookupConfiguredMojo(project, goal); - } -} diff --git a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/TestSpecifications.java b/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/TestSpecifications.java deleted file mode 100644 index 42dbd39c..00000000 --- a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/TestSpecifications.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.technologybrewery.fermenter.mda; - -import org.junit.runner.RunWith; - -import cucumber.api.CucumberOptions; -import cucumber.api.junit.Cucumber; - -/** - * Test harness to run Gherkin Business Driven Development specifications. - */ -@RunWith(Cucumber.class) -@CucumberOptions(features="src/test/resources/specifications", plugin="json:target/cucumber-html-reports/cucumber.json") -public class TestSpecifications { - -} diff --git a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/AbstractEntitySteps.java b/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/AbstractEntitySteps.java deleted file mode 100644 index 44a3d689..00000000 --- a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/AbstractEntitySteps.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import static org.junit.Assert.assertTrue; - -import java.io.File; -import java.io.IOException; -import java.util.Map; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.technologybrewery.fermenter.mda.generator.GenerationException; -import org.technologybrewery.fermenter.mda.metamodel.DefaultModelInstanceRepository; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceRepositoryManager; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceUrl; -import org.technologybrewery.fermenter.mda.metamodel.ModelRepositoryConfiguration; -import org.technologybrewery.fermenter.mda.metamodel.element.EntityElement; -import org.technologybrewery.fermenter.mda.util.MessageTracker; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.fasterxml.jackson.core.JsonGenerationException; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; - -public class AbstractEntitySteps { - - private static final Logger logger = LoggerFactory.getLogger(EntitySteps.class); - - protected ObjectMapper objectMapper = new ObjectMapper(); - protected File entitiesDirectory = new File("target/temp-metadata", "entities"); - protected MessageTracker messageTracker = MessageTracker.getInstance(); - - protected String currentBasePackage; - protected File entityFile; - protected GenerationException encounteredException; - protected DefaultModelInstanceRepository metadataRepo; - - protected void cleanUp() throws IOException { - messageTracker.clear(); - currentBasePackage = null; - - if (entitiesDirectory.exists()) { - FileUtils.forceDelete(entitiesDirectory); - } - } - - protected EntityElement createEntityElement(EntityElement entity) - throws IOException, JsonGenerationException, JsonMappingException, JsonProcessingException { - - entitiesDirectory.mkdirs(); - entityFile = new File(entitiesDirectory, entity.getName() + ".json"); - objectMapper.writeValue(entityFile, entity); - logger.debug(objectMapper.writeValueAsString(entity)); - assertTrue("Entities not written to file!", entityFile.exists()); - - currentBasePackage = entity.getPackage(); - - return entity; - } - - protected EntityElement createBaseEntity(String name, String packageName, String documentation) { - EntityElement entity = new EntityElement(); - if (StringUtils.isNotBlank(name)) { - entity.setName(name); - } - entity.setPackage(packageName); - entity.setDocumentation(documentation); - return entity; - } - - protected void readEntities() { - encounteredException = null; - - try { - ModelRepositoryConfiguration config = new ModelRepositoryConfiguration(); - config.setArtifactId("fermenter-mda"); - config.setBasePackage(currentBasePackage); - Map metadataUrlMap = config.getMetamodelInstanceLocations(); - metadataUrlMap.put("fermenter-mda", - new ModelInstanceUrl("fermenter-mda", entitiesDirectory.getParentFile().toURI().toString())); - - metadataRepo = new DefaultModelInstanceRepository(config); - ModelInstanceRepositoryManager.setRepository(metadataRepo); - metadataRepo.load(); - metadataRepo.validate(); - - } catch (GenerationException e) { - encounteredException = e; - } - } - -} diff --git a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/AdvancedProfileSteps.java b/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/AdvancedProfileSteps.java deleted file mode 100644 index 21b29dbf..00000000 --- a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/AdvancedProfileSteps.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import com.fasterxml.jackson.databind.ObjectMapper; -import cucumber.api.java.After; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; -import org.apache.commons.io.FileUtils; -import org.technologybrewery.fermenter.mda.util.JsonUtils; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import static org.junit.Assert.*; - -public class AdvancedProfileSteps { - - private ObjectMapper objectMapper = new ObjectMapper(); - private ArrayList foundProfiles = new ArrayList<>(); - private File familyFile; - private File profileFile; - - @After("@advancedProfile") - public void cleanUp() { - foundProfiles.clear(); - familyFile = null; - profileFile = null; - } - - @Given("^the following profiles and related targets:$") - public void the_following_profiles_and_related_targets(List inputs) throws Throwable { - String familyName; - String profileName; - - // need to call this to instantiate the singleton object mapper - JsonUtils.getObjectMapper(); - - for (FamilyInput input : inputs) { - profileName = input.getProfileName(); - familyName = input.getFamily(); - - Family family = new Family(); - family.setName(familyName); - ArrayList profileRefs = new ArrayList<>(); - ProfileReference ref = new ProfileReference(); - ref.setName(profileName); - profileRefs.add(ref); - family.setProfileReferences(profileRefs); - familyFile = new File(FileUtils.getTempDirectory(), familyName + "-family.json"); - objectMapper.writeValue(familyFile, family); - System.out.println("Wrote to " + familyFile.getAbsolutePath()); - assertTrue("Family not written to file!", familyFile.exists()); - - Profile profile = new Profile(); - profile.setName(profileName); - profileFile = new File(FileUtils.getTempDirectory(), profileName + "-profile.json"); - objectMapper.writeValue(profileFile, profile); - } - - } - - @When("^implementations for \"([^\"]*)\" are requested$") - public void implementations_for_are_requested(String requestedFamily) throws Throwable { - String fileName = requestedFamily + "-family.json"; - File temp = new File(FileUtils.getTempDirectory(), fileName); - System.out.println("file to read is " + temp); - Family family = JsonUtils.readAndValidateJson(temp, Family.class); - assertNotNull("Could not read family file!", family); - - for (ProfileReference profile : family.getProfileReferences()) { - foundProfiles.add(profile.getName()); - } - } - - @Then("^the following \"([^\"]*)\" are return$") - public void the_following_are_return(String expectedProfiles) throws Throwable { - String[] expectedArr = expectedProfiles.split(","); - assertEquals(expectedArr.length, foundProfiles.size()); - for (String found : foundProfiles) { - assertTrue(expectedProfiles.contains(found)); - } - } - - -} diff --git a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/CommonSteps.java b/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/CommonSteps.java deleted file mode 100644 index c409d5f6..00000000 --- a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/CommonSteps.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import java.io.File; - -import org.aeonbits.owner.KrauseningConfigFactory; -import org.apache.commons.io.FileUtils; -import org.technologybrewery.fermenter.mda.metamodel.MetamodelConfig; -import org.technologybrewery.fermenter.mda.util.MessageTracker; - -import cucumber.api.java.After; -import cucumber.api.java.Before; - -public class CommonSteps { - private static final MetamodelConfig config = KrauseningConfigFactory.create(MetamodelConfig.class); - - private File enumerationDirectory = new File("target/temp-metadata", config.getEnumerationsRelativePath()); - private File servicesDirectory = new File("target/temp-metadata", config.getServicesRelativePath()); - private File entitiesDirectory = new File("target/temp-metadata", config.getEntitiesRelativePath()); - private File typeDictionaryDirectory = new File("target/temp-metadata", config.getDictionaryTypesRelativePath()); - private File messageGroupDirectory = new File("target/temp-metadata", config.getMessageGroupsRelativePath()); - - /** - * Clears out the message tracker (a singleton) before each scenario. - */ - @Before - public void clearMessageTracker() { - MessageTracker messageTracker = MessageTracker.getInstance(); - messageTracker.clear(); - } - - - @Before("@enumeration,@service,@entity,@typeDictionary,@messageGroup") - public void commonSetUp() { - // make all the directories so we don't get a bunch of warnings: - enumerationDirectory.mkdirs(); - servicesDirectory.mkdirs(); - entitiesDirectory.mkdirs(); - typeDictionaryDirectory.mkdirs(); - messageGroupDirectory.mkdirs(); - } - - /** - * Clears out the message tracker (a singleton) before each scenario. - */ - @After("@enumeration,@service,@entity,@typeDictionary,@messageGroup") - public void commonCleanUp() throws Exception { - FileUtils.deleteDirectory(enumerationDirectory); - FileUtils.deleteDirectory(servicesDirectory); - FileUtils.deleteDirectory(entitiesDirectory); - FileUtils.deleteDirectory(typeDictionaryDirectory); - FileUtils.deleteDirectory(messageGroupDirectory); - } - -} diff --git a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/EntitySteps.java b/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/EntitySteps.java deleted file mode 100644 index 73215ce9..00000000 --- a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/EntitySteps.java +++ /dev/null @@ -1,520 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.io.IOException; -import java.util.List; - -import org.apache.commons.lang3.RandomStringUtils; -import org.apache.commons.lang3.StringUtils; -import org.technologybrewery.fermenter.mda.metamodel.element.Entity; -import org.technologybrewery.fermenter.mda.metamodel.element.EntityElement; -import org.technologybrewery.fermenter.mda.metamodel.element.Field; -import org.technologybrewery.fermenter.mda.metamodel.element.FieldElement; -import org.technologybrewery.fermenter.mda.metamodel.element.Parent; -import org.technologybrewery.fermenter.mda.metamodel.element.ParentElement; -import org.technologybrewery.fermenter.mda.metamodel.element.Reference; -import org.technologybrewery.fermenter.mda.metamodel.element.ReferenceElement; -import org.technologybrewery.fermenter.mda.metamodel.element.Relation; -import org.technologybrewery.fermenter.mda.metamodel.element.RelationElement; -import org.technologybrewery.fermenter.mda.metamodel.element.Validation; -import org.technologybrewery.fermenter.mda.metamodel.element.ValidationElement; - -import com.fasterxml.jackson.core.JsonGenerationException; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; - -import cucumber.api.java.After; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; -import org.junit.Assert; - -public class EntitySteps extends AbstractEntitySteps { - - private Entity loadedEntity; - - // Also uses CommonSteps for setup and tear down - - @After("@entity") - public void cleanUp() throws IOException { - super.cleanUp(); - - loadedEntity = null; - - } - - @Given("^an entity named \"([^\"]*)\" in \"([^\"]*)\"$") - public void an_entity_named_in(String name, String packageName) throws Throwable { - EntityElement entity = createBaseEntity(name, packageName, null); - createEntityElement(entity); - } - - @Given("^an entity named \"([^\"]*)\" in \"([^\"]*)\" with documentation \"([^\"]*)\"$") - public void an_entity_named_in(String name, String packageName, String documentation) throws Throwable { - EntityElement entity = createBaseEntity(name, packageName, documentation); - createEntityElement(entity); - } - - @Given("^an entity name \"([^\"]*)\" in \"([^\"]*)\" with parent \"([^\"]*)\" and inheritance strategy \"([^\"]*)\"$") - public void an_entity_name_in_with_parent_and_inheritance_strategy(String name, String packageName, String parent, - String inheritanceStrategy) throws Throwable { - - EntityElement entity = createBaseEntity(name, packageName, null); - ParentElement parentElement = new ParentElement(); - parentElement.setPackage(packageName); - parentElement.setType(parent); - if (StringUtils.isNotBlank(inheritanceStrategy)) { - parentElement.setInheritanceStrategy(inheritanceStrategy); - } - entity.setParent(parentElement); - createEntityElement(entity); - } - - @Given("^an entity named \"([^\"]*)\" in \"([^\"]*)\" with table \"([^\"]*)\"$") - public void an_entity_named_in_with_table(String name, String packageName, String table) throws Throwable { - EntityElement entity = createBaseEntity(name, packageName, null); - entity.setTable(table); - createEntityElement(entity); - } - - @Given("^an entity named \"([^\"]*)\" in \"([^\"]*)\" with transient flag \"([^\"]*)\"$") - public void an_entity_named_in_with_transient_flag(String name, String packageName, Boolean transientEntity) - throws Throwable { - EntityElement entity = createBaseEntity(name, packageName, null); - entity.setTransient(transientEntity); - createEntityElement(entity); - } - - @Given("^an entity named \"([^\"]*)\" in \"([^\"]*)\" with an indentifier:$") - public void an_entity_named_in_with_an_indentifier(String name, String packageName, List identifier) - throws Throwable { - - FieldInput id = identifier.iterator().next(); - createEntityWithIdentifier(name, packageName, id); - } - - @Given("^an entity named \"([^\"]*)\" in \"([^\"]*)\" with a field:$") - public void an_entity_named_in_with_a_field(String name, String packageName, List fields) - throws Throwable { - FieldInput field = fields.iterator().next(); - - EntityElement entity = createBaseEntity(name, packageName, null); - FieldElement entityField = createField(field); - entity.addField(entityField); - - // add defaults: - FieldElement defaultId = createDefaultIdentifier(); - entity.setIdentifier(defaultId); - - createEntityElement(entity); - } - - @Given("^an entity named \"([^\"]*)\" in \"([^\"]*)\" with a \"([^\"]*)\" that has no transient value set$") - public void an_entity_named_in_with_a_that_has_no_transient_value_set(String name, String packageName, String fieldName) throws Throwable { - FieldInput field = new FieldInput(); - field.name = fieldName; - - EntityElement entity = createBaseEntity(name, packageName, null); - FieldElement entityField = createField(field); - entity.addField(entityField); - - // add defaults: - FieldElement defaultId = createDefaultIdentifier(); - entity.setIdentifier(defaultId); - - createEntityElement(entity); - } - - @Given("^an entity named \"([^\"]*)\" in \"([^\"]*)\" with a reference:$") - public void an_entity_named_in_with_a_reference(String name, String packageName, List references) - throws Throwable { - ReferenceInput reference = references.iterator().next(); - - EntityElement entity = createBaseEntity(name, packageName, null); - - ReferenceElement entityReference = new ReferenceElement(); - entityReference.setName(reference.referenceName); - entityReference.setPackage(reference.referencePackage); - entityReference.setType(reference.type); - entityReference.setLocalColumn(reference.localColumn); - entityReference.setDocumentation(reference.documentation); - entityReference.setRequired(reference.required); - - entity.addReference(entityReference); - - createEntityElement(entity); - } - - @Given("^an entity named \"([^\"]*)\" in \"([^\"]*)\" with a relation:$") - public void an_entity_named_in_with_a_relation(String name, String packageName, List relations) - throws Throwable { - RelationInput relation = relations.iterator().next(); - - createEntityWithRelation(name, packageName, relation); - } - - @Given("^an entity named \"([^\"]*)\" in \"([^\"]*)\" with a valid relation that does not specify multiplicity$") - public void an_entity_named_in_with_a_valid_relation_that_does_not_specify_multiplicity(String name, - String packageName) throws Throwable { - String referencedEntityName = StringUtils.capitalize(RandomStringUtils.randomAlphabetic(10)); - String referencedEntityPackage = "foo.default.multiplicity"; - createEntityWithDefaultIdentifier(referencedEntityName, referencedEntityPackage); - - RelationInput relationInput = new RelationInput(); - relationInput.type = referencedEntityName; - relationInput.relationPackage = referencedEntityPackage; - relationInput.documentation = RandomStringUtils.randomAlphanumeric(20); - relationInput.fetchMode = Relation.FetchMode.LAZY.toString(); - createEntityWithRelation(name, packageName, relationInput); - } - - @Given("^an entity named \"([^\"]*)\" in \"([^\"]*)\" with a valid relation that does not specify fetch mode$") - public void an_entity_named_in_with_a_valid_relation_that_does_not_specify_fetch_mode(String name, - String packageName) throws Throwable { - String referencedEntityName = StringUtils.capitalize(RandomStringUtils.randomAlphabetic(10)); - String referencedEntityPackage = "foo.default.fetchmode"; - createEntityWithDefaultIdentifier(referencedEntityName, referencedEntityPackage); - - RelationInput relationInput = new RelationInput(); - relationInput.type = referencedEntityName; - relationInput.relationPackage = referencedEntityPackage; - relationInput.documentation = RandomStringUtils.randomAlphanumeric(20); - relationInput.multiplicity = Relation.Multiplicity.MANY_TO_MANY.toString(); - createEntityWithRelation(name, packageName, relationInput); - } - - @Given("^an entity named \"([^\"]*)\" in \"([^\"]*)\" with an invalid multiplicity \"([^\"]*)\"$") - public void an_entity_named_in_with_an_invalid_multiplicity(String name, String packageName, - String invalidMultiplicity) throws Throwable { - String referencedEntityName = StringUtils.capitalize(RandomStringUtils.randomAlphabetic(10)); - String referencedEntityPackage = "foo.bad.multiplicity"; - createEntityWithDefaultIdentifier(referencedEntityName, referencedEntityPackage); - - RelationInput relationInput = new RelationInput(); - relationInput.type = referencedEntityName; - relationInput.relationPackage = referencedEntityPackage; - relationInput.documentation = RandomStringUtils.randomAlphanumeric(20); - relationInput.fetchMode = Relation.FetchMode.LAZY.toString(); - relationInput.multiplicity = invalidMultiplicity; - createEntityWithRelation(name, packageName, relationInput); - } - - @Given("^an entity named \"([^\"]*)\" in \"([^\"]*)\" with an invalid fetch mode \"([^\"]*)\"$") - public void an_entity_named_in_with_an_invalid_fetch_mode(String name, String packageName, String invalidFetchMode) - throws Throwable { - String referencedEntityName = StringUtils.capitalize(RandomStringUtils.randomAlphabetic(10)); - String referencedEntityPackage = "foo.bad.multiplicity"; - createEntityWithDefaultIdentifier(referencedEntityName, referencedEntityPackage); - - RelationInput relationInput = new RelationInput(); - relationInput.type = referencedEntityName; - relationInput.relationPackage = referencedEntityPackage; - relationInput.documentation = RandomStringUtils.randomAlphanumeric(20); - relationInput.fetchMode = invalidFetchMode; - relationInput.multiplicity = Relation.Multiplicity.ONE_TO_ONE.toString(); - createEntityWithRelation(name, packageName, relationInput); - } - - private EntityElement createEntityWithIdentifier(String name, String packageName, FieldInput id) - throws IOException, JsonGenerationException, JsonMappingException, JsonProcessingException { - EntityElement entity = createBaseEntity(name, packageName, null); - FieldElement idField = createIdentifier(id); - entity.setIdentifier(idField); - - return createEntityElement(entity); - } - - private EntityElement createEntityWithDefaultIdentifier(String name, String packageName) - throws IOException, JsonGenerationException, JsonMappingException, JsonProcessingException { - EntityElement entity = createBaseEntity(name, packageName, null); - FieldInput id = new FieldInput(); - id.name = "id"; - id.column = "ID"; - id.type = "string"; - FieldElement idField = createIdentifier(id); - entity.setIdentifier(idField); - - return createEntityElement(entity); - } - - private FieldElement createIdentifier(FieldInput id) { - FieldElement idField = new FieldElement(); - idField.setName(id.name); - idField.setDocumentation(id.documentation); - idField.setColumn(id.column); - if (StringUtils.isNotBlank(id.generator)) { - idField.setGenerator(id.generator); - } - ValidationElement type = new ValidationElement(); - String typeValue = StringUtils.isNotBlank(id.type) ? id.type : "string"; - type.setName(typeValue); - idField.setType(type); - return idField; - } - - private FieldElement createDefaultIdentifier() { - FieldElement idField = new FieldElement(); - idField.setName("id"); - idField.setDocumentation("Auto created to make a valid entity"); - idField.setColumn("ID"); - ValidationElement type = new ValidationElement(); - type.setName("String"); - idField.setType(type); - return idField; - } - - private FieldElement createField(FieldInput field) { - FieldElement newField = new FieldElement(); - newField.setName(field.name); - newField.setDocumentation(field.documentation); - newField.setColumn(field.column); - newField.setTransient(field.transientValue); - newField.setLabel(field.label); - ValidationElement type = new ValidationElement(); - type.setName(field.type); - newField.setType(type); - return newField; - } - - private EntityElement createEntityWithRelation(String name, String packageName, RelationInput relation) - throws IOException, JsonGenerationException, JsonMappingException, JsonProcessingException { - EntityElement entity = createBaseEntity(name, packageName, null); - - RelationElement entityRelation = new RelationElement(); - entityRelation.setType(relation.type); - entityRelation.setPackage(relation.relationPackage); - entityRelation.setDocumentation(relation.documentation); - entityRelation.setMultiplicity(relation.multiplicity); - entityRelation.setFetchMode(relation.fetchMode); - - entity.addRelation(entityRelation); - - return createEntityElement(entity); - } - - @When("^entities are read$") - public void entities_are_read() throws Throwable { - readEntities(); - } - - @Then("^an entity metamodel instance is returned for the name \"([^\"]*)\" in \"([^\"]*)\" with the documentation \"([^\"]*)\"$") - public void an_entity_metamodel_instance_is_returned_for_the_name_in_with_the_documentation(String expectedName, - String expectedPackage, String expectedDocumentation) throws Throwable { - - validateLoadedEntities(expectedName, expectedPackage); - assertEquals("Unexpected documentation value!", expectedDocumentation, loadedEntity.getDocumentation()); - - } - - @Then("^an entity metamodel instance is returned for the name \"([^\"]*)\" in \"([^\"]*)\" with parent \"([^\"]*)\" and inheritance strategy \"([^\"]*)\"$") - public void an_entity_metamodel_instance_is_returned_for_the_name_in_with_parent_and_inheritance_strategy( - String expectedName, String expectedPackage, String expectedParent, String expectedInheritanceStrategy) - throws Throwable { - - validateLoadedEntities(expectedName, expectedPackage); - Parent parent = loadedEntity.getParent(); - assertEquals("unexpected parent value!", expectedParent, parent.getType()); - Parent.InheritanceStrategy foundInheritanceStrategy = Parent.InheritanceStrategy.fromString(expectedInheritanceStrategy); - assertEquals("unexpected inheritance strategy value!", foundInheritanceStrategy, - parent.getInheritanceStrategy()); - - } - - @Then("^an entity metamodel instance is returned for the name \"([^\"]*)\" in \"([^\"]*)\" with table \"([^\"]*)\"$") - public void an_entity_metamodel_instance_is_returned_for_the_name_in_with_table(String expectedName, - String expectedPackage, String expectedTable) throws Throwable { - - validateLoadedEntities(expectedName, expectedPackage); - assertEquals("unexpected table value!", expectedTable, loadedEntity.getTable()); - - } - - @Then("^an entity metamodel instance is returned for the name \"([^\"]*)\" in \"([^\"]*)\" with a lock strategy of \"([^\"]*)\"$") - public void an_entity_metamodel_instance_is_returned_for_the_name_in_with_a_lock_strategy_of(String expectedName, - String expectedPackage, String expectedStrategy) throws Throwable { - - validateLoadedEntities(expectedName, expectedPackage); - Entity.LockStrategy expectedLockStrategy = Entity.LockStrategy.fromString(expectedStrategy); - assertEquals("unexpected lock strategy value!", expectedLockStrategy, loadedEntity.getLockStrategy()); - - } - - @Then("^an entity metamodel instance is returned for the name \"([^\"]*)\" in \"([^\"]*)\" with a transient flag of \"([^\"]*)\"$") - public void an_entity_metamodel_instance_is_returned_for_the_name_in_with_a_transient_flag_of(String expectedName, - String expectedPackage, Boolean expectedTransient) throws Throwable { - - validateLoadedEntities(expectedName, expectedPackage); - assertEquals("unexpected lock strategy value!", expectedTransient, loadedEntity.isTransient()); - - } - - @Then("^an entity metamodel instance is returned for the name \"([^\"]*)\" in \"([^\"]*)\" with the following identifier:$") - public void an_entity_metamodel_instance_is_returned_for_the_name_in_with_the_following_identifier( - String expectedName, String expectedPackage, List expectedIdentifier) throws Throwable { - validateLoadedEntities(expectedName, expectedPackage); - Field foundIdField = loadedEntity.getIdentifier(); - assertNotNull("No identifier found!", foundIdField); - - FieldInput expectedIdField = expectedIdentifier.iterator().next(); - assertEquals("Identifier field name did not match!", expectedIdField.name, foundIdField.getName()); - assertEquals("Identifier column name did not match!", expectedIdField.column, foundIdField.getColumn()); - assertEquals("Identifier documentation did not match!", expectedIdField.documentation, - foundIdField.getDocumentation()); - - Validation foundType = foundIdField.getValidation(); - assertNotNull("No identifier type found!", foundType); - assertEquals("Identifier type name did not match!", expectedIdField.type, foundType.getName()); - - } - - @Then("^an entity metamodel instance is returned for the name \"([^\"]*)\" in \"([^\"]*)\" with the following field:$") - public void an_entity_metamodel_instance_is_returned_for_the_name_in_with_the_following_field(String expectedName, - String expectedPackage, List expectedFields) throws Throwable { - - validateLoadedEntities(expectedName, expectedPackage); - - Field foundField = null; - FieldInput expectedField = expectedFields.iterator().next(); - List loadedEntityFields = loadedEntity.getFields(); - for (Field loadedEntityField : loadedEntityFields) { - if (loadedEntityField.getName().equals(expectedField.name)) { - foundField = loadedEntityField; - Boolean expectedTransientDefaultIsFalse = expectedField.transientValue != null - ? expectedField.transientValue - : Boolean.FALSE; - assertEquals("Field name did not match!", expectedField.name, foundField.getName()); - assertEquals("Field transient property did not match!", expectedTransientDefaultIsFalse, - foundField.isTransient()); - assertEquals("Column name did not match!", expectedField.column, foundField.getColumn()); - assertEquals("Documentation did not match!", expectedField.documentation, - foundField.getDocumentation()); - assertTrue("Label did not match!", StringUtils.equals(expectedField.label, foundField.getLabel())); - break; - } - } - - Validation foundType = foundField.getValidation(); - assertNotNull("No field type found!", foundType); - assertEquals("Field type name did not match!", expectedField.type, foundType.getName()); - } - - @Then("^an entity metamodel instance is returned for the name \"([^\"]*)\" in \"([^\"]*)\" with the following reference:$") - public void an_entity_metamodel_instance_is_returned_for_the_name_in_with_the_following_reference( - String expectedName, String expectedPackage, List expectedReferences) throws Throwable { - - validateLoadedEntities(expectedName, expectedPackage); - Reference foundReference = loadedEntity.getReferences().iterator().next(); - assertNotNull("No reference found!", foundReference); - - ReferenceInput expectedReference = expectedReferences.iterator().next(); - assertEquals("Reference name did not match!", expectedReference.referenceName, foundReference.getName()); - assertEquals("Reference documentation did not match!", expectedReference.documentation, - foundReference.getDocumentation()); - assertEquals("Reference type did not match!", expectedReference.type, foundReference.getType()); - assertEquals("Reference type package did not match!", expectedReference.referencePackage, - foundReference.getPackage()); - assertEquals("Reference local column did not match!", expectedReference.localColumn, - foundReference.getLocalColumn()); - assertEquals("Reference requiredness did not match!", expectedReference.required, foundReference.isRequired()); - - } - - @Then("^an entity metamodel instance is returned for the name \"([^\"]*)\" in \"([^\"]*)\" with the following relation:$") - public void an_entity_metamodel_instance_is_returned_for_the_name_in_with_the_following_relation( - String expectedName, String expectedPackage, List expectedRelations) throws Throwable { - validateLoadedEntities(expectedName, expectedPackage); - Relation foundRelation = getAndAssertRelation(); - - RelationInput expectedRelation = expectedRelations.iterator().next(); - assertEquals("Relation documentation did not match!", expectedRelation.documentation, - foundRelation.getDocumentation()); - assertEquals("Relation type did not match!", expectedRelation.type, foundRelation.getType()); - assertEquals("Relation type package did not match!", expectedRelation.relationPackage, - foundRelation.getPackage()); - Assert.assertEquals("Relation multiplicity did not match!", Relation.Multiplicity.fromString(expectedRelation.multiplicity), - foundRelation.getMultiplicity()); - Assert.assertEquals("Relation fetchMode did not match!", Relation.FetchMode.fromString(expectedRelation.fetchMode), - foundRelation.getFetchMode()); - } - - @Then("^an entity metamodel instance is returned for the name \"([^\"]*)\" in \"([^\"]*)\" with the following relation that has one-to-many multiplicity$") - public void an_entity_metamodel_instance_is_returned_for_the_name_in_with_the_following_relation_that_has_M_multiplicity( - String expectedName, String expectedPackage) throws Throwable { - validateLoadedEntities(expectedName, expectedPackage); - - Relation foundRelation = getAndAssertRelation(); - - Assert.assertEquals("Relation multiplicity did not match!", Relation.Multiplicity.ONE_TO_MANY, foundRelation.getMultiplicity()); - } - - @Then("^an entity metamodel instance is returned for the name \"([^\"]*)\" in \"([^\"]*)\" with the following relation that has eager fetch mode$") - public void an_entity_metamodel_instance_is_returned_for_the_name_in_with_the_following_relation_that_has_eager_fetch_mode( - String expectedName, String expectedPackage) throws Throwable { - validateLoadedEntities(expectedName, expectedPackage); - - Relation foundRelation = getAndAssertRelation(); - - Assert.assertEquals("Relation fetch modes did not match!", Relation.FetchMode.EAGER, foundRelation.getFetchMode()); - } - - private Relation getAndAssertRelation() { - Relation foundRelation = loadedEntity.getRelations().iterator().next(); - assertNotNull("No relation found!", foundRelation); - return foundRelation; - } - - private void validateLoadedEntities(String expectedName, String expectedPackage) { - if (encounteredException != null) { - throw encounteredException; - } - - loadedEntity = metadataRepo.getEntities(expectedPackage).get(expectedName); - assertEquals("Unexpected entity name!", expectedName, loadedEntity.getName()); - assertEquals("Unexpected entity package!", expectedPackage, loadedEntity.getPackage()); - - } - - /** - * Uses to pass field-level information into test steps - */ - public class FieldInput { - public String name; - public String fieldPackage; - public String documentation; - public String type; - public String column; - public String generator; - public String label; - public Boolean required; - public Boolean transientValue; - } - - /** - * Uses to pass reference-level information into test steps - */ - public class ReferenceInput { - public String name; - public String referenceName; - public String documentation; - public String type; - public String referencePackage; - public Boolean required; - public String localColumn; - } - - /** - * Uses to pass relation-level information into test steps - */ - public class RelationInput { - public String documentation; - public String type; - public String relationPackage; - public String multiplicity; - public String localColumn; - public String fetchMode; - } - -} diff --git a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/EnumerationSteps.java b/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/EnumerationSteps.java deleted file mode 100644 index 63f95e00..00000000 --- a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/EnumerationSteps.java +++ /dev/null @@ -1,211 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.io.File; -import java.io.IOException; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import org.aeonbits.owner.KrauseningConfigFactory; -import org.apache.commons.lang3.RandomStringUtils; -import org.technologybrewery.fermenter.mda.generator.GenerationException; -import org.technologybrewery.fermenter.mda.metamodel.DefaultModelInstanceRepository; -import org.technologybrewery.fermenter.mda.metamodel.MetamodelConfig; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceUrl; -import org.technologybrewery.fermenter.mda.metamodel.ModelRepositoryConfiguration; -import org.technologybrewery.fermenter.mda.metamodel.element.Enum; -import org.technologybrewery.fermenter.mda.metamodel.element.EnumElement; -import org.technologybrewery.fermenter.mda.metamodel.element.Enumeration; -import org.technologybrewery.fermenter.mda.metamodel.element.EnumerationElement; -import org.technologybrewery.fermenter.mda.util.MessageTracker; - -import com.fasterxml.jackson.core.JsonGenerationException; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; - -import cucumber.api.java.After; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; - -public class EnumerationSteps { - - private static final MetamodelConfig config = KrauseningConfigFactory.create(MetamodelConfig.class); - private ObjectMapper objectMapper = new ObjectMapper(); - private MessageTracker messageTracker = MessageTracker.getInstance(); - private File enumerationsDirectory = new File("target/temp-metadata", config.getEnumerationsRelativePath()); - - private String currentBasePackage; - - private File enumerationFile; - private Enumeration loadedEnumeration; - protected GenerationException encounteredException; - protected DefaultModelInstanceRepository metadataRepo; - - // Also uses CommonSteps for setup and tear down - - @After("@enumeration,@service") - public void cleanUp() { - loadedEnumeration = null; - - messageTracker.clear(); - - currentBasePackage = null; - } - - @Given("^an enumeration named \"([^\"]*)\" in \"([^\"]*)\" and enum constants \"([^\"]*)\"$") - public void an_enumeration_named_in_and_enum_constants(String name, String packageValue, List constants) - throws Throwable { - createEnumerations(name, packageValue, constants, null); - } - - private void createEnumerations(String name, String packageValue, List constantNames, - List constantValues) throws IOException, JsonGenerationException, JsonMappingException { - EnumerationElement enumeration = new EnumerationElement(); - enumeration.setName(name); - enumeration.setPackage(packageValue); - - int index = 0; - for (String constant : constantNames) { - EnumElement newEnumConstant = new EnumElement(); - newEnumConstant.setName(constant); - if (constantValues != null) { - newEnumConstant.setValue(Integer.valueOf(constantValues.get(index))); - } - enumeration.addEnums(newEnumConstant); - - index++; - } - - enumerationFile = new File(enumerationsDirectory, name + ".json"); - objectMapper.writeValue(enumerationFile, enumeration); - assertTrue("Enumeration not written to file!", enumerationFile.exists()); - - currentBasePackage = packageValue; - } - - @Given("^an enumeration named \"([^\"]*)\" in \"([^\"]*)\" and enum constant names \"([^\"]*)\" and values \"([^\"]*)\"$") - public void an_enumeration_named_in_and_enum_constant_names_and_values(String name, String packageValue, - List constantNames, List constantValues) throws Throwable { - createEnumerations(name, packageValue, constantNames, constantValues); - } - - @Given("^an enumeration named \"([^\"]*)\" in \"([^\"]*)\"$") - public void an_enumeration_named_in(String name, String fileName) throws Throwable { - final String localPackage = "default.package"; - EnumerationElement enumeration = new EnumerationElement(); - enumeration.setName(name); - enumeration.setPackage(localPackage); - - EnumElement newEnumConstant = new EnumElement(); - newEnumConstant.setName(RandomStringUtils.randomAlphabetic(3)); - enumeration.addEnums(newEnumConstant); - - enumerationsDirectory.mkdirs(); - enumerationFile = new File(enumerationsDirectory, fileName); - objectMapper.writeValue(enumerationFile, enumeration); - assertTrue("Enumeration not written to file!", enumerationFile.exists()); - - currentBasePackage = localPackage; - - } - - - @When("^enumerations are read$") - public void enumerations_are_read() throws Throwable { - encounteredException = null; - - try { - ModelRepositoryConfiguration config = new ModelRepositoryConfiguration(); - config.setArtifactId("fermenter-mda"); - config.setBasePackage(currentBasePackage); - Map metadataUrlMap = config.getMetamodelInstanceLocations(); - metadataUrlMap.put("fermenter-mda", new ModelInstanceUrl("fermenter-mda", enumerationsDirectory.getParentFile().toURI().toString())); - - metadataRepo = new DefaultModelInstanceRepository(config); - metadataRepo.load(); - metadataRepo.validate(); - - } catch (GenerationException e) { - encounteredException = e; - } - } - - @Then("^an enumeration metamodel instance is returned for the name \"([^\"]*)\" in \"([^\"]*)\" with the enum constants \"([^\"]*)\"$") - public void an_enumeration_metamodel_instance_is_returned_for_the_name_in_with_the_enum_constants(String name, - String packageName, List constants) throws Throwable { - validateLoadedConstants(name, packageName, constants, null); - } - - @Then("^NO enumeration metamodel instance is returned for the name \"([^\"]*)\" in \"([^\"]*)\"$") - public void no_enumeration_metamodel_instance_is_returned_for_the_name_in(String name, String packageName) - throws Throwable { - if (encounteredException != null) { - throw encounteredException; - } - - Map packageEnumerations = metadataRepo.getEnumerations(packageName); - loadedEnumeration = (packageEnumerations != null) ? packageEnumerations.get(name) : null; - assertNull(loadedEnumeration); - } - - @Then("^an enumeration metamodel instance is returned for the name \"([^\"]*)\" in \"([^\"]*)\" with the enum constants \"([^\"]*)\" and matching values \"([^\"]*)\"$") - public void an_enumeration_metamodel_instance_is_returned_for_the_name_in_with_the_enum_constants_and_matching_values( - String name, String packageName, List constantNames, List constantValues) throws Throwable { - validateLoadedConstants(name, packageName, constantNames, constantValues); - } - - @Then("^the enumeration is of type \"([^\"]*)\"$") - public void the_enumeration_is_of_type(String enumerationType) throws Throwable { - if ("named".equalsIgnoreCase(enumerationType)) { - assertTrue("Should have been a named enumeration!", loadedEnumeration.isNamed()); - assertFalse("Should have been a named enumeration!", loadedEnumeration.isValued()); - - } else { - assertFalse("Should have been a valued enumeration!", loadedEnumeration.isNamed()); - assertTrue("Should have been a valued enumeration!", loadedEnumeration.isValued()); - - } - } - - @Then("^an error is returned$") - public void an_error_is_returned() throws Throwable { - assertNotNull("Expected at least on error!", encounteredException); - - } - - private void validateLoadedConstants(String name, String packageName, List constantNames, - List constantValues) { - if (encounteredException != null) { - throw encounteredException; - } - - loadedEnumeration = metadataRepo.getEnumerations(packageName).get(name); - assertEquals("Unexpected enumeration name!", name, loadedEnumeration.getName()); - assertEquals("Unexpected enumeration package!", packageName, loadedEnumeration.getPackage()); - - List loadedConstants = loadedEnumeration.getEnums(); - assertEquals("Did not find the expected number of enum constants!", constantNames.size(), - loadedConstants.size()); - Map loadedConstantMap = loadedConstants.stream().collect(Collectors.toMap(Enum::getName, x -> x)); - - int index = 0; - for (String constant : constantNames) { - Enum loadedConstantInstance = loadedConstantMap.get(constant); - assertNotNull("Could not find enum constant " + constant + "!", loadedConstantMap.get(constant)); - if (constantValues != null) { - assertEquals("Constant value unexpected!", Integer.valueOf(constantValues.get(index)), - loadedConstantInstance.getValue()); - } - - index++; - } - } - -} diff --git a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/FamilyInput.java b/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/FamilyInput.java deleted file mode 100644 index dc00bdc3..00000000 --- a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/FamilyInput.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -public class FamilyInput { - private String profileName; - private String family; - private String[] targetNames; - - public String getProfileName() { - return profileName; - } - - public void setProfileName(String profileName) { - this.profileName = profileName; - } - - public String getFamily() { - return family; - } - - public void setFamily(String family) { - this.family = family; - } - - public String[] getTargetNames() { - return targetNames; - } - - public void setTargetNames(String[] targetNames) { - this.targetNames = targetNames; - } -} diff --git a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/MessageGroupSteps.java b/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/MessageGroupSteps.java deleted file mode 100644 index 9b66abfb..00000000 --- a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/MessageGroupSteps.java +++ /dev/null @@ -1,125 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.io.File; -import java.io.IOException; -import java.util.List; -import java.util.Map; - -import org.aeonbits.owner.KrauseningConfigFactory; -import org.technologybrewery.fermenter.mda.generator.GenerationException; -import org.technologybrewery.fermenter.mda.metamodel.DefaultModelInstanceRepository; -import org.technologybrewery.fermenter.mda.metamodel.MetamodelConfig; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceUrl; -import org.technologybrewery.fermenter.mda.metamodel.ModelRepositoryConfiguration; -import org.technologybrewery.fermenter.mda.metamodel.element.Message; -import org.technologybrewery.fermenter.mda.metamodel.element.MessageElement; -import org.technologybrewery.fermenter.mda.metamodel.element.MessageGroup; -import org.technologybrewery.fermenter.mda.metamodel.element.MessageGroupElement; -import org.technologybrewery.fermenter.mda.util.MessageTracker; - -import com.fasterxml.jackson.core.JsonGenerationException; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.Maps; - -import cucumber.api.java.After; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; - -public class MessageGroupSteps { - - private static final MetamodelConfig config = KrauseningConfigFactory.create(MetamodelConfig.class); - private ObjectMapper objectMapper = new ObjectMapper(); - private MessageTracker messageTracker = MessageTracker.getInstance(); - private File messageGroupsDirectory = new File("target/temp-metadata", config.getMessageGroupsRelativePath()); - - private String currentBasePackage; - - private File messageGroupFile; - protected GenerationException encounteredException; - protected DefaultModelInstanceRepository metamodelRepo; - - // Also uses CommonSteps for setup and tear down - - @After("@messageGroup") - public void cleanUp() { - messageTracker.clear(); - } - - @Given("^a message group named \"([^\"]*)\" in \"([^\"]*)\" and the messages:$") - public void a_message_group_named_in_and_the_messages(String name, String packageValue, - List messages) throws Throwable { - MessageGroupElement messageGroup = new MessageGroupElement(); - messageGroup.setName(name); - messageGroup.setPackage(packageValue); - messageGroup.getMessages().addAll(messages); - - loadMessageGroup(name, packageValue, messageGroup); - } - - @Given("^a message group named \"([^\"]*)\" in \"([^\"]*)\" and a least one valid message$") - public void a_message_group_named_in_and_a_least_one_valid_message(String name, String packageValue) - throws Throwable { - MessageGroupElement messageGroup = new MessageGroupElement(); - messageGroup.setName(name); - messageGroup.setPackage(packageValue); - - loadMessageGroup(name, packageValue, messageGroup); - } - - @When("^message groups are read$") - public void message_groups_are_read() throws Throwable { - try { - ModelRepositoryConfiguration config = new ModelRepositoryConfiguration(); - config.setArtifactId("fermenter-mda"); - config.setBasePackage(currentBasePackage); - Map metadataUrlMap = config.getMetamodelInstanceLocations(); - metadataUrlMap.put("fermenter-mda", - new ModelInstanceUrl("fermenter-mda", messageGroupsDirectory.getParentFile().toURI().toString())); - - metamodelRepo = new DefaultModelInstanceRepository(config); - metamodelRepo.load(); - metamodelRepo.validate(); - - } catch (GenerationException e) { - encounteredException = e; - } - } - - @Then("^a meessage group is returned for the name \"([^\"]*)\" in \"([^\"]*)\" and the messages:$") - public void a_meessage_group_is_returned_for_the_name_in_and_the_messages(String expectedName, - String expectedPackageValue, List expectedMessages) throws Throwable { - MessageGroup messageGroup = metamodelRepo.getMessageGroup(expectedPackageValue, expectedName); - assertNotNull("Could not find expected message group!", messageGroup); - - Map messagesByKey = Maps.uniqueIndex(messageGroup.getMessages(), Message::getName); - - for (Message expectedMessage : expectedMessages) { - Message foundMessage = messagesByKey.get(expectedMessage.getName()); - assertNotNull("Could not find expected message!", foundMessage); - assertEquals("Unexpected message text encountered!", expectedMessage.getText(), foundMessage.getText()); - } - - } - - @Then("^the generator throws an exception about a invalid mssage group$") - public void the_generator_throws_an_exception_about_a_invalid_mssage_group() throws Throwable { - assertNotNull("Expected to have encountered an error!", encounteredException); - } - - protected void loadMessageGroup(String name, String packageValue, MessageGroupElement messageGroup) - throws IOException, JsonGenerationException, JsonMappingException { - - messageGroupFile = new File(messageGroupsDirectory, name + ".json"); - objectMapper.writeValue(messageGroupFile, messageGroup); - assertTrue("Message group not written to file!", messageGroupFile.exists()); - - currentBasePackage = packageValue; - } - -} diff --git a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/MessageTrackerSteps.java b/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/MessageTrackerSteps.java deleted file mode 100644 index 7a6c317d..00000000 --- a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/MessageTrackerSteps.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import java.util.List; - -import org.technologybrewery.fermenter.mda.util.MessageTracker; - -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; - -public class MessageTrackerSteps { - - private MessageTracker messageTracker = MessageTracker.getInstance(); - - @Given("^multiple error messages \"([^\"]*)\"$") - public void multiple_error_messages(List errors) throws Throwable { - for (String error : errors) { - messageTracker.addErrorMessage(error); - } - } - - @When("^the message tracker is asked for messages$") - public void the_message_tracker_is_asked_for_messages() throws Throwable { - } - - @Then("^the tracker reports that errors were encountered$") - public void the_tracker_reports_that_errors_were_encountered() throws Throwable { - assertTrue("Expected errors to have been tracked!", messageTracker.hasErrors()); - } - - @Given("^multiple warning messages \"([^\"]*)\"$") - public void multiple_warning_messages(List warnings) throws Throwable { - for (String warning : warnings) { - messageTracker.addWarningMessage(warning); - } - } - - @Then("^the tracker reports that no errors were encountered$") - public void the_tracker_reports_that_no_errors_were_encountered() throws Throwable { - assertFalse("Expected NO errors to have been tracked!", messageTracker.hasErrors()); - } - -} diff --git a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/OrderedEntitiesSteps.java b/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/OrderedEntitiesSteps.java deleted file mode 100644 index ce15b77c..00000000 --- a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/OrderedEntitiesSteps.java +++ /dev/null @@ -1,145 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.StringTokenizer; - -import org.apache.commons.lang3.StringUtils; -import org.technologybrewery.fermenter.mda.metamodel.ModelContext; -import org.technologybrewery.fermenter.mda.metamodel.element.Entity; -import org.technologybrewery.fermenter.mda.metamodel.element.EntityElement; -import org.technologybrewery.fermenter.mda.metamodel.element.ReferenceElement; -import org.technologybrewery.fermenter.mda.metamodel.element.RelationElement; - -import com.fasterxml.jackson.core.JsonGenerationException; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; - -import cucumber.api.java.After; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; - -public class OrderedEntitiesSteps extends AbstractEntitySteps { - - private static final String TEST_PACKAGE_NAME = "entity.ordering"; - - private List orderedEntityNames; - - @After("@orderedEntities") - public void cleanUp() throws IOException { - super.cleanUp(); - - if (orderedEntityNames != null) { - orderedEntityNames.clear(); - } - - } - - @Given("^the following entities:$") - public void the_following_entities(List entityInfos) throws Throwable { - createEntities(entityInfos); - } - - @Given("^the following entities and their references:$") - public void the_following_entities_and_their_references(List entityInfos) throws Throwable { - createEntities(entityInfos); - } - - @Given("^the following entities and their relations:$") - public void the_following_entities_and_their_relations(List entityInfos) throws Throwable { - createEntities(entityInfos); - } - - @When("^the entities are loaded$") - public void the_entities_are_loaded() throws Throwable { - this.readEntities(); - - Set entitiesByDependency = metadataRepo.getEntitiesByDependencyOrder(ModelContext.LOCAL.toString()); - - orderedEntityNames = new ArrayList<>(); - for (Entity entity : entitiesByDependency) { - orderedEntityNames.add(entity.getName()); - } - - } - - @Then("^the values are listed in the following order:$") - public void the_values_are_listed_in_the_following_order(List expectedOrder) throws Throwable { - for (String expectedString : expectedOrder) { - int expectedLocation = expectedOrder.indexOf(expectedString); - int actualLocation = orderedEntityNames.indexOf(expectedString); - assertEquals("Order not expected for value '" + expectedString + "'!", expectedLocation, actualLocation); - } - } - - @Then("^\"([^\"]*)\" is a precursor of \"([^\"]*)\"$") - public void is_a_precursor_of(String precursor, String value) throws Throwable { - int indexOfPrecursor = orderedEntityNames.indexOf(precursor); - int indexOfValue = orderedEntityNames.indexOf(value); - - assertTrue("precursor is NOT before the value as expected!", indexOfPrecursor < indexOfValue); - - } - - protected void createEntities(List entityInfos) - throws IOException, JsonGenerationException, JsonMappingException, JsonProcessingException { - for (EntityTestInfo entityInfo : entityInfos) { - EntityElement entity = new EntityElement(); - entity.setName(entityInfo.entityName); - entity.setPackage(TEST_PACKAGE_NAME); - - addReferencesToEntity(entityInfo, entity); - addRelationsToEntity(entityInfo, entity); - - createEntityElement(entity); - } - } - - protected void addReferencesToEntity(EntityTestInfo entityInfo, EntityElement entity) { - if (StringUtils.isNotBlank(entityInfo.references)) { - List references = new ArrayList<>(); - StringTokenizer st = new StringTokenizer(entityInfo.references, ","); - while (st.hasMoreTokens()) { - references.add(st.nextToken().trim()); - } - - for (String referenceName : references) { - ReferenceElement reference = new ReferenceElement(); - reference.setName(referenceName); - reference.setType(referenceName); - reference.setPackage(TEST_PACKAGE_NAME); - entity.addReference(reference); - } - } - } - - protected void addRelationsToEntity(EntityTestInfo entityInfo, EntityElement entity) { - if (StringUtils.isNotBlank(entityInfo.relations)) { - List relations = new ArrayList<>(); - StringTokenizer st = new StringTokenizer(entityInfo.relations, ","); - while (st.hasMoreTokens()) { - relations.add(st.nextToken().trim()); - } - - for (String referenceName : relations) { - RelationElement relation = new RelationElement(); - relation.setType(referenceName); - relation.setPackage(TEST_PACKAGE_NAME); - entity.addRelation(relation); - } - } - } - - public class EntityTestInfo { - public String entityName; - public String references; - public String relations; - } - -} diff --git a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/PriorityMessageSteps.java b/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/PriorityMessageSteps.java deleted file mode 100644 index dac00aa1..00000000 --- a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/PriorityMessageSteps.java +++ /dev/null @@ -1,193 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import cucumber.api.java.After; -import cucumber.api.java.Before; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; - -import org.slf4j.LoggerFactory; -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.Logger; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.read.ListAppender; - -import org.technologybrewery.fermenter.mda.MojoTestCaseWrapper; -import org.technologybrewery.fermenter.mda.util.PriorityMessage; -import org.technologybrewery.fermenter.mda.util.PriorityMessageExecution; -import org.technologybrewery.fermenter.mda.util.PriorityMessageService; - -import org.apache.maven.execution.MavenSession; - -import static org.junit.Assert.assertEquals; -import java.util.ArrayList; -import java.util.List; - -public class PriorityMessageSteps { - private MojoTestCaseWrapper mojoTestCase = new MojoTestCaseWrapper(); - private static final Logger logger = (Logger) LoggerFactory.getLogger(PriorityMessageExecution.class); - private ListAppender listAppender; - private static final String DIVIDER = "***********************************************************************\n"; - private static final String HEADER = "*** Fermenter High Priority Messages ***\n"; - private static final String EMPTY_LINE = "\n"; - private MavenSession session; - private PriorityMessageExecution priorityMessageExecution; - private PriorityMessageService priorityMessageService; - private List priorityMessages; - - @Before("@priorityMessage") - public void configureMavenTestSession() throws Exception { - //setup the new maven session and necessary classes for priority messages - this.session = mojoTestCase.newMavenSession(); - this.priorityMessageService = new PriorityMessageService(this.session); - this.priorityMessageExecution = new PriorityMessageExecution(); - this.priorityMessages = new ArrayList(); - - //tool used for collecting the logging output - this.listAppender = new ListAppender<>(); - listAppender.start(); - logger.addAppender(listAppender); - } - - @After("@priorityMessage") - public void tearDownMavenPluginTestHarness() throws Exception { - mojoTestCase.tearDownPluginTestHarness(); - } - - @When("^the priority message\\(s\\) is\\(are\\) added to the maven session$") - public void the_priority_message_s_is_added_to_the_maven_session() throws Throwable { - //adds all the priority messages to the session using the service - priorityMessages.forEach(priorityMessageService::addPriorityMessage); - } - - @Given("^a priority message without metadata$") - public void a_priority_message_without_metadata() throws Throwable { - PriorityMessage message = new PriorityMessage("Test Message"); - priorityMessages.add(message); - } - - @Then("^a priority message without metadata should be displayed at session end$") - public void a_priority_message_without_metadata_should_be_displayed_at_session_end() throws Throwable { - //*********************************************************************** - //*** Fermenter High Priority Messages *** - //*********************************************************************** - //Test Message - // - //*********************************************************************** - //*********************************************************************** - - //build the correct output - StringBuilder correctLog = new StringBuilder(); - correctLog.append(EMPTY_LINE); - correctLog.append(DIVIDER); - correctLog.append(HEADER); - correctLog.append(DIVIDER); - correctLog.append("Test Message\n"); - correctLog.append(EMPTY_LINE); - correctLog.append(DIVIDER); - correctLog.append(DIVIDER); - - //run the end of session command - priorityMessageExecution.afterSessionEnd(this.session); - - //verify the log output is correct - List logsList = listAppender.list; - assertEquals(correctLog.toString(), logsList.get(0).getMessage()); - assertEquals(Level.WARN, logsList.get(0).getLevel()); - } - - @Given("^a priority message with metadata$") - public void a_priority_message_with_metadata() throws Throwable { - PriorityMessage message = new PriorityMessage("Test Message", "test/file/path"); - priorityMessages.add(message); - } - - @Then("^a priority message with metadata should be displayed at session end$") - public void a_priority_message_with_metadata_should_be_displayed_at_session_end() throws Throwable { - //*********************************************************************** - //*** Fermenter High Priority Messages *** - //*********************************************************************** - //test/file/path: - //Test Message - // - //*********************************************************************** - //*********************************************************************** - - //build the correct output - StringBuilder correctLog = new StringBuilder(); - correctLog.append(EMPTY_LINE); - correctLog.append(DIVIDER); - correctLog.append(HEADER); - correctLog.append(DIVIDER); - correctLog.append("test/file/path:\nTest Message\n"); - correctLog.append(EMPTY_LINE); - correctLog.append(DIVIDER); - correctLog.append(DIVIDER); - - //run the end of session command - priorityMessageExecution.afterSessionEnd(this.session); - - //verify the log output is correct - List logsList = listAppender.list; - assertEquals(correctLog.toString(), logsList.get(0).getMessage()); - assertEquals(Level.WARN, logsList.get(0).getLevel()); - } - - @Given("^multiple priority messages$") - public void multiple_priority_messages() throws Throwable { - PriorityMessage message1 = new PriorityMessage("Test Message 1", "test/file/path/"); - PriorityMessage message2 = new PriorityMessage("Test Message 2"); - - priorityMessages.add(message1); - priorityMessages.add(message2); - } - - @Then("^the priority messages should be displayed at session end$") - public void the_priority_messages_should_be_displayed_at_session_end() throws Throwable { - //*********************************************************************** - //*** Fermenter High Priority Messages *** - //*********************************************************************** - //test/file/path/: - //Test Message 1 - // - //Test Message 2 - // - //*********************************************************************** - //*********************************************************************** - - //build the correct output - StringBuilder correctLog = new StringBuilder(); - correctLog.append(EMPTY_LINE); - correctLog.append(DIVIDER); - correctLog.append(HEADER); - correctLog.append(DIVIDER); - correctLog.append("test/file/path/:\nTest Message 1\n"); - correctLog.append(EMPTY_LINE); - correctLog.append("Test Message 2\n"); - correctLog.append(EMPTY_LINE); - correctLog.append(DIVIDER); - correctLog.append(DIVIDER); - - //run the end of session command - priorityMessageExecution.afterSessionEnd(this.session); - - //verify the log output is correct - List logsList = listAppender.list; - assertEquals(correctLog.toString(), logsList.get(0).getMessage()); - assertEquals(Level.WARN, logsList.get(0).getLevel()); - } - - @Given("^no priority messages$") - public void no_priority_messages() throws Throwable { //no messages, so nothing to do - } - - @Then("^no priority messages should be displayed at session end$") - public void no_priority_messages_should_be_displayed_at_session_end() throws Throwable { - //Should not be any output from the end of session command - priorityMessageExecution.afterSessionEnd(this.session); - - //verify the log output is correct - List logsList = listAppender.list; - assertEquals(0, logsList.size()); - } -} diff --git a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/ProfileSteps.java b/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/ProfileSteps.java deleted file mode 100644 index 8b362f8f..00000000 --- a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/ProfileSteps.java +++ /dev/null @@ -1,124 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.technologybrewery.fermenter.mda.generator.GenerationException; -import org.technologybrewery.fermenter.mda.util.JsonUtils; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import cucumber.api.java.After; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; - -public class ProfileSteps { - - private ObjectMapper objectMapper = new ObjectMapper(); - private Map targetMap = new HashMap<>(); - private Map profileMap = new HashMap<>(); - private File profileFile; - private GenerationException encounteredException; - private ExpandedProfile profile; - - @After("@profile") - public void cleanUp() { - targetMap.clear(); - profileMap.clear(); - profileFile = null; - encounteredException = null; - profile = null; - } - - @Given("^the following targets$") - public void the_following_targets(List targets) { - for (Target t : targets) { - targetMap.put(t.getName(), t); - } - } - - @Given("^a profile described by \"([^\"]*)\", \"([^\"]*)\", \"([^\"]*)\"$") - public void a_profile_described_by(String name, List directlyReferencedTargets, - List directlyIncludedProfiles) throws Throwable { - - Profile p = new Profile(); - if (StringUtils.isNotBlank(name)) { - p.setName(name); - } - - List targetReferences = new ArrayList<>(); - for (String targetName : directlyReferencedTargets) { - TargetReference targetReference = new TargetReference(); - targetReference.setName(targetName); - targetReferences.add(targetReference); - } - p.setTargetReferences(targetReferences); - - List profileReferences = new ArrayList<>(); - for (String profileName : directlyIncludedProfiles) { - ProfileReference profileReference = new ProfileReference(); - profileReference.setName(profileName); - profileReferences.add(profileReference); - } - p.setProfileReferences(profileReferences); - - if (profileReferences.size() == 0) { - // add this to the expanded profiles so it can be dereferenced later for profile inclusion testing: - profileMap.put(p.getName(), new ExpandedProfile(p)); - } - - assertEquals(directlyReferencedTargets.size(), p.getTargetReferences().size()); - - profileFile = new File(FileUtils.getTempDirectory(), name + "-profile.json"); - objectMapper.writeValue(profileFile, p); - assertTrue("Profile not written to file!", profileFile.exists()); - } - - @When("^profiles are read$") - public void profiles_are_read() { - encounteredException = null; - - try { - Profile profileMetadata = JsonUtils.readAndValidateJson(profileFile, Profile.class); - assertNotNull("Could not read profile file!", profileMetadata); - - profile = new ExpandedProfile(profileMetadata); - profileMap.put(profile.getName(), profile); - profile.dereference(profileMap, targetMap); - - } catch (GenerationException e) { - encounteredException = e; - } - } - - @Then("^a valid profile is available as \"([^\"]*)\" that contains (\\d+) targets$") - public void a_valid_profile_is_available_as_that_contains_targets(String expectedName, int expectedTargetCount) { - if (encounteredException != null) { - throw encounteredException; - } - assertEquals("Profile name was not matching!", expectedName, profile.getName()); - assertEquals("Profile did not have the expected number of targets!", expectedTargetCount, - profile.getTargets().size()); - } - - @Then("^a valid EMPTY profile is available as \"([^\"]*)\"$") - public void a_valid_EMPTY_profile_is_available_as(String expectedName) { - a_valid_profile_is_available_as_that_contains_targets(expectedName, 0); - } - - @Then("^the generator throws an exception about invalid profile metadata$") - public void the_generator_throws_an_exception_about_invalid_profile_metadata() { - assertNotNull("A GenerationException should have been thrown!", encounteredException); - } - -} diff --git a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/ServiceSteps.java b/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/ServiceSteps.java deleted file mode 100644 index 5a9ec363..00000000 --- a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/ServiceSteps.java +++ /dev/null @@ -1,427 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.aeonbits.owner.KrauseningConfigFactory; -import org.apache.commons.lang3.RandomStringUtils; -import org.apache.commons.lang3.StringUtils; -import org.technologybrewery.fermenter.mda.generator.GenerationException; -import org.technologybrewery.fermenter.mda.metamodel.DefaultModelInstanceRepository; -import org.technologybrewery.fermenter.mda.metamodel.MetamodelConfig; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceUrl; -import org.technologybrewery.fermenter.mda.metamodel.ModelRepositoryConfiguration; -import org.technologybrewery.fermenter.mda.metamodel.element.Operation; -import org.technologybrewery.fermenter.mda.metamodel.element.OperationElement; -import org.technologybrewery.fermenter.mda.metamodel.element.Parameter; -import org.technologybrewery.fermenter.mda.metamodel.element.ParameterElement; -import org.technologybrewery.fermenter.mda.metamodel.element.Return; -import org.technologybrewery.fermenter.mda.metamodel.element.ReturnElement; -import org.technologybrewery.fermenter.mda.metamodel.element.Service; -import org.technologybrewery.fermenter.mda.metamodel.element.ServiceElement; -import org.technologybrewery.fermenter.mda.util.MessageTracker; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import cucumber.api.java.After; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; - -public class ServiceSteps { - - private static final String INTEGER = "integer"; - private static final String FERMENTER_MDA = "fermenter-mda"; - private static final boolean IS_PAGED_RESPONSE_DISABLED = false; - private static final String TX_REQUIRED = "Required"; - private static final String TX_SUPPORTS = "Supports"; - private static final String DEFAULT_NAME = "NamedService"; - private static final String DEFAULT_PACKAGE = "org.example"; - private static final String DEFAULT_OPERATION = "defaultOperation"; - private static final boolean IS_PAGED_RESPONSE_ENABLED = true; - - private static final MetamodelConfig config = KrauseningConfigFactory.create(MetamodelConfig.class); - - private ObjectMapper objectMapper = new ObjectMapper(); - private MessageTracker messageTracker = MessageTracker.getInstance(); - private File servicesDirectory = new File("target/temp-metadata", config.getServicesRelativePath()); - - private String currentBasePackage; - - private File serviceFile; - private Service loadedService; - protected GenerationException encounteredException; - protected DefaultModelInstanceRepository metadataRepo; - - // Also uses CommonSteps for setup and tear down - - @After("@service") - public void cleanUp() { - loadedService = null; - - messageTracker.clear(); - - currentBasePackage = null; - } - - @Given("^a service named \"([^\"]*)\" in \"([^\"]*)\"$") - public void a_service_named_in(String name, String packageValue) throws Throwable { - createServiceElement(name, packageValue, null, null, null, null, false, false, null, - IS_PAGED_RESPONSE_DISABLED); - } - - @Given("^a service named \"([^\"]*)\" in \"([^\"]*)\" with an operation \"([^\"]*)\" with no parameters$") - public void a_service_named_in_with_an_operation_with_no_parameters(String name, String packageValue, - String operationName) throws Throwable { - createServiceElement(name, packageValue, operationName, null, null, null, false, false, TX_SUPPORTS, - IS_PAGED_RESPONSE_DISABLED); - } - - @Given("^a service named \"([^\"]*)\" in \"([^\"]*)\" with an operation \"([^\"]*)\" with a void return type$") - public void a_service_named_in_with_an_operation_with_a_void_return_type(String name, String packageValue, - String operationName) throws Throwable { - createServiceElement(name, packageValue, operationName, "void", null, null, false, false, TX_REQUIRED, - IS_PAGED_RESPONSE_DISABLED); - } - - @Given("^a service named \"([^\"]*)\" in \"([^\"]*)\" with an operation \"([^\"]*)\" with parameters \"([^\"]*)\" of type \"([^\"]*)\"$") - public void a_service_named_in_with_an_operation_with_parameters_of_type(String name, String packageValue, - String operationName, List paramNames, List paramValues) throws Throwable { - createServiceElement(name, packageValue, operationName, null, paramNames, paramValues, false, false, - TX_SUPPORTS, IS_PAGED_RESPONSE_DISABLED); - } - - @Given("^a service named \"([^\"]*)\" in \"([^\"]*)\" with an operation \"([^\"]*)\" with the return type \"([^\"]*)\"$") - public void a_service_named_in_with_an_operation_with_the_return_type(String name, String packageValue, - String operationName, String returnType) throws Throwable { - createServiceElement(name, packageValue, operationName, returnType, null, null, false, false, TX_SUPPORTS, - IS_PAGED_RESPONSE_DISABLED); - } - - @Given("^a service named \"([^\"]*)\" in \"([^\"]*)\" with an operation \"([^\"]*)\" with many parameters \"([^\"]*)\" of type \"([^\"]*)\"$") - public void a_service_named_in_with_an_operation_with_many_parameters_of_type(String name, String packageValue, - String operationName, List paramNames, List paramValues) throws Throwable { - createServiceElement(name, packageValue, operationName, null, paramNames, paramValues, false, true, TX_SUPPORTS, - IS_PAGED_RESPONSE_DISABLED); - } - - @Given("^a service named \"([^\"]*)\" in \"([^\"]*)\" with an operation \"([^\"]*)\" with the many return type \"([^\"]*)\"$") - public void a_service_named_in_with_an_operation_with_the_many_return_type(String name, String packageValue, - String operationName, String returnType) throws Throwable { - createServiceElement(name, packageValue, operationName, returnType, null, null, true, false, TX_REQUIRED, - IS_PAGED_RESPONSE_DISABLED); - } - - @Given("^a service named \"([^\"]*)\" in \"([^\"]*)\" with an operation \"([^\"]*)\" with the transaction attribute \"([^\"]*)\"$") - public void a_service_named_in_with_an_operation_with_the_transaction_attribute(String name, String packageValue, - String operationName, String transactionAttribute) throws Throwable { - createServiceElement(name, packageValue, operationName, "void", null, null, false, false, transactionAttribute, - IS_PAGED_RESPONSE_DISABLED); - } - - @Given("^a service named \"([^\"]*)\" in \"([^\"]*)\" with an operation \"([^\"]*)\" with a void return type in default$") - public void a_service_named_in_with_an_operation_with_a_void_return_type_in_default(String name, - String packageValue, String operationName) throws Throwable { - createServiceElement(name, packageValue, operationName, "void", null, null, false, false, null, - IS_PAGED_RESPONSE_DISABLED); - } - - @Given("^a service with an operation named \"([^\"]*)\" with paged response \"([^\"]*)\"$") - public void a_service_with_an_operation_named_with_paged_response(String operationName, String isEnabled) - throws Throwable { - boolean isPagedResponseEnabled = "enabled".equals(isEnabled); - createServiceElement(DEFAULT_NAME, DEFAULT_PACKAGE, operationName, INTEGER, null, null, true, false, null, - isPagedResponseEnabled); - } - - @Given("^a service with an operation named \"([^\"]*)\" with pagedResponse enabled and return type is void$") - public void a_service_with_an_operation_named_with_pagedResponse_enabled_and_return_type_is_void(String arg1) - throws Throwable { - createServiceElement(DEFAULT_NAME, DEFAULT_PACKAGE, DEFAULT_OPERATION, "void", null, null, true, false, null, - IS_PAGED_RESPONSE_ENABLED); - } - - @Given("^a service with with a paged operation with \"([^\"]*)\" parameters$") - public void the_operation_has_as_parameters(List parameters) throws Throwable { - List parameterTypes = new ArrayList<>(); - for (int i = 0; i < parameters.size(); i++) { - parameterTypes.add(INTEGER); - } - createServiceElement(DEFAULT_NAME, DEFAULT_PACKAGE, DEFAULT_OPERATION, INTEGER, parameters, parameterTypes, - true, false, null, IS_PAGED_RESPONSE_ENABLED); - } - - private void createServiceElement(String name, String packageValue, String operationName, String returnType, - List paramNames, List paramTypes, boolean useManyResponse, boolean useManyParams, - String transaction, boolean isPagedResponse) throws Throwable { - ServiceElement service = new ServiceElement(); - if (StringUtils.isNotBlank(name)) { - service.setName(name); - } - service.setPackage(packageValue); - service.setDocumentation(RandomStringUtils.randomAlphanumeric(15)); - - if (operationName != null) { - OperationElement operation = new OperationElement(); - operation.setName(operationName); - - if (StringUtils.isNoneBlank(transaction)) { - operation.setTransactionAttribute(transaction); - } - - service.getOperations().add(operation); - - if (paramNames != null) { - int i = 0; - for (String paramName : paramNames) { - ParameterElement parameter = createParameterForOperation(paramTypes, useManyParams, i, paramName); - - operation.getParameters().add(parameter); - i++; - } - - if (paramNames.isEmpty() && !paramTypes.isEmpty()) { - // for testing, allow a parameter with no name in this - // situation: - ParameterElement noNameParameter = new ParameterElement(); - noNameParameter.setType(paramTypes.iterator().next()); - operation.getParameters().add(noNameParameter); - } - - } - - ReturnElement returnElement = createReturnElementForOperation(returnType, useManyResponse, isPagedResponse); - - operation.setReturn(returnElement); - } - - serviceFile = new File(servicesDirectory, name + ".json"); - objectMapper.writeValue(serviceFile, service); - assertTrue("Services not written to file!", serviceFile.exists()); - - currentBasePackage = packageValue; - } - - private ParameterElement createParameterForOperation(List paramTypes, boolean useManyParams, int i, - String paramName) { - ParameterElement parameter = new ParameterElement(); - parameter.setName(paramName); - String type = paramTypes != null && !paramTypes.isEmpty() ? paramTypes.get(i) : null; - parameter.setType(type); - if (useManyParams) { - parameter.setMany(true); - } - return parameter; - } - - private ReturnElement createReturnElementForOperation(String returnType, boolean useManyResponse, - boolean isPagedResponse) { - ReturnElement returnElement = new ReturnElement(); - if (returnType == null) { - returnElement.setType("void"); - - } else { - returnElement.setType(returnType); - - } - - if (useManyResponse) { - returnElement.setMany(true); - } - - returnElement.setPagedResponse(isPagedResponse); - return returnElement; - } - - @When("^services are read$") - public void services_are_read() throws Throwable { - encounteredException = null; - - try { - ModelRepositoryConfiguration config = new ModelRepositoryConfiguration(); - config.setArtifactId(FERMENTER_MDA); - config.setBasePackage(currentBasePackage); - Map metadataUrlMap = config.getMetamodelInstanceLocations(); - metadataUrlMap.put(FERMENTER_MDA, - new ModelInstanceUrl(FERMENTER_MDA, servicesDirectory.getParentFile().toURI().toString())); - - metadataRepo = new DefaultModelInstanceRepository(config); - metadataRepo.load(); - metadataRepo.validate(); - - } catch (GenerationException e) { - encounteredException = e; - } - } - - @Then("^a service metamodel instance is returned for the name \"([^\"]*)\" in \"([^\"]*)\"$") - public void a_service_metamodel_instance_is_returned_for_the_name_in(String name, String packageValue) - throws Throwable { - validateLoadedServices(name, packageValue, null, null, null, null, false); - } - - @Then("^NO service metamodel instance is returned for the name \"([^\"]*)\" in \"([^\"]*)\"$") - public void no_service_metamodel_instance_is_returned_for_the_name_in(String name, String packageValue) - throws Throwable { - if (encounteredException != null) { - throw encounteredException; - } - - Map packageServices = metadataRepo.getServices(packageValue); - loadedService = (packageServices != null) ? packageServices.get(name) : null; - assertNull("Should not have found a service for this package and name!", loadedService); - } - - @Then("^an operation \"([^\"]*)\" without parameters is found on service \"([^\"]*)\" in \"([^\"]*)\"$") - public void an_operation_without_parameters_is_found_on_service_in(String operationName, String name, - String packageValue) throws Throwable { - validateLoadedServices(name, packageValue, null, null, null, null, false); - Operation foundOperation = getOperationFromLoadedService(operationName); - assertEquals("Unexpected number of parameters found!", 0, foundOperation.getParameters().size()); - } - - @Then("^an operation \"([^\"]*)\" with a void return type is found on service \"([^\"]*)\" in \"([^\"]*)\"$") - public void an_operation_with_a_void_return_type_is_found_on_service_in(String operationName, String name, - String packageValue) throws Throwable { - validateLoadedServices(name, packageValue, null, null, null, null, false); - Operation foundOperation = getOperationFromLoadedService(operationName); - assertEquals("Unexpected return type found!", "void", foundOperation.getReturn().getType()); - } - - @Then("^an operation \"([^\"]*)\" is found on service \"([^\"]*)\" in \"([^\"]*)\" with parameters \"([^\"]*)\" of type \"([^\"]*)\"$") - public void an_operation_is_found_on_service_in_with_parameters_of_type(String operationName, String name, - String packageValue, List expectedParamNames, List expectedParamValues) throws Throwable { - validateParameters(operationName, name, packageValue, expectedParamNames, expectedParamValues, false); - } - - @Then("^an operation \"([^\"]*)\" is found on service \"([^\"]*)\" in \"([^\"]*)\" with the return type \"([^\"]*)\"$") - public void an_operation_is_found_on_service_in_with_the_return_type(String operationName, String name, - String packageValue, String expectedReturnType) throws Throwable { - validateReturnType(operationName, name, packageValue, expectedReturnType, false); - } - - @Then("^an operation \"([^\"]*)\" is found on service \"([^\"]*)\" in \"([^\"]*)\" with many parameters \"([^\"]*)\" of type \"([^\"]*)\"$") - public void an_operation_is_found_on_service_in_with_many_parameters_of_type(String operationName, String name, - String packageValue, List expectedParamNames, List expectedParamValues) throws Throwable { - validateParameters(operationName, name, packageValue, expectedParamNames, expectedParamValues, true); - } - - @Then("^an operation \"([^\"]*)\" is found on service \"([^\"]*)\" in \"([^\"]*)\" with the many return type \"([^\"]*)\"$") - public void an_operation_is_found_on_service_in_with_the_many_return_type(String operationName, String name, - String packageValue, String expectedReturnType) throws Throwable { - validateReturnType(operationName, name, packageValue, expectedReturnType, true); - } - - @Then("^an operation \"([^\"]*)\" is found on service \"([^\"]*)\" in \"([^\"]*)\" with the transaction attribute \"([^\"]*)\"$") - public void an_operation_is_found_on_service_in_with_the_transaction_attribute(String operationName, String name, - String packageValue, String expectedTransactionAttribute) throws Throwable { - validateLoadedServices(name, packageValue, null, null, null, null, false); - Operation foundOperation = getOperationFromLoadedService(operationName); - String foundTransactionAttribute = foundOperation.getTransactionAttribute(); - assertEquals("Unexpected transaction attribute value!", expectedTransactionAttribute, - foundTransactionAttribute); - } - - @Then("^a service metamodel instance is returned with operation \"([^\"]*)\" with paged response \"([^\"]*)\"$") - public void a_service_metamodel_instance_is_returned_with_operation_with_paged_response(String operationName, - String expectedIsPagedResponse) throws Throwable { - validateLoadedServices(DEFAULT_NAME, DEFAULT_PACKAGE, null, null, null, null, false); - Operation foundOperation = getOperationFromLoadedService(operationName); - assertNotNull("Failed to find the expected operation!", foundOperation); - boolean expectedIsPagedResponseAsBoolean = "enabled".equals(expectedIsPagedResponse); - assertEquals("Unexpected isPagedResponse value!", expectedIsPagedResponseAsBoolean, - foundOperation.getReturn().isPagedResponse()); - } - - @Then("^an error is thrown for \"([^\"]*)\" because you cannot have pagedResponse enabled and return type is void$") - public void an_error_is_thrown_for_because_you_cannot_have_pagedResponse_enabled_and_return_type_is_void( - String arg1) throws Throwable { - assertNotNull("Expected to have encountered an error!", encounteredException); - } - - @Then("^the operation has \"([^\"]*)\" parameters which now included as the last two parameters$") - public void the_operation_has_parameters_which_now_included_as_parameters(List expectedParameters) - throws Throwable { - validateLoadedServices(DEFAULT_NAME, DEFAULT_PACKAGE, null, null, null, null, false); - Operation foundOperation = getOperationFromLoadedService(DEFAULT_OPERATION); - List actualParameters = foundOperation.getParameters(); - assertEquals("The number of parameters didn't match!", expectedParameters.size(), actualParameters.size()); - - for (int i = 0; i < expectedParameters.size(); i++) { - String expectedParameter = expectedParameters.get(i); - Parameter actualParameter = actualParameters.get(i); - assertEquals(expectedParameter, actualParameter.getName()); - } - } - - private void validateParameters(String operationName, String name, String packageValue, - List expectedParamNames, List expectedParamValues, boolean expectedManyValue) { - validateLoadedServices(name, packageValue, null, null, null, null, false); - Operation foundOperation = getOperationFromLoadedService(operationName); - List foundParameters = foundOperation.getParameters(); - assertEquals("Unexpected number of parameters encountered!", expectedParamNames.size(), foundParameters.size()); - - int i = 0; - Map foundParametersMap = getParametersAsMap(foundParameters); - for (String expectedParamName : expectedParamNames) { - Parameter foundParameter = foundParametersMap.get(expectedParamName); - assertEquals("Unexpected parameter type encountered!", expectedParamValues.get(i), - foundParameter.getType()); - assertEquals("Unexpected many parameter many value!", expectedManyValue, foundParameter.isMany()); - i++; - } - } - - private void validateReturnType(String operationName, String name, String packageValue, String expectedReturnType, - boolean expectedIsMany) { - validateLoadedServices(name, packageValue, null, null, null, null, false); - Operation foundOperation = getOperationFromLoadedService(operationName); - Return foundReturn = foundOperation.getReturn(); - assertEquals("Unexpected return type found!", expectedReturnType, foundReturn.getType()); - assertEquals("Unexpected many return type value!", expectedIsMany, foundReturn.isMany()); - } - - private Map getParametersAsMap(List parameters) { - Map paramMap = new HashMap<>(); - for (Parameter parameter : parameters) { - paramMap.put(parameter.getName(), parameter); - } - - return paramMap; - } - - private Operation getOperationFromLoadedService(String operationName) { - List operations = loadedService.getOperations(); - - Operation foundOperation = null; - for (Operation operation : operations) { - if (operationName.equals(operation.getName())) { - foundOperation = operation; - } - } - - assertNotNull("Should have found an operation named '" + operationName + "'", foundOperation); - return foundOperation; - } - - private void validateLoadedServices(String name, String packageName, List parameterNames, - List parameterValues, String returnType, String paramNamesWithMany, boolean isReturnTypeMany) { - if (encounteredException != null) { - throw encounteredException; - } - - loadedService = metadataRepo.getServices(packageName).get(name); - assertEquals("Unexpected service name!", name, loadedService.getName()); - assertEquals("Unexpected service package!", packageName, loadedService.getPackage()); - - } - -} diff --git a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/TargetSteps.java b/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/TargetSteps.java deleted file mode 100644 index e050da25..00000000 --- a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/TargetSteps.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.io.File; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.technologybrewery.fermenter.mda.generator.GenerationException; -import org.technologybrewery.fermenter.mda.util.JsonUtils; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; - -public class TargetSteps { - - protected ObjectMapper objectMapper = new ObjectMapper(); - protected File targetFile; - protected Target target; - protected GenerationException encounteredException; - - @Given("^a target described by \"([^\"]*)\", \"([^\"]*)\", \"([^\"]*)\", \"([^\"]*)\", \"([^\"]*)\", \"([^\"]*)\"$") - public void a_target_described_by(String name, String generator, String templateName, String outputFile, - String overwritable, String artifactType) throws Throwable { - Target newTarget = new Target(); - if (StringUtils.isNotBlank(name)) { - newTarget.setName(name); - } - if (StringUtils.isNotBlank(generator)) { - newTarget.setGenerator(generator); - } - if (StringUtils.isNotBlank(templateName)) { - newTarget.setTemplateName(templateName); - } - if (StringUtils.isNotBlank(outputFile)) { - newTarget.setOutputFile(outputFile); - } - if (StringUtils.isNotBlank(overwritable)) { - newTarget.setOverwritable(Boolean.valueOf(overwritable)); - } - if (StringUtils.isNotBlank(artifactType)) { - newTarget.setArtifactType(artifactType); - } - - targetFile = new File(FileUtils.getTempDirectory(), templateName + "-target.json"); - objectMapper.writeValue(targetFile, newTarget); - assertTrue("Target not written to file!", targetFile.exists()); - - } - - @Given("^a target described with without an artifact type value$") - public void a_target_described_with_without_an_artifact_type_value() throws Throwable { - a_target_described_by("testArtfiactTypeDefaulting", "o.b.c.f.FooGenerator", "template.java.vm", "SomeFile.Java", - Boolean.TRUE.toString(), null); - } - - @When("^targets are read$") - public void targets_are_read() throws Throwable { - encounteredException = null; - - try { - target = JsonUtils.readAndValidateJson(targetFile, Target.class); - assertNotNull("Could not read target file!", target); - - } catch (GenerationException e) { - encounteredException = e; - } - - } - - @Then("^a valid target is available can be looked up name \"([^\"]*)\"$") - public void a_valid_target_is_available_can_be_looked_up_name(String expectedName) throws Throwable { - assertEquals(expectedName, target.getName()); - } - - @Then("^the generator throws an exception about invalid metadata$") - public void the_generator_throws_an_exception_about_invalid_metadata() throws Throwable { - assertNotNull("A GenerationException should have been thrown!", encounteredException); - } - - @Then("^a valid target is available and has an artifact type of \"([^\"]*)\"$") - public void a_valid_target_is_available_and_has_an_artifact_type_of(String expectedArtifactType) throws Throwable { - assertEquals(expectedArtifactType, target.getArtifactType()); - } - -} diff --git a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/TypeDictionarySteps.java b/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/TypeDictionarySteps.java deleted file mode 100644 index 0ed69fb0..00000000 --- a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/TypeDictionarySteps.java +++ /dev/null @@ -1,190 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.io.File; -import java.net.URI; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.aeonbits.owner.KrauseningConfigFactory; -import org.apache.commons.lang3.RandomStringUtils; -import org.apache.commons.lang3.StringUtils; -import org.technologybrewery.fermenter.mda.generator.GenerationException; -import org.technologybrewery.fermenter.mda.metamodel.DefaultModelInstanceRepository; -import org.technologybrewery.fermenter.mda.metamodel.MetamodelConfig; -import org.technologybrewery.fermenter.mda.metamodel.ModelInstanceUrl; -import org.technologybrewery.fermenter.mda.metamodel.ModelRepositoryConfiguration; -import org.technologybrewery.fermenter.mda.metamodel.element.DictionaryType; -import org.technologybrewery.fermenter.mda.metamodel.element.DictionaryTypeElement; -import org.technologybrewery.fermenter.mda.util.MessageTracker; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import cucumber.api.java.After; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; - -public class TypeDictionarySteps { - - private static final MetamodelConfig config = KrauseningConfigFactory.create(MetamodelConfig.class); - - private MessageTracker messageTracker = MessageTracker.getInstance(); - private ObjectMapper objectMapper = new ObjectMapper(); - private File typeDictionaryFile; - private GenerationException encounteredException; - private DefaultModelInstanceRepository metadataRepo; - private File dictionaryTypeDirectory = new File("target/temp-metadata", config.getDictionaryTypesRelativePath()); - - // Also uses CommonSteps for setup and tear down - - @After("@typeDictionary") - public void cleanUp() { - typeDictionaryFile = null; - encounteredException = null; - messageTracker.clear(); - } - - @Given("^a dictionary type described by \"([^\"]*)\", \"([^\"]*)\"$") - public void a_dictionary_type_described_by(String name, String type) throws Throwable { - createDictionaryType(name, type, null, null, null); - } - - @Given("^a dictionary type described by \"([^\"]*)\", \"([^\"]*)\", \"([^\"]*)\"$") - public void a_dictionary_type_described_by(String name, String type, List formats) throws Throwable { - createDictionaryType(name, type, null, null, formats); - } - - @Given("^a dictionary type described by \"([^\"]*)\", \"([^\"]*)\", \"([^\"]*)\", \"([^\"]*)\"$") - public void a_dictionary_type_described_by(String name, String type, String minLength, String maxLength) - throws Throwable { - createDictionaryType(name, type, minLength, maxLength, null); - } - - @Given("^a dictionary type described by \"([^\"]*)\", \"([^\"]*)\" with a blank format$") - public void a_dictionary_type_described_by_with_a_null_format(String name, String type) throws Throwable { - List emptyFormat = new ArrayList<>(); - - // simulate blank format here because cucumber strips empty spaces from input values - emptyFormat.add(" "); - - createDictionaryType(name, type, null, null, emptyFormat); - } - - @Given("^dictionary files that are described by the following different names$") - public void dictionary_files_that_are_described_by_the_following_different_names(List inputTypes) - throws Throwable { - createDictionaryTypes(inputTypes); - } - - @When("^dictionary type file is read$") - public void dictionary_type_file_is_read() throws Throwable { - encounteredException = null; - try { - ModelRepositoryConfiguration config = new ModelRepositoryConfiguration(); - config.setArtifactId("fermenter-mda"); - Map metadataUrlMap = config.getMetamodelInstanceLocations(); - - File sourceParentDirectory = dictionaryTypeDirectory.getParentFile(); - URI sourceDirectoryURI = sourceParentDirectory.toURI(); - metadataUrlMap.put("fermenter-mda", new ModelInstanceUrl("fermenter-mda", sourceDirectoryURI.toString())); - metadataRepo = new DefaultModelInstanceRepository(config); - metadataRepo.load(); - metadataRepo.validate(); - } catch (GenerationException e) { - encounteredException = e; - } - } - - @Then("^a valid dictionary type is available and can be looked up by name \"([^\"]*)\"$") - public void a_valid_dictionary_type_is_available_and_can_be_looked_up_by_name(String name) throws Throwable { - DictionaryType loadedDictionaryType = metadataRepo.getDictionaryType(name); - assertEquals("Unexpected dictionary type name!", name, loadedDictionaryType.getName()); - } - - @Then("^the generator throws an exception about invalid dictionary type metadata$") - public void the_generator_throws_an_exception_about_invalid_dictionary_type_metadata() throws Throwable { - assertNotNull("A GenerationException should have been thrown!", encounteredException); - } - - @Then("^there should be five dictionary types available$") - public void there_should_be_five_dictionary_types_available() throws Throwable { - assertEquals("Dictionary size doesn't match the number of types available!", 5, - metadataRepo.getDictionaryTypes().size()); - } - - /** - * Helper method to create the type dictionary for fields available. - * - * @param name - * The name of the dictionary type. - * @param type - * The type of the dictionary type. - * @param minLength - * The minimal length of the dictionary type. - * @param maxLength - * The maximal length of the dictionary type. - * @param formats - * The regex formats of the type. - */ - private void createDictionaryType(String name, String type, String minLength, String maxLength, - List formats) throws Throwable { - DictionaryTypeElement newDictionaryType = new DictionaryTypeElement(); - - // setup the type dictionary for read and validation - if (StringUtils.isNotBlank(name)) { - newDictionaryType.setName(name); - } - if (StringUtils.isNotBlank(type)) { - newDictionaryType.setType(type); - } - if (StringUtils.isNotBlank(minLength)) { - newDictionaryType.setMinLength(Integer.valueOf(minLength)); - } - if (StringUtils.isNotBlank(maxLength)) { - newDictionaryType.setMaxLength(Integer.valueOf(maxLength)); - } - if (null != formats) { - newDictionaryType.setFormats(formats); - } - - // make sure the directory for saving the json exists - dictionaryTypeDirectory.mkdirs(); - - // write the json file to the dictionary location - typeDictionaryFile = new File(dictionaryTypeDirectory, name + ".json"); - objectMapper.writeValue(typeDictionaryFile, newDictionaryType); - assertTrue("Dictionary type not written to file!", typeDictionaryFile.exists()); - } - - /** - * Helper method to create a list of types available. - * - * @param names - * The names of the dictionary types to create. - */ - private void createDictionaryTypes(List names) throws Throwable { - - // make sure the directory for saving the json exists - dictionaryTypeDirectory.mkdirs(); - - // clear out json files from previous tests - for (File jsonFile : dictionaryTypeDirectory.listFiles()) { - jsonFile.delete(); - } - - for (String name : names) { - DictionaryTypeElement newDictionaryType = new DictionaryTypeElement(); - newDictionaryType.setName(name); - newDictionaryType.setType(RandomStringUtils.randomAlphanumeric(5)); - - typeDictionaryFile = new File(dictionaryTypeDirectory, name + ".json"); - objectMapper.writeValue(typeDictionaryFile, newDictionaryType); - assertTrue("Dictionary type not written to file!", typeDictionaryFile.exists()); - } - } -} diff --git a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/TypeSteps.java b/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/TypeSteps.java deleted file mode 100644 index 1fba77f6..00000000 --- a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/element/TypeSteps.java +++ /dev/null @@ -1,71 +0,0 @@ -package org.technologybrewery.fermenter.mda.element; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.io.File; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.technologybrewery.fermenter.mda.generator.GenerationException; -import org.technologybrewery.fermenter.mda.util.JsonUtils; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; - -public class TypeSteps { - - protected ObjectMapper objectMapper = new ObjectMapper(); - protected File typeFile; - protected Type type; - protected GenerationException encounteredException; - - @Given("^a type described by \"([^\"]*)\", \"([^\"]*)\", \"([^\"]*)\"$") - public void a_type_described_by(String name, String fullyQualifiedImplementation, String shortImplementation) throws Throwable { - Type newType = new Type(); - if (StringUtils.isNotBlank(name)) { - newType.setName(name); - } - if (StringUtils.isNotBlank(fullyQualifiedImplementation)) { - newType.setFullyQualifiedImplementation(fullyQualifiedImplementation); - } - if (StringUtils.isNotBlank(shortImplementation)) { - newType.setShortImplementation(shortImplementation); - } - - typeFile = new File(FileUtils.getTempDirectory(), name + "-types.json"); - objectMapper.writeValue(typeFile, newType); - assertTrue("Type not written to file!", typeFile.exists()); - - } - - @When("^types are read$") - public void types_are_read() throws Throwable { - encounteredException = null; - - try { - type = JsonUtils.readAndValidateJson(typeFile, Type.class); - assertNotNull("Could not read target file!", type); - - } catch (GenerationException e) { - encounteredException = e; - } - - } - - @Then("^a valid type is available can be looked up name \"([^\"]*)\"$") - public void a_valid_type_is_available_can_be_looked_up_name(String expectedName) throws Throwable { - assertEquals("Unexpected name encountered!", expectedName, type.getName()); - } - - - @Then("^the generator throws an exception about invalid type metadata$") - public void the_generator_throws_an_exception_about_invalid_type_metadata() throws Throwable { - assertNotNull("A GenerationException should have been thrown!", encounteredException); - } - -} diff --git a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/generator/TestGenerator.java b/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/generator/TestGenerator.java deleted file mode 100644 index 22cb2a3c..00000000 --- a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/generator/TestGenerator.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.technologybrewery.fermenter.mda.generator; - -import org.apache.commons.lang3.RandomStringUtils; -import org.apache.velocity.VelocityContext; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.UUID; - -public class TestGenerator extends AbstractGenerator { - private final int size; - private final boolean overwritable; - private final String name; - - public TestGenerator(int fileSize, boolean overwritable) { - this.size = fileSize; - this.overwritable = overwritable; - name = UUID.randomUUID().toString(); - } - - @Override - protected String getOutputSubFolder() { - return "test-generator-output/"; - } - - @Override - public void generate(GenerationContext context) { - writeTemplate(); - context.setOverwritable(overwritable); - context.setTemplateName(getTemplateName()); - context.setOutputFile(getOutputName()); - super.generateFile(context, new VelocityContext()); - } - - @Override - protected File getBaseFile(GenerationContext gc) { - return new File("target"); - } - - private void writeTemplate() { - try { - Path templateFile = getTemplatePath(); - String randomData = RandomStringUtils.randomAlphanumeric(size); - Files.writeString(templateFile, randomData); - } catch (IOException e) { - throw new RuntimeException("Failed to write test template file", e); - } - } - - public Path getTemplatePath() { - return Paths.get("target", "test-classes", getTemplateName()); - } - - public Path getOutputPath() { - return getBaseFile(null).toPath() - .resolve(getOutputSubFolder()) - .resolve(getOutputName()); - } - - private String getTemplateName() { - return name + "-template.vm" ; - } - - private String getOutputName() { - return name + "-output" ; - } - - public long getFileSize() { - return size; - } -} diff --git a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/metamodel/MetadataRepositoryManagerTest.java b/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/metamodel/MetadataRepositoryManagerTest.java deleted file mode 100644 index 509d0c9e..00000000 --- a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/metamodel/MetadataRepositoryManagerTest.java +++ /dev/null @@ -1,108 +0,0 @@ -package org.technologybrewery.fermenter.mda.metamodel; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; - -import org.junit.Before; -import org.junit.Test; - -public class MetadataRepositoryManagerTest { - - @Before - public void resetManager() { - ModelInstanceRepositoryManager.clear(); - } - - @Test - public void testDefaultMetadataReposistory() { - setNewDefaultMetadataRepository(); - - } - - @Test - public void testTestMetadataReposistory() { - TestMetadataRepository testRepository = new TestMetadataRepository(null); - TestMetadataRepository managedRespository = ModelInstanceRepositoryManager - .getMetamodelRepository(TestMetadataRepository.class); - assertNull(managedRespository); - ModelInstanceRepositoryManager.setRepository(testRepository); - managedRespository = ModelInstanceRepositoryManager.getMetamodelRepository(TestMetadataRepository.class); - assertEquals(testRepository, managedRespository); - - } - - @Test - public void testMultipleSimultaneousMetadataReposistory() { - ModelInstanceRepository defaultRepository = new DefaultModelInstanceRepository(null); - ModelInstanceRepositoryManager.setRepository(defaultRepository); - - TestMetadataRepository testRepository = new TestMetadataRepository(null); - ModelInstanceRepositoryManager.setRepository(testRepository); - - ModelInstanceRepository managedDefaultRespository = ModelInstanceRepositoryManager - .getMetamodelRepository(DefaultModelInstanceRepository.class); - assertEquals(defaultRepository, managedDefaultRespository); - - TestMetadataRepository managedTestRespository = ModelInstanceRepositoryManager - .getMetamodelRepository(TestMetadataRepository.class); - assertEquals(testRepository, managedTestRespository); - - } - - @Test - public void testOverwriteMetadataReposistory() { - setNewDefaultMetadataRepository(); - - ModelInstanceRepository newDefaultRepository = new DefaultModelInstanceRepository(null); - ModelInstanceRepositoryManager.setRepository(newDefaultRepository); - ModelInstanceRepository managedDefaultRespository = ModelInstanceRepositoryManager - .getMetamodelRepository(DefaultModelInstanceRepository.class); - assertEquals(newDefaultRepository, managedDefaultRespository); - - } - - @Test - public void testClearMetadataReposistoryManager() { - setNewDefaultMetadataRepository(); - - ModelInstanceRepositoryManager.clear(); - ModelInstanceRepository managedDefaultRespository = ModelInstanceRepositoryManager - .getMetamodelRepository(DefaultModelInstanceRepository.class); - assertNull(managedDefaultRespository); - - } - - private void setNewDefaultMetadataRepository() { - ModelInstanceRepository defaultRepository = new DefaultModelInstanceRepository(null); - ModelInstanceRepository managedRespository = ModelInstanceRepositoryManager - .getMetamodelRepository(DefaultModelInstanceRepository.class); - assertNull(managedRespository); - ModelInstanceRepositoryManager.setRepository(defaultRepository); - managedRespository = ModelInstanceRepositoryManager.getMetamodelRepository(DefaultModelInstanceRepository.class); - assertEquals(defaultRepository, managedRespository); - } - -} - -/** - * Used for testing only. - */ -class TestMetadataRepository extends AbstractModelInstanceRepository { - - public TestMetadataRepository(ModelRepositoryConfiguration config) { - super(config); - } - - @Override - public void load() { - // do nothing - - } - - @Override - public void validate() { - // do nothing - - } - -} diff --git a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/reporting/GenerationStatsSteps.java b/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/reporting/GenerationStatsSteps.java deleted file mode 100644 index 99d8cf30..00000000 --- a/fermenter-mda/src/test/java/org/technologybrewery/fermenter/mda/reporting/GenerationStatsSteps.java +++ /dev/null @@ -1,128 +0,0 @@ -package org.technologybrewery.fermenter.mda.reporting; - -import cucumber.api.java.After; -import cucumber.api.java.Before; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; -import org.apache.maven.execution.MavenSession; -import org.apache.velocity.app.VelocityEngine; -import org.apache.velocity.runtime.RuntimeConstants; -import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader; -import org.technologybrewery.fermenter.mda.MojoTestCaseWrapper; -import org.technologybrewery.fermenter.mda.generator.AbstractGenerator; -import org.technologybrewery.fermenter.mda.generator.GenerationContext; -import org.technologybrewery.fermenter.mda.generator.TestGenerator; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.nio.file.Files; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; - -import static org.junit.Assert.assertEquals; - -public class GenerationStatsSteps { - private static final Logger logger = LoggerFactory.getLogger(GenerationStatsSteps.class); - private static final int MAX_SIZE = 1000; - - private List generators; - private StatisticsService statisticsService; - private VelocityEngine engine; - private MojoTestCaseWrapper testCase; - - @Before("@generationStats") - public void setup() throws Exception { - generators = new ArrayList<>(); - testCase = new MojoTestCaseWrapper(); - testCase.configurePluginTestHarness(); - MavenSession session = testCase.newMavenSession(); - statisticsService = new StatisticsService(session); - - engine = new VelocityEngine(); - engine.setProperty(RuntimeConstants.RESOURCE_LOADERS, "classpath"); - engine.setProperty("resource.loader.classpath.class", ClasspathResourceLoader.class.getName()); - engine.init(); - } - - @After("@generationStats") - public void cleanUp() throws Exception { - for (TestGenerator eachGenerator : generators) { - Files.deleteIfExists(eachGenerator.getTemplatePath()); - Files.deleteIfExists(eachGenerator.getOutputPath()); - } - testCase.tearDownPluginTestHarness(); - } - - @Given("^statistics are enabled$") - public void statisticsAreEnabled() { - statisticsService.setStatsReportingEnabled(true); - } - - @Given("^statistics are not enabled$") - public void statisticsAreNotEnabled() { - statisticsService.setStatsReportingEnabled(false); - } - - @Given("^an overwritable target is selected$") - public void anOverwritableTargetIsSelected() { - generators.add(new TestGenerator(randomSize(), true)); - } - - @Given("^a non-overwritable target is selected$") - public void aNonOverwritableTargetIsSelected() { - generators.add(new TestGenerator(randomSize(), false)); - } - - @Given("^the target does not exist$") - public void theTargetDoesNotExist() throws IOException { - for (TestGenerator eachGenerator : generators) { - Files.deleteIfExists(eachGenerator.getOutputPath()); - } - } - - @Given("^the target already exists$") - public void theTargetAlreadyExists() throws IOException { - for (TestGenerator eachGenerator : generators) { - Files.writeString(eachGenerator.getOutputPath(), "temp"); - } - } - - @Given("^multiple targets are selected$") - public void multipleTargetsAreSelected() { - generators.add(new TestGenerator(randomSize(), true)); - generators.add(new TestGenerator(randomSize(), true)); - generators.add(new TestGenerator(randomSize(), true)); - } - - @When("^the generators are executed$") - public void theGeneratorsAreExecuted() { - GenerationContext context = new GenerationContext(); - context.setEngine(engine); - context.setStatisticsService(statisticsService); - for (AbstractGenerator eachGenerator : generators) { - eachGenerator.generate(context); - } - } - - @Then("^the total file size of the generated files is captured$") - public void theTotalFileSizeOfTheGeneratedFilesIsCaptured() { - long expectedSize = generators.stream() - .mapToLong(TestGenerator::getFileSize) - .sum(); - long recordedSize = statisticsService.calculateFinalStats().getTotalSize(); - assertEquals("Recorded generated file size differs from expected", expectedSize, recordedSize); - } - - @Then("^the file size is not recorded$") - public void theFileSizeIsNotRecorded() { - long recordedSize = statisticsService.calculateFinalStats().getTotalSize(); - assertEquals("Recorded generated file size differs from expected", 0L, recordedSize); - } - - private static int randomSize() { - return ThreadLocalRandom.current().nextInt(0, MAX_SIZE); - } -} diff --git a/fermenter-mda/src/test/resources/plugin-testing-harness-pom-files/java-default-config/pom.xml b/fermenter-mda/src/test/resources/plugin-testing-harness-pom-files/java-default-config/pom.xml deleted file mode 100644 index 7ca87542..00000000 --- a/fermenter-mda/src/test/resources/plugin-testing-harness-pom-files/java-default-config/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - 4.0.0 - - Model-Driven Architecture Code Generator::Generate Java Project with Default Configurations Test - org.technologybrewery.fermenter - java-default-config - 1.0.0 - - - - - org.technologybrewery.fermenter - fermenter-mda - ${project.version} - - org.technologybrewery.fermenter - foo - - - - - - - diff --git a/fermenter-mda/src/test/resources/plugin-testing-harness-pom-files/java-no-base-package/pom.xml b/fermenter-mda/src/test/resources/plugin-testing-harness-pom-files/java-no-base-package/pom.xml deleted file mode 100644 index b34f3d16..00000000 --- a/fermenter-mda/src/test/resources/plugin-testing-harness-pom-files/java-no-base-package/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - 4.0.0 - - Model-Driven Architecture Code Generator::Generate Java Project without basePackage Config Test - org.technologybrewery.fermenter - java-no-base-package - 1.0.0 - jar - - - - - org.technologybrewery.fermenter - fermenter-mda - ${project.version} - - foo - - - - - - - diff --git a/fermenter-mda/src/test/resources/plugin-testing-harness-pom-files/override-local-metadata-config/pom.xml b/fermenter-mda/src/test/resources/plugin-testing-harness-pom-files/override-local-metadata-config/pom.xml deleted file mode 100644 index c5f7a7e7..00000000 --- a/fermenter-mda/src/test/resources/plugin-testing-harness-pom-files/override-local-metadata-config/pom.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - 4.0.0 - - Model-Driven Architecture Code Generator::Override Local Metadata Root for Habushu Project Test - org.technologybrewery.fermenter - override-local-metadata-config - 1.0.0 - habushu - - - - - org.technologybrewery.fermenter - fermenter-mda - ${project.version} - - foo - ${basedir}/src/metadata - - - - org.technologybrewery.habushu - habushu-maven-plugin - true - - - - - - diff --git a/fermenter-mda/src/test/resources/plugin-testing-harness-pom-files/python-habushu-packaging/pom.xml b/fermenter-mda/src/test/resources/plugin-testing-harness-pom-files/python-habushu-packaging/pom.xml deleted file mode 100644 index a642f905..00000000 --- a/fermenter-mda/src/test/resources/plugin-testing-harness-pom-files/python-habushu-packaging/pom.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - 4.0.0 - - Model-Driven Architecture Code Generator::Generate Python Project with Habushu Packaging Test - org.technologybrewery.fermenter - python-habushu-packaging - 1.0.0 - habushu - - - - - org.technologybrewery.fermenter - fermenter-mda - ${project.version} - - foo - - - - org.technologybrewery.habushu - habushu-maven-plugin - true - - - - - - diff --git a/fermenter-mda/src/test/resources/plugin-testing-harness-pom-files/python-language-config/pom.xml b/fermenter-mda/src/test/resources/plugin-testing-harness-pom-files/python-language-config/pom.xml deleted file mode 100644 index f30754bc..00000000 --- a/fermenter-mda/src/test/resources/plugin-testing-harness-pom-files/python-language-config/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - 4.0.0 - - Model-Driven Architecture Code Generator::Generate Python Project with Python Language Config Test - org.technologybrewery.fermenter - python-language-config - 1.0.0 - - - - - org.technologybrewery.fermenter - fermenter-mda - ${project.version} - - python - foo - - - - - - - diff --git a/fermenter-mda/src/test/resources/specifications/advanced-profile-model.feature b/fermenter-mda/src/test/resources/specifications/advanced-profile-model.feature deleted file mode 100644 index f6679e22..00000000 --- a/fermenter-mda/src/test/resources/specifications/advanced-profile-model.feature +++ /dev/null @@ -1,21 +0,0 @@ -#@advancedProfile -#Feature: Support dynamic creation of profiles based on command line interaction -# -# Background: -# Given the following profiles and related targets: -# | profileName | family | targetNames | -# | profileA | foo | target1, target2 | -# | profileB | foo | target3, target4 | -# | profileC | bar | target5, target6 | -# | profileD | blah | target3, target7 | -# -# Scenario Outline: Discover implementation options for a given profile family -# When profiles are read -# And implementations for "" are requested -# Then the following "" are return -# -# Examples: -# | family | expectedImplementations | -# | foo | profileA, profileB | -# | bar | profileC | -# | blah | profileD | diff --git a/fermenter-mda/src/test/resources/specifications/entity-model.feature b/fermenter-mda/src/test/resources/specifications/entity-model.feature deleted file mode 100644 index 970c6ad2..00000000 --- a/fermenter-mda/src/test/resources/specifications/entity-model.feature +++ /dev/null @@ -1,229 +0,0 @@ -@entity -Feature: Specify entities for use in model-driven file generation - - Scenario Outline: specify named entities via a JSON metamodel - Given an entity named "" in "" with documentation "" - When entities are read - Then an entity metamodel instance is returned for the name "" in "" with the documentation "" - - Examples: - | name | package | documentation | - | Foo | test.entity | My purpose | - | Bar | test.entity.alt | My different purpose | - - Scenario Outline: specify an entity parent information via a JSON metamodel - Given an entity named "" in "" - And an entity name "" in "" with parent "" and inheritance strategy "" - When entities are read - Then an entity metamodel instance is returned for the name "" in "" with parent "" and inheritance strategy "" - - Examples: - | name | package | parent | inheritanceStrategy | - | Foo | test.entity.parent | Alpha | mapped-superclass | - | Bar | test.entity.parent | Beta | mapped-superclass | - - Scenario Outline: specify an entity parent that defaults/aligns inheritance strategy via a JSON metamodel - Given an entity named "" in "" - And an entity name "" in "" with parent "" and inheritance strategy "" - When entities are read - Then an entity metamodel instance is returned for the name "" in "" with parent "" and inheritance strategy "" - - Examples: - | name | package | parent | inheritanceStrategy | expectedInheritanceStrategy | - | Foo | test.entity.parent | Alpha | MAPPED-superCLASS | mapped-superclass | - | Bar | test.entity.parent | Beta | | mapped-superclass | - - Scenario Outline: specify a table name via a JSON metamodel - Given an entity named "" in "" with table "" - When entities are read - Then an entity metamodel instance is returned for the name "" in "" with table "
" - - Examples: - | name | package | table | - | Foo | test.entity | FOO | - | Bar | test.entity.alt | BAR | - - Scenario Outline: specify a lock strategy via a JSON metamodel - Given an entity named "" in "" with table "" - When entities are read - Then an entity metamodel instance is returned for the name "" in "" with a lock strategy of "" - - Examples: - | name | package | lockStrategy | - | Foo | test.entity | optimistic | - | Bar | test.entity.alt | optimistic | - - Scenario Outline: default a lock strategy via a JSON metamodel - Given an entity named "" in "" with table "" - When entities are read - Then an entity metamodel instance is returned for the name "" in "" with a lock strategy of "" - - Examples: - | name | package | lockStrategy | expectedLockStrategy | - | Foo | test.lock.default | | optimistic | - | Bar | test.default.alt | | optimistic | - - Scenario Outline: specify a transient entity via a JSON metamodel - Given an entity named "" in "" with transient flag "" - When entities are read - Then an entity metamodel instance is returned for the name "" in "" with a transient flag of "" - - Examples: - | name | package | transient | - | Foo | test.entity | true | - | Bar | test.entity.alt | false | - - Scenario Outline: default the transient state of an entity - Given an entity named "" in "" with transient flag "" - When entities are read - Then an entity metamodel instance is returned for the name "" in "" with a transient flag of "" - - Examples: - | name | package | transient | expectedTransient | - | Foo | test.entity | | false | - | Bar | test.entity.alt | | false | - - Scenario Outline: specify an identifier via a JSON metamodel - Given an entity named "" in "" with an indentifier: - | name | documentation | type | column | - | | | | | - When entities are read - Then an entity metamodel instance is returned for the name "" in "" with the following identifier: - | name | documentation | type | column | - | | | | | - - Examples: - | name | package | fieldName | documentation | type | column | - | Foo | test.entity | FooId | Primary key of Foo | string | FOO_ID | - | Bar | test.entity.alt | BarId | Primary key of Bar | integer | BAR_ID | - - Scenario Outline: specify a field via a JSON metamodel - Given an entity named "" in "" with a field: - | name | documentation | type | column | label | - | | | | |