001// -------------------------------------------------------------------------------- 002// Copyright 2002-2024 Echo Three, LLC 003// 004// Licensed under the Apache License, Version 2.0 (the "License"); 005// you may not use this file except in compliance with the License. 006// You may obtain a copy of the License at 007// 008// http://www.apache.org/licenses/LICENSE-2.0 009// 010// Unless required by applicable law or agreed to in writing, software 011// distributed under the License is distributed on an "AS IS" BASIS, 012// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013// See the License for the specific language governing permissions and 014// limitations under the License. 015// -------------------------------------------------------------------------------- 016 017package com.echothree.model.control.uom.server.util; 018 019import com.echothree.model.control.uom.server.control.UomControl; 020import com.echothree.model.data.uom.server.entity.UnitOfMeasureEquivalent; 021import com.echothree.model.data.uom.server.entity.UnitOfMeasureKind; 022import com.echothree.model.data.uom.server.entity.UnitOfMeasureType; 023import com.echothree.util.server.string.UnitOfMeasureUtils; 024import java.util.Iterator; 025import java.util.List; 026 027public class Conversion { 028 029 private UomControl uomControl; 030 private UnitOfMeasureKind unitOfMeasureKind; 031 private UnitOfMeasureType unitOfMeasureType; 032 private long quantity; 033 034 /** Creates a new instance of Conversion */ 035 public Conversion(UomControl uomControl, UnitOfMeasureKind unitOfMeasureKind, Long quantity) { 036 this.uomControl = uomControl; 037 this.unitOfMeasureKind = unitOfMeasureKind; 038 this.quantity = quantity; 039 } 040 041 /** Creates a new instance of Conversion */ 042 public Conversion(UomControl uomControl, UnitOfMeasureType unitOfMeasureType, Long quantity) { 043 this.uomControl = uomControl; 044 this.unitOfMeasureType = unitOfMeasureType; 045 this.quantity = quantity; 046 } 047 048 049 private void convertToHighestUnitOfMeasureType(UnitOfMeasureType unitOfMeasureType, long measure) { 050 List<UnitOfMeasureEquivalent> unitOfMeasureEquivalents = uomControl.getUnitOfMeasureEquivalentsByToUnitOfMeasureType(unitOfMeasureType); 051 UnitOfMeasureType attemptUnitOfMeasureType = unitOfMeasureType; 052 long attemptMeasure = measure; 053 054 if(!unitOfMeasureEquivalents.isEmpty()) { 055 for(var unitOfMeasureEquivalent : unitOfMeasureEquivalents) { 056 long toQuantity = unitOfMeasureEquivalent.getToQuantity(); 057 058 // If there's no remainder, then check to see if its lower than the existing attemptMeasure 059 if(measure % toQuantity == 0) { 060 long trialMeasure = measure / toQuantity; 061 062 if(trialMeasure < attemptMeasure) { 063 attemptUnitOfMeasureType = unitOfMeasureEquivalent.getFromUnitOfMeasureType(); 064 attemptMeasure = trialMeasure; 065 } 066 } 067 } 068 069 if(attemptMeasure != measure) { 070 convertToHighestUnitOfMeasureType(attemptUnitOfMeasureType, attemptMeasure); 071 } 072 } 073 074 if(this.unitOfMeasureType == null) { 075 this.unitOfMeasureType = attemptUnitOfMeasureType; 076 quantity = attemptMeasure; 077 } 078 } 079 080 public Conversion convertToHighestUnitOfMeasureType() { 081 convertToHighestUnitOfMeasureType(UnitOfMeasureUtils.getInstance().getLowestUnitOfMeasureType(uomControl, unitOfMeasureKind), quantity); 082 083 return this; 084 } 085 086 public Conversion convertToLowestUnitOfMeasureType() { 087 List<UnitOfMeasureEquivalent> unitOfMeasureEquivalents = uomControl.getUnitOfMeasureEquivalentsByFromUnitOfMeasureType(unitOfMeasureType); 088 089 while(!unitOfMeasureEquivalents.isEmpty()) { 090 Iterator<UnitOfMeasureEquivalent> iter = unitOfMeasureEquivalents.iterator(); 091 UnitOfMeasureEquivalent unitOfMeasureEquivalent = iter.next(); 092 093 unitOfMeasureType = unitOfMeasureEquivalent.getToUnitOfMeasureType(); 094 quantity = quantity * unitOfMeasureEquivalent.getToQuantity(); 095 096 unitOfMeasureEquivalents = uomControl.getUnitOfMeasureEquivalentsByFromUnitOfMeasureType(unitOfMeasureType); 097 } 098 099 return this; 100 } 101 102 public UnitOfMeasureKind getUnitOfMeasureKind() { 103 return unitOfMeasureKind; 104 } 105 106 public void setUnitOfMeasureKind(UnitOfMeasureKind unitOfMeasureKind) { 107 this.unitOfMeasureKind = unitOfMeasureKind; 108 } 109 110 public UnitOfMeasureType getUnitOfMeasureType() { 111 return unitOfMeasureType; 112 } 113 114 public void setUnitOfMeasureType(UnitOfMeasureType unitOfMeasureType) { 115 this.unitOfMeasureType = unitOfMeasureType; 116 } 117 118 public Long getQuantity() { 119 return quantity; 120 } 121 122 public void setQuantity(Long quantity) { 123 this.quantity = quantity; 124 } 125 126}