001// -------------------------------------------------------------------------------- 002// Copyright 2002-2025 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.UnitOfMeasureKind; 021import com.echothree.model.data.uom.server.entity.UnitOfMeasureType; 022import com.echothree.util.server.string.UnitOfMeasureUtils; 023 024public class Conversion { 025 026 private UomControl uomControl; 027 private UnitOfMeasureKind unitOfMeasureKind; 028 private UnitOfMeasureType unitOfMeasureType; 029 private long quantity; 030 031 /** Creates a new instance of Conversion */ 032 public Conversion(UomControl uomControl, UnitOfMeasureKind unitOfMeasureKind, Long quantity) { 033 this.uomControl = uomControl; 034 this.unitOfMeasureKind = unitOfMeasureKind; 035 this.quantity = quantity; 036 } 037 038 /** Creates a new instance of Conversion */ 039 public Conversion(UomControl uomControl, UnitOfMeasureType unitOfMeasureType, Long quantity) { 040 this.uomControl = uomControl; 041 this.unitOfMeasureType = unitOfMeasureType; 042 this.quantity = quantity; 043 } 044 045 046 private void convertToHighestUnitOfMeasureType(UnitOfMeasureType unitOfMeasureType, long measure) { 047 var unitOfMeasureEquivalents = uomControl.getUnitOfMeasureEquivalentsByToUnitOfMeasureType(unitOfMeasureType); 048 var attemptUnitOfMeasureType = unitOfMeasureType; 049 var attemptMeasure = measure; 050 051 if(!unitOfMeasureEquivalents.isEmpty()) { 052 for(var unitOfMeasureEquivalent : unitOfMeasureEquivalents) { 053 long toQuantity = unitOfMeasureEquivalent.getToQuantity(); 054 055 // If there's no remainder, then check to see if its lower than the existing attemptMeasure 056 if(measure % toQuantity == 0) { 057 var trialMeasure = measure / toQuantity; 058 059 if(trialMeasure < attemptMeasure) { 060 attemptUnitOfMeasureType = unitOfMeasureEquivalent.getFromUnitOfMeasureType(); 061 attemptMeasure = trialMeasure; 062 } 063 } 064 } 065 066 if(attemptMeasure != measure) { 067 convertToHighestUnitOfMeasureType(attemptUnitOfMeasureType, attemptMeasure); 068 } 069 } 070 071 if(this.unitOfMeasureType == null) { 072 this.unitOfMeasureType = attemptUnitOfMeasureType; 073 quantity = attemptMeasure; 074 } 075 } 076 077 public Conversion convertToHighestUnitOfMeasureType() { 078 convertToHighestUnitOfMeasureType(UnitOfMeasureUtils.getInstance().getLowestUnitOfMeasureType(uomControl, unitOfMeasureKind), quantity); 079 080 return this; 081 } 082 083 public Conversion convertToLowestUnitOfMeasureType() { 084 var unitOfMeasureEquivalents = uomControl.getUnitOfMeasureEquivalentsByFromUnitOfMeasureType(unitOfMeasureType); 085 086 while(!unitOfMeasureEquivalents.isEmpty()) { 087 var iter = unitOfMeasureEquivalents.iterator(); 088 var unitOfMeasureEquivalent = iter.next(); 089 090 unitOfMeasureType = unitOfMeasureEquivalent.getToUnitOfMeasureType(); 091 quantity = quantity * unitOfMeasureEquivalent.getToQuantity(); 092 093 unitOfMeasureEquivalents = uomControl.getUnitOfMeasureEquivalentsByFromUnitOfMeasureType(unitOfMeasureType); 094 } 095 096 return this; 097 } 098 099 public UnitOfMeasureKind getUnitOfMeasureKind() { 100 return unitOfMeasureKind; 101 } 102 103 public void setUnitOfMeasureKind(UnitOfMeasureKind unitOfMeasureKind) { 104 this.unitOfMeasureKind = unitOfMeasureKind; 105 } 106 107 public UnitOfMeasureType getUnitOfMeasureType() { 108 return unitOfMeasureType; 109 } 110 111 public void setUnitOfMeasureType(UnitOfMeasureType unitOfMeasureType) { 112 this.unitOfMeasureType = unitOfMeasureType; 113 } 114 115 public Long getQuantity() { 116 return quantity; 117 } 118 119 public void setQuantity(Long quantity) { 120 this.quantity = quantity; 121 } 122 123}