Class FHIRPersistenceJDBCImpl

    • Field Detail

      • TRX_SYNCH_REG_JNDI_NAME

        public static final java.lang.String TRX_SYNCH_REG_JNDI_NAME
        See Also:
        Constant Field Values
      • userTransaction

        protected javax.transaction.UserTransaction userTransaction
      • updateCreateEnabled

        protected java.lang.Boolean updateCreateEnabled
    • Constructor Detail

      • FHIRPersistenceJDBCImpl

        public FHIRPersistenceJDBCImpl​(java.util.Properties configProps,
                                       IConnectionProvider cp,
                                       FHIRPersistenceJDBCCache cache)
                                throws java.lang.Exception
        Constructor for use when running standalone, outside of any web container. The IConnectionProvider should be a pooling implementation which supports an ITransactionProvider. Uses the default adapter for reading FHIR configurations and a new SearchHelper instance, which works OK for unit-tests.
        Parameters:
        configProps -
        cp -
        cache -
        Throws:
        java.lang.Exception
      • FHIRPersistenceJDBCImpl

        public FHIRPersistenceJDBCImpl​(java.util.Properties configProps,
                                       IConnectionProvider cp,
                                       FHIRConfigProvider configProvider,
                                       FHIRPersistenceJDBCCache cache,
                                       SearchHelper searchHelper)
                                throws java.lang.Exception
        Constructor for use when running standalone, outside of any web container. The IConnectionProvider should be a pooling implementation which supports an ITransactionProvider.
        Parameters:
        configProps -
        cp -
        configProvider - adapter to provide access to FHIR configuration
        cache -
        searchHelper -
        Throws:
        java.lang.Exception
    • Method Detail

      • buildActionChain

        protected Action buildActionChain()
        Build a chain of actions we want to apply to new connections. Current the only action we need is setting the tenant if we're in multi-tenant mode.
        Returns:
        the chain of actions to be applied
      • create

        public <T extends ResourceSingleResourceResult<T> create​(FHIRPersistenceContext context,
                                                                   T updatedResource)
                                                            throws FHIRPersistenceException
        Description copied from interface: FHIRPersistence
        Stores a new FHIR Resource in the datastore. The resource is not modified before it is stored. It must therefore already include correct Meta fields.
        Specified by:
        create in interface FHIRPersistence
        Parameters:
        context - the FHIRPersistenceContext instance associated with the current request
        updatedResource - the FHIR Resource instance to be created in the datastore
        Returns:
        a SingleResourceResult with a ResourceResult that holds the unmodified resource and/or an OperationOutcome with hints, warnings, or errors related to the interaction
        Throws:
        FHIRPersistenceException
      • update

        public <T extends ResourceSingleResourceResult<T> update​(FHIRPersistenceContext context,
                                                                   T resource)
                                                            throws FHIRPersistenceException
        Description copied from interface: FHIRPersistence
        Updates an existing FHIR Resource by storing a new version in the datastore. This new method expects the resource being passed in to already be modified with correct meta and id information. It no longer updates the meta itself.
        Specified by:
        update in interface FHIRPersistence
        Parameters:
        context - the FHIRPersistenceContext instance associated with the current request
        resource - the new contents of the FHIR Resource to be stored
        Returns:
        a SingleResourceResult with a ResourceResult that holds a copy of the input resource and/or an OperationOutcome with hints, warnings, or errors related to the interaction
        Throws:
        FHIRPersistenceException
      • delete

        public <T extends Resource> void delete​(FHIRPersistenceContext context,
                                                java.lang.Class<T> resourceType,
                                                java.lang.String logicalId,
                                                int versionId,
                                                Instant lastUpdated)
                                         throws FHIRPersistenceException
        Description copied from interface: FHIRPersistence
        Deletes the FHIR resource from the datastore. The delete is a soft-delete, resulting in a new version being created to act as a deletion marker. This version is created without a payload body. The versionId must match the latest version of the resource. This must be checked by the FHIRPersistence implementation, which should throw a FHIRPersistenceVersionIdMismatchException is there is a mismatch (likely an indication of concurrent changes to the resource).
        Specified by:
        delete in interface FHIRPersistence
        Parameters:
        context - the FHIRPersistenceContext instance associated with the current request
        resourceType - the resource type of the Resource instance to be deleted
        logicalId - the logical id of the Resource instance to be deleted
        versionId - the current version of the Resource instance to be deleted
        lastUpdated - the modification timestamp to use for the deletion
        Throws:
        FHIRPersistenceException
      • read

        public <T extends ResourceSingleResourceResult<T> read​(FHIRPersistenceContext context,
                                                                 java.lang.Class<T> resourceType,
                                                                 java.lang.String logicalId)
                                                          throws FHIRPersistenceException
        Description copied from interface: FHIRPersistence
        Retrieves the most recent version of a FHIR Resource from the datastore.
        Specified by:
        read in interface FHIRPersistence
        Parameters:
        context - the FHIRPersistenceContext instance associated with the current request
        resourceType - the resource type of the Resource instance to be retrieved
        logicalId - the logical id of the Resource instance to be retrieved
        Returns:
        a SingleResourceResult with a ResourceResult populated from from the datastore and/or an OperationOutcome with hints, warnings, or errors related to the interaction
        Throws:
        FHIRPersistenceException
      • history

        public MultiResourceResult history​(FHIRPersistenceContext context,
                                           java.lang.Class<? extends Resource> resourceType,
                                           java.lang.String logicalId)
                                    throws FHIRPersistenceException
        Description copied from interface: FHIRPersistence
        Retrieves all of the versions of the specified FHIR Resource.
        Specified by:
        history in interface FHIRPersistence
        Parameters:
        context - the FHIRPersistenceContext instance associated with the current request
        resourceType - the resource type of the Resource instances to be retrieved
        logicalId - the logical id of the Resource instances to be retrieved
        Returns:
        a MultiResourceResult with a list containing the available versions of the specified FHIR Resource and/or an OperationOutcome with hints, warnings, or errors related to the interaction
        Throws:
        FHIRPersistenceException
      • vread

        public <T extends ResourceSingleResourceResult<T> vread​(FHIRPersistenceContext context,
                                                                  java.lang.Class<T> resourceType,
                                                                  java.lang.String logicalId,
                                                                  java.lang.String versionId)
                                                           throws FHIRPersistenceException
        Description copied from interface: FHIRPersistence
        Retrieves a specific version of a FHIR Resource from the datastore.
        Specified by:
        vread in interface FHIRPersistence
        Parameters:
        context - the FHIRPersistenceContext instance associated with the current request
        resourceType - the resource type of the Resource instance to be retrieved
        logicalId - the logical id of the Resource instance to be retrieved
        versionId - the version of the Resource instance to be retrieved
        Returns:
        a SingleResourceResult with a ResourceResult populated from the datastore and/or an OperationOutcome with hints, warnings, or errors related to the interaction
        Throws:
        FHIRPersistenceResourceDeletedException - if the resource being read is currently in a deleted state and FHIRPersistenceContext.includeDeleted() is set to false
        FHIRPersistenceException
      • buildSortedResourceDTOList

        protected java.util.List<Resource> buildSortedResourceDTOList​(ResourceDAO resourceDao,
                                                                      java.lang.Class<? extends Resource> resourceType,
                                                                      java.util.List<java.lang.Long> sortedIdList,
                                                                      boolean includeResourceData)
                                                               throws FHIRException,
                                                                      FHIRPersistenceException,
                                                                      java.io.IOException
        This method takes the passed list of sorted Resource ids, acquires the ResourceDTO corresponding to each id, and returns those ResourceDTOs in a List, sorted according to the input sorted ids.
        Parameters:
        resourceDao - - The resource DAO.
        resourceType - - The type of Resource that each id in the passed list represents.
        sortedIdList - - A list of Resource ids representing the proper sort order for the list of Resources to be returned.
        includeResourceData - include the resource DATA value
        Returns:
        List - A list of ResourcesDTOs of the passed resourceType, sorted according the order of ids in the passed sortedIdList.
        Throws:
        FHIRPersistenceException
        java.io.IOException
        FHIRException
      • convertResourceDTOList

        protected java.util.List<ResourceResult<? extends Resource>> convertResourceDTOList​(ResourceDAO resourceDao,
                                                                                            java.util.List<Resource> resourceDTOList,
                                                                                            java.lang.Class<? extends Resource> resourceType,
                                                                                            java.util.List<java.lang.String> elements,
                                                                                            boolean includeResourceData)
                                                                                     throws FHIRException,
                                                                                            java.io.IOException
        Converts the passed Resource Data Transfer Object collection to a collection of FHIR Resource objects. Note that if the resource has been erased or was not fetched on purpose, ResourceResult.resource will be null and the caller will need to take this into account
        Parameters:
        resourceDao -
        resourceDTOList -
        resourceType -
        elements -
        includeResourceData -
        Returns:
        Throws:
        FHIRException
        java.io.IOException
      • addCompartmentParams

        protected void addCompartmentParams​(java.util.List<ExtractedParameterValue> allParameters,
                                            java.lang.String resourceType,
                                            java.lang.String resourceId)
        Augment the given allParameters list with internal parameters that represent the relationship between the fhirResource and its compartments. These parameter values are subsequently used to improve the performance of compartment-based FHIR search queries. See CompartmentHelper.makeCompartmentParamName(String) for details on how the parameter name is composed for each relationship.
        Parameters:
        allParameters -
        resourceType - the resource type of the resource we are extracting parameter values from
        resourceId - the resource id of the resource we are extracting parameter values from
      • retrieveUserTransaction

        protected javax.transaction.UserTransaction retrieveUserTransaction​(java.lang.String jndiName)
        Retrieves (via a JNDI lookup) a reference to the UserTransaction. If the JNDI lookup fails, we'll assume that we're not running inside the container.
      • convertResourceDTOList

        protected <T extends Resource> java.util.List<T> convertResourceDTOList​(java.util.List<Resource> resourceDTOList,
                                                                                java.lang.Class<T> resourceType)
                                                                         throws FHIRException,
                                                                                java.io.IOException
        Converts the passed Resource Data Transfer Object collection to a collection of FHIR Resource objects.
        Parameters:
        resourceDTOList -
        resourceType -
        Returns:
        Throws:
        FHIRException
        java.io.IOException
      • isTransactional

        public boolean isTransactional()
        Description copied from interface: FHIRPersistence
        Returns true iff the persistence layer implementation supports transactions.
        Specified by:
        isTransactional in interface FHIRPersistence
      • getTransaction

        public FHIRPersistenceTransaction getTransaction()
        Description copied from interface: FHIRPersistence
        Returns a FHIRPersistenceTransaction object associated with the persistence layer implementation in use. This can then be used to control transactional boundaries.
        Specified by:
        getTransaction in interface FHIRPersistence
        Returns:
      • isDeleteSupported

        public boolean isDeleteSupported()
        Description copied from interface: FHIRPersistence
        Returns true iff the persistence layer implementation supports the "delete" operation.
        Specified by:
        isDeleteSupported in interface FHIRPersistence
        Returns:
      • isReindexSupported

        public boolean isReindexSupported()
        Description copied from interface: FHIRPersistence
        Returns true iff the persistence layer implementation supports the "reindex" special operation.
        Specified by:
        isReindexSupported in interface FHIRPersistence
        Returns:
      • isOffloadingSupported

        public boolean isOffloadingSupported()
        Description copied from interface: FHIRPersistence
        Returns true iff the persistence layer implementation supports offloading and this has been configured for the tenant/datasource.
        Specified by:
        isOffloadingSupported in interface FHIRPersistence
        Returns:
      • reindex

        public int reindex​(FHIRPersistenceContext context,
                           OperationOutcome.Builder operationOutcomeResult,
                           java.time.Instant tstamp,
                           java.util.List<java.lang.Long> indexIds,
                           java.lang.String resourceLogicalId,
                           boolean force)
                    throws FHIRPersistenceException
        Description copied from interface: FHIRPersistence
        Initiates reindexing for either a specified list of index IDs, or a randomly chosen resource. The number of resources processed is returned. This can be used by a controller to continue processing until everything is complete.
        Specified by:
        reindex in interface FHIRPersistence
        Parameters:
        context - the FHIRPersistenceContext instance associated with the current request.
        operationOutcomeResult - accumulate issues in this OperationOutcome.Builder
        tstamp - only reindex resources with a reindex_tstamp less than this
        indexIds - list of index IDs of resources to reindex, or null
        resourceLogicalId - resourceType/logicalId value of a specific resource to reindex, or null; this parameter is ignored if the indexIds parameter value is non-null
        force - if true, always replace the stored parameters
        Returns:
        count of the number of resources reindexed by this call
        Throws:
        FHIRPersistenceException
      • updateParameters

        public <T extends Resource> void updateParameters​(ResourceIndexRecord rir,
                                                          java.lang.Class<T> resourceTypeClass,
                                                          Resource existingResourceDTO,
                                                          ReindexResourceDAO reindexDAO,
                                                          OperationOutcome.Builder operationOutcomeResult,
                                                          boolean force)
                                                   throws java.lang.Exception
        Update the parameters for the resource described by the given DTO
        Type Parameters:
        T -
        Parameters:
        rir - the resource index record
        resourceTypeClass - the resource type class
        existingResourceDTO - the existing resource DTO
        reindexDAO - the reindex resource DAO
        operationOutcomeResult - the operation outcome result
        force -
        Throws:
        java.lang.Exception
      • fetchResourcePayloads

        public ResourcePayload fetchResourcePayloads​(java.lang.Class<? extends Resource> resourceType,
                                                     java.time.Instant fromLastModified,
                                                     java.time.Instant toLastModified,
                                                     java.util.function.Function<ResourcePayload,​java.lang.Boolean> processor)
                                              throws FHIRPersistenceException
        Description copied from interface: FHIRPersistence
        Special function for high speed export of resource payloads. The process function must process the InputStream before returning. Result processing will be stopped if the process function returns Boolean FALSE.
        Specified by:
        fetchResourcePayloads in interface FHIRPersistence
        Parameters:
        resourceType - the resource type which is the target of the search
        fromLastModified - start reading from this timestamp
        toLastModified - do not read beyond this timestamp
        processor - function to process each payload record
        Returns:
        the last ResourcePayload processed, or null if no data was found
        Throws:
        FHIRPersistenceException
      • changes

        public java.util.List<ResourceChangeLogRecord> changes​(FHIRPersistenceContext context,
                                                               int resourceCount,
                                                               java.time.Instant sinceLastModified,
                                                               java.time.Instant beforeLastModified,
                                                               java.lang.Long changeIdMarker,
                                                               java.util.List<java.lang.String> resourceTypeNames,
                                                               boolean excludeTransactionTimeoutWindow,
                                                               HistorySortOrder historySortOrder)
                                                        throws FHIRPersistenceException
        Description copied from interface: FHIRPersistence
        Fetch up to resourceCount records from the RESOURCE_CHANGE_LOG table.
        Specified by:
        changes in interface FHIRPersistence
        Parameters:
        context - the FHIRPersistenceContext associated with the current request
        resourceCount - the max number of resource change records to fetch
        sinceLastModified - filter records with record.lastUpdate >= sinceLastModified. Optional.
        beforeLastModified - filter records with record.lastUpdate <= beforeLastModified. Optional.
        resourceTypeNames - filter records matching any resource type name in the list
        excludeTransactionTimeoutWindow - flag to exclude resources falling inside server's tx timeout window
        historySortOrder - the type of sorting to apply
        Returns:
        a list containing up to resourceCount elements describing resources which have changed
        Throws:
        FHIRPersistenceException
      • retrieveIndex

        public java.util.List<java.lang.Long> retrieveIndex​(FHIRPersistenceContext context,
                                                            int count,
                                                            java.time.Instant notModifiedAfter,
                                                            java.lang.Long afterIndexId,
                                                            java.lang.String resourceTypeName)
                                                     throws FHIRPersistenceException
        Description copied from interface: FHIRPersistence
        Retrieves a list of index IDs available for reindexing.
        Specified by:
        retrieveIndex in interface FHIRPersistence
        Parameters:
        context - the FHIRPersistenceContext associated with this request
        count - the maximum nuber of index IDs to retrieve
        notModifiedAfter - only retrieve index IDs for resources not last updated after the specified timestamp
        afterIndexId - retrieve index IDs starting after this specified index ID, or null to start with first index ID
        resourceTypeName - the resource type of index IDs to return, or null
        Returns:
        list of index IDs available for reindexing
        Throws:
        FHIRPersistenceException
      • isUpdateCreateEnabled

        public boolean isUpdateCreateEnabled()
        Description copied from interface: FHIRPersistence
        Returns true iff the persistence layer implementation supports update/create and it has been configured in the persistence config.
        Specified by:
        isUpdateCreateEnabled in interface FHIRPersistence
        Returns:
      • storePayload

        public PayloadPersistenceResponse storePayload​(Resource resource,
                                                       java.lang.String logicalId,
                                                       int newVersionNumber,
                                                       java.lang.String resourcePayloadKey)
                                                throws FHIRPersistenceException
        Description copied from interface: FHIRPersistence
        Offload payload storage to another provider. If result is not null, the returned Future can be used to obtain the status of the operation. If the result is null, then the implementation does not support offloading and the payload must be stored in the traditional manner (e.g. in the RDBMS). A Future is used because the offloading storage operation may be asynchronous. This Future must be resolved prior to the transaction commit.
        Specified by:
        storePayload in interface FHIRPersistence
        Returns:
        Throws:
        FHIRPersistenceException