From 11d22b1b1f62105b24f7e58be2aacd16f50ea06d Mon Sep 17 00:00:00 2001 From: jamesagnew Date: Thu, 28 May 2015 08:35:49 -0400 Subject: [PATCH] Site updates and clean up RI IdType --- .../fhir/model/api/IPrimitiveDatatype.java | 4 + .../ca/uhn/fhir/model/primitive/IdDt.java | 134 +- .../fhir/instance/model/IPrimitiveType.java | 36 - .../org/hl7/fhir/instance/model/IdType.java | 1139 +++++++++-------- .../imgsources/hapi-1.1-structs-datatypes.xml | 2 + .../imgsources/hapi-1.1-structs-resource.xml | 2 +- .../images/hapi-1.1-structs-datatypes.png | Bin 0 -> 19761 bytes .../images/hapi-1.1-structs-resource.png | Bin 22819 -> 24253 bytes src/site/xdoc/doc_upgrading.xml | 59 +- src/site/xdoc/download.xml.vm | 15 + 10 files changed, 744 insertions(+), 647 deletions(-) delete mode 100644 hapi-fhir-structures-hl7org-dstu2/src/main/java/org/hl7/fhir/instance/model/IPrimitiveType.java create mode 100644 src/site/imgsources/hapi-1.1-structs-datatypes.xml create mode 100644 src/site/resources/images/hapi-1.1-structs-datatypes.png diff --git a/hapi-fhir-base/src/main/java/ca/uhn/fhir/model/api/IPrimitiveDatatype.java b/hapi-fhir-base/src/main/java/ca/uhn/fhir/model/api/IPrimitiveDatatype.java index c0f8dd7b55d..af08c471162 100644 --- a/hapi-fhir-base/src/main/java/ca/uhn/fhir/model/api/IPrimitiveDatatype.java +++ b/hapi-fhir-base/src/main/java/ca/uhn/fhir/model/api/IPrimitiveDatatype.java @@ -26,11 +26,15 @@ import ca.uhn.fhir.parser.DataFormatException; public interface IPrimitiveDatatype extends IDatatype, IPrimitiveType { + @Override void setValueAsString(String theValue) throws DataFormatException; + @Override String getValueAsString() throws DataFormatException; + @Override T getValue(); + @Override IPrimitiveType setValue(T theValue) throws DataFormatException; } diff --git a/hapi-fhir-base/src/main/java/ca/uhn/fhir/model/primitive/IdDt.java b/hapi-fhir-base/src/main/java/ca/uhn/fhir/model/primitive/IdDt.java index b8d64324543..ba9a72e7c45 100644 --- a/hapi-fhir-base/src/main/java/ca/uhn/fhir/model/primitive/IdDt.java +++ b/hapi-fhir-base/src/main/java/ca/uhn/fhir/model/primitive/IdDt.java @@ -59,7 +59,6 @@ public class IdDt extends UriDt implements IPrimitiveDatatype, IIdType { private String myResourceType; private String myUnqualifiedId; private String myUnqualifiedVersionId; - private volatile String myValue; /** * Create a new empty ID @@ -179,6 +178,18 @@ public class IdDt extends UriDt implements IPrimitiveDatatype, IIdType { setValue(theUrl.getValueAsString()); } + public void applyTo(IBaseResource theResouce) { + if (theResouce == null) { + throw new NullPointerException("theResource can not be null"); + } else if (theResouce instanceof IResource) { + ((IResource) theResouce).setId(new IdDt(getValue())); + } else if (theResouce instanceof IAnyResource) { + ((IAnyResource) theResouce).setId(getValue()); + } else { + throw new IllegalArgumentException("Unknown resource class type, does not implement IResource or extend Resource"); + } + } + /** * @deprecated Use {@link #getIdPartAsBigDecimal()} instead (this method was deprocated because its name is ambiguous) */ @@ -187,6 +198,15 @@ public class IdDt extends UriDt implements IPrimitiveDatatype, IIdType { return getIdPartAsBigDecimal(); } + @Override + public boolean equals(Object theArg0) { + if (!(theArg0 instanceof IdDt)) { + return false; + } + IdDt id = (IdDt) theArg0; + return StringUtils.equals(getValueAsString(), id.getValueAsString()); + } + /** * Returns true if this IdDt matches the given IdDt in terms of resource type and ID, but ignores the URL base */ @@ -201,22 +221,6 @@ public class IdDt extends UriDt implements IPrimitiveDatatype, IIdType { return ObjectUtils.equals(getResourceType(), theId.getResourceType()) && ObjectUtils.equals(getIdPart(), theId.getIdPart()) && ObjectUtils.equals(getVersionIdPart(), theId.getVersionIdPart()); } - @Override - public boolean equals(Object theArg0) { - if (!(theArg0 instanceof IdDt)) { - return false; - } - IdDt id = (IdDt) theArg0; - return StringUtils.equals(getValueAsString(), id.getValueAsString()); - } - - @Override - public int hashCode() { - HashCodeBuilder b = new HashCodeBuilder(); - b.append(getValueAsString()); - return b.toHashCode(); - } - /** * Returns the portion of this resource ID which corresponds to the server base URL. For example given the resource ID http://example.com/fhir/Patient/123 the base URL would be * http://example.com/fhir. @@ -224,6 +228,7 @@ public class IdDt extends UriDt implements IPrimitiveDatatype, IIdType { * This method may return null if the ID contains no base (e.g. "Patient/123") *

*/ + @Override public String getBaseUrl() { return myBaseUrl; } @@ -231,6 +236,7 @@ public class IdDt extends UriDt implements IPrimitiveDatatype, IIdType { /** * Returns only the logical ID part of this ID. For example, given the ID "http://example,.com/fhir/Patient/123/_history/456", this method would return "123". */ + @Override public String getIdPart() { return myUnqualifiedId; } @@ -255,6 +261,7 @@ public class IdDt extends UriDt implements IPrimitiveDatatype, IIdType { * @throws NumberFormatException * If the value is not a valid Long */ + @Override public Long getIdPartAsLong() { String val = getIdPart(); if (isBlank(val)) { @@ -263,6 +270,7 @@ public class IdDt extends UriDt implements IPrimitiveDatatype, IIdType { return Long.parseLong(val); } + @Override public String getResourceType() { return myResourceType; } @@ -274,7 +282,7 @@ public class IdDt extends UriDt implements IPrimitiveDatatype, IIdType { */ @Override public String getValue() { - if (myValue == null && myHaveComponentParts) { + if (super.getValue() == null && myHaveComponentParts) { StringBuilder b = new StringBuilder(); if (isNotBlank(myBaseUrl)) { b.append(myBaseUrl); @@ -299,9 +307,9 @@ public class IdDt extends UriDt implements IPrimitiveDatatype, IIdType { b.append(myUnqualifiedVersionId); } String value = b.toString(); - myValue = value; + super.setValue(value); } - return myValue; + return super.getValue(); } @Override @@ -309,6 +317,7 @@ public class IdDt extends UriDt implements IPrimitiveDatatype, IIdType { return getValue(); } + @Override public String getVersionIdPart() { return myUnqualifiedVersionId; } @@ -330,14 +339,24 @@ public class IdDt extends UriDt implements IPrimitiveDatatype, IIdType { return isNotBlank(myBaseUrl); } + @Override + public int hashCode() { + HashCodeBuilder b = new HashCodeBuilder(); + b.append(getValueAsString()); + return b.toHashCode(); + } + + @Override public boolean hasIdPart() { return isNotBlank(getIdPart()); } + @Override public boolean hasResourceType() { return isNotBlank(myResourceType); } + @Override public boolean hasVersionIdPart() { return isNotBlank(getVersionIdPart()); } @@ -345,6 +364,7 @@ public class IdDt extends UriDt implements IPrimitiveDatatype, IIdType { /** * Returns true if this ID contains an absolute URL (in other words, a URL starting with "http://" or "https://" */ + @Override public boolean isAbsolute() { if (StringUtils.isBlank(getValue())) { return false; @@ -352,9 +372,15 @@ public class IdDt extends UriDt implements IPrimitiveDatatype, IIdType { return UrlUtil.isAbsolute(getValue()); } + @Override + public boolean isEmpty() { + return isBlank(getValue()); + } + /** * Returns true if the unqualified ID is a valid {@link Long} value (in other words, it consists only of digits) */ + @Override public boolean isIdPartValidLong() { String id = getIdPart(); if (StringUtils.isBlank(id)) { @@ -371,6 +397,7 @@ public class IdDt extends UriDt implements IPrimitiveDatatype, IIdType { /** * Returns true if the ID is a local reference (in other words, it begins with the '#' character) */ + @Override public boolean isLocal() { return myUnqualifiedId != null && myUnqualifiedId.isEmpty() == false && myUnqualifiedId.charAt(0) == '#'; } @@ -378,6 +405,7 @@ public class IdDt extends UriDt implements IPrimitiveDatatype, IIdType { /** * Copies the value from the given IdDt to this IdDt. It is generally not neccesary to use this method but it is provided for consistency with the rest of the API. */ + @Override public void setId(IdDt theId) { setValue(theId.getValue()); } @@ -396,16 +424,16 @@ public class IdDt extends UriDt implements IPrimitiveDatatype, IIdType { @Override public IdDt setValue(String theValue) throws DataFormatException { // TODO: add validation - myValue = theValue; + super.setValue(theValue); myHaveComponentParts = false; if (StringUtils.isBlank(theValue)) { myBaseUrl = null; - myValue = null; + super.setValue(null); myUnqualifiedId = null; myUnqualifiedVersionId = null; myResourceType = null; } else if (theValue.charAt(0) == '#') { - myValue = theValue; + super.setValue(theValue); myUnqualifiedId = theValue; myUnqualifiedVersionId = null; myResourceType = null; @@ -469,18 +497,22 @@ public class IdDt extends UriDt implements IPrimitiveDatatype, IIdType { * Returns a new IdDt containing this IdDt's values but with no server base URL if one is present in this IdDt. For example, if this IdDt contains the ID "http://foo/Patient/1", this method will * return a new IdDt containing ID "Patient/1". */ + @Override public IdDt toUnqualified() { return new IdDt(getResourceType(), getIdPart(), getVersionIdPart()); } + @Override public IdDt toUnqualifiedVersionless() { return new IdDt(getResourceType(), getIdPart()); } + @Override public IdDt toVersionless() { return new IdDt(getBaseUrl(), getResourceType(), getIdPart(), null); } + @Override public IdDt withResourceType(String theResourceName) { return new IdDt(theResourceName, getIdPart(), getVersionIdPart()); } @@ -495,6 +527,7 @@ public class IdDt extends UriDt implements IPrimitiveDatatype, IIdType { * The resource name (e.g. "Patient") * @return A fully qualified URL for this ID (e.g. "http://example.com/fhir/Patient/1") */ + @Override public IdDt withServerBase(String theServerBase, String theResourceType) { return new IdDt(theServerBase, theResourceType, getIdPart(), getVersionIdPart()); } @@ -522,6 +555,24 @@ public class IdDt extends UriDt implements IPrimitiveDatatype, IIdType { return new IdDt(value + '/' + Constants.PARAM_HISTORY + '/' + theVersion); } + /** + * Retrieves the ID from the given resource instance + */ + public static IdDt of(IBaseResource theResouce) { + if (theResouce == null) { + throw new NullPointerException("theResource can not be null"); + } else { + IIdType retVal = theResouce.getIdElement(); + if (retVal == null) { + return null; + } else if (retVal instanceof IdDt) { + return (IdDt) retVal; + } else { + return new IdDt(retVal.getValue()); + } + } + } + private static String toPlainStringWithNpeThrowIfNeeded(BigDecimal theIdPart) { if (theIdPart == null) { throw new NullPointerException("BigDecimal ID can not be null"); @@ -536,41 +587,4 @@ public class IdDt extends UriDt implements IPrimitiveDatatype, IIdType { return theIdPart.toString(); } - @Override - public boolean isEmpty() { - return isBlank(getValue()); - } - - public void applyTo(IBaseResource theResouce) { - if (theResouce == null) { - throw new NullPointerException("theResource can not be null"); - } else if (theResouce instanceof IResource) { - ((IResource) theResouce).setId(new IdDt(getValue())); - } else if (theResouce instanceof IAnyResource) { - ((IAnyResource) theResouce).setId(getValue()); - } else { - throw new IllegalArgumentException("Unknown resource class type, does not implement IResource or extend Resource"); - } - } - - /** - * Retrieves the ID from the given resource instance - */ - public static IdDt of(IBaseResource theResouce) { - if (theResouce == null) { - throw new NullPointerException("theResource can not be null"); - } else if (theResouce instanceof IBaseResource) { - IIdType retVal = ((IBaseResource) theResouce).getIdElement(); - if (retVal == null) { - return null; - } else if (retVal instanceof IdDt) { - return (IdDt) retVal; - } else { - return new IdDt(retVal.getValue()); - } - } else { - throw new IllegalArgumentException("Unknown resource class type, does not implement IResource or extend Resource"); - } - } - } diff --git a/hapi-fhir-structures-hl7org-dstu2/src/main/java/org/hl7/fhir/instance/model/IPrimitiveType.java b/hapi-fhir-structures-hl7org-dstu2/src/main/java/org/hl7/fhir/instance/model/IPrimitiveType.java deleted file mode 100644 index 1d6685a2a29..00000000000 --- a/hapi-fhir-structures-hl7org-dstu2/src/main/java/org/hl7/fhir/instance/model/IPrimitiveType.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.hl7.fhir.instance.model; - -import org.hl7.fhir.instance.model.api.IBaseDatatype; - -/* - * #%L - * HAPI FHIR - Core Library - * %% - * Copyright (C) 2014 - 2015 University Health Network - * %% - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * #L% - */ - - -public interface IPrimitiveType extends IBaseDatatype { - - void setValueAsString(String theValue) throws IllegalArgumentException; - - String getValueAsString(); - - T getValue(); - - IPrimitiveType setValue(T theValue) throws IllegalArgumentException; - -} diff --git a/hapi-fhir-structures-hl7org-dstu2/src/main/java/org/hl7/fhir/instance/model/IdType.java b/hapi-fhir-structures-hl7org-dstu2/src/main/java/org/hl7/fhir/instance/model/IdType.java index cf3112b0405..59d2fee31ce 100644 --- a/hapi-fhir-structures-hl7org-dstu2/src/main/java/org/hl7/fhir/instance/model/IdType.java +++ b/hapi-fhir-structures-hl7org-dstu2/src/main/java/org/hl7/fhir/instance/model/IdType.java @@ -1,547 +1,592 @@ -/* -Copyright (c) 2011+, HL7, Inc -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of HL7 nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ -package org.hl7.fhir.instance.model; - -import static org.apache.commons.lang3.StringUtils.*; - -import java.math.BigDecimal; - -import org.apache.commons.lang3.ObjectUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.Validate; -import org.apache.commons.lang3.builder.HashCodeBuilder; -import org.hl7.fhir.instance.model.annotations.DatatypeDef; -import org.hl7.fhir.instance.model.api.IIdType; - -/** - * Primitive type "id" in FHIR: a string from 1 to 64 characters, only containing letters, digits, "-" and "." - */ -@DatatypeDef(name = "id") -public class IdType extends UriType implements IIdType { - - public static final int MAX_LENGTH = 64; - private static final long serialVersionUID = 4L; - - private String myBaseUrl; - private boolean myHaveComponentParts; - private String myResourceType; - private String myUnqualifiedId; - private String myUnqualifiedVersionId; - private volatile String myValue; - - /** - * Create a new empty ID - */ - public IdType() { - super(); - } - - /** - * Create a new ID, using a BigDecimal input. Uses {@link BigDecimal#toPlainString()} to generate the string representation. - */ - public IdType(BigDecimal thePid) { - if (thePid != null) { - setValue(toPlainStringWithNpeThrowIfNeeded(thePid)); - } else { - setValue(null); - } - } - - /** - * Create a new ID using a long - */ - public IdType(long theId) { - setValue(Long.toString(theId)); - } - - /** - * Create a new ID using a string. This String may contain a simple ID (e.g. "1234") or it may contain a complete URL (http://example.com/fhir/Patient/1234). - * - *

- * Description: A whole number in the range 0 to 2^64-1 (optionally represented in hex), a uuid, an oid, or any other combination of lowercase letters, numerals, "-" and ".", with a length - * limit of 36 characters. - *

- *

- * regex: [a-z0-9\-\.]{1,36} - *

- */ - public IdType(String theValue) { - setValue(theValue); - } - - /** - * Constructor - * - * @param theResourceType - * The resource type (e.g. "Patient") - * @param theIdPart - * The ID (e.g. "123") - */ - public IdType(String theResourceType, BigDecimal theIdPart) { - this(theResourceType, toPlainStringWithNpeThrowIfNeeded(theIdPart)); - } - - /** - * Constructor - * - * @param theResourceType - * The resource type (e.g. "Patient") - * @param theIdPart - * The ID (e.g. "123") - */ - public IdType(String theResourceType, Long theIdPart) { - this(theResourceType, toPlainStringWithNpeThrowIfNeeded(theIdPart)); - } - - /** - * Constructor - * - * @param theResourceType - * The resource type (e.g. "Patient") - * @param theId - * The ID (e.g. "123") - */ - public IdType(String theResourceType, String theId) { - this(theResourceType, theId, null); - } - - /** - * Constructor - * - * @param theResourceType - * The resource type (e.g. "Patient") - * @param theId - * The ID (e.g. "123") - * @param theVersionId - * The version ID ("e.g. "456") - */ - public IdType(String theResourceType, String theId, String theVersionId) { - this(null,theResourceType,theId,theVersionId); - } - - /** - * Constructor - * - * @param theBaseUrl - * The server base URL (e.g. "http://example.com/fhir") - * @param theResourceType - * The resource type (e.g. "Patient") - * @param theId - * The ID (e.g. "123") - * @param theVersionId - * The version ID ("e.g. "456") - */ - public IdType(String theBaseUrl, String theResourceType, String theId, String theVersionId) { - myBaseUrl = theBaseUrl; - myResourceType = theResourceType; - myUnqualifiedId = theId; - myUnqualifiedVersionId = StringUtils.defaultIfBlank(theVersionId, null); - myHaveComponentParts = true; - } - - /** - * Creates an ID based on a given URL - */ - public IdType(UriType theUrl) { - setValue(theUrl.getValueAsString()); - } - - /** - * @deprecated Use {@link #getIdPartAsBigDecimal()} instead (this method was deprocated because its name is ambiguous) - */ - @Deprecated - public BigDecimal asBigDecimal() { - return getIdPartAsBigDecimal(); - } - - /** - * Returns true if this IdDt matches the given IdDt in terms of resource type and ID, but ignores the URL base - */ - @SuppressWarnings("deprecation") - public boolean equalsIgnoreBase(IdType theId) { - if (theId == null) { - return false; - } - if (theId.isEmpty()) { - return isEmpty(); - } - return ObjectUtils.equals(getResourceType(), theId.getResourceType()) && ObjectUtils.equals(getIdPart(), theId.getIdPart()) && ObjectUtils.equals(getVersionIdPart(), theId.getVersionIdPart()); - } - - - - @Override - public boolean equals(Object theArg0) { - if (!(theArg0 instanceof IdType)) { - return false; - } - IdType id = (IdType)theArg0; - return StringUtils.equals(getValueAsString(), id.getValueAsString()); - } - - @Override - public int hashCode() { - HashCodeBuilder b = new HashCodeBuilder(); - b.append(getValueAsString()); - return b.toHashCode(); - } - - /** - * Returns the portion of this resource ID which corresponds to the server base URL. For example given the resource ID http://example.com/fhir/Patient/123 the base URL would be - * http://example.com/fhir. - *

- * This method may return null if the ID contains no base (e.g. "Patient/123") - *

- */ - public String getBaseUrl() { - return myBaseUrl; - } - - public String getIdPart() { - return myUnqualifiedId; - } - - /** - * Returns the unqualified portion of this ID as a big decimal, or null if the value is null - * - * @throws NumberFormatException - * If the value is not a valid BigDecimal - */ - public BigDecimal getIdPartAsBigDecimal() { - String val = getIdPart(); - if (isBlank(val)) { - return null; - } - return new BigDecimal(val); - } - - /** - * Returns the unqualified portion of this ID as a {@link Long}, or null if the value is null - * - * @throws NumberFormatException - * If the value is not a valid Long - */ - public Long getIdPartAsLong() { - String val = getIdPart(); - if (isBlank(val)) { - return null; - } - return Long.parseLong(val); - } - - public String getResourceType() { - return myResourceType; - } - - /** - * Returns the value of this ID. Note that this value may be a fully qualified URL, a relative/partial URL, or a simple ID. Use {@link #getIdPart()} to get just the ID portion. - * - * @see #getIdPart() - */ - @Override - public String getValue() { - if (myValue == null && myHaveComponentParts) { - StringBuilder b = new StringBuilder(); - if (isNotBlank(myBaseUrl)) { - b.append(myBaseUrl); - if (myBaseUrl.charAt(myBaseUrl.length()-1)!='/') { - b.append('/'); - } - } - - if (isNotBlank(myResourceType)) { - b.append(myResourceType); - } - - if (b.length() > 0) { - b.append('/'); - } - - b.append(myUnqualifiedId); - if (isNotBlank(myUnqualifiedVersionId)) { - b.append("/_history/"); - b.append(myUnqualifiedVersionId); - } - String value = b.toString(); - myValue = value; - } - return myValue; - } - - @Override - public String getValueAsString() { - return getValue(); - } - - public String getVersionIdPart() { - return myUnqualifiedVersionId; - } - - public Long getVersionIdPartAsLong() { - if (!hasVersionIdPart()) { - return null; - } else { - return Long.parseLong(getVersionIdPart()); - } - } - - /** - * Returns true if this ID has a base url - * - * @see #getBaseUrl() - */ - public boolean hasBaseUrl() { - return isNotBlank(myBaseUrl); - } - - public boolean hasIdPart() { - return isNotBlank(getIdPart()); - } - - public boolean hasResourceType() { - return isNotBlank(myResourceType); - } - - public boolean hasVersionIdPart() { - return isNotBlank(getVersionIdPart()); - } - - /** - * Returns true if this ID contains an absolute URL (in other words, a URL starting with "http://" or "https://" - */ - public boolean isAbsolute() { - if (StringUtils.isBlank(getValue())) { - return false; - } - return isAbsolute(getValue()); - } - - /** - * Returns true if the unqualified ID is a valid {@link Long} value (in other words, it consists only of digits) - */ - public boolean isIdPartValidLong() { - String id = getIdPart(); - if (StringUtils.isBlank(id)) { - return false; - } - for (int i = 0; i < id.length(); i++) { - if (Character.isDigit(id.charAt(i)) == false) { - return false; - } - } - return true; - } - - /** - * Returns true if the ID is a local reference (in other words, it begins with the '#' character) - */ - public boolean isLocal() { - return myUnqualifiedId != null && myUnqualifiedId.isEmpty() == false && myUnqualifiedId.charAt(0) == '#'; - } - - /** - * Copies the value from the given IdDt to this IdDt. It is generally not neccesary to use this method but it is provided for consistency with the rest of the API. - */ - public void setId(IdType theId) { - setValue(theId.getValue()); - } - - /** - * Set the value - * - *

- * Description: A whole number in the range 0 to 2^64-1 (optionally represented in hex), a uuid, an oid, or any other combination of lowercase letters, numerals, "-" and ".", with a length - * limit of 36 characters. - *

- *

- * regex: [a-z0-9\-\.]{1,36} - *

- */ - @Override - public IdType setValue(String theValue) { - // TODO: add validation - myValue = theValue; - myHaveComponentParts = false; - if (StringUtils.isBlank(theValue)) { - myBaseUrl = null; - myValue = null; - myUnqualifiedId = null; - myUnqualifiedVersionId = null; - myResourceType = null; - } else if (theValue.charAt(0)== '#') { - myValue = theValue; - myUnqualifiedId = theValue; - myUnqualifiedVersionId=null; - myResourceType = null; - myHaveComponentParts = true; - } else { - int vidIndex = theValue.indexOf("/_history/"); - int idIndex; - if (vidIndex != -1) { - myUnqualifiedVersionId = theValue.substring(vidIndex + "/_history/".length()); - idIndex = theValue.lastIndexOf('/', vidIndex - 1); - myUnqualifiedId = theValue.substring(idIndex + 1, vidIndex); - } else { - idIndex = theValue.lastIndexOf('/'); - myUnqualifiedId = theValue.substring(idIndex + 1); - myUnqualifiedVersionId = null; - } - - myBaseUrl = null; - if (idIndex <= 0) { - myResourceType = null; - } else { - int typeIndex = theValue.lastIndexOf('/', idIndex - 1); - if (typeIndex == -1) { - myResourceType = theValue.substring(0, idIndex); - } else { - myResourceType = theValue.substring(typeIndex + 1, idIndex); - - if (typeIndex > 4) { - myBaseUrl = theValue.substring(0, typeIndex); - } - - } - } - - } - return this; - } - - /** - * Set the value - * - *

- * Description: A whole number in the range 0 to 2^64-1 (optionally represented in hex), a uuid, an oid, or any other combination of lowercase letters, numerals, "-" and ".", with a length - * limit of 36 characters. - *

- *

- * regex: [a-z0-9\-\.]{1,36} - *

- */ - @Override - public void setValueAsString(String theValue) { - setValue(theValue); - } - - @Override - public String toString() { - return getValue(); - } - - /** - * Returns a new IdDt containing this IdDt's values but with no server base URL if one - * is present in this IdDt. For example, if this IdDt contains the ID "http://foo/Patient/1", - * this method will return a new IdDt containing ID "Patient/1". - */ - public IdType toUnqualified() { - return new IdType(getResourceType(), getIdPart(), getVersionIdPart()); - } - - public IdType toUnqualifiedVersionless() { - return new IdType(getResourceType(), getIdPart()); - } - - public IdType toVersionless() { - return new IdType(getBaseUrl(), getResourceType(), getIdPart(), null); - } - - public IdType withResourceType(String theResourceName) { - return new IdType(theResourceName, getIdPart(), getVersionIdPart()); - } - - /** - * Returns a view of this ID as a fully qualified URL, given a server base and resource name (which will only be used if the ID does not already contain those respective parts). Essentially, - * because IdDt can contain either a complete URL or a partial one (or even jut a simple ID), this method may be used to translate into a complete URL. - * - * @param theServerBase - * The server base (e.g. "http://example.com/fhir") - * @param theResourceType - * The resource name (e.g. "Patient") - * @return A fully qualified URL for this ID (e.g. "http://example.com/fhir/Patient/1") - */ - public IdType withServerBase(String theServerBase, String theResourceType) { - return new IdType(theServerBase, theResourceType, getIdPart(), getVersionIdPart()); - } - - /** - * Creates a new instance of this ID which is identical, but refers to the specific version of this resource ID noted by theVersion. - * - * @param theVersion - * The actual version string, e.g. "1" - * @return A new instance of IdDt which is identical, but refers to the specific version of this resource ID noted by theVersion. - */ - public IdType withVersion(String theVersion) { - Validate.notBlank(theVersion, "Version may not be null or empty"); - - String existingValue = getValue(); - - int i = existingValue.indexOf("_history"); - String value; - if (i > 1) { - value = existingValue.substring(0, i - 1); - } else { - value = existingValue; - } - - return new IdType(value + "/_history/" + theVersion); - } - - private static String toPlainStringWithNpeThrowIfNeeded(BigDecimal theIdPart) { - if (theIdPart == null) { - throw new NullPointerException("BigDecimal ID can not be null"); - } - return theIdPart.toPlainString(); - } - - private static String toPlainStringWithNpeThrowIfNeeded(Long theIdPart) { - if (theIdPart == null) { - throw new NullPointerException("Long ID can not be null"); - } - return theIdPart.toString(); - } - - @Override - public boolean isEmpty() { - return isBlank(getValue()); - } - - @Override - public IdType copy() { - return new IdType(getValue()); - } - - - private static boolean isAbsolute(String theValue) { - String value = theValue.toLowerCase(); - return value.startsWith("http://") || value.startsWith("https://"); - } - - -} \ No newline at end of file +package org.hl7.fhir.instance.model; + +/* + Copyright (c) 2011+, HL7, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of HL7 nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +*/ + +import static org.apache.commons.lang3.StringUtils.*; + +import java.math.BigDecimal; + +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.hl7.fhir.instance.model.annotations.DatatypeDef; +import org.hl7.fhir.instance.model.api.IBaseResource; +import org.hl7.fhir.instance.model.api.IIdType; +import org.hl7.fhir.instance.model.api.IPrimitiveType; + +/** + * Represents the FHIR ID type. This is the actual resource ID, meaning the ID that will be used in RESTful URLs, Resource References, etc. to represent a specific instance of a resource. + * + *

+ * Description: A whole number in the range 0 to 2^64-1 (optionally represented in hex), a uuid, an oid, or any other combination of lowercase letters, numerals, "-" and ".", with a length + * limit of 36 characters. + *

+ *

+ * regex: [a-z0-9\-\.]{1,36} + *

+ */ +@DatatypeDef(name = "id") +public final class IdType extends UriType implements IPrimitiveType, IIdType { + + private static final long serialVersionUID = 2L; + private String myBaseUrl; + private boolean myHaveComponentParts; + private String myResourceType; + private String myUnqualifiedId; + private String myUnqualifiedVersionId; + + /** + * Create a new empty ID + */ + public IdType() { + super(); + } + + /** + * Create a new ID, using a BigDecimal input. Uses {@link BigDecimal#toPlainString()} to generate the string representation. + */ + public IdType(BigDecimal thePid) { + if (thePid != null) { + setValue(toPlainStringWithNpeThrowIfNeeded(thePid)); + } else { + setValue(null); + } + } + + /** + * Create a new ID using a long + */ + public IdType(long theId) { + setValue(Long.toString(theId)); + } + + /** + * Create a new ID using a string. This String may contain a simple ID (e.g. "1234") or it may contain a complete URL (http://example.com/fhir/Patient/1234). + * + *

+ * Description: A whole number in the range 0 to 2^64-1 (optionally represented in hex), a uuid, an oid, or any other combination of lowercase letters, numerals, "-" and ".", with a length + * limit of 36 characters. + *

+ *

+ * regex: [a-z0-9\-\.]{1,36} + *

+ */ + public IdType(String theValue) { + setValue(theValue); + } + + /** + * Constructor + * + * @param theResourceType + * The resource type (e.g. "Patient") + * @param theIdPart + * The ID (e.g. "123") + */ + public IdType(String theResourceType, BigDecimal theIdPart) { + this(theResourceType, toPlainStringWithNpeThrowIfNeeded(theIdPart)); + } + + /** + * Constructor + * + * @param theResourceType + * The resource type (e.g. "Patient") + * @param theIdPart + * The ID (e.g. "123") + */ + public IdType(String theResourceType, Long theIdPart) { + this(theResourceType, toPlainStringWithNpeThrowIfNeeded(theIdPart)); + } + + /** + * Constructor + * + * @param theResourceType + * The resource type (e.g. "Patient") + * @param theId + * The ID (e.g. "123") + */ + public IdType(String theResourceType, String theId) { + this(theResourceType, theId, null); + } + + /** + * Constructor + * + * @param theResourceType + * The resource type (e.g. "Patient") + * @param theId + * The ID (e.g. "123") + * @param theVersionId + * The version ID ("e.g. "456") + */ + public IdType(String theResourceType, String theId, String theVersionId) { + this(null, theResourceType, theId, theVersionId); + } + + /** + * Constructor + * + * @param theBaseUrl + * The server base URL (e.g. "http://example.com/fhir") + * @param theResourceType + * The resource type (e.g. "Patient") + * @param theId + * The ID (e.g. "123") + * @param theVersionId + * The version ID ("e.g. "456") + */ + public IdType(String theBaseUrl, String theResourceType, String theId, String theVersionId) { + myBaseUrl = theBaseUrl; + myResourceType = theResourceType; + myUnqualifiedId = theId; + myUnqualifiedVersionId = StringUtils.defaultIfBlank(theVersionId, null); + myHaveComponentParts = true; + } + + /** + * Creates an ID based on a given URL + */ + public IdType(UriType theUrl) { + setValue(theUrl.getValueAsString()); + } + + public void applyTo(IBaseResource theResouce) { + if (theResouce == null) { + throw new NullPointerException("theResource can not be null"); + } else { + theResouce.setId(new IdType(getValue())); + } + } + + /** + * @deprecated Use {@link #getIdPartAsBigDecimal()} instead (this method was deprocated because its name is ambiguous) + */ + @Deprecated + public BigDecimal asBigDecimal() { + return getIdPartAsBigDecimal(); + } + + @Override + public IdType copy() { + return new IdType(getValue()); + } + + @Override + public boolean equals(Object theArg0) { + if (!(theArg0 instanceof IdType)) { + return false; + } + IdType id = (IdType) theArg0; + return StringUtils.equals(getValueAsString(), id.getValueAsString()); + } + + /** + * Returns true if this IdType matches the given IdType in terms of resource type and ID, but ignores the URL base + */ + @SuppressWarnings("deprecation") + public boolean equalsIgnoreBase(IdType theId) { + if (theId == null) { + return false; + } + if (theId.isEmpty()) { + return isEmpty(); + } + return ObjectUtils.equals(getResourceType(), theId.getResourceType()) && ObjectUtils.equals(getIdPart(), theId.getIdPart()) && ObjectUtils.equals(getVersionIdPart(), theId.getVersionIdPart()); + } + + /** + * Returns the portion of this resource ID which corresponds to the server base URL. For example given the resource ID http://example.com/fhir/Patient/123 the base URL would be + * http://example.com/fhir. + *

+ * This method may return null if the ID contains no base (e.g. "Patient/123") + *

+ */ + @Override + public String getBaseUrl() { + return myBaseUrl; + } + + /** + * Returns only the logical ID part of this ID. For example, given the ID "http://example,.com/fhir/Patient/123/_history/456", this method would return "123". + */ + @Override + public String getIdPart() { + return myUnqualifiedId; + } + + /** + * Returns the unqualified portion of this ID as a big decimal, or null if the value is null + * + * @throws NumberFormatException + * If the value is not a valid BigDecimal + */ + public BigDecimal getIdPartAsBigDecimal() { + String val = getIdPart(); + if (isBlank(val)) { + return null; + } + return new BigDecimal(val); + } + + /** + * Returns the unqualified portion of this ID as a {@link Long}, or null if the value is null + * + * @throws NumberFormatException + * If the value is not a valid Long + */ + @Override + public Long getIdPartAsLong() { + String val = getIdPart(); + if (isBlank(val)) { + return null; + } + return Long.parseLong(val); + } + + @Override + public String getResourceType() { + return myResourceType; + } + + /** + * Returns the value of this ID. Note that this value may be a fully qualified URL, a relative/partial URL, or a simple ID. Use {@link #getIdPart()} to get just the ID portion. + * + * @see #getIdPart() + */ + @Override + public String getValue() { + String retVal = super.getValue(); + if (retVal == null && myHaveComponentParts) { + StringBuilder b = new StringBuilder(); + if (isNotBlank(myBaseUrl)) { + b.append(myBaseUrl); + if (myBaseUrl.charAt(myBaseUrl.length() - 1) != '/') { + b.append('/'); + } + } + + if (isNotBlank(myResourceType)) { + b.append(myResourceType); + } + + if (b.length() > 0) { + b.append('/'); + } + + b.append(myUnqualifiedId); + if (isNotBlank(myUnqualifiedVersionId)) { + b.append('/'); + b.append("_history"); + b.append('/'); + b.append(myUnqualifiedVersionId); + } + retVal = b.toString(); + super.setValue(retVal); + } + return retVal; + } + + @Override + public String getValueAsString() { + return getValue(); + } + + @Override + public String getVersionIdPart() { + return myUnqualifiedVersionId; + } + + public Long getVersionIdPartAsLong() { + if (!hasVersionIdPart()) { + return null; + } else { + return Long.parseLong(getVersionIdPart()); + } + } + + /** + * Returns true if this ID has a base url + * + * @see #getBaseUrl() + */ + public boolean hasBaseUrl() { + return isNotBlank(myBaseUrl); + } + + @Override + public int hashCode() { + HashCodeBuilder b = new HashCodeBuilder(); + b.append(getValueAsString()); + return b.toHashCode(); + } + + @Override + public boolean hasIdPart() { + return isNotBlank(getIdPart()); + } + + @Override + public boolean hasResourceType() { + return isNotBlank(myResourceType); + } + + @Override + public boolean hasVersionIdPart() { + return isNotBlank(getVersionIdPart()); + } + + /** + * Returns true if this ID contains an absolute URL (in other words, a URL starting with "http://" or "https://" + */ + @Override + public boolean isAbsolute() { + if (StringUtils.isBlank(getValue())) { + return false; + } + return isUrlAbsolute(getValue()); + } + + + @Override + public boolean isEmpty() { + return isBlank(getValue()); + } + + /** + * Returns true if the unqualified ID is a valid {@link Long} value (in other words, it consists only of digits) + */ + @Override + public boolean isIdPartValidLong() { + String id = getIdPart(); + if (StringUtils.isBlank(id)) { + return false; + } + for (int i = 0; i < id.length(); i++) { + if (Character.isDigit(id.charAt(i)) == false) { + return false; + } + } + return true; + } + + /** + * Returns true if the ID is a local reference (in other words, it begins with the '#' character) + */ + @Override + public boolean isLocal() { + return myUnqualifiedId != null && myUnqualifiedId.isEmpty() == false && myUnqualifiedId.charAt(0) == '#'; + } + + /** + * Set the value + * + *

+ * Description: A whole number in the range 0 to 2^64-1 (optionally represented in hex), a uuid, an oid, or any other combination of lowercase letters, numerals, "-" and ".", with a length + * limit of 36 characters. + *

+ *

+ * regex: [a-z0-9\-\.]{1,36} + *

+ */ + @Override + public IdType setValue(String theValue) { + // TODO: add validation + super.setValue(theValue); + myHaveComponentParts = false; + if (StringUtils.isBlank(theValue)) { + myBaseUrl = null; + super.setValue(null); + myUnqualifiedId = null; + myUnqualifiedVersionId = null; + myResourceType = null; + } else if (theValue.charAt(0) == '#') { + super.setValue(theValue); + myUnqualifiedId = theValue; + myUnqualifiedVersionId = null; + myResourceType = null; + myHaveComponentParts = true; + } else { + int vidIndex = theValue.indexOf("/_history/"); + int idIndex; + if (vidIndex != -1) { + myUnqualifiedVersionId = theValue.substring(vidIndex + "/_history/".length()); + idIndex = theValue.lastIndexOf('/', vidIndex - 1); + myUnqualifiedId = theValue.substring(idIndex + 1, vidIndex); + } else { + idIndex = theValue.lastIndexOf('/'); + myUnqualifiedId = theValue.substring(idIndex + 1); + myUnqualifiedVersionId = null; + } + + myBaseUrl = null; + if (idIndex <= 0) { + myResourceType = null; + } else { + int typeIndex = theValue.lastIndexOf('/', idIndex - 1); + if (typeIndex == -1) { + myResourceType = theValue.substring(0, idIndex); + } else { + myResourceType = theValue.substring(typeIndex + 1, idIndex); + + if (typeIndex > 4) { + myBaseUrl = theValue.substring(0, typeIndex); + } + + } + } + + } + return this; + } + + /** + * Set the value + * + *

+ * Description: A whole number in the range 0 to 2^64-1 (optionally represented in hex), a uuid, an oid, or any other combination of lowercase letters, numerals, "-" and ".", with a length + * limit of 36 characters. + *

+ *

+ * regex: [a-z0-9\-\.]{1,36} + *

+ */ + @Override + public void setValueAsString(String theValue) { + setValue(theValue); + } + + @Override + public String toString() { + return getValue(); + } + + /** + * Returns a new IdType containing this IdType's values but with no server base URL if one is present in this IdType. For example, if this IdType contains the ID "http://foo/Patient/1", this method will + * return a new IdType containing ID "Patient/1". + */ + @Override + public IdType toUnqualified() { + return new IdType(getResourceType(), getIdPart(), getVersionIdPart()); + } + + @Override + public IdType toUnqualifiedVersionless() { + return new IdType(getResourceType(), getIdPart()); + } + + @Override + public IdType toVersionless() { + return new IdType(getBaseUrl(), getResourceType(), getIdPart(), null); + } + + @Override + public IdType withResourceType(String theResourceName) { + return new IdType(theResourceName, getIdPart(), getVersionIdPart()); + } + + /** + * Returns a view of this ID as a fully qualified URL, given a server base and resource name (which will only be used if the ID does not already contain those respective parts). Essentially, + * because IdType can contain either a complete URL or a partial one (or even jut a simple ID), this method may be used to translate into a complete URL. + * + * @param theServerBase + * The server base (e.g. "http://example.com/fhir") + * @param theResourceType + * The resource name (e.g. "Patient") + * @return A fully qualified URL for this ID (e.g. "http://example.com/fhir/Patient/1") + */ + @Override + public IdType withServerBase(String theServerBase, String theResourceType) { + return new IdType(theServerBase, theResourceType, getIdPart(), getVersionIdPart()); + } + + /** + * Creates a new instance of this ID which is identical, but refers to the specific version of this resource ID noted by theVersion. + * + * @param theVersion + * The actual version string, e.g. "1" + * @return A new instance of IdType which is identical, but refers to the specific version of this resource ID noted by theVersion. + */ + public IdType withVersion(String theVersion) { + Validate.notBlank(theVersion, "Version may not be null or empty"); + + String existingValue = getValue(); + + int i = existingValue.indexOf("_history"); + String value; + if (i > 1) { + value = existingValue.substring(0, i - 1); + } else { + value = existingValue; + } + + return new IdType(value + '/' + "_history" + '/' + theVersion); + } + + private static boolean isUrlAbsolute(String theValue) { + String value = theValue.toLowerCase(); + return value.startsWith("http://") || value.startsWith("https://"); + } + + /** + * Retrieves the ID from the given resource instance + */ + public static IdType of(IBaseResource theResouce) { + if (theResouce == null) { + throw new NullPointerException("theResource can not be null"); + } else { + IIdType retVal = theResouce.getIdElement(); + if (retVal == null) { + return null; + } else if (retVal instanceof IdType) { + return (IdType) retVal; + } else { + return new IdType(retVal.getValue()); + } + } + } + + private static String toPlainStringWithNpeThrowIfNeeded(BigDecimal theIdPart) { + if (theIdPart == null) { + throw new NullPointerException("BigDecimal ID can not be null"); + } + return theIdPart.toPlainString(); + } + + private static String toPlainStringWithNpeThrowIfNeeded(Long theIdPart) { + if (theIdPart == null) { + throw new NullPointerException("Long ID can not be null"); + } + return theIdPart.toString(); + } + +} diff --git a/src/site/imgsources/hapi-1.1-structs-datatypes.xml b/src/site/imgsources/hapi-1.1-structs-datatypes.xml new file mode 100644 index 00000000000..04e57051bef --- /dev/null +++ b/src/site/imgsources/hapi-1.1-structs-datatypes.xml @@ -0,0 +1,2 @@ + +7VhRb9owEP41PDaCpAnwWKC0L5sqMWnbo5s4iVXHRo5TYL++5+RMAgEadcCEtBeU+2Jf7O++O5/pedNs/aTIMv0mI8p7bj9a97xZz3UDdwC/BthUwL03rIBEsaiCcIQBFuwPRbCPaMEimu8M1FJyzZa7YCiFoKHewWLJ8RPobEkS674GFiHhbfQni3RaoSM3qPFnypLUfmYQjKs3ud5YHxGNScH1XQnBO/M6I9ZXuRDvEQhTUoIb85Stp5Qb0iwhHvViL/Djse+Ho8EwvKuWP+86fLsNRQUu9a9dIoPvhBe40YVWTCQz3WJglTJNF0sSGnsFquh5k1RnHKwBPMZS6AWOLm3G+VRyqcrZ3ng8n4/HgHfYBG70nSpNUXAlhJt6ojKjWm1giH07xH2gGgc+2qs63AMPsbQRaqsggqpLtq5rFuEBiexKql1/TWpInCIVTpwy5WQmlxzDgWIZ0+ydOl/l/CpcWvszLu8vwiWmWkugPzZLeksS9YIOErUUXl6iXotWqRIn5cNKo0zkmoiQGplWev0661dh85BID7F5GZHiQdJg87nIiPhOMnrbhdT9t4UUe4rPCmmU68J1QpktZQ7UAhRwWNfkVcFTYp5OhaNB/aHIXIXmrjXWhuO8NI+Oy/eWS+xB8V6vxGIP2b3Efpn0q5DZtcJeRKI2Qg1OaAQ9PppS6VQmUhD+WKMTJQsRUeOyv8sXXTP9y8COj9ZvHERF9KCUXIEZMZJJAbMNOAcZ28nCXmegz0PBN2xOXimfSBVRZXUvpDDL6R6lXBaqDPWpw0YTldCjjtCTIelktBXlxLSgOxelQ6HDqS+Sweq3KnFtkbIqsRcK66JaJc6qBQAkE/N5O2xpBuQtiWwX2kk1PiXxKPCGw6HrD4gfb0VfZ2BLRXlKoKPxZmGh+GaiSPhmOD14EDQEVCvrYl24TS3b4Fi7kX42KZrZNzpD9rV4bPfgL/bq0j5qZ0QTDW0iRHP/VYt9IMPgDWZzreQb3cuc5iGCEOEsEWCqausTwyyDG/8D4hmLorIIHIqkhNExL7M8hXEUJlwkiPtNqrUbMbTxOneP2ophu+G/2VzYEvRJLowvweN9i8ep7Tv/58KJIO7HMPDb7UT/WsmA94oj3QTSepX24VxNAbbwp5sCrAHnawqOBADM+m/Q6iCv/0T2Hj8A \ No newline at end of file diff --git a/src/site/imgsources/hapi-1.1-structs-resource.xml b/src/site/imgsources/hapi-1.1-structs-resource.xml index 4a42551c615..86ab1ae797d 100644 --- a/src/site/imgsources/hapi-1.1-structs-resource.xml +++ b/src/site/imgsources/hapi-1.1-structs-resource.xml @@ -1,2 +1,2 @@ -5Vnfb6M4EP5r8rgoQAnJY5M2e5XupNX2pLt7dMGAVceOjNk299fvGI8DAdpL24RudC+R/fn3N994PGQSrjbPXxXZFn/IlPJJME2fJ+HNJAhmgQ+/BthZ4CqMLZArlloIexjgnv1LEZwiWrGUlgcdtZRcs+0hmEghaKIPsExyXAIn25LcTd8A9wnhffQvlurCovNg1uC/UZYXbhl/trAtpd65OVKakYrrLzUEbaZ5Q9xc9UbCWyBMSQnTmNLmeUW5Ic0REtIwC2dRtoiiZO7HyRe7/fWx3ffHUFTgVj865dxO+YPwCs95tyQl/U5LWamE9lh4Kpim91sCTeHNEyhjEi4LveFQ86GYSaHvsXddZ5yvJJeqHh3eXN366whwXJUqTVFQx5yt7oMH+0rlhmq1gzE4QzBDNaAiI6w+NRb3rxArWtZ2IiIovHw/c0MkFJDLI3lF/bR4lSr3Ch57WcGUx0SpiUioZ0RkXMsjW+Z9nHrrZr6pl9CTifx3mplzAm8OWUqt5eYQ+450tKA/JSxQA2MYKz7SWA47qbHcndT2gkv0AN+xiKT6Qy4QjuUCoMIuqwnxqkJYF7CyN4sa5b+X7lFoHBLnEI3nESfGmrY4r8XuEvUZdpx+UJ+jXdF++K47+gPcj8Lp596kVz1OaApPMaxKpQuZS0H4bYMulaxESs2U00O+6DPTfxvYM4o0tX+wE7CldrYpqNtM3TTWw0R6rZR8guoDl8mjhdYg9P1o9yCtI6XdstnnG40C57Q6eD2saKJy+tJE9UOhb11FOdHsx+GOTmuqaHRTxb+uqfCS/UVNhXlK66b6BkuaI5/29l8s1uvFYqSwOvhAH+91gunqf71O0lJXgafwxvde4r3F8ZAJRuHzc58p/UzyAjXajaafm0T6b84i30n5KFR+6sPE2ef80e5tAa2btXPyQPlSqpQqp3khhdnM2UIfBpdXQ5/N5T4Q+3DoN8mMOvdfAdz15DTinkxuCrspHNWYHygmZnnXbWs6lD2B7Dd6lGYiSrL5LIzjOIh8EmWOvZb39TRUFmRrikml+G6pSPJoKBwMAS35NLo6WwrrnMh9ne37nvOItuv58xP4Xo/HfgLbJFAzbvh6UFDKTelOaKoyIM5as8010GN6tHgstZKPtOMn7XCBEOEsF1BV9qRLwzWDr8PXiG9YmtYOP2Q3Cb0zXnt0Af0oDDiLybp5nHOFlsmcdU59W/Ys1s+ML1b5x0r/LMrHbHhQ+dM7jN5QXHFSlkbyXXf4vzlB13jOKdpvhulYXoAZwgtPBqR1hDfC2SI/Ptlfj/z1XXD6rBeqzT9lNlo3/zOGtz8B \ No newline at end of file +3Vnfb6M4EP5rIt09LApQ8uOxpM1upTupak+6u0cXDFh1cGScbXN//Y7xODhAu+k2Ie29RPjzD+xvvvHMkFG4WD1/lWRd/ClSykfBOH0ehVejIJgEPvxqYGuAi3BqgFyy1EA4QgP37D+K4BjRDUtptTdQCcEVW++DiShLmqg9LBMcX4GLrUlul2+A+4TwLvo3S1Vh0FkwafBvlOWFfY0/mZueSm3tGinNyIarLzUEfbp7Rexa9UbCayBMCgHL6KfV84JyTZolJKRhFk6ibB5FycyfJl/M9peHDt8dQ9ISt/reJWdmye+Eb/CcNzGp6B2txEYmtMPCU8EUvV8T6AqvnkAZozAu1IpDy4fHTJTqHkfXbcb5QnAh69nh1cW1v4wAx7dSqSgK6pCz1WPwYF+pWFEltzAHVwgmqAZUZITNp8bi/gVihWNtKyKCwst3KzdEwgNyeSCvqB+HVyFzr+BTLyuY9FhZKVIm1NMi0q7lkTXz3k+9cTNftysYycr8D5rpcwJvFomFUmK1j90hHQ70l4AX1MAQxpoeaCyLHdVY9k5yvaAxw/i3b5e3N7+PggmHTcQPEp5y/fSZnMO3BCPffp93hEN5Bwi0TXhCvE1RGu8wHqFfqp3iVx1iEBr7dNtH42l0i2HI1e1luXWle/fZhRu2Lope4Q52rfvhL93re0Y5v4o7nJ739r3ocEJTSN+wKaQqRC5Kwq8bNJZiU6ZULzne54s+M/WPhj2tSN36FwcBW3JruoK6T7d1Zz2tTC+lFE/QfOAieTTQEoS+m22T2Dq6mi3rfb7RKHBOo4PXQ5EiMqcvLVQnF13rSsqJYt/3d3RcU0WDm2r6cU2Ft+8HNRXWNs5NdQuv1EceLKOZz5fL+XygUNyb7w+X0WD1+7OMJq3UJvAkBgNvZ5IW7w7HfSYYhM/zpjbdwtSR7xBZzUnF247A5y1W/TdXqy/p9gMkM+ctJa19Th8h3xYE218HOHmgPBYypdJqvhSl3szJwiUGpFfDpSkM3xEvceqtYPVNYb822HvLasSmWXYJsymc1ZgfKCb69XbYWg+oOgLZbfQgzUSUZLNJOJ1Og8gnUWbZc7yvo6GqIGv9mGwk38aSJI+awt7Y4Min0dXJ6mHrRPYrcNf3rEe4rufPjuB7HR671XBTdLWDxU2pqMyAOGNNl2ugR49weKyUFI+05SduuECIcJaX0JTmpLHmmsFX6EvEVyxNa4fvs5uA0RmvPbqAcRQmnMRk7drPuoJjMmudY9+WHYt1q+lPq/xDpX8S5WMF3av88Q1Gb3hccFJVWvI/zZ3+507QNp51CjdnGA/lBVg6vJAyIK0D5Agni/yYy78e+eu74PiVMjSbf+RMtG7+zwyvfwA= \ No newline at end of file diff --git a/src/site/resources/images/hapi-1.1-structs-datatypes.png b/src/site/resources/images/hapi-1.1-structs-datatypes.png new file mode 100644 index 0000000000000000000000000000000000000000..6edecf3dc8bf633d7a65a77bd87fe4d87b9b5d8e GIT binary patch literal 19761 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± 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 literal 22819 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 Btdsx% diff --git a/src/site/xdoc/doc_upgrading.xml b/src/site/xdoc/doc_upgrading.xml index ca6bc170710..c7752150b18 100644 --- a/src/site/xdoc/doc_upgrading.xml +++ b/src/site/xdoc/doc_upgrading.xml @@ -11,11 +11,64 @@

- HAPI 1.1 introduces support for the "reference i" + Since the early days of FHIR, HL7.org has provided an + open source "Java Reference Implementation", which is an implementation + of a FHIR data model, parser, and client in Java. +

+

+ HAPI was originally started as a separate Java implementation of FHIR, + but with a fairly different focus: implementing servers with an easily + extendible data model. Over time though, the two Java implementations have + shown a fair bit of overlap, so at the 2014 + DevDays we decided + to try and harmonize the two libraries. +

+

+ HAPI FHIR 1.1 begins the availability of a harmonized library. Note that + this version has not yet been formally released, but is currently available in + "snapshot" development builds. +

+

+ For HAPI FHIR users: This integration will bring the ability to use powerful features + from the RI in your applications, such as the resource validator and the narrative + generator. +

+

+ For RI users: This integration will bring the ability to use HAPI's client + and server frameworks in your application, as well as the ability to take advantage + of HAPI's code-first statically bound extension mechanism.

- Structures - + +

+ At this point, the RI integration consists of a new parallel set of + classes representing the FHIR data model. For example, in addition to the + Patient classes representing HAPI's DSTU1 and DSTU2 models there is now + a new Patient class representing the RI structure (which is also a DSTU2 + structure). +

+

+ The reference implementation (RI) structures have been added as a new + maven dependency library called hapi-fhir-structures-hl7org-dstu2. See + the download page for information on the Maven + dependencies for this version of the structures. +

+

+ A new interface has been added which serves as a master interface + for all resource classes: org.hl7.fhir.instance.model.api.IBaseResource. + All RI resource classes will be in the package org.hl7.fhir.instance.model, + as shown below. +

+ Structures + +

+ Datatypes will also be found inthe same package. Unlike HAPI datatype structures, + which all end with "Dt", the RI primitive structure names end with "Type" and the + RI composite structures have no suffix, as shown below. +

+ Structures + +