001/*
002Copyright (c) 2011+, HL7, Inc
003All rights reserved.
004
005Redistribution and use in source and binary forms, with or without modification, 
006are permitted provided that the following conditions are met:
007
008 * Redistributions of source code must retain the above copyright notice, this 
009   list of conditions and the following disclaimer.
010 * Redistributions in binary form must reproduce the above copyright notice, 
011   this list of conditions and the following disclaimer in the documentation 
012   and/or other materials provided with the distribution.
013 * Neither the name of HL7 nor the names of its contributors may be used to 
014   endorse or promote products derived from this software without specific 
015   prior written permission.
016
017THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
018ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
019WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
020IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
021INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
022NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
023PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
024WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
025ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
026POSSIBILITY OF SUCH DAMAGE.
027
028 */
029package org.hl7.fhir.r4.model;
030
031/*-
032 * #%L
033 * org.hl7.fhir.r4
034 * %%
035 * Copyright (C) 2014 - 2019 Health Level 7
036 * %%
037 * Licensed under the Apache License, Version 2.0 (the "License");
038 * you may not use this file except in compliance with the License.
039 * You may obtain a copy of the License at
040 * 
041 *      http://www.apache.org/licenses/LICENSE-2.0
042 * 
043 * Unless required by applicable law or agreed to in writing, software
044 * distributed under the License is distributed on an "AS IS" BASIS,
045 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
046 * See the License for the specific language governing permissions and
047 * limitations under the License.
048 * #L%
049 */
050
051
052import ca.uhn.fhir.model.api.IElement;
053import org.apache.commons.codec.binary.Base64;
054
055import ca.uhn.fhir.model.api.annotation.DatatypeDef;
056import org.hl7.fhir.instance.model.api.IBaseHasExtensions;
057import org.hl7.fhir.instance.model.api.IPrimitiveType;
058
059import java.io.Externalizable;
060import java.io.IOException;
061import java.io.ObjectInput;
062import java.io.ObjectOutput;
063
064/**
065 * Primitive type "base64Binary" in FHIR: a sequence of bytes represented in base64
066 */
067@DatatypeDef(name = "base64Binary")
068public class Base64BinaryType extends PrimitiveType<byte[]> implements IPrimitiveType<byte[]>, IBaseHasExtensions, IElement, Externalizable {
069
070  private static final long serialVersionUID = 3L;
071  private byte[] myValue;
072
073  /**
074   * Constructor
075   */
076  public Base64BinaryType() {
077    super();
078  }
079
080  public Base64BinaryType(byte[] theBytes) {
081    super();
082    setValue(theBytes);
083  }
084
085  public Base64BinaryType(String theValue) {
086    super();
087    setValueAsString(theValue);
088  }
089
090  protected byte[] parse(String theValue) {
091    return Base64.decodeBase64(theValue.getBytes(ca.uhn.fhir.rest.api.Constants.CHARSET_UTF8));
092  }
093
094  protected String encode(byte[] theValue) {
095    if (theValue == null) {
096      return null;
097    }
098    return new String(Base64.encodeBase64(theValue), ca.uhn.fhir.rest.api.Constants.CHARSET_UTF8);
099  }
100
101  @Override
102  public Base64BinaryType copy() {
103    return new Base64BinaryType(getValue());
104  }
105
106  @Override
107  protected Type typedCopy() {
108    return null;
109  }
110
111  public String fhirType() {
112    return "base64Binary";
113  }
114
115  @Override
116  public void writeExternal(ObjectOutput out) throws IOException {
117    out.writeObject(getValue());
118  }
119
120  @Override
121  public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
122    setValue((byte[]) in.readObject());
123  }
124
125  @Override
126  public String getValueAsString() {
127    return encode(myValue);
128  }
129
130  @Override
131  public void setValueAsString(String theValue) throws IllegalArgumentException {
132    setValue(parse(theValue));
133  }
134
135  @Override
136  public byte[] getValue() {
137    return myValue;
138  }
139
140  @Override
141  public Base64BinaryType setValue(byte[] theValue) throws IllegalArgumentException {
142    myValue = theValue;
143    return this;
144  }
145
146  @Override
147  public boolean hasValue() {
148    return myValue != null && myValue.length > 0;
149  }
150
151  @Override
152  public boolean isEmpty() {
153    // Custom isEmpty() in order to avoid generating the text representation unneccessarily
154    return ca.uhn.fhir.util.ElementUtil.isEmpty(id, extension) && !hasValue();
155  }
156
157}