/* * Copyright 2015 Open mHealth * * 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. */ package org.openmhealth.schema.domain.omh; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonValue; import com.fasterxml.jackson.databind.PropertyNamingStrategy; import com.fasterxml.jackson.databind.annotation.JsonNaming; import com.google.common.collect.Maps; import org.openmhealth.schema.serializer.SerializationConstructor; import javax.annotation.Nullable; import java.util.HashMap; import java.util.Map; import static com.google.common.base.Preconditions.checkNotNull; /** * A measurement of blood oxygen saturation. * * @author Chris Schaefbauer * @version 1.0 * @see * <a href="http://www.openmhealth.org/documentation/#/schema-docs/schema-library/schemas/omh_oxygen-saturation">oxygen-saturation</a> */ @JsonInclude(JsonInclude.Include.NON_NULL) @JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class) public class OxygenSaturation extends Measure { public static final SchemaId SCHEMA_ID = new SchemaId(OMH_NAMESPACE, "oxygen-saturation", "1.0"); /** * A route by which supplemental oxygen is being administered. */ public enum SupplementalOxygenAdministrationMode implements SchemaEnumValue { NASAL_CANNULA; private String schemaValue; private static final Map<String, SupplementalOxygenAdministrationMode> constantsBySchemaValue = Maps.newHashMap(); static { for (SupplementalOxygenAdministrationMode mode : values()) { constantsBySchemaValue.put(mode.getSchemaValue(), mode); } } SupplementalOxygenAdministrationMode() { this.schemaValue = name().toLowerCase().replace('_', ' '); } @JsonValue @Override public String getSchemaValue() { return schemaValue; } @Nullable @JsonCreator public static SupplementalOxygenAdministrationMode findBySchemaValue(String schemaValue) { return constantsBySchemaValue.get(schemaValue); } } /** * A body system used to measure oxygen saturation. */ public enum MeasurementSystem implements SchemaEnumValue { PERIPHERAL_CAPILLARY; private String schemaValue; private static final Map<String, MeasurementSystem> constantsBySchemaValue = Maps.newHashMap(); static { for (MeasurementSystem system : values()) { constantsBySchemaValue.put(system.getSchemaValue(), system); } } MeasurementSystem() { this.schemaValue = name().toLowerCase().replace('_', ' '); } @JsonValue @Override public String getSchemaValue() { return schemaValue; } @Nullable @JsonCreator public static MeasurementSystem findBySchemaValue(String schemaValue) { return constantsBySchemaValue.get(schemaValue); } } /** * A method used to measure the oxygen saturation value. Pulse oximetry is currently the only method used for * measuring oxygen saturation in a non-hospital setting. */ public enum MeasurementMethod implements SchemaEnumValue { PULSE_OXIMETRY; private String schemaValue; private static final Map<String, MeasurementMethod> constantsBySchemaValue = new HashMap<>(); static { for (MeasurementMethod constant : values()) { constantsBySchemaValue.put(constant.getSchemaValue(), constant); } } MeasurementMethod() { this.schemaValue = name().toLowerCase().replace('_', ' '); } @JsonValue @Override public String getSchemaValue() { return schemaValue; } @Nullable @JsonCreator public static MeasurementMethod findBySchemaValue(String schemaValue) { return constantsBySchemaValue.get(schemaValue); } } private TypedUnitValue<PercentUnit> oxygenSaturation; private MeasurementSystem measurementSystem; private MeasurementMethod measurementMethod; private TypedUnitValue<OxygenFlowRateUnit> supplementalOxygenFlowRate; private SupplementalOxygenAdministrationMode supplementalOxygenAdministrationMode; @SerializationConstructor protected OxygenSaturation() { } public static class Builder extends Measure.Builder<OxygenSaturation, Builder> { private final TypedUnitValue<PercentUnit> oxygenSaturation; private MeasurementSystem measurementSystem; private MeasurementMethod measurementMethod; private TypedUnitValue<OxygenFlowRateUnit> supplementalOxygenFlowRate; private SupplementalOxygenAdministrationMode supplementalOxygenAdministrationMode; public Builder(TypedUnitValue<PercentUnit> oxygenSaturation) { checkNotNull(oxygenSaturation, "An oxygen saturation value hasn't been specified."); this.oxygenSaturation = oxygenSaturation; } public Builder setMeasurementSystem(MeasurementSystem measurementSystem) { this.measurementSystem = measurementSystem; return this; } public Builder setMeasurementMethod(MeasurementMethod measurementMethod) { this.measurementMethod = measurementMethod; return this; } public Builder setSupplementalOxygenFlowRate(TypedUnitValue<OxygenFlowRateUnit> supplementalOxygenFlowRate) { this.supplementalOxygenFlowRate = supplementalOxygenFlowRate; return this; } public Builder setSupplementalOxygenAdministrationMode( SupplementalOxygenAdministrationMode administrationMode) { this.supplementalOxygenAdministrationMode = administrationMode; return this; } @Override public OxygenSaturation build() { return new OxygenSaturation(this); } } private OxygenSaturation(Builder builder) { super(builder); this.oxygenSaturation = builder.oxygenSaturation; this.measurementSystem = builder.measurementSystem; this.supplementalOxygenFlowRate = builder.supplementalOxygenFlowRate; this.supplementalOxygenAdministrationMode = builder.supplementalOxygenAdministrationMode; this.measurementMethod = builder.measurementMethod; } @Override public SchemaId getSchemaId() { return SCHEMA_ID; } public TypedUnitValue<PercentUnit> getOxygenSaturation() { return oxygenSaturation; } public TypedUnitValue<OxygenFlowRateUnit> getSupplementalOxygenFlowRate() { return supplementalOxygenFlowRate; } @JsonProperty("system") public MeasurementSystem getMeasurementSystem() { return measurementSystem; } @JsonProperty("oxygen_therapy_mode_of_administration") public SupplementalOxygenAdministrationMode getSupplementalOxygenAdministrationMode() { return supplementalOxygenAdministrationMode; } public MeasurementMethod getMeasurementMethod() { return measurementMethod; } @SuppressWarnings("SimplifiableIfStatement") @Override public boolean equals(Object object) { if (this == object) { return true; } if (object == null || getClass() != object.getClass()) { return false; } if (!super.equals(object)) { return false; } OxygenSaturation that = (OxygenSaturation) object; if (!oxygenSaturation.equals(that.oxygenSaturation)) { return false; } if (measurementSystem != null ? !measurementSystem.equals(that.measurementSystem) : that.measurementSystem != null) { return false; } if (supplementalOxygenFlowRate != null ? !supplementalOxygenFlowRate.equals(that.supplementalOxygenFlowRate) : that.supplementalOxygenFlowRate != null) { return false; } if (supplementalOxygenAdministrationMode != null ? !supplementalOxygenAdministrationMode.equals(that.supplementalOxygenAdministrationMode) : that.supplementalOxygenAdministrationMode != null) { return false; } return measurementMethod == that.measurementMethod; } @Override public int hashCode() { int result = super.hashCode(); result = 31 * result + oxygenSaturation.hashCode(); result = 31 * result + (measurementSystem != null ? measurementSystem.hashCode() : 0); result = 31 * result + (supplementalOxygenFlowRate != null ? supplementalOxygenFlowRate.hashCode() : 0); result = 31 * result + (supplementalOxygenAdministrationMode != null ? supplementalOxygenAdministrationMode.hashCode() : 0); result = 31 * result + (measurementMethod != null ? measurementMethod.hashCode() : 0); return result; } }