Release History

Version Date Description
2.5 2017-06-08  
2.4 2017-04-19  
2.3 2017-03-18  
2.2 2016-12-20  
2.1 2016-11-11  
2.0 2016-08-30  
1.6 2016-07-07  
1.5 2016-04-20  
1.4 2016-02-04  
1.3 2015-11-14  
1.2 2015-09-18  
1.1 2015-07-13  
1.0 2015-04-08  
0.9 2015-03-14  
0.8 2014-12-17  
0.7 2014-10-23  
0.6 2014-09-08 This release brings a number of new features and bug fixes!
0.5 2014-07-30  
0.4 2014-07-13  
0.3 2014-05-12 This release corrects lots of bugs and introduces the fluent client mode
0.2 2014-04-23  
0.1 2014-04-15  

Get the RSS feed of the last changes: rss feed

Release 2.5 – 2017-06-08

Type Changes By
This release includes significant performance enhancements for the JPA server. Most importantly, the way that searches are performed has been re-written to allow the server to perform better when the database has a large number of results in it. The following enhancements have been made:

  • Searches with multiple search parameters of different datatypes (e.g. find patients by name and date of birth) were previously joined in Java code, now the join is performed by the database which is faster
  • Searches which returned lots of results previously has all results streamed into memory before anything was returned to the client. This is particularly slow if you do a search for (say) "get me all patients" since potentially thousands or even millions of patients' IDs were loaded into memory before anything gets returned to the client. HAPI FHIR now has a multithreaded search coordinator which returns results to the client as soon as they are available
  • Search results will be cached and reused (so that if a client does two searches for "get me all patients matching FOO" with the same FOO in short succession, we won't query the DB again but will instead reuse the cached results). Note that this can improve performance, but does mean that searches can return slightly out of date results. Essentially what this means is that the latest version of individual resources will always be returned despite this cacheing, but newly created resources that should match may not be returned until the cache expires. By default this cache has been set to one minute, which should be acceptable for most real-world usage, but this can be changed or disabled entirely.
  • Updates which do not actually change the contents of the resource can optionally be prevented from creating a new version of the resource in the database


Existing users should delete the HFJ_SEARCH, HFJ_SEARCH_INCLUDE, and HFJ_SEARCH_RESULT tables from your database before upgrading, as the structure of these tables has changed and old search results can not be reused.
AuthorizationInterceptor did not correctly handle paging requests (e.g. requests for the second page of results for a search operation). Thanks to Eeva Turkka for reporting!. Fixes 590.
Add configuration property to DSTU3 FhirInstanceValidator to allow client code to change unknown extension handling behaviour.
Fix concurrency issues in FhirContext that were causing issues when starting a context up on Android. Thanks to GitHub issue @Jaypeg85 for the pull request!. Fixes 630.
Fix an issue in the JPA server if a resource has been previously saved containing vocabulary that is no longer valid. This only really happened if you were using a non-final version of FHIR (e.g. using DSTU3 before it was finalized) but if you were in this situation, upgrading HAPI could cause you to have old codes that no longer exist in your database. This fix prevents these from blocking you from accesing those resources.
CLI now defaults to DSTU3 mode if no FHIR version is specified
Server and annotation-client @History annotation now allows DSTU3+ resource types in the type= property
JSON Parser gave a very unhelpful error message (Unknown attribute 'value' found during parse) when a scalar value was found in a spot where an object is expected. This has been corrected to include much more information. Thanks to GitHub user @jasminas for reporting!. Fixes 563.
DaoConfig#setInterceptors() has been un-deprecated. It was previously deprecated as we thought it was not useful, but uses have been identified so it turns out this method will live after all. Interceptors registered to this method will now be treated appropriately if they implement IServerOperationInterceptor too.
JPA server did not correctly support searching on a custom search parameter whose path pointed to an extension, where the client used a chained value.
Fix issue where the JSON parser sometimes did not encode DSTU3 extensions on the root of a resource which have a value of type reference.
Server now respects the If-Modified-Since header and will return an HTTP 304 if appropriate for read operations.
JPA server did not correctly process :missing qualifier on date parameters
AppacheHttpClient did not always respect the charset in the response Content-Type header. Thanks to Gijsbert van den Brink for the pull request!. Fixes 633.
Fix XhtmlParser to correctly handle hexadecimal escaped literals. Thanks to Gijsbert van den Brink for the Pull Request!. Fixes 636.
JPA server now has configurable properties that allow referential integrity to be disabled for both writes and deletes. This is useful in some cases where data integrity is not wanted or not possible. It can also be useful if you want to delete large amounts of interconnected data quickly.

A corresponding flag has been added to the CLI tool as well.
JPA server did not correctly support searching on a custom search parameter whose path pointed to an extension, where the client used a chained value.
Fix dependency on commons-codec 1.4 in hapi-fhir-structures-dstu3, which was preventing this library from being used on Android because Android includes an older version of commons-codec.
JPA server failed to index search parameters on paths containing a decimal data type
Validator incorrectly rejected references where only an identifier was populated
Make error handler in the client more tolerant of errors where no response has been received by the client when the error happens. Thanks to GitHub user maclema for the pull request!. Fixes 649.
Add a check in JPA server that prevents completely blank tags, profiles, and security labels from being saved to the database. These were filtered out anyhow when the result was returned back to the client but they were persisted which just wasted space.
Loading the build-in profile structures (StructureDefinition, ValueSet, etc) is now done in a synchronized block in order to prevent multiple loads happening if the server processes multiple validations in parallel threads right after startup. Previously a heavy load could cause the server to run out of memory and lock up. Thanks to Karl M Davis for analysis and help fixing this!. Fixes 664.
Fix bad ValueSet URL in DeviceRequest profile definition for STU3 which was preventing the CLI from uploading definitions correctly. Thanks to Joel Schneider for the Pull Request!. Fixes 652.
DateTime datatypes (both DSTU1/2 and RI STU3) did not properly parse values with MINUTE precision. Thanks to Christian Ohr for the pull request!. Fixes 655.
Improve handling in JPA server when doing code:above and code:below searches to use a disjunction of AND and IN in order to avoid failures under certain conditions. Thanks to Michael Lawley for the pul request!. Fixes 656.
Fix an error where the JPA server sometimes failed occasional requests with a weird NullPointerException when running under very large concurrent loads. Thanks to Karl M. Davis for reporting, investigating, and ultimately finding a solution!. Fixes 660.

Release 2.4 – 2017-04-19

Type Changes By
This release brings the DSTU3 structures up to FHIR R3 (FHIR 3.0.1) definitions. Note that there are very few changes between the DSTU3 structures in HAPI FHIR 2.3 and the ones in HAPI FHIR 2.4 since the basis for the DSTU3 structures in HAPI FHIR 2.3 was the R3 QA FHIR version (1.9.0) but this is the first release of HAPI FHIR to support the final/complete R3 release.
Bump the version of a few dependencies to the latest versions (dependent HAPI modules listed in brackets):
  • Hibernate (JPA): 5.2.7 -> 5.2.9
  • Hibernate Search (JPA): 5.5.7.CR1 -> 5.2.7.Final
  • Hibernate Validator (JPA): 5.3.4 -> 5.4.1
  • Spring (JPA): 4.3.6 -> 4.3.7
  • Gson (Core): 2.7 -> 2.8.0
  • Guava (JPA): 19.0 -> 21.0
  • SLF4j (Core): 1.7.21 -> 1.7.25
  • Logback (Core): 1.1.7 -> 1.2.2
hapi-fhir-jpaserver-example now includes the Prefer header in the list of CORS headers. Thanks to GitHub user @elnin0815 for the pull request!. Fixes 602.
AuthorizationInterceptor can now allow make read or write authorization decisions on a resource by instance ID
Remove SupportingDocumentation resource from DSTU2 structures. This isn't actually a resource in FHIR DSTU2 and its inclusion causes errors on clients that don't understand what it is. Thanks to Travis Cummings and Michele Mottini for pointing this out. Fixes 208.
Web testing UI displayed an error when a transaction was pasted into the UI for a DSTU2 server. Thanks to Suresh Kumar for reporting!. Fixes 607.
DaoConfig#setAllowInlineMatchUrlReferences() now defaults to true since inline conditional references are now a part of the FHIR specification. Thanks to Jan Dědek for pointing this out!
hapi-fhir-jpaserver-base now exposes a FhirInstanceValidator bean named "myInstanceValidatorDstu2" for DSTU2. A similar bean for DSTU3 was previously implemented. Fixes 609.
hapi-fhir-jpaserver-example project now defaults to STU3 mode instead of the previous DSTU2. Thanks to Joel Schneider for the pull request!. Fixes 453.
JPA server now has a setting on the DaoConfig to force it to treat certain reference URLs or reference URL patterns as logical URLs instead of literal ones, meaning that the server will not try to resolve these URLs. Thanks to Eeva Turkka for the suggestion!. Fixes 534.
Add a utility method to JPA server: IFhirResourceDao#removeTag(IIdType, TagTypeEnum, String, String). This allows client code to remove tags from a resource without having a servlet request object in context.
JPA server was unable to process custom search parameters where the path pointed to an extension containing a reference. Thanks to Ravi Kuchi for reporting!
Servers in DSTU2.1 mode were incorrectly using the legacy mimetypes instead of the new STU3 ones. Thanks to Michael Lawley for the pull request!. Fixes 623.
Add an option to ParserOptions that specifies that when parsing a bundle, the ID found in the Bundle.entry.fullUrl should not override the ID found in the Resource.id field. Technically these fields must always supply the same ID in order for a server to be considered conformant, but this option allows you to deal with servers which are behaving badly. Thanks to GitHub user CarthageKing for the pul request!. Fixes 624.
Remove unneccesary whitespace in the text areas on the testing web UI. Thanks to GitHub user @elnin0815 for the pull request!. Fixes 617.
In JAX-RS server it is now possible to change the server exception handler at runtime without a server restart. Thanks to Sebastien Riviere for the pull request!. Fixes 613.
Fix a potential race condition when the FhirContext is being accessed by many threads at the same time right as it is initializing. Thanks to Ben Spencer for the pull request!. Fixes 610.

Release 2.3 – 2017-03-18

Type Changes By
Bump the version of a few dependencies to the latest versions (dependent HAPI modules listed in brackets):
  • Hibernate (JPA): 5.1.0 -> 5.2.7
  • Hibernate Search (JPA): 5.5.4 -&gtp; 5.7.0.CR1
  • Hibernate Validator (JPA): 5.2.4 -&gtp; 5.3.4
  • Spring (JPA): 4.3.1 -> 4.3.6
The JPA server now supports custom search parameters in DSTU3 mode. This allows users to create search parameters which contain custom paths, or even override and disable existing search parameters.
CLI example uploader couldn't find STU3 examples after CI server was moved to build.fhir.org
Fix issue in JPA subscription module that prevented purging stale subscriptions when many were present on Postgres
Server interceptor methods were being called twice unnecessarily by the JPA server, and the DaoConfig interceptor registration framework was not actually useful. Thanks to GitHub user @mattiuusitalo for reporting!. Fixes 532.
AuthorizationInterceptor on JPA server did not correctly apply rules on deleting resources in a specific compartment because the resource metadata was stripped by the JPA server before the interceptor could see it. Thanks to Eeva Turkka for reporting!. Fixes 503.
JPA server exported CapabilityStatement includes double entries for the _id parameter and uses the wrong type (string instead of token). Thanks to Robert Lichtenberger for reporting!. Fixes 519.
Custom resource types which extend Binary must not have declared extensions since this is invalid in FHIR (and HAPI would just ignore them anyhow). Thanks to Thomas S Berg for reporting!. Fixes 504.
Standard HAPI zip/tar distributions did not include the project sources and JavaDoc JARs. Thanks to Keith Boone for pointing this out!
Server AuthorizationInterceptor always rejects history operation at the type level even if rules should allow it.
JPA server terminology service was not correctly validating or expanding codes in SNOMED CT or LOINC code systems. Thanks to David Hay for reporting!
Attempting to search for an invalid resource type (e.g. GET base/FooResource) should return an HTTP 404 and not a 400, per the HTTP spec. Thanks to GitHub user @CarthageKing for the pull request!. Fixes 539.
When parsing a Bundle containing placeholder fullUrls and references (e.g. "urn:uuid:0000-0000") the resource reference targets did not get populated with the given resources. Note that as a part of this change, IdType and IdDt have been modified so that when parsing a placeholder ID, the complete placeholder including the "urn:uuid:" or "urn:oid:" prefix will be placed into the ID part. Previously, the prefix was treated as the base URL, which led to strange behaviour like the placeholder being treated as a real IDs. Thanks to GitHub user @jodue for reporting!. Fixes 544.
Declared extensions with multiple type() options listed in the @Child annotation caused a crash on startup. Now this is supported.
STU3 XHTML parser for narrative choked if the narrative contained an &rsquot; entity string.
When parsing a quantity parameter on the server with a value and units but no system (e.g. GET [base]/Observation?value=5.4||mg) the unit was incorrectly treated as the system. Thanks to @CarthageKing for the pull request!. Fixes 538.
Correct a typo in the JPA ValueSet ResourceProvider which prevented successful operation under Spring 4.3. Thanks to Robbert van Waveren for the pull request!
Deprecate the method ICompositeElement#getAllPopulatedChildElementsOfType(Class) as it is no longer used by HAPI and is just an annoying step in creating custom structures. Thanks to Allan Bro Hansen for pointing this out.
CapturingInterceptor did not buffer the response meaning that in many circumstances it did not actually capture the response. Thanks to Jenny Syed of Cerner for the pull request and contribution!. Fixes 547.
Clean up dependencies and remove Eclipse project files from git. Thanks to @sekaijin for the pull request!. Fixes 548.
When performing a conditional create in a transaction in JPA server, if a resource already existed matching the conditional expression, the server did not change the version of the resource but did update the body with the passed in body. Thanks to Artem Sopin for reporting and providing a test case for this!
Client revincludes did not include the :recurse modifier. Thanks to Jenny Meinsma for pointing this out on Zulip!
JPA server did not return an OperationOutcome in the response for a normal delete operation.
Fix an issue in JPA server where _history results were kept in memory instead of being spooled to the database as they should be. Note that as a part of this fix a new method was added to IBundleProvider called getUuid(). This method may return null in any current cases.
Expanding a ValueSet in JPA server did not correctly apply ?filter= parameter when the ValueSet being expanded had codes included explicitly (i.e. not by is-a relationship). Thanks to David Hay for reporting!
JPA validator incorrectly returned an HTTP 400 instead of an HTTP 422 when the resource ID was not present and required, or vice versa. Thanks to Brian Postlethwaite for reporting!
When using an annotation based client, a ClassCastException would occur under certain circumstances when the response contained contained resources
JPA server interceptor methods for create/update/delete provided the wrong version ID to the interceptors
A post-processing hook for subclasses of BaseValidatingInterceptor is now available.
AuthorizationInterceptor can now authorize (allow/deny) extended operations on instances and types by wildcard (on any type, or on any instance). Fixes 585.
When RequestValidatingInterceptor is used, the validation results are now populated into the OperationOutcome produced by create and update operations. Fixes 595.
Add support for the $process-message operation to fluent client. Thanks to Hugo Soares for the pull request!. Fixes 542.
Parser can now be configured when encoding to use a specific base URL for extensions. Thanks to Sebastien Riviere for the pull request!. Fixes 543.
Correct the resource paths for the DSTU2.1 validation resources, allowing the validator to correctly work against those structures. Thanks to Michael Lawley for the pull request!. Fixes 568.
XML Parser failed to parse large field values (greater than 512 Kb) on certain platforms where the StAX parser was overridden. Thanks to GitHub user @Jodue for the pull request!. Fixes 551.
Remove an unneccesary database flush when saving large code systems to the JPA database, improving performance of this operation. Thanks to Joel Schneider for the pull request and analysis!. Fixes 575.
A new post-processing hook for subclasses of BaseValidatingInterceptor is now available. The hook exposes the request details on validation failure prior to throwing an UnprocessableEntityException.

Release 2.2 – 2016-12-20

Type Changes By
Bump the version of a few dependencies to the latest versions (dependent HAPI modules listed in brackets):
  • Derby (CLI): 10.12.1.1 -> 10.13.1.1
  • Jetty (CLI): 9.3.10.v20160621 -> 9.3.14.v20161028
  • JAnsi (CLI): 1.13 -> 1.14
  • Phloc Commons (SCH Validator): 4.4.5 -> 4.4.6
Fix issue in AuthorizationIntetceptor where transactions are blocked even when they should not be
Fix regression in HAPI FHIR 2.1 JPA server where some search parameters on metadata resources did not appear (e.g. "StructureDefinition.url"). Thanks to David Hay for reporting!
Add ability to JPA server for disabling stale search expiry. This is useful if you are deploying the server to a cluster.
RestfulServer with no explicitly set FhirContext fails to detect the presents of DSTU3 structures. Thanks to GitHub user @vijayt27 for reporting!. Fixes 495.
As the eBay CORS interceptor project has gone dormant, we have introduced a new HAPI server interceptor which can be used to implement CORS support instead of using the previously recommended Servlet Filter. All server examples as well as the CLI have been switched to use this new interceptor. See the CORS Documentation for more information.
Make the parser configurable so that when parsing an invalid empty value (e.g. {"status":""}) the parser will either throw a meaningful exception or log a warning depending on the configured error handler. Fixes 480.
Fix issue when serializing resources that have contained resources which are referred to from multiple places. Sometimes when serializing these resources the contained resource section would contain duplicates. Thanks to Hugo Soares and Stefan Evinance for reporting and providing a test case!. Fixes 276.
Allow client to gracefully handle running in DSTU3 mode but with a structures JAR that does not contain a CapabilityStatement resource. Thanks to Michael Lawley for the pull request!. Fixes 518.
Fix a crash in JPA server when searching using an _include if _include targets are external references (and therefore can't be loaded by the server). Thanks to Hannes Ulrich for reporting!
HAPI FHIR CLI failed to delete a file when uploading example resources while running under Windows.
Server should reject update if the resource body does not contain an ID, or the ID does not match the request URL. Thanks to Jim Steel for reporting!. Fixes 521.
Web Testing UI's next and previous buttons for paging through paged results did not work after the migration to using Thymeleaf 3. Thanks to GitHub user @gsureshkumar for reporting!. Fixes 500.
When parsing invalid enum values in STU3, report errors through the parserErrorHandler, not by throwing an exception. Thanks to Michael Lawley for the pull request!. Fixes 525.
When parsing DSTU3 resources with enumerated types that contain invalid values, the parser will now invoke the parserErrorHandler. For example, when parsing {"resourceType":"Patient", "gender":"foo"} the previous behaviour was to throw an InvalidArgumentException. Now, the parserErrorHandler is invoked. In addition, thw LenientErrorHandler has been modified so that this one case will result in a DataFormatException. This has the effect that servers which receive an invalid enum velue will return an HTTP 400 instead of an HTTP 500. Thanks to Jim Steel for reporting!. Fixes 516.
DSTU3 context now pulls the FHIR version from the actual model classes. Thanks to Michael Lawley for the pull request!. Fixes 520.
Enhancements to the tinder-plugin's generic template features of the generate-multi-files and generate-single-file Maven goals as well as the Ant hapi-tinder task.
  • Provides the full Tinder data model by adding composites, valuesets, and profiles to resourcesw.
  • Supports generating files for resources, composites, valuesets, and profiles
  • Supports Velocimacro files outside the tinder-plugin JAR
  • Provides filename prefix as well as suffix properties
  • Can specify any of the Velocity configuration parameters such as macro.provide.scope.control which allows safe macro recursion
  • Templates can now drill down into the referenced children for a ResourceBlockCopy
  • Normalization of properties across all three generic tasks
Fix ordering of validator property handling when an element has a name that is similar to a shorter name[x] style name. Thanks to CarthageKing for the pull request!. Fixes 523.
Add a docker configuration to the hapi-fhir-jpaservr-example module. Thanks to Gijsbert van den Brink for the pull request!. Fixes 510.
Add utility constructors to MoneyDt. Thanks to James Ren for the contribution!. Fixes 507.
AuthorizationInterceptor was failing to allow read requests to pass when a rule authorized those resources by compartment. Thanks to GitHub user @mattiuusitalo for reporting and supplying a test case!. Fixes 528.
Correct a typo in client IHttpRequest class: "bufferEntitity" should be "bufferEntity".
ErrorHandler is now called (resulting in a warning by default, but can also be an exception) when arsing JSON if the resource ID is not a JSON string, or an object is found where an array is expected (e.g. repeating field). Thanks to Jenni Syed of Cerner for providing a test case!
Fix Web Testing UI to be able to handle STU3 servers which return CapabilityStatement instead of the previously used "Conformance" resource
CLI example uploader couldn't find STU3 examples after CI server was moved to build.fhir.org
Fix issue in JPA subscription module that prevented purging stale subscriptions when many were present on Postgres
Server interceptor methods were being called twice unnecessarily by the JPA server, and the DaoConfig interceptor registration framework was not actually useful. Thanks to GitHub user @mattiuusitalo for reporting!. Fixes 532.
AuthorizationInterceptor on JPA server did not correctly apply rules on deleting resources in a specific compartment because the resource metadata was stripped by the JPA server before the interceptor could see it. Thanks to Eeva Turkka for reporting!. Fixes 503.
JPA server exported CapabilityStatement includes double entries for the _id parameter and uses the wrong type (string instead of token). Thanks to Robert Lichtenberger for reporting!. Fixes 519.
Custom resource types which extend Binary must not have declared extensions since this is invalid in FHIR (and HAPI would just ignore them anyhow). Thanks to Thomas S Berg for reporting!. Fixes 504.
Standard HAPI zip/tar distributions did not include the project sources and JavaDoc JARs. Thanks to Keith Boone for pointing this out!
Server AuthorizationInterceptor always rejects history operation at the type level even if rules should allow it.
JPA server terminology service was not correctly validating or expanding codes in SNOMED CT or LOINC code systems. Thanks to David Hay for reporting!
Attempting to search for an invalid resource type (e.g. GET base/FooResource) should return an HTTP 404 and not a 400, per the HTTP spec. Thanks to GitHub user @CarthageKing for the pull request!. Fixes 539.
When parsing a Bundle containing placeholder fullUrls and references (e.g. "urn:uuid:0000-0000") the resource reference targets did not get populated with the given resources. Note that as a part of this change, IdType and IdDt have been modified so that when parsing a placeholder ID, the complete placeholder including the "urn:uuid:" or "urn:oid:" prefix will be placed into the ID part. Previously, the prefix was treated as the base URL, which led to strange behaviour like the placeholder being treated as a real IDs. Thanks to GitHub user @jodue for reporting!. Fixes 544.
Declared extensions with multiple type() options listed in the @Child annotation caused a crash on startup. Now this is supported.
STU3 XHTML parser for narrative choked if the narrative contained an &rsquot; entity string.
When parsing a quantity parameter on the server with a value and units but no system (e.g. GET [base]/Observation?value=5.4||mg) the unit was incorrectly treated as the system. Thanks to @CarthageKing for the pull request!. Fixes 538.
Correct a typo in the JPA ValueSet ResourceProvider which prevented successful operation under Spring 4.3. Thanks to Robbert van Waveren for the pull request!
Deprecate the method ICompositeElement#getAllPopulatedChildElementsOfType(Class) as it is no longer used by HAPI and is just an annoying step in creating custom structures. Thanks to Allan Bro Hansen for pointing this out.
CapturingInterceptor did not buffer the response meaning that in many circumstances it did not actually capture the response. Thanks to Jenny Syed of Cerner for the pull request and contribution!. Fixes 547.

Release 2.1 – 2016-11-11

Type Changes By
STU3 structure definitions have been updated to the STU3 latest definitions (1.7.0 - SVN 10129). In particular, this version supports the new CapabilityStatement resource which replaces the previous Conformance resource (in order to reduce upgrade pain, both resource types are included in this version of HAPI)
Bump the version of a few dependencies to the latest versions (dependent HAPI modules listed in brackets):
  • spring-data-orm (JPA): 1.10.2 -> 1.10.4
Fix a fairly significant issue in JPA Server when using the DatabaseBackedPagingProvider: When paging over the results of a search / $everything operation, under certain circumstances resources may be missing from the last page of results that is returned. Thanks to David Hay for reporting!
Client, Server, and JPA server now support experimental support for HTTP PATCH using the XML Patch and JSON Patch syntax as explored during the September 2016 Baltimore Connectathon. See this wiki page for a description of the syntax.
Thanks to Pater Girard for all of his help during the connectathon in implementing this feature!
Android library now uses OkHttp client by default instead of Apache HttpClient. This should lead to much simpler support for Android in the future.
Both client and server now use the new STU3 mime types by default if running in STU3 mode (in other words, using an STU3 FhirContext).
In server, when returning a list of resources, the server sometimes failed to add _include resources to the response bundle if they were referred to by a contained reosurce. Thanks to Neal Acharya for reporting!
Fix regression in web testing UI where "prev" and "next" buttons don't work when showing a result bundle
JPA server should not attempt to resolve built-in FHIR StructureDefinitions from the database (this causes a significant performance hit when validating)
BanUnsupportedHttpMethodsInterceptor was erroring out when a client attempts HTTP HEAD requests
Conditional URLs in JPA server (e.g. for delete or update) did not support the _has parameter
Remove Maven dependency on Saxon library, as it is not actually used. Thanks to Lem Edmondson for the suggestion!. Fixes 440.
Times before 1970 with fractional milliseconds were parsed incorrectly. Thanks to GitHub user @CarthageKing for reporting!. Fixes 444.
Prevent crash in parser when parsing resource with multiple profile declarations when default type for profile is used. Thanks to Filip Domazet for the pull request!. Fixes 448.
STU3 servers were adding the old MimeType strings to the Conformance.format part of the generated server conformance statement. Fixes 445.
When performing an update using the client on a resource that contains other resources (e.g. Bundle update), all child resources in the parent bundle were incorrectly given the ID of the parent. Thanks to Filip Domazet for reporting!. Fixes 446.
STU clients now use an Accept header which indicates support for both the old MimeTypes (e.g. application/xml+fhir) and the new MimeTypes (e.g. application/fhir+xml)
JPA server now sends correct HTTP 409 Version Conflict when a DELETE fails because of constraint issues, instead of HTTP 400 Invalid Request
Server history operation did not populate the Bundle.entry.request.url field, which is required in order for the bundle to pass validation. Thanks to Richard Ettema for spotting this!
Add a new method to the server interceptor framework which will be called after all other processing is complete (useful for performance tracking). The server LoggingInterceptor has been switched to using this method which means that log lines will be created when processing is finished, instead of when it started.
STU3 clients were not sending the new mimetype values in the Content-Type header. Thanks to Claude Nanjo for pointing this out!
JAX-RS server was not able to handle the new mime types defined in STU3
JPA server did not handle custom types when being called programatically (I.e. not through HTTP interface). Thanks to Anthony Mei for pointing this out!
CLI was not correctly able to upload DSTU2 examples to any server
STU3 validator has been upgrated to include fixes made since the 1.6.0 ballot
Prevent JPA server from creating a bunch of FhirContext objects for versions of FHIR that aren't actually being used
XhtmlNode.equalsDeep() contained a bug which caused resources containing a narrative to always return false for STU3 Resource#equalsDeep(). Thanks to GitHub user @XcrigX for reporting!. Fixes 443.
JPA server did not correctly process searches for chained parameters where the chain passed across a field that was a choice between a reference and a non-reference type (e.g. MedicationAdministration.medication[x]. Thanks to GitHub user @Crudelus for reporting!. Fixes 441.
Handle parsing an extension without a URL more gracefully. In HAPI FHIR 2.0 this caused a NullPointerException to be thrown. Now it will trigger a warning, or throw a DataFormatException if the StrictErrorHandler is configured on the parser. Fixes 414.
Calling a HAPI server URL with a chain on a parameter that shouldn't accept chains (e.g. GET [base]/Patient?name.foo=smith) did not return an error and instead just ignored the chained part and treated the parameter as though it did not have the chain. This led to confusing and potentially unsafe behaviour. This has been corrected to return an error to the client. Thanks to Kevin Tallevi for finding this!
Fix #411 - Searching by POST [base]/_search with urlencoded parameters doesn't work correctly if interceptors are accessing the parameters and there is are also parameters on the URL. Thanks to Jim Steel for reporting!. Fixes 411.
Fluent client can now return types other than Parameters when invoking operations.
JPA server shouldn't report a totalCount in Bundle of "-1" when there are no results
JPA server was not correctly normalizing strings with non-latin characters (e.g. Chinese chars). Thanks to GitHub user @YinAqu for reporting and providing some great analysis of the issue!. Fixes 454.
Add a new method to ReferenceClientParam which allows you to pass in a number of IDs by a collection of Strings. Thanks to Thomas Andersen for the pul request!
When encoding a resource in JSON where the resource has an extension with a value where the value is a reference to a contained resource, the reference value (e.g. "#1") did not get serialized. Thanks to GitHub user @fw060 for reporting!. Fixes 327.
ResponseHighlighterInterceptor now pretty-prints responses by default unless the user has explicitly requested a non-pretty-printed response (ie. using ?_pretty=false. Thanks to Allan Brohansen and Jens Villadsen for the suggestion!. Fixes 464.
Add a new JSON library abstraction layer to the JSON parser. This contribution shouldn't have any end-user impact but does make it easier to use the JSON parser to generate custom structures for other purposes, and should allow us to support RDF more easily at some point. Thanks to Bill Denton for the pull request and the contribution!. Fixes 469.
DSTU1 Bundle encoder did not include the Bundle entry author in the generated bundle. Thanks to Hannes Venter for the pull request and contribution!. Fixes 455.
Remove unused field (myIsContained) from ResourceTable in JPA server.
AuthorizationInterceptor is now a bit more aggressive at blocking read operations, stopping them on the way in if there is no way they will be accepted to the resource check on the way out. In addition it can now be configured to allow/deny operation invocations at the instance level on any instance of a given type
STU3 servers were incorrectly returning the Content-Location header instead of the Content header. The former has been removed from the FHIR specification in STU3, but the latter got removed in HAPI's code base. Thanks to Jim Steel for reporting!. Fixes 472.
Correct several documentation issues. Thanks to Vadim Peretokin for the pull requests!
Remove an unneccesary database flush from JPA persistence operations
Add method to fluent client to allow OR search across several profiles. Thanks to Thomas Andersen for the pull request!. Fixes 470.

Release 2.0 – 2016-08-30

Type Changes By
JSON parsing in HAPI FHIR has been switched from using JSR353 (javax.json) to using Google Gson. For this reason we are bumping the major release number to 2.0. Theoretically this should not affect projects in any major way, but Gson does have subtle differences. Two differences which popped up a fair bit in our own testing:
      A space is placed after the : in keys, e.g. what was previously encoded as "resourceType":"Patient" is now encoded as "resourceType": "Patient" (this broke a number of our unit tests with hardcoded resource definitions)
      Trailing content after a valid json resource is rejected by Gson (it was ignored by the Glassfish parser we were previously using even though it was invalid)
STU3 structure definitions have been updated to the STU3 ballot candidate versions (1.6.0 - SVN 9663)
Both client and server now support the new Content Types decided in FHIR #10199.

This means that the server now supports application/fhir+xml and application/fhir+json in addition to the older style application/xml+fhir and application/json+fhir. In order to facilitate migration by implementors, the old style remains the default for now, but the server will respond using the new style if the request contains it. The client now uses an Accept header value which requests both styles with a preference given to the new style when running in DSTU3 mode.

As a part of this change, the server has also been enhanced so that if a request contains a Content-Type header but no Accept header, the response will prefer the encoding specified by the Content-Type header.
Bump the version of a few dependencies to the latest versions (dependent HAPI modules listed in brackets):
  • Logback (used in sample projects): 1.1.5 -> 1.1.7
  • Phloc Commons (used by schematron validator): 4.4.4 -> 4.4.5
  • Commons-IO: 2.4 -> 2.5
  • Apache HTTPClient: 4.5.1 -> 4.5.2
  • Apache HTTPCore: 4.4.4 -> 4.4.5
  • Jersey (JAX-RS tests): 2.22.2 -> 2.23.1
  • Spring (JPA, Web Tester): 4.3.0 -> 4.3.1
  • Hibernate Search (JPA): 5.5.2 -> 5.5.4
  • Thymeleaf (Narrative Generator / Web Tester): 2.1.4 ->3.0.1
Fix issue in DSTU1 Bundle parsing where unexpected elements in the bundle resulted in a failure to parse.
DSTU2 QuestionnaireResponse validator failed with an exception if the QuestionnaireResponse contained certain groups with no content
Fluent client should ignore parameter values which are null instead of including them as ?foo=null. Fixes 150.
When using _elements parameter on server, the server was not automatically adding the SUBSETTED tag as it should
JPA server should now automatically detect if Hibernate Search (Lucene) is configured to be disabled and will not attempt to use it. This prevents a crash for some operations.
A new server interceptor "BanUnsupprtedHttpMethodsInterceptor" has been added which causes the server to return an HTTP 405 if an unsupported HTTP verb is received from the client
Fix an issue where resource IDs were not correctly set when using DSTU2 HL7org structures with the JAX-RS module. Thanks to Carlo Mion for the pull request!. Fixes 404.
hapi-fhir-testpage-overlay project contained an unneccesary dependency on hapi-fhir-jpaserver-base module, which resulted in projects using the overlay having a large number of unnneded JARs included
It is not possible to configure both the parser and the context to preserve versions in resource references (default behaviour is to strip versions from references). Thanks to GitHub user @cknaap for the suggestion!. Fixes 403.
Tag#setCode(String) did not actually set the code it was supposed to set. Thanks to Tim Tschampel for reporting!. Fixes 409.
JPA server's /Bundle endpoint cleared the Bundle.entry.fullUrl field on stored bundles, resulting in invalid content being saved. Thanks to Mirjam Baltus for reporting!. Fixes 401.
JPA server now returns HTTP 200 instead of HTTP 404 for conditional deletes which did not find any matches, per FHIR-I decision.
Client that declares explicitly that it is searching/reading/etc for a custom type did not automatically parse into that type.
Allow servers to specify the authentication realm of their choosing when throwing an AuthenticationException. Thanks to GitHub user @allanbrohansen for the suggestion!. Fixes 406.
Add a new client implementation which uses the OkHttp library as the HTTP client implementation (instead of Apache HttpClient). This is particularly useful for Android (where HttpClient is a pain) but could also be useful in other places too. Thanks to Matt Clarke of Orion Health for the contribution!. Fixes 416.
Fix a regression when parsing resources that have contained resources, where the reference in the outer resource which links to the contained resource sometimes did does not get populated with the actual target resource instance. Thanks to Neal Acharya for reporting!
hapi-fhir-cli upload-terminology command now has an argument "-b FOO" that lets you add an authorization header in the form Authorization: Bearer FOO
Parser failed to successfully encode a custom resource if it contained custom fields that also used custom types. Thanks to GitHub user @sjanic for reporting!. Fixes 423.
Inprove handling of _text and _content searches in JPA server to do better matching on partial strings
Servers in STU3 mode will now ignore any ID or VersionID found in the resource body provided by the client when processing FHIR update operations. This change has been made because the FHIR specification now requires servers to ignore these values. Note that as a result of this change, resources passed to @Update methods will always have null ID
Add new methods to AuthorizationInterceptor which allow user code to declare support for conditional create, update, and delete.
When encoding a resource with a reference to another resource that has a placeholder ID (e.g. urn:uuid:foo), the urn prefix was incorrectly stripped from the reference.
Servers for STU3 (or newer) will no longer include a Location: header on responses for read operations. This header was required in earlier versions of FHIR but has been removed from the specification.
Fix NullPointerException when encoding an extension containing CodeableConcept with log level set to TRACE. Thanks to Bill Denton for the report!. Fixes 428.
Add two new methods to the parser error handler that let users trap invalid contained resources with no ID, as well as references to contained resource that do not exist.
Improve performance when parsing resources containing contained resources by eliminating a step where references were woven twice
Parser failed to parse resources containing an extension with a value type of "id". Thanks to Raphael Mäder for reporting!. Fixes 426.
When committing a transaction in JPA server where the transaction contained placeholder IDs for references between bundles, the placeholder IDs were not substituted with viewing resources using the _history operation
HAPI root pom shouldn't include animal-sniffer plugin, since that causes any projects which extend this to be held to Java 6 compliance.

Release 1.6 – 2016-07-07

Type Changes By
Performance has been improved for the initial FhirContext object creation by avoiding a lot of unnecessary reflection. HAPI FHIR 1.5 had a regression compared to previous releases and this has been corrected, but other improvements have been made so that this release is faster than previous releases too.

In addition, a new "deferred scan" mode has been implemented for even faster initialization on slower environments (e.g. Android). See the performance documentation for more information.

The following shows our benchmarks for context initialization across several versions of HAPI:
  • Version 1.4: 560ms
  • Version 1.5: 800ms
  • Version 1.6: 340ms
  • Version 1.6 (deferred mode): 240ms
Bump the version of a few dependencies to the latest versions (dependent HAPI modules listed in brackets):
  • Spring (JPA, Web Tester): 4.2.5 -> 4.3.0
  • Spring-Data (JPA): 1.9.2 -> 1.10.1
  • Hibernate Search (JPA): 5.5.2 -> 5.5.3
  • Jetty (CLI): 9.3.9 -> 9.3.10
Remove some clases that were deprecated over a year ago and have suitable replacements:
  • QualifiedDateParam has been removed, but DateParam may be used instead
  • PathSpecification has been removedm but Include may be used instead
ResponseValidatingInterceptor threw an InternalErrorException (HTTP 500) for operations that do not return any content (e.g. delete). Thanks to Mohammad Jafari for reporting!. Fixes 345.
REST server now throws an HTTP 400 instead of an HTTP 500 if an operation which takes a FHIR resource in the request body (e.g. create, update) contains invalid content that the parser is unable to parse. Thanks to Jim Steel for the suggestion!. Fixes 342.
Deprecate fluent client search operations without an explicit declaration of the bundle type being used. This also means that in a client .search() operation, the .returnBundle(Bundle.class) needs to be the last statement before .execute()
Server now respects the parameter _format=application/xml+fhir" which is technically invalid since the + should be escaped, but is likely to be used. Also, a parameter of _format=html can now be used, which forces SyntaxHighlightingInterceptor to use HTML even if the headers wouldn't otherwise trigger it. Thanks to Jim Steel for reporting!. Fixes 346.
Improve performance when parsing large bundles by fixing a loop over all of the entries inthe bundle to stitch together cross-references, which was happening once per entry instead of once overall. Thanks to Erick on the HAPI FHIR Google Group for noticing that this was an issue!
JSON parser no longer allows the resource ID to be specified in an element called "_id" (the correct one is "id"). Previously _id was allowed because some early FHIR examples used that form, but this was never actually valid so it is now being removed.
JPA server now allows "forced IDs" (ids containing non-numeric, client assigned IDs) to use the same logical ID part on different resource types. E.g. A server may now have both Patient/foo and Obervation/foo on the same server.

Note that existing databases will need to modify index "IDX_FORCEDID" as it is no longer unique, and perform a reindexing pass.
When serializing/encoding custom types which replace exsting choice fields by fixing the choice to a single type, the parser would forget that the field was a choice and would use the wrong name (e.g. "abatement" instead of "abatementDateType"). Thanks to Yaroslav Kovbas for reporting and providing a unit test!. Fixes 350.
JPA server transactions sometimes created an incorrect resource reference if a resource being saved contained references that had a display value but not an actual reference. Thanks to David Hay for reporting!
When performing a REST Client create or update with Prefer: return=representation set, if the server does not honour the Prefer header, the client will automatically fetch the resource before returning. Thanks to Ewout Kramer for the idea!. Fixes 352.
DSTU3 structures now have setFoo(List) and setGetFooFirstRep() methods, bringing them back to parity with the HAPI DSTU2 structures. Thanks to Rahul Somasunderam and Claude Nanjo for the suggestions!. Fixes 354.
JPA server has now been refactored to use the new FluentPath search parameter definitions for DSTU3 resources.
RequestValidatingInterceptor and ResponseValidatingInterceptor both have new method setIgnoreValidatorExceptions which causes validator exceptions to be ignored, rather than causing processing to be aborted.
LoggingInterceptor on server has a new parameter ${requestBodyFhir} which logs the entire request body.
JAX-RS server module now supports DSTU3 resources (previously it only supported DSTU2). Thanks to Phillip Warner for implementing this, and providing a pull request!. Fixes 355.
Generated conformance statements for DSTU3 servers did not properly reference their OperationDefinitions. Thanks to Phillip Warner for implementing this, and providing a pull request!. Fixes 356.
Properly handle null arrays when parsing JSON resources. Thanks to Subhro for fixing this and providing a pull request!. Fixes 359.
STU3 validator failed to validate codes where the code was a child code within the code system that contained it (i.e. not a top level code). Thanks to Jon Zammit for reporting!
Restore the setType method in the DSTU1 Bundle class, as it was accidentally commented out. Thanks to GitHub user @Virdulys for the pull request!. Fixes 361.
JPA server now supports composite search parameters where the type of the composite parameter is a quantity (e.g. Observation:component-code-component-value-quantity)
Remove the Remittance resource from DSTU2 structures, as it is not a real resource and was causing issues with interoperability with the .NET client.
CLI tool cache feature (-c) for upload-example task sometimes failed to write cache file and exited with an exception.
Fix error message in web testing UI when loading pages in a search result for STU3 endpoints.
When encoding JSON resource, the parser will now always ensure that XHTML narrative content has an XHTML namespace declaration on the first DIV tag. This was preventing validation for some resources using the official validator rules.
Server failed to invoke operations when the name was escaped (%24execute instead of $execute). Thanks to Michael Lawley for reporting!
JPA server transactions containing a bundle that has multiple entries trying to delete the same resource caused a 500 internal error
JPA module failed to index search parameters that mapped to a Timing datatype, e.g. CarePlan:activitydate
Add a new option to the CLI run-server command called --lowmem. This option disables some features (e.g. fulltext search) in order to allow the server to start in memory-constrained environments (e.g Raspberry Pi)
When updating a resource via an update operation on the server, if the ID of the resource is not present in the resource body but is present on the URL, this will now be treated as a warning instead of as a failure in order to be a bit more tolerant of errors. If the ID is present in the body but does not agree with the ID in the URL this remains an error.
Server / JPA server date range search params (e.g. Encounter:date) now treat a single date with no comparator (or the eq comparator) as requiring that the value be completely contained by the range specified. Thanks to Chris Moesel for the suggestion.
In server, if a parameter was annotated with the @Count annotation, the count would not appear in the self/prev/next links and would not actually be applied to the search results by the server. Thanks to Jim Steele for letting us know!
Conditional update on server failed to process if the conditional URL did not have any search parameters that did not start with an underscore. E.g. "Patient?_id=1" failed even though this is a valid conditional reference.
JPA server can now be configured to allow external references (i.e. references that point to resources on other servers). See JPA Documentation for information on how to use this. Thanks to Naminder Soorma for the suggestion!. Fixes 363.
When posting a resource to a server that contains an invalid value in a boolean field (e.g. Patient with an active value of "1") the server should return an HTTP 400, not an HTTP 500. Thanks to Jim Steel for reporting!. Fixes 366.
Enable parsers to parse and serialize custom resources that contain custom datatypes. An example has been added which shows how to do this here. Fixes 364.
JSON parser was incorrectly encoding resource language attribute in JSON as an array instead of a string. Thanks to David Hay for reporting!
Sébastien Rivière contributed an excellent pull request which adds a number of enhancements to JAX-RS module:
  • Enable the conditional update and delete
  • Creation of a bundle provider, and support of the @Transaction
  • Bug fix on the exceptions handling as some exceptions throw outside bean context were not intercept.
  • Add the possibility to have the stacktrace in the jaxrsException
. Fixes 367.
FhirTerser.cloneInto method failed to clone correctly if the source had any extensions. Thanks to GitHub user @Virdulys for submitting and providing a test case!. Fixes 369.
Update DSTU2 InstanceValidator to latest version from upstream
Web Testing UI was not able to correctly post an STU3 transaction
DateTime parser incorrectly parsed times where more than 3 digits of precision were provided on the seconds after the decimal point
Improve error messages when the $validate operation is called but no resource is actually supplied to validate
DSTU2+ servers no longer return the Category header, as this has been removed from the FHIR specification (and tags are now available in the resource body so the header was duplication/wasted bandwidth)
Create and Update operations in server did not include ETag or Last-Modified headers even though the spec says they should. Thanks to Jim Steel for reporting!. Fixes 374.
Update STU3 client and server to use the new sort parameter style (param1,-param2,param). Thanks to GitHub user @euz1e4r for reporting!. Fixes 371.
QuantityClientParam#withUnit(String) put the unit into the system part of the parameter value
Fluent client searches with date parameters were not correctly using new prefix style (e.g. gt) instead of old one (e.g. >)
Some built-in v3 code systems for STU3 resources were missing certain codes, which caused false failures when validating resources. Thanks to GitHub user @Xoude for reporting!. Fixes 370.
Some methods on DSTU2 model structures have JavaDocs that incorrectly claim that the method will not return null when in fact it can. Thanks to Rick Riemer for reporting!. Fixes 365.
ResponseHighlightingInterceptor has been modified based on consensus on Zulip with Grahame that requests that have a parameter of _format=json or _format=xml will output raw FHIR content instead of HTML highlighting the content as they previously did. HTML content can now be forced via the (previously existing) _format=html or via the two newly added values _format=html/json and _format=html/xml. Because of this change, the custom _raw=true mode has been deprecated and will be removed at some point.
Operation definitions (e.g. for $everything operation) in the generated server conformance statement should not include the $ prefix in the operation name or code. Thanks to Dion McMurtrie for reporting!. Fixes 267.
Server generated OperationDefinition resources did not validate due to some missing elements (kind, status, etc.). Thanks to Michael Lawley for reporting!. Fixes 378.
Operations that are defined on multiple resource provider types with the same name (e.g. "$everything") are now automatically exposed by the server as separate OperationDefinition resources per resource type. Thanks to Michael Lawley for reporting!. Fixes 379.
OperationDefinition resources generated automatically by the server for operations that are defined within resource/plain providers incorrectly stated that the maximum cardinality was "*" for non-collection types with no explicit maximum stated, which is not the behaviour that the JavaDoc on the @OperationParam annotation describes. Thanks to Michael Lawley for reporting!. Fixes 380.
Server parameters annotated with @Since or @Count which are of a FHIR type such as IntegerDt or DateTimeType will now be set to null if the client's URL does not contain this parameter. Previously they would be populated with an empty instance of the FHIR type, which was inconsistent with the way other server parameters worked.
Server now supports the _at parameter (including multiple repetitions) for history operation
AuthorizationInterceptor can now allow or deny requests to extended operations (e.g. $everything)
DecimalType used BigDecimal constructor instead of valueOf method to create a BigDecimal from a double, resulting in weird floating point conversions. Thanks to Craig McClendon for reporting!
Remove the depdendency on a method from commons-lang3 3.3 which was causing issues on some Android phones which come with an older version of this library bundled. Thanks to Paolo Perliti for reporting!. Fixes 394.
Parser is now better able to handle encoding fields which have been populated with a class that extends the expected class
When declaring a child with order=Child.REPLACE_PARENT the serialized form still put the element at the end of the resource instead of in the correct order
Fix STU3 JPA resource providers to allow validate operation at instance level

Release 1.5 – 2016-04-20

Type Changes By
Security Fix: XML parser was vulnerable to XXE (XML External Entity) processing, which could result in local files on disk being disclosed. See this page for more information. Thanks to Jim Steel for reporting!. Fixes 339.
Bump the version of a few dependencies to the latest versions (dependent HAPI modules listed in brackets):
  • Hibernate (JPA, Web Tester): 5.0.7 -> 5.1.0
  • Spring (JPA, Web Tester): 4.2.4 -> 4.2.5
  • SLF4j (All): 1.7.14 -> 1.7.21
Support comments when parsing and encoding both JSON and XML. Comments are retrieved and added to the newly created methods IBase#getFormatCommentsPre() and IBase#getFormatCommentsPost()
Added options to the CLI upload-examples command which allow it to cache the downloaded content file, or use an arbitrary one. Thanks to Adam Carbone for the pull request!. Fixes 293.
REST search parameters with a prefix/comparator had not been updated to use the DSTU2 style prefixes (gt2011-01-10) instead of the DSTU1 style prefixes (>2011-01-01). The client has been updated so that it uses the new prefixes if the client has a DSTU2+ context. The server has been updated so that it now supports both styles.

As a part of this change, a new enum called ParamPrefixEnum has been introduced. This enum replaces the old QuantityCompararatorEnum which has a typo in its name and can not represent several new prefixes added since DSTU1.
JPA server number and quantity search params now follow the rules for the use of precision in search terms outlined in the search page of the FHIR specification. For example, previously a 1% tolerance was applied for all searches (10% for approximate search). Now, a tolerance which respects the precision of the search term is used (but still 10% for approximate search).
Fix a failure starting the REST server if a method returns an untyped List, which among other things prevented resource provider added to the server as CDI beans in a JBoss enviroment. Thanks to GitHub user fw060 (Fei) for reporting and figuring out exactly why this wasn't working!. Fixes 291.
JPA server now supports :above and :below qualifiers on URI search params
Add optional support (disabled by default for now) to JPA server to support inline references containing search URLs. These URLs will be resolved when a resource is being created/updated and replaced with the single matching resource. This is being used as a part of the May 2016 Connectathon for a testing scenario.
The server no longer adds a WWW-Authenticate header to the response if any resource provider code throws an AuthenticationException. This header is used for interactive authentication, which isn't generally appropriate for FHIR. We added code to add this header a long time ago for testing purposes and it never got removed. Please let us know if you need the ability to add this header automatically. Thanks to Lars Kristian Roland for pointing this out.
In the client, the create/update operations on a Binary resource (which use the raw binary's content type as opposed to the FHIR content type) were not including any request headers (Content-Type, User-Agent, etc.) Thanks to Peter Van Houte of Agfa Healthcare for reporting!
Handling of Binary resources containing embedded FHIR resources for create/update/etc operations has been corrected per the FHIR rules outlined at Binary Resource in both the client and server.

Essentially, if the Binary contains something that isn't FHIR (e.g. an image with an image content-type) the client will send the raw data with the image content type to the server. The server will place the content type and raw data into a Binary resource instance and pass those to the resource provider. This part was already correct previous to 1.5.

On the other hand, if the Binary contains a FHIR content type, the Binary is now sent by the client to the server as a Binary resource with a FHIR content-type, and the embedded FHIR content is contained in the appropriate fields. The server will pass this "outer" Binary resource to the resource provider code.
The RequestDetails and ActionRequestDetails objects which are passed to server interceptor methods and may also be used as server provider method arguments now has a new method Map<String, String> getUserData() which can be used to pass data and objects between interceptor methods to to providers. This can be useful, for instance, if an authorization interceptor wants to pass the logged in user's details to other parts of the server.
When IServerInterceptor#incomingRequestPreHandled() is called for a @Validate method, the resource was not populated in the ActionRequestDetails argument. Thanks to Ravi Kuchi for reporting!. Fixes 297.
Request to server at [baseUrl]/metadata with an HTTP method other than GET (e.g. POST, PUT) should result in an HTTP 405. Thanks to Michael Lawley for reporting!. Fixes 298.
Fix a server exception when trying to automatically add the profile tag to a resource which already has one or more profiles set. Thanks to Magnus Vinther for reporting!. Fixes 302.
QuantityParam parameters being used in the RESTful server were ignoring the :missing qualifier. Thanks to Alexander Takacs for reporting!. Fixes 296.
Annotation client failed with an exception if the response contained extensions on fields in the resonse Bundle (e.g. Bundle.entry.search). Thanks to GitHub user am202 for reporting!. Fixes 299.
Primitive elements with no value but an extension were sometimes not encoded correctly in XML, and sometimes not parsed correctly in JSON. Thanks to Bill de Beaubien for reporting!. Fixes 274.
The Web Testing UI has long had an issue where if you click on a button which navigates to a new page (e.g. search, read, etc) and then click the back button to return to the original page, the button you clicked remains disabled and can't be clicked again (on Firefox and Safari). This is now fixed. Unfortunately the fix means that the buttom will no longer show a "loading" spinner, but there doesn't seem to be another way of fixing this. Thanks to Mark Scrimshire for reporting!. Fixes 280.
Extensions found while parsing an object that doesn't support extensions are now reported using the IParserErrorHandler framework in the same way that other similar errors are handled. This allows the parser to be more lenient when needed.
Improve error message if incorrect type is placed in a list field in the data model. Java uses generics to prevent this at compile time, but if someone is in an environment without generics this helps improve the error message at runtime. Thanks to Hugo Soares for suggesting. Fixes 304.
Prevent an unneeded warning when parsing a resource containing a declared extension. Thanks to Matt Blanchette for reporting!. Fixes 308.
Web Tester UI did not invoke VRead even if a version ID was specified. Thanks to Poseidon for reporting!
Per discussion on the FHIR implementer chat, the JPA server no longer includes _revinclude matches in the Bundle.total count, or the page size limit.
JPA server now persists search results to the database in a new table where they can be temporaily preserved. This makes the JPA server much more scalable, since it no longer needs to store large lists of pages in memory between search invocations.

Old searches are deleted after an hour by default, but this can be changed via a setting in the DaoConfig.
JPA servers' resource version history mechanism has been adjusted so that the history table keeps a record of all versions including the current version. This has the very helpful side effect that history no longer needs to be paged into memory as a complete set. Previously history had a hard limit of only being able to page the most recent 20000 entries. Now it has no limit.
JPA server returned the wrong Bundle.type value (COLLECTION, should be SEARCHSET) for $everything operation responses. Thanks to Sonali Somase for reporting!
REST and JPA server should reject update requests where the resource body does not contain an ID, or contains an ID which does not match the URL. Previously these were accepted (the URL ID was trusted) which is incorrect according to the FHIR specification. Thanks to GitHub user ametke for reporting!

As a part of this change, server error messages were also improved for requests where the URL does not contain an ID but needs to (e.g. for an update) or contains an ID but shouldn't (e.g. for a create). Fixes 305.
When fields of type BoundCodeDt (e.g. Patient.gender) are serialized and deserialized using Java's native object serialization, the enum binder was not serialized too. This meant that values for the field in the deserialized object could not be modified. Thanks to Thomas Andersen for reporting!
REST Server responded to HTTP OPTIONS requests with any URI as being a request for the server's Conformance statement. This is incorrect, as only a request for OPTIONS [base url] should be treated as such. Thanks to Michael Lawley for reporting!. Fixes 313.
REST annotation style client was not able to handle extended operations ($foo) where the response from the server was a raw resource instead of a Parameters resource. Thanks to Andrew Michael Martin for reporting!
JPA server applies _lastUpdated filter inline with other searches wherever possible instead of applying this filter as a second query against the results of the first query. This should improve performance when searching against large datasets.
Parsers have new method setDontEncodeElements which can be used to force the parser to not encode certain elements in a resource when serializing. For example this can be used to omit sensitive data or skip the resource metadata.
JPA server database design has been adjusted so that different tables use different sequences to generate their indexes, resulting in more sequential resource IDs being assigned by the server
Server now correctly serves up Binary resources using their native content type (instead of as a FHIR resource) if the request contains an accept header containing "application/xml" as some browsers do.
DSTU2 resources now have a getMeta() method which returns a modifiable view of the resource metadata for convenience. This matches the equivalent method in the DSTU3 structures.
Add a new method to FhirContext called setDefaultTypeForProfile which can be used to specify that when recources are received which declare support for specific profiles, a specific custom structures should be used instead of the default. For example, if you have created a custom Observation class for a specific profile, you could use this method to cause your custom type to be used by the parser for resources in a search bundle you receive.

See the documentation page on Profiles and Extensions for more information. Fixes 315.
Parsing/Encoding a custom resource type which extends a base type sometimes caused the FhirContext to treat all future parses of the same resource as using the custom type even when this was not wanted.

Custom structures may now be explicitly declared by profile using the setDefaultTypeForProfile method.

This issue was discovered and fixed as a part of the implementation of issue #315. Fixes 315.
Set up the tinder plugin to work as an ant task as well as a Maven plugin, and to use external sources. Thanks to Bill Denton for the pull request!. Fixes 321.
JPA server now allows searching by token parameter using a system only and no code, giving a search for any tokens which match the given token with any code. Previously the expected behaviour for this search was not clear in the spec and HAPI had different behaviour from the other reference servers.
Introduce a JAX-RS client provider which can be used instead of the default Apache HTTP Client provider to provide low level HTTP services to HAPI's REST client. See JAX-RS & Alternate HTTP Client Providers for more information.

This is useful in cases where you have other non-FHIR REST clients using a JAX-RS provider and want to take advantage of the rest of the framework.

Thanks to Peter Van Houte from Agfa for the amazing work!
Parser failed with a NPE while encoding resources if the resource contained a null extension. Thanks to steve1medix for reporting!. Fixes 312.
In generated model classes (DSTU1/2) don't use BoundCodeDt and BoundCodeableConceptDt for coded fields which use example bindings. Thanks to GitHub user Ricq for reporting!. Fixes 320.
Operations methods defined using @Operation will now infer the maximum number of repetitions of their parameters by the type of the parameter. Previously if a default max() value was not specified in the @OperationParam annotation on a parameter, the maximum was assumed to be 1. Now, if a max value is not explicitly specified and the type of the parameter is a basic type (e.g. StringDt) the max will be 1. If the parameter is a collection type (e.g. List<StringDt>) the max will be *
Operation methods defined using @Operation may now use search parameter types, such as TokenParam and TokenAndListParam as values. Thanks to Christian Ohr for reporting!. Fixes 317.
Add databases indexes to JPA module search index tables for the RES_ID column on each. This should help performance when searching over large datasets. Thanks to Emmanuel Duviviers for the suggestion!
DateTimeType should fail to parse 1974-12-25+10:00 as this is not a valid time in FHIR. Thanks to Grahame Grieve for reporting!
When parsing a Bundle resource, if the Bundle.entry.request.url contains a UUID but the resource body has no ID, the Resource.id will be populated with the ID from the Bundle.entry.request.url. This is helpful when round tripping Bundles containing UUIDs.
When parsing a DSTU3 bundle, references between resources did not have the actual resource instance populated into the reference if the IDs matched as they did in DSTU1/2.
Contained resource references on DSTU3 resources were not serialized correctly when using the Json Parser. Thanks to GitHub user @fw060 for reporting and supplying a patch which corrects the issue!. Fixes 326.
DSTU3 model classes equalsShallow and equalsDeep both did not work correctly if a field was null in one object, but contained an empty object in the other (e.g. a StringType with no actual value in it). These two should be considered equal, since they would produce the exact same wire format.

Thanks to GitHub user @ipropper for reporting and providing a test case!. Fixes 325.
JPA server now supports searching for _tag:not=[tag] which enables finding resources that to not have a given tag/profile/security tag. Thanks to Lars Kristian Roland for the suggestion!
Extensions containing resource references did not get encoded correctly some of the time. Thanks to Poseidon for reporting!
Parsers (both XML and JSON) encoded the first few elements of DSTU3 structures in the wrong order: Extensions were placed before any other content, which is incorrect (several elements come first: meta, text, etc.)
In server implementations, the Bundle.entry.fullUrl was not getting correctly populated on Hl7OrgDstu2 servers. Thanks to Christian Ohr for reporting!
Ensure that element IDs within resources (i.e. IDs on elements other than the resource itself) get serialized and parsed correctly. Previously, these didn't get serialized in a bunch of circumstances. Thanks to Vadim Peretokin for reporting and providing test cases!. Fixes 335.
Improve CLI error message if the tool can't bind to the requested port. Thanks to Claude Nanjo for the suggestion!
Server param of _summary=text did not include mandatory elements in return as well as the text element, even though the FHIR specification required it.
Remove invalid resource type "Documentation" from DSTU2 structures.
JPA server did not respect target types for search parameters. E.g. Appointment:patient has a path of "Appointment.participant.actor" and a target type of "Patient". The search path was being correctly handled, but the target type was being ignored.
RestfulServer now manually parses URL parameters instead of relying on the container's parsed parameters. This is useful because many Java servlet containers (e.g. Tomcat, Glassfish) default to ISO-8859-1 encoding for URLs insetad of the UTF-8 encoding specified by FHIR.
ResponseHighlightingInterceptor now doesn't highlight if the request has an Origin header, since this probably denotes an AJAX request.

Release 1.4 – 2016-02-04

Type Changes By
Bump the version of a few dependencies to the latest versions (dependent HAPI modules listed in brackets):
  • Hibernate (JPA, Web Tester): 5.0.3 -> 5.0.7
  • Springframework (JPA, Web Tester): 4.2.2 -> 4.2.4
  • Phloc-Commons (Schematron Validator): 4.3.6 -> 4.4.4
  • Apache httpclient (Client): 4.4 -> 4.5.1
  • Apache httpcore (Client): 4.4 -> 4.4.4
  • SLF4j (All): 1.7.13 -> 1.7.14
Remove a dependency on a Java 1.7 class (ReflectiveOperationException) in several spots in the codebase. This dependency was accidentally introduced in 1.3, and animal-sniffer-plugin failed to detect it (sigh).
Add two new server interceptors: RequestValidatingInterceptor and ResponseValidatingInterceptor which can be used to validate incoming requests or outgoing responses using the standard FHIR validation tools. See the Server Validation Page for examples of how to use these interceptors. These intereptors have both been enabled on the public test page.
Make IBoundCodeableConcept and IValueSetEnumBinder serializable, fixing an issue when trying to serialize model classes containing bound codes. Thanks to Nick Peterson for the Pull Request!. Fixes 259.
Introduce a JAX-RS version of the REST server, which can be used to deploy the same resource provider implementations which work on the existing REST server into a JAX-RS (e.g. Jersey) environment. Thanks to Peter Van Houte from Agfa for the amazing work!. Fixes 251.
CLI now supports writing to file:// URL for 'upload-examples' command
GZipped content is now supported for client-to-server uploads (create, update, transaction, etc.). The server will not automatically detect compressed incoming content and decompress it (this can be disabled using a RestfulServer configuration setting). A new client interceptor has been added which compresses outgoing content from the client.
JPA server transaction attempted to validate resources twice each, with one of these times being before anything had been committed to the database. This meant that if a transaction contained both a Questionnaire and a QuestionnaireResponse, it would fail because the QuestionnaireResponse validator wouldn't be able to find the questionnaire. This is now corrected.
Add a new method to the generic/fluent client for searching: .count(int)
This replaces the existing ".limitTo(int)" method which has now been deprocated because it was badly named and undocumented.
Profile validator has been configured to allow extensions even if they aren't explicitly declared in the profile.
Add a constraint that the Maven build will only run in JDK 8+. HAPI remains committed to supporting JDK 6+ in the compiled library, but these days it can only be built using JDK 8. Thanks to joelsch for the PR!. Fixes 265.
When serializing a value[x] field, if the value type was a profiled type (e.g. markdown is a profile of string) HAPI 1.3 would use the base type in the element name, e.g. valueString instead of valueMarkdown. After discussion with Grahame, this appears to be incorrect behaviour so it has been fixed.
Support target parameter type in _include / _revinclude values, e.g. _include=Patient:careProvider:Organization. Thanks to Joe Portner for reporting!. Fixes 240.
Use ResponseHighlighterInterceptor in the hapi-fhir-jpaserver-example project to provide nice syntax highlighting. Thanks to Rob Hausam for noting that this wasn't there.
Introduce custom @CoverageIgnore annotation to hapi-fhir-base in order to remove dependency on cobertura during build and in runtime.
Server-generated conformance statements incorrectly used /Profile/ instead of /StructureDefinition/ in URL links to structures.
JsonParser has been changed so that when serializing numbers it will use plain format (0.001) instead of scientific format (1e-3). The latter is valid JSON, and the parser will still correctly parse either format (all clients should be prepared to) but this change makes serialized resources appear more consistent between XML and JSON. As a result of this change, trailing zeros will now be preserved when serializing as well.
Add DSTU3 example to hapi-fhir-jpaserver-example. Thanks to Karl Davis for the Pull Request!. Fixes 278.
RestfulServer#setUseBrowserFriendlyContentTypes has been deprecated and its functionality removed. The intention of this feature was that if it detected a request coming in from a browser, it would serve up JSON/XML using content types that caused the browsers to pretty print. But each browser has different rules for when to pretty print, and after we wrote that feature both Chrome and FF changed their rules to break it anyhow. ResponseHighlightingInterceptor provides a better implementation of this functionality and should be used instead.
Narrative generator framework has removed the ability to generate resource titles. This functionality was only useful for DSTU1 implementations and wasn't compatible with coming changes to that API.
Remove dependency on Servlet-API 3.0+ by using methods available in 2.5 where possible. Note that we continue to use Servlet-API 3.0+ features in some parts of the JPA API, so running in an old serlvet container should be tested well before use. Thanks to Bill Denton for reporting!. Fixes 283.
Add new methods to RestfulClientFactory allowing you to configure the size of the client pool used by Apache HttpClient. Thanks to Matt Blanchette for the pull request!. Fixes 288.
Add support for new modifier types on Token search params in Server and annotation client.
Server conformance statement should include search parameter chains if the chains are explicitly defined via @Search(whitelist={....}). Thanks to lcamilo15 for reporting!. Fixes 286.
Remove afterPropertiesSet() call in Java config for JPA server's EntityManagerFactory. This doesn't need to be called manually, the the manual call led to a warning about the EntityManager being created twice.
Allow server to correctly figure out it's own address even if the container provides a Servlet Context Path which does not include the root. Thanks to Petro Mykhaylyshyn for the pull request!. Fixes 289.

Release 1.3 – 2015-11-14

Type Changes By
Bump the version of a few dependencies to the latest versions (dependent HAPI modules listed in brackets):
  • Commons-lang3 (Core): 3.3.2 -> 3.4
  • Logback (Core): 1.1.2 -> 1.1.3
  • SLF4j (Core): 1.7.102 -> 1.7.12
  • Springframework (JPA, Web Tester): 4.1.5 -> 4.2.2
  • Hibernate (JPA, Web Tester): 4.2.17 -> 5."
  • Hibernate Validator (JPA, Web Tester): 5.2.1 -> 5.2.2
  • Derby (JPA, CLI, Public Server): 10.11.1.1 -> 10.12.1.1
  • Jetty (JPA, CLI, Public Server): 9.2.6.v20141205 -> 9.3.4.v20151007
JPA and Tester Overlay now use Spring Java config files instead of the older XML config files. All example projects have been updated.
JPA server removes duplicate resource index entries before storing them (e.g. if a patient has the same name twice, only one index entry is created for that name)
JPA server did not correctly index search parameters of type "reference" where the path had multiple entries (i.e. "Resource.path1 | Resource.path2")
JPA server _history operations (server, type, instance) not correctly set the Bundle.entry.request.method to POST or PUT for create and updates of the resource.
Support AND/OR on _id search parameter in JPA. Fixes 225.
Constructor for DateRanfeParam which dates in two DateParam instances was ignoring comparators on the DateParam.
In JSON parsing, finding an object where an array was expected led to an unhelpful error message. Thanks to Avinash Shanbhag for reporting!
JPA server gave an unhelpful error message if $meta-add or $meta-delete were called with no meta elements in the input Parameters
Narrative generator did not include OperationOutcome.issue.diagnostics in the generated narrative.
Clients (generic and annotation) did not populate the Accept header on outgoing requests. This is now populated to indicate that the client supports both XML and JSON unless the user has explicitly requested one or the other (in which case the appropriate type only will be send in the accept header). Thanks to Avinash Shanbhag for reporting!. Fixes 250.
QuestionnaireResponse validator now allows responses to questions of type OPENCHOICE to be of type 'string'
JPA server should reject resources with a reference that points to an incorrectly typed resource (e.g. points to Patient/123 but resource 123 is actually an Observation) or points to a resource that is not valid in the location it is found in (e.g. points to Patient/123 but the field supposed to reference an Organization). Thanks to Bill de Beaubien for reporting!. Fixes 227.
In server, if a client request is received and it has an Accept header indicating that it supports both XML and JSON with equal weight, the server's default is used instead of the first entry in the list.
JPA server now supports searching with sort by token, quantity, number, Uri, and _lastUpdated (previously only string, date, and _id were supported)
Fix issue in JPA where a search with a _lastUpdated filter which matches no results would crash if the search also had a _sort
Fix several cases where invalid requests would cause an HTTP 500 instead of a more appropriate 400/404 in the JPA server (vread on invalid version, delete with no ID, etc.)
Fix narrative generation for DSTU2 Medication resource
Profile validator now works for valuesets which use v2 tables
JPA server Patient/[id]/$everything operation now supports _lastUpdated filtering and _sort'ing of results.
Fix parser issue where profiled choice element datatypes (e.g. value[x] where one allowable type is Duration, which is a profile of Quantity) get incorrectly encoded using the profiled datatype name instead of the base datatype name as required by the FHIR spec. Thanks to Nehashri Puttu Lokesh for reporting!. Fixes 233.
Some generated Enum types in DSTU2 HAPI structures did not have latest valueset definitions applied. Thanks to Bill de Beaubien for reporting!
JPA server can now successfully search for tokens pointing at code values (values with no explicit system but an implied one, such as Patient.gender) even if the system is supplied in the query.
Correct issues with Android library. Thanks to Thomas Andersen for the submission!. Fixes 235.
JPA server incorrectly rejected match URLs if they did not contain a question mark. Thanks to Bill de Beaubien for reporting!
Remove invalid entries in OSGi Manifest. Thanks to Alexander Kley for the fix!. Fixes 234.
JPA server now supports $everything on Patient and Encounter types (patient and encounter instance was already supported)
Generic client operation invocations now have an additional inline method for generating the input Parameters using chained method calls instead of by passing a Parameters resource in
Parsing an XML resource where the XHTML namespace was declared before the beginning of the narrative section caused an invalid re-encoding when encoding to JSON.
Conditional deletes in JPA did not correctly process if the condition had a chain or a qualifier, e.g. "Patient?organization.name" or "Patient.identifier:missing"
Generic/fluent client search can now be performed using a complete URL supplied by user code. Thanks to Simone Heckmann pointing out that this was needed!
Refactor JPA $everything operations so that they perform better
Server operation methods can now declare the ID optional, via @IdParam(optional=true) meaning that the same operation can also be invoked at the type level.
Make JPA search queries with _lastUpdated parameter a bit more efficient
Clean up Android project to make it more lightweight and remove a number of unneeded dependencies. Thanks to Thomas Andersen for the pull request!. Fixes 239.
Fix a crash when encoding a Binary resource in JSON encoding if the resource has no content-type
JPA server now supports read/history/search in transaction entries by calling the actual implementing method in the server (previously the call was simulated, which meant that many features did not work)
ResourceReferenceDt#loadResource(IRestfulClient) did not use the client's read functionality, so it did not handle JSON responses or use interceptors. Thanks to JT for reporting!
JPA server maximumn length for a URI search parameter has been reduced from 256 to 255 in order to accomodate MySQL's indexing requirements
Server failed to respond correctly to compartment search operations if the same provider also contained a read operation. Thanks to GitHub user @am202 for reporting!. Fixes 242.
Fix issue in testpage-overlay's new Java configuration where only the first configured server actually gets used. Fixes 245.
Introduce IJpaServerInterceptor interceptors for JPA server which can be used for more fine grained operations.
Parser (XML and JSON) shouldn't encode an ID tag in resources which are part of a bundle when the resource has a UUID/OID ID. Fixes 241.
Add ability for a server REST resource provider @Search method to declare that it should allow even parameters it doesn't understand.
Correctly set the Bundle.type value on all pages of a search result in the server, and correcltly set the same value in JPA server $everything results. Fixes 247.
JPA $everything operations now support new parameters _content and _text, which work the same way as the same parameters on a search. This is experimental, since it is not a part of the core FHIR specification.
Process "Accept: text/xml" and "Accept: text/json" headers was wanting the equivalent FHIR encoding styles. These are not correct, but the intention is clear so we will honour them just to be helpful. Fixes 250.
Generated Enum types for some ValueSets did not include all codes (specifically, ValueSets which defined concepts containing child concepts did not result in Enum values for the child concepts)
In the JPA server, order of transaction processing should be DELETE, POST, PUT, GET, and the order should not matter within entries with the same verb. Thanks to Bill de Beaubien for reporting!. Fixes 253.
Add the ability to wire JPA conformance providers using Spring (basically, add default constructors and setters to the conformance providers). Thanks to C. Mike Bylund for the pull request!. Fixes 254.

Release 1.2 – 2015-09-18

Type Changes By
JPA server now validates QuestionnaireAnswers for conformance to their respective Questionnaire if one is declared.
SyntaxHighlightingInterceptor now also highlights OperationOutcome responses for errors/exceptions.
Model classes do not use BoundCodeableConcept for example bindings that do not actually point to any codes (e.g. Observation.interpretation). Thanks to GitHub user @steve1medix for reporting!. Fixes 126.
Server now exports operations as separate resources instead of as contained resources within Conformance
Add new operation $get-resource-counts which will replace the resource count extensions exported in the Conformance statement by the JPA server.
JPA server sorting often returned unexpected orders when multiple indexes of the same type were found on the same resource (e.g. multiple string indexed fields). Thanks to Travis Cummings for reporting!. Fixes 198.
Add another method to IServerInterceptor which converts an exception generated on the server into a BaseServerResponseException. This is useful so that servers using ResponseHighlighterInterceptor will highlight exceptions even if they aren't created with an OperationOutcome.
XmlParser and JsonParser in DSTU2 mode should not encode empty tags in resource. Thanks to Bill De Beaubien for reporting!. Fixes 158.
OperationDefinitions generated by server did not properly document their return parameters or the type of their input parameters.
Operations in server generated conformance statement should only appear once per name, since the name needs to be unique.
Resources and datatypes are now serializable. This is an experimental feature which hasn't yet been extensively tested. Please test and give us your feedback!
Switch REST server to using HttpServletRequest#getContextPath() to get the servlet's context path. This means that the server should behave more predictably, and should work in servlet 2.4 environments. Thanks to Ken Zeisset for the suggestion!
Vagrant environment now has an apt recipt to ensure that package lists are up to date. Thanks to GitHub user Brian S. Corbin (@corbinbs) for thr contribution!. Fixes 200.
JPA server and generic client now both support the _tag search parameter
Add support for BATCH mode to JPA server transaction operation
Server was not correctly unescaping URL parameter values with a trailing comma or an escaped backslash. Thanks to GitHub user @SherryH for all of her help in diagnosing this issue!. Fixes 192.
Avoid crash when parsing if an invalid child element is found in a resource reference.
Create new android specialty libraries for DSTU1 and DSTU2
Throwing a server exception (e.g. AuthenticationException) in a server interceptor's incomingRequestPreProcessed method resulted in the server returning an HTTP 500 instead of the appropriate error code for the exception being thrown. Thanks to Nagesh Bashyam for reporting!
Fix issue in JSON parser where invalid contained resources (missing a resourceType element) fail to parse with a confusing NullPointerException. Thanks to GitHub user @hugosoares for reporting!. Fixes 207.
JPA server now implements the $validate-code operation
HAPI-FHIR now has support for _summary and _elements parameters, in server, client, and JPA server. Fixes 125.
_revinclude results from JPA server should have a Bundle.entry.search.mode of "include" and not "match". Thanks to Josh Mandel for reporting!. Fixes 209.
Resource references using resource instance objects instead of resource IDs will correctly qualify the IDs with the resource type if they aren't already qualified
Testpage Overlay project now properly allows a custom client factory to be used (e.g. for custom authentication, etc.) Thanks to Chin Huang (@pukkaone) for the pull request!. Fixes 211.
JPA server should reject IDs containing invalid characters (e.g. "abc:123") but should allow client assigned IDs that contain text but do not start with text. Thanks to Josh Mandel for reporting!. Fixes 212.
:text modifier on server and JPA server did not work correctly. Thanks to Josh Mandel for reporting!
Fix issue in client where parameter values containing a comma were sometimes double escaped.
_include parameters now support the new _include:recurse=FOO syntax that has been introduced in DSTU2 in the Client, Server, and JPA Server modules. Non-recursive behaviour is now the default (previously it was recursive) and :recurse needs to be explicitly stated in order to support recursion.
New operations added to JPA server to force re-indexing of all resources (really only useful after indexes change or bugs are fixed)
JPA server did not correctly index search parameters of type "URI". Thanks to David Hay for reporting! Note that if you are using the JPA server, this change means that there are two new tables added to the database schema. Updating existing resources in the database may fail unless you set default values for the resource table by issuing a SQL command similar to the following (false may be 0 or something else, depending on the database platform in use)
update hfj_resource set sp_coords_present = false;
update hfj_resource set sp_uri_present = false;
FIx issue in JPA server where profile declarations, tags, and security labels were not always properly removed by an update that was trying to remove them. Also don't store duplicates.
Instance $meta operations on JPA server did not previously return the resource version and lastUpdated time
Server responses populate Bundle.entry.fullUrl if possible. Thanks to Bill de Beaubien for reporting!
XML parser failed to initialize in environments where a very old Woodstox library is in use (earlier than 4.0). Thanks to Bill de Beaubien for reporting!
Invalid/unexpected attributes found when parsing composite elements should be logged or reported to the parser error handler. Fixes 216.
JPA server can now store Conformance resources, per a request from David Hay
ResponseHighlightingInterceptor now skips handling responses if it finds a URL parameter of _raw=true (in other words, if this parameter is found, the response won't be returned as HTML even if the request is detected as coming from a browser.
RestfulServer now supports dynamically adding and removing resource providers at runtime. Thanks to Bill Denton for adding this.
JPA server now correctly suppresses contents of deleted resources in history
JPA server returned deleted resources in search results when using the _tag, _id, _profile, or _security search parameters. Fixes 222.
Fix issue with build on Windows. Thanks to Bryce van Dyk for the pull request!. Fixes 223.
JPA server now supports $validate operation completely, including delete mode and profile validation using the RI InstanceValidator

Release 1.1 – 2015-07-13

Type Changes By
Add support for reference implementation structures.
Parsers did not encode the resource meta element if the resource had tags but no other meta elements. Thanks to Bill de Beaubien and Claude Nanjo for finding this.
Correct performance issue with :missing=true search requests where the parameter is a resource link. Thanks to wanghaisheng for all his help in testing this. Fixes 164.
The self link in the Bundle returned by searches on the server does not respect the server's address strategy (which resulted in an internal IP being shown on fhirtest.uhn.ca). Fixes 149.
Introduce ResponseHighlighterInterceptor, which provides syntax highlighting on RESTful server responses if the server detects that the request is coming from a browser. This interceptor has been added to fhirtest.uhn.ca responses.
Performing a create operation in a client used an incorrect URL if the resource had an ID set. ID should be ignored for creates. Thanks to Peter Girard for reporting!
Add better addXXX() methods to structures, which take the datatype being added as a parameter. Thanks to Claude Nanjo for the suggestion!. Fixes 170.
Add a new parser validation mechanism (see the validation page for info) which can be used to validate resources as they are being parsed, and optionally fail if invalid/unexpected elements are found in resource bodies during parsing. Fixes 152.
IParser#parseResource(Class, String) method, which is used to parse a resource into the given structure will now throw a DataFormatException if the structure is for the wrong type of resource for the one actually found in the input String (or Reader). For example, if a Patient resource is being parsed into Organization.class this will now cause an error. Previously, the XML parser would ignore the type and the JSON parser would fail. This also caused operations to not parse correctly if they returned a resource type other than parameters with JSON encoding (e.g. the $everything operation on UHN's test server). Thanks to Avinash Shanbhag for reporting!
Web tester UI now supports _revinclude
Support link elements in Bundle.entry when parsing in DSTU2 mode using the old (non-resource) Bundle class. Thanks to GitHub user @joedai for reporting!. Fixes 178.
LoggingInterceptor for server now supports logging DSTU2 extended operations by name
Woodstox XML parser has a default setting to limit the maximum length of an attribute to 512kb. This caused issues handling large attachments, so this setting has been increased to 100Mb. Thanks to Nikos Kyriakoulakos for reporting!
Some HTML entities were not correctly converted during parsing. Thanks to Nick Kitto for reporting!. Fixes 175.
In the JPA Server: Transactions creating resources with temporary/placeholder resource IDs and other resources with references to those placeholder IDs previously did not work if the reference did not contain the resource type (e.g. Patient/urn:oid:0.1.2.3 instead of urn:oid:0.1.2.3). The latter is actually the correct way of specifying a reference to a placeholder, but the former was the only way that worked. Both forms now work, in order to be lenient. Thanks to Bill De Beaubien for reporting!
When parsing Bundles, if Bundle.entry.base is set to "cid:" (for DSTU1) or "urn:uuid:" / "urn:oid:" (for DSTU2) this is now correctly passed as the base in resource.getId(). Conversely, when encoding bundles, if a resource ID has a base defined, and Bundle.entry.base is empty, it will now be automatically set by the parser.
Add fluent client method for validate operation, and support the new DSTU2 style extended operation for $validate if the client is in DSTU2 mode. Thanks to Eric from the FHIR Skype Implementers chat for reporting. Fixes 179.
Server now supports complete Accept header content negotiation, including q values specifying order of preference. Previously the q value was ignored.
Server in DSTU2 mode now indicates that whether it has support for Transaction operation or not. Thanks to Kevin Paschke for pointing out that this wasn't working!
Questionnaire.title now gets correctly indexed in JPA server (it has no path, so it is a special case). Fixes 166.
JPA server now supports ifNoneMatch in GET within a transaction request.
DateRangeParam now supports null values in the constructor for lower or upper bounds (but still not both)
Generic/fluent client and JPA server now both support _lastUpdated search parameter which was added in DSTU2
JPA server now supports sorting on reference parameters. Thanks to Vishal Kachroo for reporting that this wasn't working!. Fixes 188.
Prevent Last-Updated header in responses coming back to the client from overwriting the 'lastUpdated' value in the meta element in DSTU2 resources. This is important because 'lastUpdated' can have more precision than the equivalent header, but the client previously gave the header priority.
JPA server supports _count parameter in transaction containing search URL (nested search)
DSTU2 servers now indicate support for conditional create/update/delete in their conformance statement.
Support for the Prefer header has been added to the server, client, and JPA modules.
JPA server failed to search for deep chained parameters across multiple references, e.g. "Location.partof.partof.organization". Thanks to Ismael Sarmento Jr for reporting!. Fixes 196.
Prevent crash when encoding resources with contained resources if the contained resources contained a circular reference to each other
Add $meta, $meta-add, and $meta-delete operations to generic client

Release 1.0 – 2015-04-08

Type Changes By
Bump the version of a few dependencies to the latest versions:
  • Phloc-commons (for schematron validation) 4.3.5 -> 4.3.6
  • Apache HttpClient 4.3.6 -> 4.4
  • Woodstox 4.4.0 -> 4.4.1
  • SLF4j 1.7.9 -> 1.7.10
  • Spring (used in hapi-fhir-jpaserver-base module) 4.1.3.RELEASE -> 4.1.5.RELEASE
Add support for "profile" and "tag" elements in the resource Meta block when parsing DSTU2 structures.
When a user manually creates the list of contained resources in a resource, the encoder fails to encode any resources that don't have a '#' at the start of their ID. This is unintuitive, so we now assume that '123' means '#123'. Thanks to myungchoi for reporting and providing a test case!. Fixes 113.
Add methods for setting the default encoding (XML/JSON) and oretty print behaviour in the Fluent Client. Thanks to Stackoverflow user ewall for the idea.
JPA Server did not mark a resource as "no longer deleted" if it was updated after being deleted. Thanks to Elliott Lavy and Lloyd McKenzie for reporting!. Fixes 129.
Fix regression in 0.9 - Server responds with an HTTP 500 and a NullPointerException instead of an HTTP 400 and a useful error message if the client requests an unknown resource type. Fixes 128.
Add support for _revinclude parameter in client, server, and JPA.
Include constants on resources (such as Observation.INCLUDE_VALUE_STRING) have been switched in the DSTU2 structures to use the new syntax required in DSTU2: [resource name]:[search param NAME] insead of the DSTU1 style [resource name].[search param PATH]
When encoding resources, the parser will now convert any resource references to versionless references automatically (i.e. it will omit the version part automatically if one is present in the reference) since references between resources must be versionless. Additionally, references in server responses will omit the server base URL part of the reference if the base matches the base for the server giving the response. Fixes 124.
Narrative generator incorrectly sets the Resource.text.status to 'generated' even if the given resource type does not have a template (and therefore no narrative is actually generated). Thanks to Bill de Beaubien for reporting!. Fixes 130.
Searching in JPA server with no search parameter returns deleted resources when it should exclude them.
Remove Eclipse and IntelliJ artifacts (.project, *.iml, etc) from version control. Thanks to Doug Martin for the suggestion!. Fixes 135.
REST server methods may now have a parameter of type NarrativeModeEnum which will be populated with the value of the _narrative URL parameter if one was supplied. Annotation client methods may also include a parameter of this type, and it will be used to populate this parameter on the request URL if it is not null. Thanks to Neal Acharya for the idea!
Android JAR now includes servlet-API classes, as the project will not work without them. Thanks
Requested _include values are preserved across paging links when the server returns multiple pages. Thanks to Bill de Beaubien for reporting!. Fixes 116.
Add new server address strategy "ApacheProxyAddressStrategy" which uses headers "x-forwarded-host" and "x-forwarded-proto" to determine the server's address. This is useful if you are deploying a HAPI FHIR server behind an Apache proxy (e.g. for load balancing or other reasons). Thanks to Bill de Beaubien for contributing!. Fixes 138. wdebeau1
Resource references between separate resources found in a single bundle did not get populated with the actual resource when parsing a DSTU2 style bundle. Thanks to Nick Peterson for reporting and figuring out why none of our unit tests were actually catching the problem!. Fixes 143.
JSON encoder did not encode contained resources when encoding a DSTU2 style bundle. Thanks to Mohammad Jafari and baopingle for all of their help in tracking this issue down and developing useful unit tests to demonstrate it. Fixes 146.
Client now supports invoking transcation using a DSTU2-style Bundle resource as the input.
JPA Server $everything operation could sometimes include a duplicate copy of the main focus resource if it was referred to in a deep chain. Thanks to David Hay for reporting!. Fixes 147.
JPA Server $everything operation now allows a _count parameter. Fixes 148.
JPA server failed to index resources containing ContactPointDt elements with populated values (e.g. Patient.telecom). Thanks to Mohammad Jafari for reporting!. Fixes 139.
Add a new configuration method on the parsers, setStripVersionsFromReferences(boolean) which configures the parser to preserve versions in resource reference links when encoding. By default, these are removed.
Terser's IModelVisitor now supplies to the path to the element. This is an API change, but I don't think there are many users of the IModelVisitor yet. Please let us know if this is a big hardship and we can find an alternate way of making this change. Fixes 155. wdebeau1
Prevent server from returning a Content-Location header for search response when using the DSTU2 bundle format
JPA server (uhnfhirtest.uhn.ca) sometimes included an empty "text" element in Bundles being returned.
Add a framework for the Web Tester UI to allow its internal FHIR client to be configured (e.g. to add an authorization interceptor so that it adds credentials to client requests it makes). Thanks to Harsha Kumara for the suggestion!. Fixes 162.
Fix regression in early 1.0 builds where resource type sometimes does not get populated in a resource ID when the resource is parsed. Thanks to Nick Peterson for reporting, and for providing a test case!. Fixes 163.
Allow fluent/generic client users to execute a transaction using a raw string (containing a bundle resource) as input instead of a Bundle resource class instance.
Disable date validation in the web tester UI, so that it is possible to enter partial dates, or dates without times, or even test out invalid date options.
Make BaseElement#getUndeclaredExtensions() and BaseElement#getUndeclaredExtensions() return a mutable list so that it is possible to delete extensions from a resource instance. Fixes 36.
Server conformance statement check in clients (this is the check where the first time a given FhirContext is used to access a given server base URL, it will first check the server's Conformance statement to ensure that it supports the correct version of FHIR) now uses any registered client interceptors. In addition, IGenericClient now has a method "forceConformanceCheck()" which manually triggers this check. Thanks to Doug Martin for reporting and suggesting!. Fixes 168.
Rename the Spring Bean definition for the JPA server EntityManager from "myEntityManagerFactory" to just "entityManagerFactory" as this is the default bean name expected in other parts of the Spring framework. Thanks to Mohammad Jafari for the suggestion!. Fixes 167.
Improve error message when a user tries to perform a create/update with an invalid or missing Content-Type header. Thanks to wanghaisheng for reporting! (This was actually a three part bug, so the following two fixes also reference this bug number). Fixes 164.
Add support for :missing qualifier in generic/fluent client. Fixes 164.
Add support for :missing qualifier in JPA server. Fixes 164.
Add a new configuration method on the parsers, setStripVersionsFromReferences(boolean) which configures the parser to preserve versions in resource reference links when encoding. By default, these are removed.
Add an exception for RESTful clients/servers to represent the HTTP 403 Forbidden status code. Thanks to Joel Costigliola for the patch!. Fixes 171. Thanks to joel-costigliola.
Transaction server operations incorrectly used the "Accept" header instead of the "Content-Type" header to determine the POST request encoding. Thanks to Rene Spronk for providing a test case!

Release 0.9 – 2015-03-14

Type Changes By
Support for DSTU2 features introduced: New resource definitions, Bundle resource, encoding changes (ID in resource bodt, meta tag)
Fix an issue encoding extensions on primitive types in JSON. Previously the "_value" object would be an array even if the field it was extending was not repeatable. This is not correct according to the specification, nor can HAPI's parser parse this correctly. The encoder has been corrected, and the parser has been adjusted to be able to handle resources with extensions encoded in this way. Thanks to Mohammad Jafari for reporting!. Fixes 65.
Library now checks if custom resource types can be instantiated on startup (e.g. because they don't have a no-argument constructor) in order to avoid failing later
Bump a few dependency JARs to the latest versions in Maven POM:
  • SLF4j (in base module) - Bumped to 1.7.9
  • Apache HTTPClient (in base module) - Bumped to 4.3.6
  • Hibernate (in JPA module) - Bumped to 4.3.7
IdDt failed to recognize local identifiers containing fragments that look like real identifiers as being local identifiers even though they started with '#'. For example, a local resource reference of "#aa/_history/aa" would be incorrectly parsed as a non-local reference. Thanks to Mohammad Jafari for reporting!. Fixes 67.
Last-Modified header in server was incorrectly using FHIR date format instead of RFC-1123 format.
Server create and update methods failed with an IllegalArgumentException if the method type was a custom resource definition type (instead of a built-in HAPI type). Thanks to Neal Acharya for the analysis.
JPA server module now supports _include value of *. Thanks to Bill de Beaubien for reporting!. Fixes 79.
IdDt method withServerBase returned String (unlike all of the other "withFoo" methods on that class), and did not work correctly if the IdDt already had a server base. This has been corrected. Note that the return type for this method has been changed, so code may need to be updated.
In previous versions of HAPI, the XML parser encoded multiple contained resources in a single <contained></contained> tag, even though the FHIR specification rerquires a separate <contained></contained> tag for each resource. This has been corrected. Note that the parser will correctly parse either form (this has always been the case) so this change should not cause any breakage in HAPI based trading partners, but may cause issues if other applications have been coded to depend on the incorrect behaviour. Thanks to Mochaholic for reporting!. Fixes 84. Thanks to mochaholic.
Custom/user defined resource definitions which contained more than one child with no order defined failed to initialize properly. Thanks to Andy Huang for reporting and figuring out where the problem was!. Fixes 91. Thanks to andyhuang91.
RESTful Client now queries the server (only once per server base URL) to ensure that the given server corresponds to the correct version of the FHIR specification, as defined by the FhirContext. This behaviour can be disabled by setting the appropriate configuration on the RestfulClientConfig. Thanks to Grahame Grieve for the suggestion!
JPA module now supports deleting resource via transaction
DateClientParam#second() incorrectly used DAY precision instead of SECOND precision. Thanks to Tom Wilson for the pull request!. Fixes 97. Thanks to twilson650.
Fix issue where HAPI failed to initialize correctly if Woodstox library was not on the classpath, even if StAX API was configured to use a different provider. Thanks to James Butler for reporting and figuring out where the issue was!. Fixes 100. Thanks to sweetnavelorange.
Calling BaseDateTimeDt#setValue(Date, TemporalPrecisionEnum) did not always actually respect the given precision when the value was encoded. Thanks to jacksonjesse for reporting!. Fixes 101.
Encoders (both XML and JSON) will no longer encode contained resources if they are not referenced anywhere in the resource via a local reference. This is just a convenience for users who have parsed a resource with contained resources and want to remove some before re-encoding. Thanks to Alexander Kley for reporting!. Fixes 103.
Add support for DSTU2 style security labels in the parser and encoder. Thanks to Mohammad Jafari for the contribution!. Fixes 110. Thanks to mochaholic.
Server requests for Binary resources where the client has explicitly requested XML or JSON responses (either with a _format URL parameter, or an Accept request header) will be responded to using the Binary FHIR resource type instead of as Binary blobs. This is in accordance with the recommended behaviour in the FHIR specification.
Add new properties to RestfulServer: "DefaultResponseEncoding", which allows users to configure a default encoding (XML/JSON) to use if none is specified in the client request. Currently defaults to XML. Also "DefaultPrettyPrint", which specifies whether to pretty print responses by default. Both properties can be overridden on individual requets using the appropriate Accept header or request URL parameters.
Add support for quantity search params in FHIR tester UI
Add support for FHIR "extended operations" as defined in the FHIR DSTU2 specification, for the Generic Client, Annotation Client, and Server.
Observation.applies[x] and other similar search fields with multiple allowable value types were not being correctly indexed in the JPA server.
DateClientParam.before() incorrectly placed "<=" instead of "<" in the request URL. Thanks to Ryan for reporting!. Fixes 122.
Server now only automatically adds _include resources which are provided as references if the client request actually requested that specific include. See RestfulServer. Fixes 77. wdebeau1
User defined resource types which contain extensions that use a bound code type (e.g. an BoundCodeDt with a custom Enum) failed to parse correctly. Thanks to baopingle for reporting and providing a test case!. Fixes 120.
Sorting is now supported in the Web Testing UI (previously a button existed for sorting, but it didn't do anything)
Server will no longer include stack traces in the OperationOutcome returned to the client when an exception is thrown. A new interceptor called ExceptionHandlingInterceptor has been created which adds this functionality back if it is needed (e.g. for DEV setups). See the server interceptor documentation for more information. Thanks to Andy Huang for the suggestion!. Fixes 111.

Release 0.8 – 2014-12-17

Type Changes By
API CHANGE: The "FHIR structures" for DSTU1 (the classes which model the resources and composite datatypes) have been moved out of the core JAR into their own JAR, in order to allow support for DEV resources, and DSTU2 resources when thast version is finalized. See the DSTU2 page for more information.
Deprocated API Removal: The following classes (which were deprocated previously) have now been removed:
  • ISecurityManager: If you are using this class, the same functionality is available through the more general purpose server interceptor capabilities.
  • CodingListParam: This class was made redundant by the TokenOrListParam class, which can be used in its place.
API Change: The IResource#getResourceMetadata() method has been changed from returning Map<ResourceMetadataKeyEnum<?>, Object> to returning a new type called ResourceMetadataMap. This new type implements Map<ResourceMetadataKeyEnum<?>, Object> itself, so this change should not break existing code, but may require a clean build in order to run correctly.
Profile generation on the server was not working due to IdDt being incorrectly used. Thanks to Bill de Beaubien for the pull request!. Fixes 38. wdebeau1
Profiles did not generate correctly if a resource definition class had a defined extension which was of a composite type. Thanks to Bill de Beaubien for the pull request!. Fixes 42. wdebeau1
Remove unnecessary IOException from narrative generator API. Thanks to Petro Mykhailysyn for the pull request!. Fixes 44. petromykhailysyn
Introduced a new @ProvidesResources annotation which can be added to resource provider and servers to allow them to declare additional resource classes they are able to serve. This is useful if you have a server which can serve up multiple classes for the same resource type (e.g. a server that sometimes returns a default Patient, but sometimes uses a custom subclass). Thanks to Bill de Beaubien for the pull request!. Fixes 48. wdebeau1
Introduced a new @Destroy annotation which can be added to a resource provider method. This method will be called by the server when it is being closed/destroyed (e.g. when the application is being undeployed, the container is being shut down, etc.) Thanks to Bill de Beaubien for the pull request!. Fixes 49. wdebeau1
Add a new method handleException to the server interceptor framework which allows interceptors to be notified of any exceptions and runtime errors within server methods. Interceptors may optionally also override the default error handling behaviour of the RestfulServer.
Add constants to BaseResource for the "_id" search parameter which all resources should support. wdebeau1
DateRangeParam parameters on the server now return correct getLowerBoundAsInstant() and getUpperBoundAsInstant() values if a single unqualified value is passed in. For example, if a query containing &birthdate=2012-10-01 is received, previously these two methods would both return the same value, but with this fix getUpperBoundAsInstant() now returns the instant at 23:59:59.9999.
Resource fields with a type of "*" (or Any) sometimes failed to parse if a value type of "code" was used. Thanks to Bill de Beaubien for reporting!
Remove dependency on JAXB libraries, which were used to parse and encode dates and times (even in the JSON parser). JAXB is built in to most JDKs but the version bundled with IBM's JDK is flaky and resulted in a number of problems when deploying to Websphere. lmds
Primitive datatypes now preserve their original string value when parsing resources, as well as containing the "parsed value". For instance, a DecimalDt field value of 1.0000 will be parsed into the corresponding decimal value, but will also retain the original value with the corresponding level of precision. This allows vadliator rules to be applied to original values as received "over the wire", such as well formatted but invalid dates, e.g. "2001-15-01". Thanks to Joe Athman for reporting and helping to come up with a fix!. Fixes 50. jjathman
When using Generic Client, if performing a create or update operation using a String as the resource body, the client will auto-detect the FHIR encoding style and send an appropriate Content-Type header.
JPA module (and public HAPI-FHIR test server) were unable to process resource types where at least one search parameter has no path specified. These now correctly save (although the server does not yet process these params, and it should). Thanks to GitHub user shvoidlee for reporting and help with analysis!. Fixes 52.
Generic/Fluent Client "create" and "update" method requests were not setting a content type header
DateDt left precision value as null in the constructor DateDt(Date). Fixes 53. petromykhailysyn
RESTful server now doesn't overwrite resource IDs if they are absolute. In other words, if a server's Resource Provider returns a resource with ID "Patient/123" it will be translated to "[base url]/Patient/123" but if the RP returns ID "http://foo/Patient/123" the ID will be returned exactly as is. Thanks to Bill de Beaubien for the suggestion!
JPA module Transaction operation was not correctly replacing logical IDs beginning with "cid:" with server assigned IDs, as required by the specification. Fixes 55.
FhirTerser did not visit or find children in contained resources when searching a resource. This caused server implementations to not always return contained resources when they are included with a resource being returned. tahurac
Add a method String IResource#getResourceName() which returns the name of the resource in question (e.g. "Patient", or "Observation"). This is intended as a convenience to users. lmds
Do not strip version from resource references in resources returned from server search methods. Thanks to Bill de Beaubien for reporting!
Correct an issue with the validator where changes to the underlying OperationOutcome produced by a validation cycle cause the validation results to be incorrect. Fixes 54. jjathman
Client interceptors registered to an interface based client instance were applied to other client instances for the same client interface as well. (Issue did not affect generic/fluent clients)
DateDt, DateTimeDt and types InstantDt types now do not throw an exception if they are used to parse a value with the wrong level of precision for the given type but do throw an exception if the wrong level of precision is passed into their constructors.

This means that HAPI FHIR can now successfully parse resources from external sources that have the wrong level of precision, but will generate a validation error if the resource is validated. Thanks to Alexander Kley for the suggestion!. Fixes 57.
Encoding a Binary resource without a content type set should not result in a NullPointerException. Thanks to Alexander Kley for reporting!
Server gives a more helpful error message if multiple IResourceProvider implementations are provided for the same resource type. Thanks to wanghaisheng for the idea!
Bring DSTU1 resource definitions up to version 0.0.82-2929
Bring DEV resource definitions up to 0.4.0-3775
Thanks to crinacimpian for reporting!. Fixes 61.
JPA server did not correctly process _include requests if included resources were present with a non-numeric identifier. Thanks to Bill de Beaubien for reporting!. Fixes 62.
Client requests which include a resource/bundle body (e.g. create, update, transaction) were not including a charset in the content type header, leading to servers incorrectly assuming ISO-8859/1. Thanks to shvoidlee for reporting!. Fixes 60.
Clean up the way that Profile resources are automatically exported by the server for custom resource profile classes. See the @ResourceDef JavaDoc for information on how this works. Fixes 59. wdebeau1
Add convenience methods to TokenOrListParam to test whether any of a set of tokens match the given requested list. Fixes 73. wdebeau1
Add a protected method to RestfulServer which allows developers to implement their own method for determining which part of the request URL is the FHIR request path (useful if you are embedding the RestulServer inside of another web framework). Thanks to Harsha Kumara for the pull request!. Fixes 86. harsha89

Release 0.7 – 2014-10-23

Type Changes By
API CHANGE: The TagList class previously implemented ArrayList semantics, but this has been replaced with LinkedHashMap semantics. This means that the list of tags will no longer accept duplicate tags, but that tag order will still be preserved. Thanks to Bill de Beaubien for reporting!. Fixes 30.
Server was incorrectly including contained resources being returned as both contained resources, and as top-level resources in the returned bundle for search operations. Thanks to Bill de Beaubien for reporting! This also fixes Issue #20, thanks to lephty for reporting!. Fixes 33.
Documentation fixes suranga
Add a collection of new methods on the generic client which support the read, read, and search operations using an absolute URL. This allows developers to perform these operations using URLs they obtained from other sources (or external resource references within resources). In addition, the existing read/vread operations will now access absolute URL references if they are passed in. Thanks to Doug Martin of the Regenstrief Center for Biomedical Informatics for contributing this implementation! dougmartin
Server implementation was not correctly figuring out its own FHIR Base URL when deployed on Amazon Web Service server. Thanks to Jeffrey Ting and Bill De Beaubien of Systems Made Simple for their help in figuring out this issue!
XML Parser failed to encode fields with both a resource reference child and a primitive type child. Thanks to Jeffrey Ting and Bill De Beaubien of Systems Made Simple for their help in figuring out this issue!
HAPI now runs successfully on Servlet 2.5 containers (such as Tomcat 6). Thanks to Bernard Gitaadji for reporting and diagnosing the issue!
Summary (in the bundle entry) is now encoded by the XML and JSON parsers if supplied. Thanks to David Hay of Orion Health for reporting this!
Conformance profiles which are automatically generated by the server were missing a few mandatory elements, which meant that the profile did not correctly validate. Thanks to Bill de Beaubien of Systems Made Simple for reporting this!. Fixes 24.
XHTML (in narratives) containing escapable characters (e.g. < or ") will now always have those characters escaped properly in encoded messages.
Resources containing entities which are not valid in basic XML (e.g. §) will have those entities converted to their equivalent unicode characters when resources are encoded, since FHIR does not allow extended entities in resource instances.
Add a new client interceptor which adds HTTP Authorization Bearer Tokens (for use with OAUTH2 servers) to client requests.
Add phloc-commons dependency explicitly, which resolves an issue building HAPI from source on some platforms. Thanks to Odysseas Pentakalos for the patch!
HAPI now logs a single line indicating the StAX implementation being used upon the first time an XML parser is created.
Update methods on the server did not return a "content-location" header, but only a "location" header. Both are required according to the FHIR specification. Thanks to Bill de Beaubien of Systems Made Simple for reporting this!
Parser failed to correctly read contained Binary resources. Thanks to Alexander Kley for the patch!. Fixes 26. akley
Calling encode multiple times on a resource with contained resources caused the contained resources to be re-added (and the actual message to grow) with each encode pass. Thanks to Alexander Kley for the test case!. Fixes 29. akley
JSON-encoded contained resources with the incorrect "_id" element (which should be "id", but some incorrect examples exist on the FHIR specification) now parse correctly. In other words, HAPI previously only accepted the correct "id" element, but now it also accepts the incorrect "_id" element just to be more lenient.
Several unit tests failed on Windows (or any platform with non UTF-8 default encoding). This may have also caused resource validation to fail occasionally on these platforms as well. Thanks to Bill de Beaubien for reporting!
toString() method on TokenParam was incorrectly showing the system as the value. Thanks to Bill de Beaubien for reporting!
Documentation on contained resources contained a typo and did not actually produce contained resources. Thanks to David Hay of Orion Health for reporting!
Add a Vagrant based environment (basically a fully built, self contained development environment) for trying out the HAPI server modules. Thanks to Preston Lee for the pull request, and for offering to maintain this!. Fixes 31. preston
Change validation API so that it uses a return type instead of exceptions to communicate validation failures. Thanks to Joe Athman for the pull request!. Fixes 32. jjathman
Add a client interceptor which adds an HTTP cookie to each client request. Thanks to Petro Mykhailysyn for the pull request!. Fixes 35. petromykhailysyn

Release 0.6 – 2014-09-08

Type Changes By
Add server interceptor framework, and new interceptor for logging incoming requests.
Add server validation framework for validating resources against the FHIR schemas and schematrons
Tester UI created double _format and _pretty param entries in searches. Thanks to Gered King of University Health Network for reporting!
Create method was incorrectly returning an HTTP 204 on sucessful completion, but should be returning an HTTP 200 per the FHIR specification. Thanks to wanghaisheng for reporting!. Fixes 4.
FHIR Tester UI now correctly sends UTF-8 charset in responses so that message payloads containing non US-ASCII characters will correctly display in the browser
JSON parser was incorrectly encoding extensions on composite elements outside the element itself (as is done correctly for non-composite elements) instead of inside of them. Thanks to David Hay of Orion for reporting this!
Contained/included resource instances received by a client are now automatically added to any ResourceReferenceDt instancea in other resources which reference them.
Add documentation on how to use eBay CORS Filter to support Cross Origin Resource Sharing (CORS) to server. CORS support that was built in to the server itself has been removed, as it did not work correctly (and was reinventing a wheel that others have done a great job inventing). Thanks to Peter Bernhardt of Relay Health for all the assistance in testing this!
IResource interface did not expose the getLanguage/setLanguage methods from BaseResource, so the resource language was difficult to access.
JSON Parser now gives a more friendly error message if it tries to parse JSON with invalid use of single quotes
Transaction server method is now allowed to return an OperationOutcome in addition to the incoming resources. The public test server now does this in order to return status information about the transaction processing.
Update method in the server can now flag (via a field on the MethodOutcome object being returned) that the result was actually a creation, and Create method can indicate that it was actually an update. This has no effect other than to switch between the HTTP 200 and HTTP 201 status codes on the response, but this may be useful in some circumstances.
Annotation client search methods with a specific resource type (e.g. List search()) won't return any resources that aren't of the correct type that are received in a response bundle (generally these are referenced resources, so they are populated in the reference fields instead). Thanks to Tahura Chaudhry of University Health Network for the unit test! tahurac
Added narrative generator template for OperationOutcome resource
Date/time types did not correctly parse values in the format "yyyymmdd" (although the FHIR-defined format is "yyyy-mm-dd" anyhow, and this is correctly handled). Thanks to Jeffrey Ting of Systems Made Simple for reporting!
Server search method for an unnamed query gets called if the client requests a named query with the same parameter list. Thanks to Neal Acharya of University Health Network for reporting!
Category header (for tags) is correctly read in client for "read" operation
Transaction method in server can now have parameter type Bundle instead of List
HAPI parsers now use field access to get/set values instead of method accessors and mutators. This should give a small performance boost.
JSON parser encodes resource references incorrectly, using the name "resource" instead of the name "reference" for the actual reference. Thanks to Ricky Nguyen for reporting and tracking down the issue!
Rename NotImpementedException to NotImplementedException (to correct typo)
Server setUseBrowserFriendlyContentType setting also respected for errors (e.g. OperationOutcome with 4xx/5xx status)
Fix performance issue in date/time datatypes where pattern matchers were not static
Server now gives a more helpful error message if a @Read method has a search parameter (which is invalid, but previously lead to a very unhelpful error message). Thanks to Tahura Chaudhry of UHN for reporting!
Resource of type "List" failed to parse from a bundle correctly. Thanks to David Hay of Orion Health for reporting!
QuantityParam correctly encodes approximate (~) prefix to values
If a server defines a method with parameter "_id", incoming search requests for that method may get delegated to the wrong method. Thanks to Neal Acharya for reporting!. Fixes 14.
SecurityEvent.Object structural element has been renamed to SecurityEvent.ObjectElement to avoid conflicting names with the java Object class. Thanks to Laurie Macdougall-Sookraj of UHN for reporting!
Text/narrative blocks that were created with a non-empty namespace prefix (e.g. ... ) failed to encode correctly (prefix was missing in encoded resource)
Resource references previously encoded their children (display and reference) in the wrong order so references with both would fail schema validation.
SecurityEvent resource's enums now use friendly enum names instead of the unfriendly numeric code values. Thanks to Laurie MacDougall-Sookraj of UHN for the suggestion!

Release 0.5 – 2014-07-30

Type Changes By
HAPI has a number of RESTful method parameter types that have similar but not identical purposes and confusing names. A cleanup has been undertaken to clean this up. This means that a number of existing classes have been deprocated in favour of new naming schemes.

All annotation-based clients and all server search method parameters are now named (type)Param, for example: StringParam, TokenParam, etc.

All generic/fluent client method parameters are now named (type)ClientParam, for example: StringClientParam, TokenClientParam, etc.

All renamed classes have been retained and deprocated, so this change should not cause any issues for existing applications but those applications should be refactored to use the new parameters when possible.
Allow server methods to return wildcard generic types (e.g. List )
Search parameters are not properly escaped and unescaped. E.g. for a token parameter such as "&identifier=system|codepart1\|codepart2"
Add support for OPTIONS verb (which returns the server conformance statement)
Add support for CORS headers in server
Bump SLF4j dependency to latest version (1.7.7)
Add interceptor framework for clients (annotation based and generic), and add interceptors for configurable logging, capturing requests and responses, and HTTP basic auth.
Transaction client invocations with XML encoding were using the wrong content type ("application/xml+fhir" instead of the correct "application/atom+xml"). Thanks to David Hay of Orion Health for surfacing this one!
Bundle entries now support a link type of "search". Thanks to David Hay for the suggestion!
If a client receives a non 2xx response (e.g. HTTP 500) and the response body is a text/plain message or an OperationOutcome resource, include the message in the exception message so that it will be more conveniently displayed in logs and other places. Thanks to Neal Acharya for the suggestion!. Fixes 1.
Read invocations in the client now process the "Content-Location" header and use it to populate the ID of the returned resource. Thanks to Neal Acharya for the suggestion!. Fixes 2.
Fix issue where vread invocations on server incorrectly get routed to instance history method if one is defined. Thanks to Neal Acharya from UHN for surfacing this one!. Fixes 3.
Binary reads on a server not include the Content-Disposition header, to prevent HTML in binary blobs from being used for nefarious purposes. See FHIR Tracker Bug 3298 for more information.
Support has been added for using an HTTP proxy for outgoing requests.
Fix: Primitive extensions declared against custom resource types are encoded even if they have no value. Thanks to David Hay of Orion for reporting this!
Fix: RESTful server deployed to a location where the URL to access it contained a space (e.g. a WAR file with a space in the name) failed to work correctly. Thanks to David Hay of Orion for reporting this!

Release 0.4 – 2014-07-13

Type Changes By
BREAKING CHANGE:: IdDt has been modified so that it contains a partial or complete resource identity. Previously it contained only the simple alphanumeric id of the resource (the part at the end of the "read" URL for that resource) but it can now contain a complete URL or even a partial URL (e.g. "Patient/123") and can optionally contain a version (e.g. "Patient/123/_history/456"). New methods have been added to this datatype which provide just the numeric portion. See the JavaDoc for more information.
API CHANGE:: Most elements in the HAPI FHIR model contain a getId() and setId() method. This method is confusing because it is only actually used for IDREF elements (which are rare) but its name makes it easy to confuse with more important identifiers. For this reason, these methods have been deprocated and replaced with get/setElementSpecificId() methods. The old methods will be removed at some point. Resource types are unchanged and retain their get/setId methods.
Allow use of QuantityDt as a service parameter to support the "quantity" type. Previously QuantityDt did not implement IQueryParameterType so it was not valid, and there was no way to support quantity search parameters on the server (e.g. Observation.value-quantity)
Introduce StringParameter type which can be used as a RESTful operation search parameter type. StringParameter allows ":exact" matches to be specified in clients, and handled in servers.
Parsers (XML/JSON) now support deleted entries in bundles
Transaction method now supported in servers
Support for Binary resources added (in servers, clients, parsers, etc.)
Support for Query resources fixed (in parser)
Nested contained resources (e.g. encoding a resource with a contained resource that itself contains a resource) now parse and encode correctly, meaning that all contained resources are placed in the "contained" element of the root resource, and the parser looks in the root resource for all container levels when stitching contained resources back together.
Server methods with @Include parameter would sometimes fail when no _include was actually specified in query strings.
Client requests for IdentifierDt types (such as Patient.identifier) did not create the correct query string if the system is null.
Add support for paging responses from RESTful servers.
Don't fail on narrative blocks in JSON resources with only an XML declaration but no content (these are produced by the Health Intersections server)
Server now automatically compresses responses if the client indicates support
Server failed to support optional parameters when type is String and :exact qualifier is used
Read method in client correctly populated resource ID in returned object
Support added for deleted-entry by/name, by/email, and comment from Tombstones spec

Release 0.3 – 2014-05-12

No changes in this release.

Release 0.2 – 2014-04-23

No changes in this release.

Release 0.1 – 2014-04-15

No changes in this release.

Back to top

Reflow Maven skin by Andrius Velykis.