/** * Copyright (c) 2012, Lindsay Bradford and other Contributors. * All rights reserved. * * This program and the accompanying materials are made available * under the terms of the BSD 3-Clause licence which accompanies * this distribution, and is available at * http://opensource.org/licenses/BSD-3-Clause */ package blacksmyth.personalfinancier.model.inflation; import java.util.Calendar; import java.util.Observable; import java.util.Observer; import blacksmyth.personalfinancier.model.Money; import blacksmyth.personalfinancier.model.MoneyFactory; public class InflationConversionModel extends Observable implements Observer { private Money initialValue; private Calendar initialDate; private Money conversionValue; private Calendar conversionDate; private double inflationOverPeriod; private double inflationPerAnnum; private InflationProvider inflationProvider; public void setInflationProvider(InflationProvider inflationProvider) { this.inflationProvider = inflationProvider; Observable providerAsObservable = (Observable) inflationProvider; providerAsObservable.addObserver(this); } public InflationConversionModel(InflationProvider provider) { this.setInflationProvider(provider); this.initialValue = MoneyFactory.createAmount(0); this.initialDate = inflationProvider.getEarliestDate(); this.conversionValue = MoneyFactory.createAmount(0); this.conversionDate = inflationProvider.getLatestDate(); this.inflationOverPeriod = 0; this.inflationPerAnnum = 0; this.changeAndNotifyObservers(); } public Money getInitialValue() { return initialValue; } public void setInitialValue(Money initialValue) { this.initialValue = initialValue; updateConversionValue(); changeAndNotifyObservers(); } public Calendar getInitialDate() { return initialDate; } public void setInitialDate(Calendar initialDate) { this.initialDate = initialDate; updateConversionValue(); changeAndNotifyObservers(); } private void updateConversionValue() { this.conversionValue = inflationProvider.computeComparisonValue( this.initialValue, this.initialDate, this.conversionDate ); } public Money getConversionValue() { return conversionValue; } public void setConversionValue(Money conversionValue) { this.conversionValue = conversionValue; updateInitialValue(); changeAndNotifyObservers(); } public Calendar getConversionDate() { return conversionDate; } public void setConversionDate(Calendar conversionDate) { this.conversionDate = conversionDate; updateInitialValue(); changeAndNotifyObservers(); } private void updateInitialValue() { this.initialValue = inflationProvider.computeComparisonValue( this.conversionValue, this.conversionDate, this.initialDate ); } public double getInflationOverPeriod() { return inflationOverPeriod; } private void setInflationOverPeriod(double inflationOverPeriod) { this.inflationOverPeriod = inflationOverPeriod; } public double getInflationPerAnnum() { return inflationPerAnnum; } private void setInflationPerAnnum(double inflationPerAnnum) { this.inflationPerAnnum = inflationPerAnnum; } public void changeAndNotifyObservers() { this.setChanged(); updateDerivedValues(); this.notifyObservers(); } private void updateDerivedValues() { updateInflationOverPeriod(); updateInflationPerAnnum(); } private void updateInflationOverPeriod() { this.setInflationOverPeriod( inflationProvider.getInflationForDateRange( this.getInitialDate(), this.getConversionDate() ) ); } private void updateInflationPerAnnum() { this.setInflationPerAnnum( inflationProvider.getInflationPerAnnum( this.getInitialDate(), this.getConversionDate() ) ); } public Calendar getEarliestDate() { return inflationProvider.getEarliestDate(); } public Calendar getLatestLatestDate() { return inflationProvider.getLatestDate(); } @Override public void update(Observable arg0, Object arg1) { updateConversionValue(); changeAndNotifyObservers(); } }