diff --git a/.github/workflows/build_docs.yml b/.github/workflows/build_docs.yml deleted file mode 100644 index 6f92022c5..000000000 --- a/.github/workflows/build_docs.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Build Documentation - -on: [push] - -jobs: - build: - - runs-on: ubuntu-latest - strategy: - matrix: - python: [3.7, 3.8] - - steps: - - uses: actions/checkout@v2 - name: Check out source-code repository - - - name: Setup Python - uses: actions/setup-python@v1 - with: - python-version: ${{ matrix.python }} - - - name: Install pip - run: | - python -m pip install --upgrade pip - - - name: Install doc dependencies - run: | - pip install -r docs/requirements.txt - - - name: Build docs - run: | - cd docs - make html - diff --git a/.qube.yml b/.qube.yml index ac0e06ef9..f6e6a0443 100644 --- a/.qube.yml +++ b/.qube.yml @@ -4,7 +4,7 @@ email: sven.fillinger@qbic.uni-tuebingen.de project_name: data-model-lib project_short_description: "Data models. A collection of QBiC's central data models\ \ and DTOs. " -version: 2.13.0 +version: 2.14.0 domain: lib language: groovy project_slug: data-model-lib diff --git a/CHANGELOG.rst b/CHANGELOG.rst index c40a0a0b3..5e976e3aa 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -4,6 +4,22 @@ Changelog This project adheres to `Semantic Versioning `_. +2.14.0 (2021-10-27) +------------------- + +**Added** + +* Added String representing product abbreviation to ProductCategory Enum (`#266 `_) +* ProductId now provides 'From' method to be created via String representation (`#264 `_) + +**Fixed** + +**Dependencies** + +**Deprecated** + +* ``life.qbic.datamodel.dtos.business.services.ProductType.groovy``. The abbreviation is now accessible via the ``abbreviation`` property in ``life.qbic.datamodel.dtos.business.ProductCategory`` (`#266 `_) + 2.13.0 (2021-10-13) ------------------- diff --git a/docs/conf.py b/docs/conf.py index 4971609d3..899faaa96 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -55,9 +55,9 @@ # the built documents. # # The short X.Y version. -version = '2.13.0' +version = '2.14.0' # The full version, including alpha/beta/rc tags. -release = '2.13.0' +release = '2.14.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/pom.xml b/pom.xml index aec2d99dc..83ca85566 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ life.qbic data-model-lib - 2.13.0 + 2.14.0 data-model-lib http://github.com/qbicsoftware/data-model-lib Data models. A collection of QBiC's central data models and DTOs. diff --git a/qube.cfg b/qube.cfg index ee3a9cd7e..c3e8f9f25 100644 --- a/qube.cfg +++ b/qube.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 2.13.0 +current_version = 2.14.0 [bumpversion_files_whitelisted] dot_qube = .qube.yml diff --git a/src/main/groovy/life/qbic/datamodel/dtos/business/ProductCategory.groovy b/src/main/groovy/life/qbic/datamodel/dtos/business/ProductCategory.groovy index 4078d3338..e0c7ef0f9 100644 --- a/src/main/groovy/life/qbic/datamodel/dtos/business/ProductCategory.groovy +++ b/src/main/groovy/life/qbic/datamodel/dtos/business/ProductCategory.groovy @@ -9,22 +9,28 @@ package life.qbic.datamodel.dtos.business */ enum ProductCategory { - SEQUENCING("Sequencing"), - PROJECT_MANAGEMENT("Project Management"), - PRIMARY_BIOINFO("Primary Bioinformatics"), - SECONDARY_BIOINFO("Secondary Bioinformatics"), - DATA_STORAGE("Data Storage"), - PROTEOMIC("Proteomics"), - METABOLOMIC("Metabolomics"), - EXTERNAL_SERVICE("External Service") + SEQUENCING("Sequencing", "SE"), + PROJECT_MANAGEMENT("Project Management", "PM"), + PRIMARY_BIOINFO("Primary Bioinformatics", "PB"), + SECONDARY_BIOINFO("Secondary Bioinformatics", "SB"), + DATA_STORAGE("Data Storage", "DS"), + PROTEOMIC("Proteomics", "PR"), + METABOLOMIC("Metabolomics", "ME"), + EXTERNAL_SERVICE("External Service", "EXT") /** * Value describing the enum type with a string */ - private final String value + private String value - ProductCategory(String value) { + /** + * Abbreviation for the enum type name + */ + private String abbreviation + + ProductCategory(String value, String abbreviation) { this.value = value + this.abbreviation = abbreviation } /** @@ -35,4 +41,14 @@ enum ProductCategory { String getValue() { return value } + + /** + * Returns the abbreviation associated to the given enum + * This is NOT the same as {@link #toString} + * @return a user-friendly string value + */ + String getAbbreviation() { + return abbreviation + } + } \ No newline at end of file diff --git a/src/main/groovy/life/qbic/datamodel/dtos/business/ProductCategoryFactory.groovy b/src/main/groovy/life/qbic/datamodel/dtos/business/ProductCategoryFactory.groovy index 855a13491..e23f01da8 100644 --- a/src/main/groovy/life/qbic/datamodel/dtos/business/ProductCategoryFactory.groovy +++ b/src/main/groovy/life/qbic/datamodel/dtos/business/ProductCategoryFactory.groovy @@ -27,4 +27,20 @@ class ProductCategoryFactory extends EnumFactory{ } return desiredKey } + + /** + * This method returns the enum with the provided String abbreviation. + * + * @throws IllegalArgumentException in case the String could not be mapped + * @param abbreviation the String corresponding to the abbreviation stored in the enum + * @return the enum key for the provided abbreviation + */ + ProductCategory getForAbbreviation(String abbreviation) { + ProductCategory desiredKey + desiredKey = ProductCategory.values().find {it.abbreviation.equals(abbreviation.trim())} + if (!desiredKey) { + throw new IllegalArgumentException("Unknown abbreviation'$abbreviation' for ${ProductCategory.getSimpleName()}") + } + return desiredKey + } } diff --git a/src/main/groovy/life/qbic/datamodel/dtos/business/ProductId.groovy b/src/main/groovy/life/qbic/datamodel/dtos/business/ProductId.groovy index 32a7b044a..c7c5a5eff 100644 --- a/src/main/groovy/life/qbic/datamodel/dtos/business/ProductId.groovy +++ b/src/main/groovy/life/qbic/datamodel/dtos/business/ProductId.groovy @@ -27,6 +27,9 @@ class ProductId implements Comparable{ /** * A builder for ProductId instances. */ + + private static final ProductCategoryFactory productCategoryFactory = new ProductCategoryFactory() + static class Builder { private String productType private long uniqueId @@ -113,6 +116,39 @@ class ProductId implements Comparable{ return type } + /** + * Returns a ProductId from a given String representation + * + * Expects a ProductIdString with the Format P_N + * P being the one of the abbreviation values stored in {@link ProductCategory} enum + * N being an Integer Number + * + * @param String representation of a productId + * @return ProductId containing productCategory abbreviation and uniqueNumber of String representation + */ + static ProductId from(String productId) { + if (!productId.contains("_")) { + throw new IllegalArgumentException("${productId} is not a valid product identifier.") + } + def splitId = productId.split("_") + String productCategoryString = splitId[0].trim() + String runningNumberString = splitId[1].trim() + Long runningNumber + ProductCategory productCategory + try { + runningNumber = Long.parseUnsignedLong(runningNumberString) + productCategory = productCategoryFactory.getForAbbreviation(productCategoryString) + } + catch (NumberFormatException numberFormatException) { + throw new NumberFormatException("Provided productId does not have a valid uniqueID. Provided unique id: ${runningNumberString}") + } + catch (IllegalArgumentException illegalArgumentException) { + throw new IllegalArgumentException("ProductId does not have a valid ProductCategory abbreviation. Provided abbreviation: ${productCategoryString}") + + } + return new Builder(productCategory.getAbbreviation() , runningNumber).build() + } + /** * Returns a String representation in the format: * diff --git a/src/main/groovy/life/qbic/datamodel/dtos/business/services/DataStorage.groovy b/src/main/groovy/life/qbic/datamodel/dtos/business/services/DataStorage.groovy index 21bc5fe2c..cc937b81f 100644 --- a/src/main/groovy/life/qbic/datamodel/dtos/business/services/DataStorage.groovy +++ b/src/main/groovy/life/qbic/datamodel/dtos/business/services/DataStorage.groovy @@ -1,6 +1,7 @@ package life.qbic.datamodel.dtos.business.services import groovy.transform.EqualsAndHashCode +import life.qbic.datamodel.dtos.business.ProductCategory import life.qbic.datamodel.dtos.business.ProductId import life.qbic.datamodel.dtos.business.facilities.Facility @@ -20,12 +21,12 @@ class DataStorage extends PartialProduct { * @param description The description of what the product is about. * @param unitPrice The price in € per unit * @param unit The product unit - * @param runningNumber Number used in conjunction with ProductType{@link life.qbic.datamodel.dtos.business.services.ProductType} to identify product + * @param runningNumber Number used in conjunction with {@link ProductCategory} to identify product * @deprecated since 2.5.0 */ @Deprecated DataStorage(String name, String description, double unitPrice, ProductUnit unit, String runningNumber) { - super(name, description, unitPrice, unit, new ProductId(ProductType.DATA_STORAGE.toString(), runningNumber)) + super(name, description, unitPrice, unit, new ProductId(ProductCategory.DATA_STORAGE.getAbbreviation(), runningNumber)) } /** @@ -37,13 +38,13 @@ class DataStorage extends PartialProduct { * @param description The description of what the product is about. * @param unitPrice The price in € per unit * @param unit The product unit - * @param runningNumber Number used in conjunction with ProductType{@link life.qbic.datamodel.dtos.business.services.ProductType} to identify product + * @param runningNumber Number used in conjunction with {@link ProductCategory} to identify product * * @deprecated 2.11.0 */ @Deprecated DataStorage(String name, String description, double unitPrice, ProductUnit unit, long runningNumber) { - super(name, description, unitPrice, unit, new ProductId.Builder(ProductType.DATA_STORAGE.toString(), runningNumber).build()) + super(name, description, unitPrice, unit, new ProductId.Builder(ProductCategory.DATA_STORAGE.getAbbreviation(), runningNumber).build()) } /** @@ -56,11 +57,11 @@ class DataStorage extends PartialProduct { * @param internalUnitPrice The price in € per unit for internal customers * @param externalUnitPrice The price in € per unit for external customers * @param unit The product unit - * @param runningNumber Number used in conjunction with ProductType{@link life.qbic.datamodel.dtos.business.services.ProductType} to identify product + * @param runningNumber Number used in conjunction with {@link ProductCategory} to identify product * * @since 2.11.0 */ DataStorage(String name, String description, double internalUnitPrice, double externalUnitPrice, ProductUnit unit, long runningNumber, Facility serviceProvider) { - super(name, description, internalUnitPrice, externalUnitPrice, unit, new ProductId.Builder(ProductType.DATA_STORAGE.toString(), runningNumber).build(), serviceProvider) + super(name, description, internalUnitPrice, externalUnitPrice, unit, new ProductId.Builder(ProductCategory.DATA_STORAGE.getAbbreviation(), runningNumber).build(), serviceProvider) } } diff --git a/src/main/groovy/life/qbic/datamodel/dtos/business/services/ExternalServiceProduct.groovy b/src/main/groovy/life/qbic/datamodel/dtos/business/services/ExternalServiceProduct.groovy index 34bee0ab9..ae089d1f1 100644 --- a/src/main/groovy/life/qbic/datamodel/dtos/business/services/ExternalServiceProduct.groovy +++ b/src/main/groovy/life/qbic/datamodel/dtos/business/services/ExternalServiceProduct.groovy @@ -1,6 +1,7 @@ package life.qbic.datamodel.dtos.business.services import groovy.transform.EqualsAndHashCode +import life.qbic.datamodel.dtos.business.ProductCategory import life.qbic.datamodel.dtos.business.ProductId import life.qbic.datamodel.dtos.business.facilities.Facility @@ -24,6 +25,7 @@ class ExternalServiceProduct extends PartialProduct { * @param serviceProvider The service provider */ ExternalServiceProduct(String name, String description, double internalUnitPrice, double externalUnitPrice, ProductUnit unit, long runningNumber, Facility serviceProvider) { - super(name, description, internalUnitPrice, externalUnitPrice, unit, new ProductId.Builder(ProductType.EXTERNAL_SERVICE.toString(), runningNumber).build(), serviceProvider) + super(name, description, internalUnitPrice, externalUnitPrice, unit, new ProductId.Builder( + ProductCategory.EXTERNAL_SERVICE.getAbbreviation(), runningNumber).build(), serviceProvider) } } diff --git a/src/main/groovy/life/qbic/datamodel/dtos/business/services/MetabolomicAnalysis.groovy b/src/main/groovy/life/qbic/datamodel/dtos/business/services/MetabolomicAnalysis.groovy index b2e62e524..ca23f9567 100644 --- a/src/main/groovy/life/qbic/datamodel/dtos/business/services/MetabolomicAnalysis.groovy +++ b/src/main/groovy/life/qbic/datamodel/dtos/business/services/MetabolomicAnalysis.groovy @@ -1,6 +1,7 @@ package life.qbic.datamodel.dtos.business.services import groovy.transform.EqualsAndHashCode +import life.qbic.datamodel.dtos.business.ProductCategory import life.qbic.datamodel.dtos.business.ProductId import life.qbic.datamodel.dtos.business.facilities.Facility @@ -20,12 +21,12 @@ class MetabolomicAnalysis extends AtomicProduct { * @param description The description of what the product is about. * @param unitPrice The price in € per unit * @param unit The product unit - * @param runningNumber Number used in conjunction with ProductType{@link life.qbic.datamodel.dtos.business.services.ProductType} to identify product + * @param runningNumber Number used in conjunction with {@link ProductCategory} to identify product * @deprecated since 2.5.0 */ @Deprecated MetabolomicAnalysis(String name, String description, double unitPrice, ProductUnit unit, String runningNumber) { - super(name, description, unitPrice, unit, new ProductId(ProductType.METABOLOMIC.toString(), runningNumber)) + super(name, description, unitPrice, unit, new ProductId(ProductCategory.METABOLOMIC.getAbbreviation(), runningNumber)) } /** @@ -37,13 +38,13 @@ class MetabolomicAnalysis extends AtomicProduct { * @param description The description of what the product is about. * @param unitPrice The price in € per unit * @param unit The product unit - * @param runningNumber Number used in conjunction with ProductType{@link life.qbic.datamodel.dtos.business.services.ProductType} to identify product + * @param runningNumber Number used in conjunction with {@link ProductCategory} to identify product * * @deprecated 2.11.0 */ @Deprecated MetabolomicAnalysis(String name, String description, double unitPrice, ProductUnit unit, long runningNumber) { - super(name, description, unitPrice, unit, new ProductId.Builder(ProductType.METABOLOMIC.toString(), runningNumber).build()) + super(name, description, unitPrice, unit, new ProductId.Builder(ProductCategory.METABOLOMIC.getAbbreviation(), runningNumber).build()) } /** @@ -56,13 +57,13 @@ class MetabolomicAnalysis extends AtomicProduct { * @param internalUnitPrice The price in € per unit for internal customers * @param externalUnitPrice The price in € per unit for external customers * @param unit The product unit - * @param runningNumber Number used in conjunction with ProductType{@link life.qbic.datamodel.dtos.business.services.ProductType} to identify product + * @param runningNumber Number used in conjunction with {@link ProductCategory} to identify product * @param serviceProvider The facility providing the service product * * @since 2.11.0 */ MetabolomicAnalysis(String name, String description, double internalUnitPrice, double externalUnitPrice, ProductUnit unit, long runningNumber, Facility serviceProvider) { - super(name, description, internalUnitPrice, externalUnitPrice, unit, new ProductId.Builder(ProductType.METABOLOMIC.toString(), runningNumber).build(), serviceProvider) + super(name, description, internalUnitPrice, externalUnitPrice, unit, new ProductId.Builder(ProductCategory.METABOLOMIC.getAbbreviation(), runningNumber).build(), serviceProvider) } } diff --git a/src/main/groovy/life/qbic/datamodel/dtos/business/services/PrimaryAnalysis.groovy b/src/main/groovy/life/qbic/datamodel/dtos/business/services/PrimaryAnalysis.groovy index 2f06907d4..67badca36 100644 --- a/src/main/groovy/life/qbic/datamodel/dtos/business/services/PrimaryAnalysis.groovy +++ b/src/main/groovy/life/qbic/datamodel/dtos/business/services/PrimaryAnalysis.groovy @@ -1,6 +1,7 @@ package life.qbic.datamodel.dtos.business.services import groovy.transform.EqualsAndHashCode +import life.qbic.datamodel.dtos.business.ProductCategory import life.qbic.datamodel.dtos.business.ProductId import life.qbic.datamodel.dtos.business.facilities.Facility @@ -20,12 +21,12 @@ class PrimaryAnalysis extends AtomicProduct { * @param description The description of what the product is about. * @param unitPrice The price in € per unit * @param unit The product unit - * @param runningNumber Number used in conjunction with ProductType{@link life.qbic.datamodel.dtos.business.services.ProductType} to identify product + * @param runningNumber Number used in conjunction with {@link ProductCategory} to identify product * @deprecated since 2.5.0 */ @Deprecated PrimaryAnalysis(String name, String description, double unitPrice, ProductUnit unit, String runningNumber) { - super(name, description, unitPrice, unit, new ProductId(ProductType.PRIMARY_BIOINFO.toString(), runningNumber)) + super(name, description, unitPrice, unit, new ProductId(ProductCategory.PRIMARY_BIOINFO.getAbbreviation(), runningNumber)) } /** @@ -37,13 +38,13 @@ class PrimaryAnalysis extends AtomicProduct { * @param description The description of what the product is about. * @param unitPrice The price in € per unit * @param unit The product unit - * @param runningNumber Number used in conjunction with ProductType{@link life.qbic.datamodel.dtos.business.services.ProductType} to identify product + * @param runningNumber Number used in conjunction with {@link ProductCategory} to identify product * * @deprecated 2.11.0 */ @Deprecated PrimaryAnalysis(String name, String description, double unitPrice, ProductUnit unit, long runningNumber) { - super(name, description, unitPrice, unit, new ProductId.Builder(ProductType.PRIMARY_BIOINFO.toString(), runningNumber).build()) + super(name, description, unitPrice, unit, new ProductId.Builder(ProductCategory.PRIMARY_BIOINFO.getAbbreviation(), runningNumber).build()) } /** @@ -56,12 +57,12 @@ class PrimaryAnalysis extends AtomicProduct { * @param internalUnitPrice The price in € per unit for internal customers * @param externalUnitPrice The price in € per unit for external customers * @param unit The product unit - * @param runningNumber Number used in conjunction with ProductType{@link life.qbic.datamodel.dtos.business.services.ProductType} to identify product + * @param runningNumber Number used in conjunction with {@link ProductCategory} to identify product * @param serviceProvider The facility providing the service product * * @since 2.11.0 */ PrimaryAnalysis(String name, String description, double internalUnitPrice, double externalUnitPrice, ProductUnit unit, long runningNumber, Facility serviceProvider) { - super(name, description, internalUnitPrice, externalUnitPrice, unit, new ProductId.Builder(ProductType.PRIMARY_BIOINFO.toString(), runningNumber).build(), serviceProvider) + super(name, description, internalUnitPrice, externalUnitPrice, unit, new ProductId.Builder(ProductCategory.PRIMARY_BIOINFO.getAbbreviation(), runningNumber).build(), serviceProvider) } } diff --git a/src/main/groovy/life/qbic/datamodel/dtos/business/services/ProductType.groovy b/src/main/groovy/life/qbic/datamodel/dtos/business/services/ProductType.groovy index bb1f25f60..d8ec92fae 100644 --- a/src/main/groovy/life/qbic/datamodel/dtos/business/services/ProductType.groovy +++ b/src/main/groovy/life/qbic/datamodel/dtos/business/services/ProductType.groovy @@ -5,8 +5,10 @@ package life.qbic.datamodel.dtos.business.services * by the ProductIdentifier {@link life.qbic.datamodel.dtos.business.ProductId} * * @since: 2.0.0 + * @deprecated Will be removed, please use the abbreviation in the {@link life.qbic.datamodel.dtos.business.ProductCategory} + * @see life.qbic.datamodel.dtos.business.ProductCategory#getAbbreviation() */ - +@Deprecated enum ProductType { SEQUENCING("SE"), diff --git a/src/main/groovy/life/qbic/datamodel/dtos/business/services/ProjectManagement.groovy b/src/main/groovy/life/qbic/datamodel/dtos/business/services/ProjectManagement.groovy index e99d1c65f..76aed2982 100644 --- a/src/main/groovy/life/qbic/datamodel/dtos/business/services/ProjectManagement.groovy +++ b/src/main/groovy/life/qbic/datamodel/dtos/business/services/ProjectManagement.groovy @@ -1,6 +1,7 @@ package life.qbic.datamodel.dtos.business.services import groovy.transform.EqualsAndHashCode +import life.qbic.datamodel.dtos.business.ProductCategory import life.qbic.datamodel.dtos.business.ProductId import life.qbic.datamodel.dtos.business.facilities.Facility @@ -20,12 +21,12 @@ class ProjectManagement extends PartialProduct { * @param description The description of what the product is about. * @param unitPrice The price in € per unit * @param unit The product unit - * @param runningNumber Number used in conjunction with ProductType{@link life.qbic.datamodel.dtos.business.services.ProductType} to identify product + * @param runningNumber Number used in conjunction with {@link ProductCategory} to identify product * @deprecated since 2.5.0 */ @Deprecated ProjectManagement(String name, String description, double unitPrice, ProductUnit unit, String runningNumber) { - super(name, description, unitPrice, unit, new ProductId(ProductType.PROJECT_MANAGEMENT.toString(), runningNumber)) + super(name, description, unitPrice, unit, new ProductId(ProductCategory.PROJECT_MANAGEMENT.getAbbreviation(), runningNumber)) } /** @@ -37,13 +38,13 @@ class ProjectManagement extends PartialProduct { * @param description The description of what the product is about. * @param unitPrice The price in € per unit * @param unit The product unit - * @param runningNumber Number used in conjunction with ProductType{@link life.qbic.datamodel.dtos.business.services.ProductType} to identify product + * @param runningNumber Number used in conjunction with {@link ProductCategory} to identify product * * @deprecated 2.11.0 */ @Deprecated ProjectManagement(String name, String description, double unitPrice, ProductUnit unit, long runningNumber) { - super(name, description, unitPrice, unit, new ProductId.Builder(ProductType.PROJECT_MANAGEMENT.toString(), runningNumber).build()) + super(name, description, unitPrice, unit, new ProductId.Builder(ProductCategory.PROJECT_MANAGEMENT.getAbbreviation(), runningNumber).build()) } /** @@ -56,12 +57,12 @@ class ProjectManagement extends PartialProduct { * @param internalUnitPrice The price in € per unit for internal customers * @param externalUnitPrice The price in € per unit for external customers * @param unit The product unit - * @param runningNumber Number used in conjunction with ProductType{@link life.qbic.datamodel.dtos.business.services.ProductType} to identify product + * @param runningNumber Number used in conjunction with {@link ProductCategory} to identify product * @param serviceProvider The facility providing the service product * * @since 2.11.0 */ ProjectManagement(String name, String description, double internalUnitPrice, double externalUnitPrice, ProductUnit unit, long runningNumber, Facility serviceProvider) { - super(name, description, internalUnitPrice, externalUnitPrice, unit, new ProductId.Builder(ProductType.PROJECT_MANAGEMENT.toString(), runningNumber).build(), serviceProvider) + super(name, description, internalUnitPrice, externalUnitPrice, unit, new ProductId.Builder(ProductCategory.PROJECT_MANAGEMENT.getAbbreviation(), runningNumber).build(), serviceProvider) } } diff --git a/src/main/groovy/life/qbic/datamodel/dtos/business/services/ProteomicAnalysis.groovy b/src/main/groovy/life/qbic/datamodel/dtos/business/services/ProteomicAnalysis.groovy index aa6b50aca..174bffce3 100644 --- a/src/main/groovy/life/qbic/datamodel/dtos/business/services/ProteomicAnalysis.groovy +++ b/src/main/groovy/life/qbic/datamodel/dtos/business/services/ProteomicAnalysis.groovy @@ -1,6 +1,7 @@ package life.qbic.datamodel.dtos.business.services import groovy.transform.EqualsAndHashCode +import life.qbic.datamodel.dtos.business.ProductCategory import life.qbic.datamodel.dtos.business.ProductId import life.qbic.datamodel.dtos.business.facilities.Facility @@ -21,12 +22,12 @@ class ProteomicAnalysis extends AtomicProduct { * @param description The description of what the product is about. * @param unitPrice The price in € per unit * @param unit The product unit - * @param runningNumber Number used in conjunction with ProductType{@link life.qbic.datamodel.dtos.business.services.ProductType} to identify product + * @param runningNumber Number used in conjunction with {@link ProductCategory} to identify product * @deprecated since 2.5.0 */ @Deprecated ProteomicAnalysis(String name, String description, double unitPrice, ProductUnit unit, String runningNumber) { - super(name, description, unitPrice, unit, new ProductId(ProductType.PROTEOMIC.toString(), runningNumber)) + super(name, description, unitPrice, unit, new ProductId(ProductCategory.PROTEOMIC.getAbbreviation(), runningNumber)) } /** @@ -38,13 +39,13 @@ class ProteomicAnalysis extends AtomicProduct { * @param description The description of what the product is about. * @param unitPrice The price in € per unit * @param unit The product unit - * @param runningNumber Number used in conjunction with ProductType{@link life.qbic.datamodel.dtos.business.services.ProductType} to identify product + * @param runningNumber Number used in conjunction with {@link ProductCategory} to identify product * * @deprecated 2.11.0 */ @Deprecated ProteomicAnalysis(String name, String description, double unitPrice, ProductUnit unit, long runningNumber) { - super(name, description, unitPrice, unit, new ProductId.Builder(ProductType.PROTEOMIC.toString(), runningNumber).build()) + super(name, description, unitPrice, unit, new ProductId.Builder(ProductCategory.PROTEOMIC.getAbbreviation(), runningNumber).build()) } /** @@ -57,12 +58,12 @@ class ProteomicAnalysis extends AtomicProduct { * @param internalUnitPrice The price in € per unit for internal customers * @param externalUnitPrice The price in € per unit for external customers * @param unit The product unit - * @param runningNumber Number used in conjunction with ProductType{@link life.qbic.datamodel.dtos.business.services.ProductType} to identify product + * @param runningNumber Number used in conjunction with {@link ProductCategory} to identify product * @param serviceProvider The facility providing the service product * * @since 2.11.0 */ ProteomicAnalysis(String name, String description, double internalUnitPrice, double externalUnitPrice, ProductUnit unit, long runningNumber, Facility serviceProvider) { - super(name, description, internalUnitPrice, externalUnitPrice, unit, new ProductId.Builder(ProductType.PROTEOMIC.toString(), runningNumber).build(), serviceProvider) + super(name, description, internalUnitPrice, externalUnitPrice, unit, new ProductId.Builder(ProductCategory.PROTEOMIC.getAbbreviation(), runningNumber).build(), serviceProvider) } } diff --git a/src/main/groovy/life/qbic/datamodel/dtos/business/services/SecondaryAnalysis.groovy b/src/main/groovy/life/qbic/datamodel/dtos/business/services/SecondaryAnalysis.groovy index 25407a3ae..9a69ea244 100644 --- a/src/main/groovy/life/qbic/datamodel/dtos/business/services/SecondaryAnalysis.groovy +++ b/src/main/groovy/life/qbic/datamodel/dtos/business/services/SecondaryAnalysis.groovy @@ -1,6 +1,7 @@ package life.qbic.datamodel.dtos.business.services import groovy.transform.EqualsAndHashCode +import life.qbic.datamodel.dtos.business.ProductCategory import life.qbic.datamodel.dtos.business.ProductId import life.qbic.datamodel.dtos.business.facilities.Facility @@ -21,12 +22,12 @@ class SecondaryAnalysis extends AtomicProduct { * @param description The description of what the product is about. * @param unitPrice The price in € per unit * @param unit The product unit - * @param runningNumber Number used in conjunction with ProductType{@link life.qbic.datamodel.dtos.business.services.ProductType} to identify product + * @param runningNumber Number used in conjunction with {@link ProductCategory} to identify product * @deprecated since 2.5.0 */ @Deprecated SecondaryAnalysis(String name, String description, double unitPrice, ProductUnit unit, String runningNumber) { - super(name, description, unitPrice, unit, new ProductId(ProductType.SECONDARY_BIOINFO.toString() , runningNumber)) + super(name, description, unitPrice, unit, new ProductId(ProductCategory.SECONDARY_BIOINFO.getAbbreviation() , runningNumber)) } /** @@ -38,13 +39,13 @@ class SecondaryAnalysis extends AtomicProduct { * @param description The description of what the product is about. * @param unitPrice The price in € per unit * @param unit The product unit - * @param runningNumber Number used in conjunction with ProductType{@link life.qbic.datamodel.dtos.business.services.ProductType} to identify product + * @param runningNumber Number used in conjunction with {@link ProductCategory} to identify product * * @deprecated 2.11.0 */ @Deprecated SecondaryAnalysis(String name, String description, double unitPrice, ProductUnit unit, long runningNumber) { - super(name, description, unitPrice, unit, new ProductId.Builder(ProductType.SECONDARY_BIOINFO.toString(), runningNumber).build()) + super(name, description, unitPrice, unit, new ProductId.Builder(ProductCategory.SECONDARY_BIOINFO.getAbbreviation(), runningNumber).build()) } /** @@ -57,11 +58,11 @@ class SecondaryAnalysis extends AtomicProduct { * @param internalUnitPrice The price in € per unit for internal customers * @param externalUnitPrice The price in € per unit for external customers * @param unit The product unit - * @param runningNumber Number used in conjunction with ProductType{@link life.qbic.datamodel.dtos.business.services.ProductType} to identify product + * @param runningNumber Number used in conjunction with {@link ProductCategory} to identify product * * @since 2.11.0 */ SecondaryAnalysis(String name, String description, double internalUnitPrice, double externalUnitPrice, ProductUnit unit, long runningNumber, Facility serviceProvider) { - super(name, description, internalUnitPrice, externalUnitPrice, unit, new ProductId.Builder(ProductType.SECONDARY_BIOINFO.toString(), runningNumber).build(), serviceProvider) + super(name, description, internalUnitPrice, externalUnitPrice, unit, new ProductId.Builder(ProductCategory.SECONDARY_BIOINFO.getAbbreviation(), runningNumber).build(), serviceProvider) } } diff --git a/src/main/groovy/life/qbic/datamodel/dtos/business/services/Sequencing.groovy b/src/main/groovy/life/qbic/datamodel/dtos/business/services/Sequencing.groovy index a99f1e518..7d41f2e14 100644 --- a/src/main/groovy/life/qbic/datamodel/dtos/business/services/Sequencing.groovy +++ b/src/main/groovy/life/qbic/datamodel/dtos/business/services/Sequencing.groovy @@ -1,6 +1,7 @@ package life.qbic.datamodel.dtos.business.services import groovy.transform.EqualsAndHashCode +import life.qbic.datamodel.dtos.business.ProductCategory import life.qbic.datamodel.dtos.business.ProductId import life.qbic.datamodel.dtos.business.facilities.Facility @@ -20,12 +21,12 @@ class Sequencing extends AtomicProduct { * @param description The description of what the product is about. * @param unitPrice The price in € per unit * @param unit The product unit - * @param runningNumber Number used in conjunction with ProductType{@link life.qbic.datamodel.dtos.business.services.ProductType} to identify product + * @param runningNumber Number used in conjunction with {@link ProductCategory} to identify product * @deprecated 2.5.0 */ @Deprecated Sequencing(String name, String description, double unitPrice, ProductUnit unit, String runningNumber) { - super(name, description, unitPrice, unit, new ProductId(ProductType.SEQUENCING.toString(), runningNumber)) + super(name, description, unitPrice, unit, new ProductId(ProductCategory.SEQUENCING.getAbbreviation(), runningNumber)) } /** @@ -37,13 +38,13 @@ class Sequencing extends AtomicProduct { * @param description The description of what the product is about. * @param unitPrice The price in € per unit * @param unit The product unit - * @param runningNumber Number used in conjunction with ProductType{@link life.qbic.datamodel.dtos.business.services.ProductType} to identify product + * @param runningNumber Number used in conjunction with {@link ProductCategory} to identify product * * @deprecated 2.11.0 */ @Deprecated Sequencing(String name, String description, double unitPrice, ProductUnit unit, long runningNumber) { - super(name, description, unitPrice, unit, new ProductId.Builder(ProductType.SEQUENCING.toString(), runningNumber).build()) + super(name, description, unitPrice, unit, new ProductId.Builder(ProductCategory.SEQUENCING.getAbbreviation(), runningNumber).build()) } /** @@ -56,12 +57,12 @@ class Sequencing extends AtomicProduct { * @param internalUnitPrice The price in € per unit for internal customers * @param externalUnitPrice The price in € per unit for external customers * @param unit The product unit - * @param runningNumber Number used in conjunction with ProductType{@link life.qbic.datamodel.dtos.business.services.ProductType} to identify product + * @param runningNumber Number used in conjunction with {@link ProductCategory} to identify product * @param serviceProvider The facility providing the service product * * @since 2.11.0 */ Sequencing(String name, String description, double internalUnitPrice, double externalUnitPrice, ProductUnit unit, long runningNumber, Facility serviceProvider) { - super(name, description, internalUnitPrice, externalUnitPrice, unit, new ProductId.Builder(ProductType.SEQUENCING.toString(), runningNumber).build(), serviceProvider) + super(name, description, internalUnitPrice, externalUnitPrice, unit, new ProductId.Builder(ProductCategory.SEQUENCING.getAbbreviation(), runningNumber).build(), serviceProvider) } } diff --git a/src/test/groovy/life/qbic/datamodel/dtos/business/ProductCategoryFactorySpec.groovy b/src/test/groovy/life/qbic/datamodel/dtos/business/ProductCategoryFactorySpec.groovy index a46e4d7aa..0619d12d1 100644 --- a/src/test/groovy/life/qbic/datamodel/dtos/business/ProductCategoryFactorySpec.groovy +++ b/src/test/groovy/life/qbic/datamodel/dtos/business/ProductCategoryFactorySpec.groovy @@ -38,6 +38,7 @@ class ProductCategoryFactorySpec extends Specification { "Data Storage" | ProductCategory.DATA_STORAGE "Proteomics" | ProductCategory.PROTEOMIC "Metabolomics" | ProductCategory.METABOLOMIC + "External Service" | ProductCategory.EXTERNAL_SERVICE } def "GetForString(java.lang.String) returns the correct enums and ignores whitespace"() { @@ -56,5 +57,44 @@ class ProductCategoryFactorySpec extends Specification { "\nData Storage\t" | ProductCategory.DATA_STORAGE " Proteomics " | ProductCategory.PROTEOMIC " Metabolomics " | ProductCategory.METABOLOMIC + " External Service " | ProductCategory.EXTERNAL_SERVICE + } + + def "GetForAbbreviation(java.lang.String) returns the correct enums for correct requests"() { + when: "the factory is tasked to deliver an enum given a string value" + ProductCategory category = productCategoryFactory.getForAbbreviation(request) + + then: "the returned ProductCategory is the same as the expected result" + category == expectedEnum + + where: "all valid combinations are tested" + request | expectedEnum + "SE" | ProductCategory.SEQUENCING + "PM" | ProductCategory.PROJECT_MANAGEMENT + "PB" | ProductCategory.PRIMARY_BIOINFO + "SB" | ProductCategory.SECONDARY_BIOINFO + "DS" | ProductCategory.DATA_STORAGE + "PR" | ProductCategory.PROTEOMIC + "ME" | ProductCategory.METABOLOMIC + "EXT" | ProductCategory.EXTERNAL_SERVICE + } + + def "GetForAbbreviation(java.lang.String) returns the correct enums and ignores whitespace"() { + when: "the factory is tasked to deliver an enum given a string value" + ProductCategory category = productCategoryFactory.getForAbbreviation(request) + + then: "the returned ProductCategory is the same as the expected result" + category == expectedEnum + + where: "all valid combinations are tested" + request | expectedEnum + "SE " | ProductCategory.SEQUENCING + " PM" | ProductCategory.PROJECT_MANAGEMENT + " PB " | ProductCategory.PRIMARY_BIOINFO + "\tSB " | ProductCategory.SECONDARY_BIOINFO + "\nDS\t" | ProductCategory.DATA_STORAGE + " PR " | ProductCategory.PROTEOMIC + " ME " | ProductCategory.METABOLOMIC + " EXT " | ProductCategory.EXTERNAL_SERVICE } } diff --git a/src/test/groovy/life/qbic/datamodel/dtos/business/ProductIdSpec.groovy b/src/test/groovy/life/qbic/datamodel/dtos/business/ProductIdSpec.groovy index 72c09e4f4..e37d370e0 100644 --- a/src/test/groovy/life/qbic/datamodel/dtos/business/ProductIdSpec.groovy +++ b/src/test/groovy/life/qbic/datamodel/dtos/business/ProductIdSpec.groovy @@ -120,16 +120,84 @@ class ProductIdSpec extends Specification { result == expectedResult where: - x | y | expectedResult - new ProductId.Builder("A",1).build() | new ProductId.Builder("B",1).build() | -1 - new ProductId.Builder("B",1).build() | new ProductId.Builder("A",1).build() | 1 - new ProductId.Builder("A",1).build() | new ProductId.Builder("A",1).build() | 0 - new ProductId.Builder("A",1).build() | new ProductId.Builder("A",42).build() | -1 - new ProductId.Builder("A",42).build() | new ProductId.Builder("A",1).build() | 1 - new ProductId.Builder("A",1).build() | new ProductId.Builder("B",0).build() | -1 - new ProductId.Builder("Z",42).build() | new ProductId.Builder("A",100).build() | 1 + x | y | expectedResult + new ProductId.Builder("A", 1).build() | new ProductId.Builder("B", 1).build() | -1 + new ProductId.Builder("B", 1).build() | new ProductId.Builder("A", 1).build() | 1 + new ProductId.Builder("A", 1).build() | new ProductId.Builder("A", 1).build() | 0 + new ProductId.Builder("A", 1).build() | new ProductId.Builder("A", 42).build() | -1 + new ProductId.Builder("A", 42).build() | new ProductId.Builder("A", 1).build() | 1 + new ProductId.Builder("A", 1).build() | new ProductId.Builder("B", 0).build() | -1 + new ProductId.Builder("Z", 42).build() | new ProductId.Builder("A", 100).build() | 1 } + def "Valid ProductId String can be converted to ProductId"() { + when: + ProductId productId = ProductId.from(validProductIdString) + then: + validProductId == productId + + where: + validProductIdString | validProductId + "SE_1" | new ProductId.Builder("SE", 1).build() + "PM_2" | new ProductId.Builder("PM", 2).build() + "PB_3" | new ProductId.Builder("PB", 3).build() + "SB_4" | new ProductId.Builder("SB", 4).build() + "DS_5" | new ProductId.Builder("DS", 5).build() + "PR_6" | new ProductId.Builder("PR", 6).build() + "ME_7" | new ProductId.Builder("ME", 7).build() + "EXT_8" | new ProductId.Builder("EXT", 8).build() + } + + def "ProductId String with invalid number will return NumberFormatException"() { + when: + ProductId.from(inValidProductIdString) + then: + thrown(NumberFormatException) + where: + inValidProductIdString | _ + "SE_1.5" | _ + "PM_Z" | _ + "PB_ARG" | _ + "SB_1,4" | _ + "DS_1,A" | _ + "PR_A_5" | _ + "ME_A-0" | _ + "EXT_D/0" | _ + } + + def "ProductId String with invalid productType will return IllegalArgumentException"() { + when: + ProductId.from(inValidProductIdString) + then: + thrown(IllegalArgumentException) + where: + inValidProductIdString | _ + "Dane_1" | _ + "Mary_2" | _ + "Fred_3" | _ + "A:P_4" | _ + "101_5" | _ + "Wat_6" | _ + "Decibel_7" | _ + "Why_8" | _ + } + + def "ProductId String with invalid Format will return IllegalArgumentException"() { + when: + ProductId.from(inValidProductIdString) + then: + thrown(IllegalArgumentException) + where: + inValidProductIdString | _ + "SE1" | _ + "PM2" | _ + "PB3" | _ + "SB4" | _ + "DS5" | _ + "PR&6" | _ + "ME-7" | _ + "EXT/8" | _ + } }