diff --git a/CMakeLists.txt b/CMakeLists.txt index 9cd3371e8..ba9f3e9b0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,8 +10,8 @@ set (FESAPI_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) # version mechanism set (Fesapi_VERSION_MAJOR 2) -set (Fesapi_VERSION_MINOR 7) -set (Fesapi_VERSION_PATCH 1) +set (Fesapi_VERSION_MINOR 8) +set (Fesapi_VERSION_PATCH 0) set (Fesapi_VERSION_TWEAK 0) set (Fesapi_VERSION ${Fesapi_VERSION_MAJOR}.${Fesapi_VERSION_MINOR}.${Fesapi_VERSION_PATCH}.${Fesapi_VERSION_TWEAK}) diff --git a/cmake/swigCsInclude.i b/cmake/swigCsInclude.i index 611f9d0ea..c5f6b6e76 100644 --- a/cmake/swigCsInclude.i +++ b/cmake/swigCsInclude.i @@ -1052,7 +1052,6 @@ namespace RESQML2_NS PointsProperty*, PolylineRepresentation*, PolylineSetRepresentation*, - PropertySet*, RepresentationSetRepresentation*, RockFluidOrganizationInterpretation*, RockFluidUnitInterpretation*, diff --git a/cmake/swigJavaInclude.i b/cmake/swigJavaInclude.i index e3342477c..6478b0134 100644 --- a/cmake/swigJavaInclude.i +++ b/cmake/swigJavaInclude.i @@ -1064,7 +1064,6 @@ namespace RESQML2_NS PointsProperty*, PolylineRepresentation*, PolylineSetRepresentation*, - PropertySet*, RepresentationSetRepresentation*, RockFluidOrganizationInterpretation*, RockFluidUnitInterpretation*, diff --git a/cmake/swigPythonInclude.i.in b/cmake/swigPythonInclude.i.in index 6f3d992b4..8451fe817 100644 --- a/cmake/swigPythonInclude.i.in +++ b/cmake/swigPythonInclude.i.in @@ -107,7 +107,6 @@ namespace RESQML2_NS PointsProperty*, PolylineRepresentation*, PolylineSetRepresentation*, - PropertySet*, RepresentationSetRepresentation*, RockFluidOrganizationInterpretation*, RockFluidUnitInterpretation*, diff --git a/example/example.cpp b/example/example.cpp index 3c0d74097..aa2750cb6 100644 --- a/example/example.cpp +++ b/example/example.cpp @@ -1008,7 +1008,7 @@ void serializeGrid(COMMON_NS::DataObjectRepository * pck, EML2_NS::AbstractHdfPr int64_t prop2Values[2] = { 10, 11 }; discreteProp2->pushBackInt64Hdf5Array3dOfValues(prop2Values, 2, 1, 1, hdfProxy, 1111); - RESQML2_NS::PropertySet* propSet = pck->createPropertySet("", "Testing property set", false, true,gsoap_resqml2_0_1::resqml20__TimeSetKind::not_x0020a_x0020time_x0020set); + RESQML2_0_1_NS::PropertySet* propSet = pck->createPropertySet("", "Testing property set", false, true,gsoap_resqml2_0_1::resqml20__TimeSetKind::not_x0020a_x0020time_x0020set); propSet->pushBackProperty(discreteProp1); propSet->pushBackProperty(discreteProp2); @@ -2525,9 +2525,9 @@ void showAllProperties(RESQML2_NS::AbstractRepresentation const * rep, bool* ena RESQML2_NS::AbstractProperty const * prop = propertySet[propIndex]; showAllMetadata(prop, "\t"); - std::vector propSets = prop->getPropertySets(); + std::vector propSets = prop->getPropertySets(); for (size_t propSetIndex = 0; propSetIndex < propSets.size(); ++propSetIndex) { - RESQML2_NS::PropertySet* propSet = propSets[propSetIndex]; + RESQML2_0_1_NS::PropertySet* propSet = propSets[propSetIndex]; std::cout << "\tContained in property set : "; showAllMetadata(propSet, "\t"); } diff --git a/src/common/DataObjectRepository.cpp b/src/common/DataObjectRepository.cpp index dc313ce19..c289aae87 100644 --- a/src/common/DataObjectRepository.cpp +++ b/src/common/DataObjectRepository.cpp @@ -2400,7 +2400,7 @@ EML2_NS::PropertyKind* DataObjectRepository::createPropertyKind(const std::strin } } -RESQML2_NS::PropertySet* DataObjectRepository::createPropertySet(const std::string & guid, const std::string & title, +RESQML2_0_1_NS::PropertySet* DataObjectRepository::createPropertySet(const std::string & guid, const std::string & title, bool hasMultipleRealizations, bool hasSinglePropertyKind, gsoap_resqml2_0_1::resqml20__TimeSetKind timeSetKind) { return new RESQML2_0_1_NS::PropertySet(this, guid, title, hasMultipleRealizations, hasSinglePropertyKind, timeSetKind); @@ -2844,6 +2844,7 @@ GETTER_DATAOBJECTS_IMPL(RESQML2_NS::UnstructuredGridRepresentation, Unstructured GETTER_DATAOBJECTS_IMPL(RESQML2_NS::WellboreFeature, Wellbore) GETTER_DATAOBJECTS_IMPL(RESQML2_NS::WellboreTrajectoryRepresentation, WellboreTrajectoryRepresentation) GETTER_DATAOBJECTS_IMPL(RESQML2_NS::WellboreFrameRepresentation, WellboreFrameRepresentation) +GETTER_DATAOBJECTS_IMPL(RESQML2_0_1_NS::PropertySet, PropertySet) GETTER_DATAOBJECTS_IMPL(WITSML2_NS::Well, WitsmlWell) GETTER_DATAOBJECTS_IMPL(WITSML2_NS::Wellbore, WitsmlWellbore) diff --git a/src/common/DataObjectRepository.h b/src/common/DataObjectRepository.h index 3dbe83005..e9d49c610 100644 --- a/src/common/DataObjectRepository.h +++ b/src/common/DataObjectRepository.h @@ -80,7 +80,6 @@ namespace RESQML2_NS class PointsProperty; class PolylineRepresentation; class PolylineSetRepresentation; - class PropertySet; class RepresentationSetRepresentation; class RockFluidOrganizationInterpretation; class RockFluidUnitInterpretation; @@ -123,6 +122,7 @@ namespace RESQML2_0_1_NS class Horizon; class PointsProperty; class PropertyKind; + class PropertySet; class RockFluidUnitFeature; class SeismicLineFeature; class TectonicBoundaryFeature; @@ -588,6 +588,8 @@ namespace COMMON_NS GETTER_DATAOBJECTS(RESQML2_NS::WellboreTrajectoryRepresentation, WellboreTrajectoryRepresentation) GETTER_DATAOBJECTS(RESQML2_NS::WellboreFrameRepresentation, WellboreFrameRepresentation) + GETTER_DATAOBJECTS(RESQML2_0_1_NS::PropertySet, PropertySet) + GETTER_DATAOBJECTS(WITSML2_NS::Well, WitsmlWell) GETTER_DATAOBJECTS(WITSML2_NS::Wellbore, WitsmlWellbore) GETTER_DATAOBJECTS(WITSML2_NS::Trajectory, WitsmlTrajectory) @@ -2737,7 +2739,7 @@ namespace COMMON_NS * * @returns A pointer to the new property set. */ - DLL_IMPORT_OR_EXPORT RESQML2_NS::PropertySet* createPropertySet(const std::string & guid, const std::string & title, + DLL_IMPORT_OR_EXPORT RESQML2_0_1_NS::PropertySet* createPropertySet(const std::string & guid, const std::string & title, bool hasMultipleRealizations, bool hasSinglePropertyKind, gsoap_resqml2_0_1::resqml20__TimeSetKind timeSetKind); /** diff --git a/src/resqml2/AbstractProperty.cpp b/src/resqml2/AbstractProperty.cpp index 8610326d8..461ed0018 100644 --- a/src/resqml2/AbstractProperty.cpp +++ b/src/resqml2/AbstractProperty.cpp @@ -31,10 +31,10 @@ under the License. #include "../eml2/TimeSeries.h" #include "AbstractRepresentation.h" -#include "PropertySet.h" #include "AbstractLocal3dCrs.h" #include "../resqml2_0_1/PropertyKindMapper.h" +#include "../resqml2_0_1/PropertySet.h" using namespace RESQML2_NS; using namespace std; @@ -279,31 +279,19 @@ gsoap_eml2_3::eml23__IndexableElement AbstractProperty::getAttachmentKind() cons throw logic_error("Not implemented yet"); } -std::vector AbstractProperty::getPropertySets() const +std::vector AbstractProperty::getPropertySets() const { - return repository->getSourceObjects(this); + return repository->getSourceObjects(this); } -unsigned int AbstractProperty::getPropertySetCount() const +uint64_t AbstractProperty::getPropertySetCount() const { - const std::vector & propSets = getPropertySets(); - - if (propSets.size() > (std::numeric_limits::max)()) { - throw range_error("Too much property set containing this property"); - } - - return static_cast(propSets.size()); + return getPropertySets().size(); } -RESQML2_NS::PropertySet * AbstractProperty::getPropertySet(unsigned int index) const +RESQML2_0_1_NS::PropertySet * AbstractProperty::getPropertySet(uint64_t index) const { - const std::vector & propSets = getPropertySets(); - - if (index < propSets.size()) { - return propSets[index]; - } - - throw out_of_range("The index of the prop Set is out of range"); + return getPropertySets().at(index); } void AbstractProperty::setLocalCrs(AbstractLocal3dCrs * crs) diff --git a/src/resqml2/AbstractProperty.h b/src/resqml2/AbstractProperty.h index b395b0ee3..ee480c50f 100644 --- a/src/resqml2/AbstractProperty.h +++ b/src/resqml2/AbstractProperty.h @@ -146,7 +146,7 @@ namespace RESQML2_NS * * @returns A vector of all property sets which contain this property. */ - DLL_IMPORT_OR_EXPORT std::vector getPropertySets() const; + DLL_IMPORT_OR_EXPORT std::vector getPropertySets() const; /** * Gets the count of property sets which contain this property @@ -156,7 +156,7 @@ namespace RESQML2_NS * * @returns The count of property sets which contain this property. */ - DLL_IMPORT_OR_EXPORT unsigned int getPropertySetCount() const; + DLL_IMPORT_OR_EXPORT uint64_t getPropertySetCount() const; /** * Gets a given property set taken from all property sets which contain this property @@ -167,7 +167,7 @@ namespace RESQML2_NS * * @returns The property set at @p index. */ - DLL_IMPORT_OR_EXPORT RESQML2_NS::PropertySet * getPropertySet(unsigned int index) const; + DLL_IMPORT_OR_EXPORT RESQML2_0_1_NS::PropertySet * getPropertySet(uint64_t index) const; //********************************************* //****************** CRS ********************** @@ -206,7 +206,7 @@ namespace RESQML2_NS /** * Checks if this property has at least one realization index. Realization index is used if the property is * the result of a multi-realization process. - * Reamrk : v2.0.1 is constrained to have a maximum of one realisation index + * Remark : v2.0.1 is constrained to have a maximum of one realisation index * * @returns True if the property has at least one realization index, false if not. */ @@ -216,6 +216,7 @@ namespace RESQML2_NS * Gets the realization index of this property. Realization index is used if the property is the * result of a multi-realization process. You should have checked before that this property * actually has a realization index. + * Remark : v2.0.1 is constrained to have a maximum of one realisation index * * @exception std::invalid_argument If this property has actually no realization index. * @@ -242,6 +243,7 @@ namespace RESQML2_NS * @exception std::logic_error If no supported gSOAP proxy is available. * * @param realizationIndices The realization indices to set to this property. + * Remark : v2.0.1 is constrained to have a maximum of one realisation index * @param [in,out] hdfProxy (Optional) The HDF proxy where to store @p * realizationIndices values. If @p nullptr (default), then * the repository default HDF proxy will be used. diff --git a/src/resqml2/CMakeLists.txt b/src/resqml2/CMakeLists.txt index 29fdbd211..6312a6e1c 100644 --- a/src/resqml2/CMakeLists.txt +++ b/src/resqml2/CMakeLists.txt @@ -33,7 +33,6 @@ set(FESAPI_RESQML_2_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/${RESQML_PREFIX_2}/Abstr ${CMAKE_CURRENT_SOURCE_DIR}/${RESQML_PREFIX_2}/PointsProperty.cpp ${CMAKE_CURRENT_SOURCE_DIR}/${RESQML_PREFIX_2}/PolylineRepresentation.cpp ${CMAKE_CURRENT_SOURCE_DIR}/${RESQML_PREFIX_2}/PolylineSetRepresentation.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/${RESQML_PREFIX_2}/PropertySet.cpp ${CMAKE_CURRENT_SOURCE_DIR}/${RESQML_PREFIX_2}/RepresentationSetRepresentation.cpp ${CMAKE_CURRENT_SOURCE_DIR}/${RESQML_PREFIX_2}/RockFluidOrganizationInterpretation.cpp ${CMAKE_CURRENT_SOURCE_DIR}/${RESQML_PREFIX_2}/SealedVolumeFrameworkRepresentation.cpp @@ -105,7 +104,6 @@ set(FESAPI_RESQML_2_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/${RESQML_PREFIX_2}/Abstr ${CMAKE_CURRENT_SOURCE_DIR}/${RESQML_PREFIX_2}/PointsProperty.h ${CMAKE_CURRENT_SOURCE_DIR}/${RESQML_PREFIX_2}/PolylineRepresentation.h ${CMAKE_CURRENT_SOURCE_DIR}/${RESQML_PREFIX_2}/PolylineSetRepresentation.h - ${CMAKE_CURRENT_SOURCE_DIR}/${RESQML_PREFIX_2}/PropertySet.h ${CMAKE_CURRENT_SOURCE_DIR}/${RESQML_PREFIX_2}/RepresentationSetRepresentation.h ${CMAKE_CURRENT_SOURCE_DIR}/${RESQML_PREFIX_2}/RockFluidOrganizationInterpretation.h ${CMAKE_CURRENT_SOURCE_DIR}/${RESQML_PREFIX_2}/RockFluidUnitInterpretation.h diff --git a/src/resqml2/PropertySet.cpp b/src/resqml2/PropertySet.cpp deleted file mode 100644 index 14a3af547..000000000 --- a/src/resqml2/PropertySet.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/*----------------------------------------------------------------------- -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"; you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. ------------------------------------------------------------------------*/ -#include "PropertySet.h" - -#include - -#include "AbstractProperty.h" - -using namespace std; -using namespace RESQML2_NS; - -const char* PropertySet::XML_TAG = "PropertySet"; - -void PropertySet::setParent(PropertySet * parent) -{ - if (parent == nullptr) { - throw invalid_argument("The parent property set cannot be null."); - } - - repository->addRelationship(this, parent); - - setXmlParent(parent); -} - -PropertySet * PropertySet::getParent() const -{ - return static_cast(repository->getDataObjectByUuid(getParentDor().getUuid())); -} - -std::vector PropertySet::getChildren() const -{ - return repository->getSourceObjects(this); -} - -unsigned int PropertySet::getChildrenCount() const -{ - const std::vector & children = getChildren(); - - if (children.size() > (std::numeric_limits::max)()) { - throw range_error("Too much children in this property set"); - } - - return static_cast(children.size()); -} - -PropertySet* PropertySet::getChildren(unsigned int index) const -{ - const std::vector & children = getChildren(); - - if (index < children.size()) { - return children[index]; - } - - throw out_of_range("The index of the child is out of range"); -} - -void PropertySet::pushBackProperty(RESQML2_NS::AbstractProperty * prop) -{ - if (prop == nullptr) - throw invalid_argument("The property to push cannot be null."); - - pushBackXmlProperty(prop); - - repository->addRelationship(this, prop); -} - -std::vector PropertySet::getProperties() const -{ - return repository->getTargetObjects(this); -} - -unsigned int PropertySet::getPropertyCount() const -{ - const std::vector & props = getProperties(); - - if (props.size() > (std::numeric_limits::max)()) { - throw range_error("Too much property in this property set"); - } - - return static_cast(props.size()); -} - -RESQML2_NS::AbstractProperty* PropertySet::getProperty(unsigned int index) const -{ - const std::vector & props = getProperties(); - - if (index < props.size()) { - return props[index]; - } - - throw out_of_range("The index of the property is out of range"); -} - -void PropertySet::loadTargetRelationships() -{ - COMMON_NS::DataObjectReference dor = getParentDor(); - if (!dor.isEmpty()) { - PropertySet* propertySet = getRepository()->getDataObjectByUuid(dor.getUuid()); - if (propertySet == nullptr) { // partial transfer - getRepository()->createPartial(dor); - propertySet = getRepository()->getDataObjectByUuid(dor.getUuid()); - if (propertySet == nullptr) { - throw invalid_argument("The DOR looks invalid."); - } - } - repository->addRelationship(this, propertySet); - } - - const std::vector& propDors = getAllPropertiesDors(); - for (size_t i = 0; i < propDors.size(); ++i) { - dor = propDors[i]; - RESQML2_NS::AbstractProperty* prop = getRepository()->getDataObjectByUuid(dor.getUuid()); - if (prop == nullptr) { // partial transfer - getRepository()->createPartial(dor); - prop = getRepository()->getDataObjectByUuid(dor.getUuid()); - if (prop == nullptr) { - throw invalid_argument("The DOR looks invalid."); - } - } - repository->addRelationship(this, prop); - } -} diff --git a/src/resqml2/PropertySet.h b/src/resqml2/PropertySet.h deleted file mode 100644 index 9f6d4d855..000000000 --- a/src/resqml2/PropertySet.h +++ /dev/null @@ -1,213 +0,0 @@ -/*----------------------------------------------------------------------- -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"; you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. ------------------------------------------------------------------------*/ -#pragma once - -#include "../common/AbstractObject.h" - -namespace RESQML2_NS -{ - class AbstractProperty; - - /** - * @brief Proxy class for a property set. A property set is a set of properties collected - * together for a specific purpose. - * - * For example, a property set can be used to collect all the properties corresponding - * to the simulation output at a single time, or all the values of a single property - * kind for all times. - */ - class PropertySet : public COMMON_NS::AbstractObject - { - public: - - /** - * Only to be used in partial transfer context. - * - * @param [in] partialObject If non-nullptr, the partial object. - */ - DLL_IMPORT_OR_EXPORT PropertySet(gsoap_resqml2_0_1::eml20__DataObjectReference* partialObject) : COMMON_NS::AbstractObject(partialObject) {} - - /** Destructor does nothing since the memory is managed by the gsoap context. */ - virtual ~PropertySet() = default; - - /** - * Sets the parent property set of this instance. - * - * @exception std::invalid_argument If @p parent is nullptr. - * - * @param [in] parent The parent to set to this instance. - */ - DLL_IMPORT_OR_EXPORT void setParent(PropertySet * parent); - - /** - * Gets the data object reference of the parent property set of this instance. - * - * @returns Empty data object reference if no parent property set is defined, else the data - * object reference of the parent property set. - */ - virtual COMMON_NS::DataObjectReference getParentDor() const = 0; - - /** - * Gets the parent property set of this instance. - * - * @returns A pointer to the parent property set or nullptr if no parent property set is defined. - */ - DLL_IMPORT_OR_EXPORT PropertySet * getParent() const; - - /** - * Gets the children property set of this instance. - * - * @returns A vector of pointer to the children property set or empty vector if this instance has - * no child property set. - */ - DLL_IMPORT_OR_EXPORT std::vector getChildren() const; - - /** - * Gets the count of all children property set of this instance. - * - * @exception std::range_error If the count of children property set is strictly greater - * than unsigned int max. - * - * @returns The children count. - */ - DLL_IMPORT_OR_EXPORT unsigned int getChildrenCount() const; - - /** - * Gets a particular child property set of this property set. - * - * @exception std::out_of_range If @p index is out of range. - * - * @param index Zero-based index of the child property set we look for. - * - * @returns The child property set at position @p index. - */ - DLL_IMPORT_OR_EXPORT PropertySet* getChildren(unsigned int index) const; - - /** - * Pushes back a property into this property set. - * - * @exception std::invalid_argument If @p prop is nullptr. - * - * @param [in] prop The property to push into this property set. - */ - DLL_IMPORT_OR_EXPORT void pushBackProperty(RESQML2_NS::AbstractProperty * prop); - - /** - * Gets all properties directly contained in this property set. "Directly contained" means that - * this method does not collect properties contained in the children property set. - * - * @returns The vector of pointer to all the contained properties. - */ - DLL_IMPORT_OR_EXPORT std::vector getProperties() const; - - /** - * Gets the count of all properties directly contained in this property set. "Directly - * contained" means that this method does not count properties contained in the children - * property set. - * - * @returns The count of contained properties. - */ - DLL_IMPORT_OR_EXPORT unsigned int getPropertyCount() const; - - /** - * Gets a particular property among the properties directly contained in this property set. - * "Directly contained" means that this method does not look at properties contained in the - * children property set. - * - * @exception std::out_of_range If @p index is out of range. - * - * @param index Zero-based index of the property we look for. - * - * @returns The contained property at position @p index. - */ - DLL_IMPORT_OR_EXPORT RESQML2_NS::AbstractProperty* getProperty(unsigned int index) const; - - /** - * Checks whether this property set contains at least one property with multiple realization - * indices. This method just read the @c HasMultipleRealizations attribute value. The value of - * this attribute only concerns properties directly contained in this property set and thus does - * not inform about properties contained in the children property set. - * - * @returns True if this property set contains properties with multiple realization indices, - * false if not. - */ - DLL_IMPORT_OR_EXPORT virtual bool hasMultipleRealizations() const = 0; - - /** - * Checks whether this property set contains only property values associated with a single - * property kind. This method just read the @c HasSinglePropertyKind attribute value. The value - * of this attribute only concerns properties directly contained in this property set and thus - * does not inform about properties contained in the children property set. - * - * @returns True if this property set contains only property values associated with a single - * property kind. - */ - DLL_IMPORT_OR_EXPORT virtual bool hasSinglePropertyKind() const = 0; - - /** - * Gets the time set kind that applies on all properties directly contained in this property - * set. "Directly contained" means that the time set kind does not apply on properties contained - * in the children property set. - * - * @returns The time set kind associated to this this property set. - */ - DLL_IMPORT_OR_EXPORT virtual gsoap_resqml2_0_1::resqml20__TimeSetKind getTimeSetKind() const = 0; - - /** The standard XML tag without XML namespace for serializing this data object */ - DLL_IMPORT_OR_EXPORT static const char* XML_TAG; - - /** - * Gets the standard XML tag without XML namespace for serializing this data object. - * - * @returns The XML tag. - */ - DLL_IMPORT_OR_EXPORT virtual std::string getXmlTag() const final { return XML_TAG; } - - /** Loads target relationships */ - void loadTargetRelationships() final; - - protected: - - /** Default constructor does nothing */ - PropertySet() : COMMON_NS::AbstractObject() {} - - /** - * Creates an instance of this class by wrapping a gsoap instance. - * - * @param [in,out] fromGsoap If non-null, from gsoap. - */ - PropertySet(gsoap_resqml2_0_1::_resqml20__PropertySet* fromGsoap) : COMMON_NS::AbstractObject(fromGsoap) {} - - /** - * Sets XML parent - * - * @param [in,out] parent If non-null, the parent. - */ - virtual void setXmlParent(PropertySet * parent) = 0; - - /** - * Pushes a back XML property - * - * @param [in,out] prop If non-null, the property. - */ - virtual void pushBackXmlProperty(RESQML2_NS::AbstractProperty * prop) = 0; - - virtual std::vector getAllPropertiesDors() const = 0; - }; -} diff --git a/src/resqml2/WellboreFeature.cpp b/src/resqml2/WellboreFeature.cpp index df61d6442..477c89381 100644 --- a/src/resqml2/WellboreFeature.cpp +++ b/src/resqml2/WellboreFeature.cpp @@ -20,7 +20,6 @@ under the License. #include "../witsml2/Wellbore.h" -using namespace std; using namespace RESQML2_NS; WITSML2_NS::Wellbore* WellboreFeature::getWitsmlWellbore() const @@ -32,13 +31,7 @@ WITSML2_NS::Wellbore* WellboreFeature::getWitsmlWellbore() const void WellboreFeature::loadTargetRelationships() { COMMON_NS::DataObjectReference dor = getWitsmlWellboreDor(); - WITSML2_NS::Wellbore* witsmlWellbore = getRepository()->getDataObjectByUuid(dor.getUuid()); - if (witsmlWellbore == nullptr) { // partial transfer - getRepository()->createPartial(dor); - witsmlWellbore = getRepository()->getDataObjectByUuid(dor.getUuid()); + if (!dor.isEmpty()) { + convertDorIntoRel(dor); } - if (witsmlWellbore == nullptr) { - throw invalid_argument("The DOR looks invalid."); - } - repository->addRelationship(this, witsmlWellbore); } diff --git a/src/resqml2_0_1/PropertySet.cpp b/src/resqml2_0_1/PropertySet.cpp index fbb81be9f..71384fb3a 100644 --- a/src/resqml2_0_1/PropertySet.cpp +++ b/src/resqml2_0_1/PropertySet.cpp @@ -24,8 +24,6 @@ using namespace std; using namespace RESQML2_0_1_NS; using namespace gsoap_resqml2_0_1; -const char* PropertySet::XML_NS = "resqml20"; - PropertySet::PropertySet(COMMON_NS::DataObjectRepository* repo, const std::string & guid, const std::string & title, bool hasMultipleRealizations, bool hasSinglePropertyKind, gsoap_resqml2_0_1::resqml20__TimeSetKind timeSetKind) { @@ -45,7 +43,74 @@ PropertySet::PropertySet(COMMON_NS::DataObjectRepository* repo, const std::strin repo->addDataObject(this); } -void PropertySet::setXmlParent(RESQML2_NS::PropertySet * parent) +void PropertySet::setParent(PropertySet * parent) +{ + if (parent == nullptr) { + throw invalid_argument("The parent property set cannot be null."); + } + + repository->addRelationship(this, parent); + + setXmlParent(parent); +} + +PropertySet * PropertySet::getParent() const +{ + return static_cast(repository->getDataObjectByUuid(getParentDor().getUuid())); +} + +std::vector PropertySet::getChildren() const +{ + return repository->getSourceObjects(this); +} + +PropertySet* PropertySet::getChildren(uint64_t index) const +{ + const std::vector & children = getChildren(); + return children.at(index); +} + +void PropertySet::pushBackProperty(RESQML2_NS::AbstractProperty * prop) +{ + if (prop == nullptr) + throw invalid_argument("The property to push cannot be null."); + + pushBackXmlProperty(prop); + + repository->addRelationship(this, prop); +} + +std::vector PropertySet::getProperties() const +{ + return repository->getTargetObjects(this); +} + +uint64_t PropertySet::getPropertyCount() const noexcept +{ + return getProperties().size(); +} + +RESQML2_NS::AbstractProperty* PropertySet::getProperty(uint64_t index) const +{ + const std::vector & props = getProperties(); + return props.at(index); +} + +void PropertySet::loadTargetRelationships() +{ + COMMON_NS::DataObjectReference dor = getParentDor(); + if (!dor.isEmpty()) { + convertDorIntoRel(dor); + } + + for (auto dor2 : getAllPropertiesDors()) { + if (!dor2.isEmpty()) { + convertDorIntoRel(dor2); + } + } +} + +void PropertySet::setXmlParent(PropertySet * parent) { static_cast<_resqml20__PropertySet*>(gsoapProxy2_0_1)->ParentSet.clear(); static_cast<_resqml20__PropertySet*>(gsoapProxy2_0_1)->ParentSet.push_back(parent->newResqmlReference()); @@ -84,8 +149,8 @@ gsoap_resqml2_0_1::resqml20__TimeSetKind PropertySet::getTimeSetKind() const std::vector PropertySet::getAllPropertiesDors() const { std::vector result; - for (size_t i = 0; i < static_cast<_resqml20__PropertySet*>(gsoapProxy2_0_1)->Properties.size(); ++i) { - result.push_back(COMMON_NS::DataObjectReference(static_cast<_resqml20__PropertySet*>(gsoapProxy2_0_1)->Properties[i])); + for (auto* dor : static_cast<_resqml20__PropertySet*>(gsoapProxy2_0_1)->Properties) { + result.push_back(COMMON_NS::DataObjectReference(dor)); } return result; diff --git a/src/resqml2_0_1/PropertySet.h b/src/resqml2_0_1/PropertySet.h index 98df13e2d..0333b0019 100644 --- a/src/resqml2_0_1/PropertySet.h +++ b/src/resqml2_0_1/PropertySet.h @@ -18,16 +18,24 @@ under the License. -----------------------------------------------------------------------*/ #pragma once -#include "../resqml2/PropertySet.h" +#include "../common/AbstractObject.h" + +namespace RESQML2_NS +{ + class AbstractProperty; +} namespace RESQML2_0_1_NS { /** - * A set of properties collected together for a specific purpose. For example, a property set - * can be used to collect all the properties corresponding to the simulation output at a single - * time, or all the values of a single property kind for all times. + * @brief Proxy class for a property set. A property set is a set of properties collected + * together for a specific purpose. + * + * For example, a property set can be used to collect all the properties corresponding + * to the simulation output at a single time, or all the values of a single property + * kind for all times. */ - class PropertySet final : public RESQML2_NS::PropertySet + class PropertySet final : public COMMON_NS::AbstractObject { public: @@ -36,9 +44,9 @@ namespace RESQML2_0_1_NS * * @param [in,out] partialObject If non-null, the partial object. * - * + * */ - DLL_IMPORT_OR_EXPORT PropertySet(gsoap_resqml2_0_1::eml20__DataObjectReference* partialObject) : RESQML2_NS::PropertySet(partialObject) {} + DLL_IMPORT_OR_EXPORT PropertySet(gsoap_resqml2_0_1::eml20__DataObjectReference* partialObject) : COMMON_NS::AbstractObject(partialObject) {} /** * @brief Creates an instance of this class in a gsoap context. @@ -65,37 +73,139 @@ namespace RESQML2_0_1_NS * * @param [in,out] fromGsoap If non-null, from gsoap. */ - PropertySet(gsoap_resqml2_0_1::_resqml20__PropertySet* fromGsoap) : RESQML2_NS::PropertySet(fromGsoap) {} + PropertySet(gsoap_resqml2_0_1::_resqml20__PropertySet* fromGsoap) : COMMON_NS::AbstractObject(fromGsoap) {} /** Destructor does nothing since the memory is managed by the gsoap context. */ ~PropertySet() = default; - DLL_IMPORT_OR_EXPORT bool hasMultipleRealizations() const final; + /** + * Sets the parent property set of this instance. + * + * @exception std::invalid_argument If @p parent is nullptr. + * + * @param [in] parent The parent to set to this instance. + */ + DLL_IMPORT_OR_EXPORT void setParent(PropertySet * parent); + + /** + * Gets the data object reference of the parent property set of this instance. + * + * @returns Empty data object reference if no parent property set is defined, else the data + * object reference of the parent property set. + */ + COMMON_NS::DataObjectReference getParentDor() const; + + /** + * Gets the parent property set of this instance. + * + * @returns A pointer to the parent property set or nullptr if no parent property set is defined. + */ + DLL_IMPORT_OR_EXPORT PropertySet * getParent() const; + + /** + * Gets the children property set of this instance. + * + * @returns A vector of pointer to the children property set or empty vector if this instance has + * no child property set. + */ + DLL_IMPORT_OR_EXPORT std::vector getChildren() const; - DLL_IMPORT_OR_EXPORT bool hasSinglePropertyKind() const final; + /** + * Gets the count of all children property set of this instance. + * + * @returns The children count. + */ + DLL_IMPORT_OR_EXPORT uint64_t getChildrenCount() const noexcept { + return getChildren().size(); + } - DLL_IMPORT_OR_EXPORT gsoap_resqml2_0_1::resqml20__TimeSetKind getTimeSetKind() const final; + /** + * Gets a particular child property set of this property set. + * + * @exception std::out_of_range If @p index is out of range. + * + * @param index Zero-based index of the child property set we look for. + * + * @returns The child property set at position @p index. + */ + DLL_IMPORT_OR_EXPORT PropertySet* getChildren(uint64_t index) const; + + /** + * Pushes back a property into this property set. + * + * @exception std::invalid_argument If @p prop is nullptr. + * + * @param [in] prop The property to push into this property set. + */ + DLL_IMPORT_OR_EXPORT void pushBackProperty(RESQML2_NS::AbstractProperty * prop); + + /** + * Gets all properties directly contained in this property set. "Directly contained" means that + * this method does not collect properties contained in the children property set. + * + * @returns The vector of pointer to all the contained properties. + */ + DLL_IMPORT_OR_EXPORT std::vector getProperties() const; + + /** + * Gets the count of all properties directly contained in this property set. "Directly + * contained" means that this method does not count properties contained in the children + * property set. + * + * @returns The count of contained properties. + */ + DLL_IMPORT_OR_EXPORT uint64_t getPropertyCount() const noexcept; + + /** + * Gets a particular property among the properties directly contained in this property set. + * "Directly contained" means that this method does not look at properties contained in the + * children property set. + * + * @exception std::out_of_range If @p index is out of range. + * + * @param index Zero-based index of the property we look for. + * + * @returns The contained property at position @p index. + */ + DLL_IMPORT_OR_EXPORT RESQML2_NS::AbstractProperty* getProperty(uint64_t index) const; + + DLL_IMPORT_OR_EXPORT bool hasMultipleRealizations() const; + + DLL_IMPORT_OR_EXPORT bool hasSinglePropertyKind() const; + + DLL_IMPORT_OR_EXPORT gsoap_resqml2_0_1::resqml20__TimeSetKind getTimeSetKind() const; /** * The standard XML namespace for serializing this data object. */ - DLL_IMPORT_OR_EXPORT static const char* XML_NS; + DLL_IMPORT_OR_EXPORT static constexpr char const* XML_NS = "resqml20"; /** * Get the standard XML namespace for serializing this data object. */ DLL_IMPORT_OR_EXPORT std::string getXmlNamespace() const final { return XML_NS; } - private : + /** The standard XML tag without XML namespace for serializing this data object */ + DLL_IMPORT_OR_EXPORT static constexpr char const* XML_TAG = "PropertySet"; + + /** + * Gets the standard XML tag without XML namespace for serializing this data object. + * + * @returns The XML tag. + */ + DLL_IMPORT_OR_EXPORT virtual std::string getXmlTag() const final { return XML_TAG; } + + /** Loads target relationships */ + void loadTargetRelationships() final; + + private: /** * Sets XML parent * * @param [in,out] parent If non-null, the parent. */ - void setXmlParent(RESQML2_NS::PropertySet * parent); - - COMMON_NS::DataObjectReference getParentDor() const; + void setXmlParent(PropertySet * parent); /** * Pushes a back XML property diff --git a/src/witsml2/Well.cpp b/src/witsml2/Well.cpp index 18b3a372a..1eaef2060 100644 --- a/src/witsml2/Well.cpp +++ b/src/witsml2/Well.cpp @@ -26,7 +26,7 @@ under the License. using namespace WITSML2_NS; -std::vector Well::getResqmlWellboreFeatures() const +std::vector Well::getResqmlWellboreFeatureSet() const { return getRepository()->getSourceObjects(this); } diff --git a/src/witsml2/Well.h b/src/witsml2/Well.h index ff72f6dd9..fe43f71db 100644 --- a/src/witsml2/Well.h +++ b/src/witsml2/Well.h @@ -181,13 +181,7 @@ namespace WITSML2_NS */ DLL_IMPORT_OR_EXPORT virtual unsigned int geLocationCount() const = 0; - /** - * Gets resqml wellbore features - * - * @returns Null if it fails, else the RESQML wellbore features. - */ - DLL_IMPORT_OR_EXPORT std::vector getResqmlWellboreFeatures() const; - + GETTER_DATAOBJECTS(RESQML2_NS::WellboreFeature, ResqmlWellboreFeature) GETTER_DATAOBJECTS(WITSML2_NS::Wellbore, Wellbore) GETTER_DATAOBJECTS(WITSML2_1_NS::WellCompletion, Wellcompletion) diff --git a/swig/swigModule.i b/swig/swigModule.i index 0158ab58a..efe57bcb1 100644 --- a/swig/swigModule.i +++ b/swig/swigModule.i @@ -577,6 +577,7 @@ import com.f2i_consulting.fesapi.*; SWIG_GETTER_DATAOBJECTS(RESQML2_NS::WellboreFeature, Wellbore) SWIG_GETTER_DATAOBJECTS(RESQML2_NS::WellboreTrajectoryRepresentation, WellboreTrajectoryRepresentation) SWIG_GETTER_DATAOBJECTS(RESQML2_NS::WellboreFrameRepresentation, WellboreFrameRepresentation) + SWIG_GETTER_DATAOBJECTS(RESQML2_0_1_NS::PropertySet, PropertySet) SWIG_GETTER_DATAOBJECTS(WITSML2_NS::Well, WitsmlWell) SWIG_GETTER_DATAOBJECTS(WITSML2_NS::Wellbore, WitsmlWellbore) @@ -1256,7 +1257,7 @@ import com.f2i_consulting.fesapi.*; EML2_NS::PropertyKind* createPropertyKind(const std::string & guid, const std::string & title, gsoap_eml2_3::eml23__QuantityClassKind quantityClass, bool isAbstract = false, EML2_NS::PropertyKind* parentPropertyKind = nullptr); - RESQML2_NS::PropertySet* createPropertySet(const std::string & guid, const std::string & title, + RESQML2_0_1_NS::PropertySet* createPropertySet(const std::string & guid, const std::string & title, bool hasMultipleRealizations, bool hasSinglePropertyKind, gsoap_resqml2_0_1::resqml20__TimeSetKind timeSetKind); RESQML2_0_1_NS::CommentProperty* createCommentProperty(RESQML2_NS::AbstractRepresentation * rep, const std::string & guid, const std::string & title, diff --git a/swig/swigResqml2Include.i b/swig/swigResqml2Include.i index 0d59c07cd..ae2cc6adc 100644 --- a/swig/swigResqml2Include.i +++ b/swig/swigResqml2Include.i @@ -83,7 +83,6 @@ under the License. %nspace RESQML2_NS::PointsProperty; %nspace RESQML2_NS::PolylineRepresentation; %nspace RESQML2_NS::PolylineSetRepresentation; - %nspace RESQML2_NS::PropertySet; %nspace RESQML2_NS::RepresentationSetRepresentation; %nspace RESQML2_NS::RockFluidOrganizationInterpretation; %nspace RESQML2_NS::RockFluidUnitInterpretation; @@ -4847,29 +4846,6 @@ namespace RESQML2_NS RESQML2_NS::AbstractGridRepresentation* getGridRepresentation(uint64_t index) const; }; - class AbstractProperty; -#ifdef SWIGPYTHON - %rename(Resqml2_PropertySet) PropertySet; -#endif - class PropertySet : public COMMON_NS::AbstractObject - { - public: - void setParent(PropertySet * parent); - PropertySet * getParent() const; - - unsigned int getChildrenCount() const; - PropertySet* getChildren(unsigned int index) const; - - void pushBackProperty(RESQML2_NS::AbstractProperty * prop); - - unsigned int getPropertyCount() const; - AbstractProperty* getProperty(unsigned int index) const; - - bool hasMultipleRealizations() const; - bool hasSinglePropertyKind() const; - gsoap_resqml2_0_1::resqml20__TimeSetKind getTimeSetKind() const; - }; - #ifdef SWIGPYTHON %rename(Resqml2_AbstractProperty) AbstractProperty; #endif @@ -4946,9 +4922,26 @@ namespace RESQML2_NS */ gsoap_eml2_3::eml23__IndexableElement getAttachmentKind() const; - std::vector getPropertySets() const; - unsigned int getPropertySetCount() const; - RESQML2_NS::PropertySet * getPropertySet(unsigned int index) const; + /** + * Gets the count of property sets which contain this property + * + * @exception std::range_error If the count of property sets is strictly greater than + * unsigned int max. + * + * @returns The count of property sets which contain this property. + */ + uint64_t getPropertySetCount() const; + + /** + * Gets a given property set taken from all property sets which contain this property + * + * @exception std::out_of_range If @p index is out of range. + * + * @param index Zero-based index of the property set we look for. + * + * @returns The property set at @p index. + */ + RESQML2_0_1_NS::PropertySet * getPropertySet(uint64_t index) const; bool hasRealizationIndices() const; std::vector getRealizationIndices() const; diff --git a/swig/swigResqml2_0_1Include.i b/swig/swigResqml2_0_1Include.i index e9c61ecf1..3b04539f6 100644 --- a/swig/swigResqml2_0_1Include.i +++ b/swig/swigResqml2_0_1Include.i @@ -1166,9 +1166,77 @@ namespace RESQML2_0_1_NS #if defined(SWIGJAVA) || defined(SWIGPYTHON) %rename(Resqml20_PropertySet) PropertySet; #endif - class PropertySet : public RESQML2_NS::PropertySet + class PropertySet : public COMMON_NS::AbstractObject { public: + /** + * Sets the parent property set of this instance. + * + * @exception std::invalid_argument If @p parent is nullptr. + * + * @param [in] parent The parent to set to this instance. + */ + void setParent(PropertySet * parent); + + /** + * Gets the parent property set of this instance. + * + * @returns A pointer to the parent property set or nullptr if no parent property set is defined. + */ + PropertySet * getParent() const; + + /** + * Gets the count of all children property set of this instance. + * + * @returns The children count. + */ + uint64_t getChildrenCount() const; + + /** + * Gets a particular child property set of this property set. + * + * @exception std::out_of_range If @p index is out of range. + * + * @param index Zero-based index of the child property set we look for. + * + * @returns The child property set at position @p index. + */ + PropertySet* getChildren(unsigned int index) const; + + /** + * Pushes back a property into this property set. + * + * @exception std::invalid_argument If @p prop is nullptr. + * + * @param [in] prop The property to push into this property set. + */ + void pushBackProperty(RESQML2_NS::AbstractProperty * prop); + + /** + * Gets the count of all properties directly contained in this property set. "Directly + * contained" means that this method does not count properties contained in the children + * property set. + * + * @returns The count of contained properties. + */ + uint64_t getPropertyCount() const; + + /** + * Gets a particular property among the properties directly contained in this property set. + * "Directly contained" means that this method does not look at properties contained in the + * children property set. + * + * @exception std::out_of_range If @p index is out of range. + * + * @param index Zero-based index of the property we look for. + * + * @returns The contained property at position @p index. + */ + RESQML2_NS::AbstractProperty* getProperty(uint64_t index) const; + + bool hasMultipleRealizations() const; + bool hasSinglePropertyKind() const; + gsoap_resqml2_0_1::resqml20__TimeSetKind getTimeSetKind() const; }; #if defined(SWIGJAVA) || defined(SWIGPYTHON) diff --git a/swig/swigWitsml2Include.i b/swig/swigWitsml2Include.i index 2552ba1d6..67618e918 100644 --- a/swig/swigWitsml2Include.i +++ b/swig/swigWitsml2Include.i @@ -440,6 +440,7 @@ namespace WITSML2_NS * @returns An int. */unsigned int geLocationCount() const; + SWIG_GETTER_DATAOBJECTS(RESQML2_NS::WellboreFeature, ResqmlWellboreFeature) SWIG_GETTER_DATAOBJECTS(WITSML2_NS::Wellbore, Wellbore) SWIG_GETTER_DATAOBJECTS(WITSML2_1_NS::WellCompletion, Wellcompletion) }; diff --git a/test/resqml2_test/WellboreTrajectoryRepresentationTest.cpp b/test/resqml2_test/WellboreTrajectoryRepresentationTest.cpp index bf8743742..737b3aebc 100644 --- a/test/resqml2_test/WellboreTrajectoryRepresentationTest.cpp +++ b/test/resqml2_test/WellboreTrajectoryRepresentationTest.cpp @@ -26,9 +26,6 @@ under the License. #include "resqml2/WellboreInterpretation.h" #include "resqml2/WellboreTrajectoryRepresentation.h" -#include "witsml2/Well.h" -#include "witsml2/Wellbore.h" - using namespace std; using namespace resqml2_test; using namespace COMMON_NS; @@ -47,12 +44,8 @@ WellboreTrajectoryRepresentationTest::WellboreTrajectoryRepresentationTest(const : commontest::AbstractTest(repoPath) { } -void WellboreTrajectoryRepresentationTest::initRepo() { - WITSML2_NS::Well* well = repo->createWell("1f885c7b-5262-41ef-bd1c-e06f40c08387", "", false); - WITSML2_NS::Wellbore* wellbore = repo->createWellbore(well, "", "", false); - +void WellboreTrajectoryRepresentationTest::initRepo() { WellboreFeature* feature = repo->createWellboreFeature("", ""); - feature->setWitsmlWellbore(wellbore); WellboreInterpretation* interp = repo->createWellboreInterpretation(feature, "", "", true); MdDatum* mdDatum = repo->createMdDatum("", "", nullptr, gsoap_eml2_3::eml23__ReferencePointKind::mean_x0020sea_x0020level, 275, 75, 0); @@ -92,7 +85,6 @@ void WellboreTrajectoryRepresentationTest::initRepo() { void WellboreTrajectoryRepresentationTest::readRepo() { // getting the WellboreTrajectoryRepresentation WellboreTrajectoryRepresentation* traj = repo->getDataObjectByUuid(defaultUuid); - REQUIRE(dynamic_cast(traj->getInterpretation()->getInterpretedFeature())->getWitsmlWellbore()->getWell()->getUuid() == "1f885c7b-5262-41ef-bd1c-e06f40c08387"); REQUIRE(traj->getXyzPointCountOfAllPatches() == 4); REQUIRE(traj->getGeometryKind() == 0); diff --git a/test/witsml2_test/WellTest.cpp b/test/witsml2_test/WellTest.cpp index 6ad3d6212..4ee839186 100644 --- a/test/witsml2_test/WellTest.cpp +++ b/test/witsml2_test/WellTest.cpp @@ -22,7 +22,10 @@ under the License. #include "../catch.hpp" +#include "resqml2/WellboreFeature.h" + #include "witsml2/Well.h" +#include "witsml2/Wellbore.h" using namespace std; using namespace witsml2_test; @@ -39,7 +42,11 @@ WellTest::WellTest(const string & epcDocPath) void WellTest::initRepo() { Well* well = repo->createWell(defaultUuid, defaultTitle, false); - REQUIRE(well != nullptr); + Wellbore* wellbore = repo->createWellbore(well, witsmlWellboreUuid, "", false); + + RESQML2_NS::WellboreFeature* resqmlWellboreFeature = repo->createWellboreFeature(resqmlWellboreFeatureUuid, ""); + resqmlWellboreFeature->setWitsmlWellbore(wellbore); + well->setBlock("my Block"); // No county well->setDTimLicense(defaultTimestamp); @@ -51,7 +58,12 @@ void WellTest::initRepo() { } void WellTest::readRepo() { - Well* well = repo->getDataObjectByUuid(defaultUuid); + auto* well = repo->getDataObjectByUuid(defaultUuid); + auto* wellbore = repo->getDataObjectByUuid(witsmlWellboreUuid); + auto* resqmlWellboreFeature = repo->getDataObjectByUuid(resqmlWellboreFeatureUuid); + REQUIRE(resqmlWellboreFeature->getWitsmlWellbore() == wellbore); + REQUIRE(wellbore->getWell() == well); + REQUIRE(well != nullptr); REQUIRE(well->hasBlock()); REQUIRE(well->getBlock() == "my Block"); diff --git a/test/witsml2_test/WellTest.h b/test/witsml2_test/WellTest.h index 16a4be1e2..bd28a77b5 100644 --- a/test/witsml2_test/WellTest.h +++ b/test/witsml2_test/WellTest.h @@ -35,6 +35,9 @@ namespace witsml2_test { WellTest(const std::string & epcDocPath); protected: + static constexpr char const* witsmlWellboreUuid = "2632b49d-b18a-4d83-a85d-d6a2bd879d20"; + static constexpr char const* resqmlWellboreFeatureUuid = "044823a6-2d42-4b32-9606-e7c1c4652804"; + void initRepo(); void readRepo(); };