001package org.hl7.fhir.dstu2.model;
002
003/*
004  Copyright (c) 2011+, HL7, Inc.
005  All rights reserved.
006  
007  Redistribution and use in source and binary forms, with or without modification, 
008  are permitted provided that the following conditions are met:
009    
010   * Redistributions of source code must retain the above copyright notice, this 
011     list of conditions and the following disclaimer.
012   * Redistributions in binary form must reproduce the above copyright notice, 
013     this list of conditions and the following disclaimer in the documentation 
014     and/or other materials provided with the distribution.
015   * Neither the name of HL7 nor the names of its contributors may be used to 
016     endorse or promote products derived from this software without specific 
017     prior written permission.
018  
019  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
020  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
021  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
022  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
023  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
024  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
025  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
026  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
027  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
028  POSSIBILITY OF SUCH DAMAGE.
029  
030 */
031
032
033
034import java.net.URI;
035import java.net.URISyntaxException;
036
037import org.apache.commons.lang3.StringUtils;
038import ca.uhn.fhir.model.api.annotation.DatatypeDef;
039
040/**
041 * Primitive type "uri" in FHIR: any valid URI. Sometimes constrained to be only an absolute URI, and sometimes constrained to be a literal reference
042 */
043@DatatypeDef(name = "uri")
044public class UriType extends PrimitiveType<String> {
045
046        private static final long serialVersionUID = 3L;
047
048        /**
049         * Constructor
050         */
051        public UriType() {
052                // nothing
053        }
054
055        /**
056         * Constructor
057         */
058        public UriType(String theValue) {
059                setValueAsString(theValue);
060        }
061
062        /**
063         * Constructor
064         */
065        public UriType(URI theValue) {
066                setValue(theValue.toString());
067        }
068
069        @Override
070        public UriType copy() {
071                return new UriType(getValue());
072        }
073
074        @Override
075        protected String encode(String theValue) {
076                return theValue;
077        }
078
079        /**
080         * Compares the given string to the string representation of this URI. In many cases it is preferable to use this
081         * instead of the standard {@link #equals(Object)} method, since that method returns <code>false</code> unless it is
082         * passed an instance of {@link UriType}
083         */
084        public boolean equals(String theString) {
085                return StringUtils.equals(getValueAsString(), theString);
086        }
087
088        @Override
089        public int hashCode() {
090                final int prime = 31;
091                int result = 1;
092
093                String normalize = normalize(getValue());
094                result = prime * result + ((normalize == null) ? 0 : normalize.hashCode());
095
096                return result;
097        }
098
099        private String normalize(String theValue) {
100                if (theValue == null) {
101                        return null;
102                }
103                try {
104                        URI retVal = new URI(getValue()).normalize();
105                        String urlString = retVal.toString();
106                        if (urlString.endsWith("/") && urlString.length() > 1) {
107                                retVal = new URI(urlString.substring(0, urlString.length() - 1));
108                        }
109                        return retVal.toASCIIString();
110                } catch (URISyntaxException e) {
111                        // ourLog.debug("Failed to normalize URL '{}', message was: {}", urlString, e.toString());
112                        return theValue;
113                }
114        }
115
116        @Override
117        protected String parse(String theValue) {
118                return theValue;
119        }
120
121        /**
122         * Creates a new OidType instance which uses the given OID as the content (and prepends "urn:oid:" to the OID string
123         * in the value of the newly created OidType, per the FHIR specification).
124         * 
125         * @param theOid
126         *            The OID to use (<code>null</code> is acceptable and will result in a UriDt instance with a
127         *            <code>null</code> value)
128         * @return A new UriDt instance
129         */
130        public static OidType fromOid(String theOid) {
131                if (theOid == null) {
132                        return new OidType();
133                }
134                return new OidType("urn:oid:" + theOid);
135        }
136
137         @Override
138   public boolean equalsDeep(Base obj) {
139     if (!super.equalsDeep(obj))
140       return false;
141                if (this == obj)
142                        return true;
143                if (obj == null)
144                        return false;
145                if (getClass() != obj.getClass())
146                        return false;
147
148                UriType other = (UriType) obj;
149                if (getValue() == null && other.getValue() == null) {
150                        return true;
151                }
152                if (getValue() == null || other.getValue() == null) {
153                        return false;
154                }
155
156                String normalize = normalize(getValue());
157                String normalize2 = normalize(other.getValue());
158                return normalize.equals(normalize2);
159   }
160
161                public String fhirType() {
162                        return "uri";                   
163                }
164
165}