/*
* Loan.java
*
* Created on January 15, 2002, 10:41 AM
*/
package com.imsl.demo.jsp;
import com.imsl.chart.*;
import com.imsl.math.PrintMatrix;
import com.imsl.math.PrintMatrixFormat;
import com.imsl.finance.Finance;
import java.text.*;
import java.io.*;
import javax.servlet.http.*;
/**
* Loan amortization demo
*/
public class Loan extends JspBean {
static private final NumberFormat DOLLAR_FORMAT = NumberFormat.getCurrencyInstance();
static private String[] columnLabels = {"Principal", "Interest", "Interest Cost", "Total Payments"};
private Chart principalChart;
private Chart interestChart;
private JspBean beanPrincipalChart;
private JspBean beanInterestChart;
private double amount;
private double rate;
private int years;
/** Creates new Loan */
public Loan() {
amount = 100000.;
rate = 8.0;
years = 10;
beanPrincipalChart = new JspBean();
beanPrincipalChart.setSize(200, 200);
beanInterestChart = new JspBean();
beanInterestChart.setSize(200, 200);
}
public void setAmount(double amount) {
this.amount = amount;
}
public double getAmount() {
return amount;
}
public void setRate(double rate) {
this.rate = rate;
}
public double getRate() {
return rate;
}
public void setYears(int years) {
this.years = years;
}
public int getYears() {
return years;
}
public String getPayment() {
double payment = -Finance.pmt(0.01*rate/12., 12*years, amount, 0, Finance.AT_END_OF_PERIOD);
return DOLLAR_FORMAT.format(payment);
}
public String getTotalInterest() {
double r = 0.01*rate/12.;
double interest = -Finance.cumipmt(r, 12*years, amount, 1, 12*years, Finance.AT_END_OF_PERIOD);
return DOLLAR_FORMAT.format(interest);
}
public String getTable() {
int nper = 12*years;
double table[][] = new double[nper-1][4];
double ppmt[] = new double[nper-1];
double ipmt[] = new double[nper-1];
double cumppmt[] = new double[nper-1];
double cumipmt[] = new double[nper-1];
double r = 0.01*rate/12.;
for (int iper = 1; iper < nper; iper++) {
double row[] = table[iper-1];
row[0] = -Finance.ppmt(r, iper, nper, amount, 0, Finance.AT_END_OF_PERIOD);
row[1] = -Finance.ipmt(r, iper, nper, amount, 0, Finance.AT_END_OF_PERIOD);
row[2] = -Finance.cumprinc(r, nper, amount, 1, iper, Finance.AT_END_OF_PERIOD);
row[3] = -Finance.cumipmt(r, nper, amount, 1, iper, Finance.AT_END_OF_PERIOD);
}
PrintMatrixFormat pmf = new MyPrintMatrixFormat();
pmf.setColumnLabels(columnLabels);
pmf.setNumberFormat(DOLLAR_FORMAT);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(bos);
new PrintMatrix(ps, "Amortization Table").printHTML(pmf, table, table.length, table[0].length);
return bos.toString();
}
/**
* PrintMatrix format with right-aligned entries.
*/
static private class MyPrintMatrixFormat extends PrintMatrixFormat {
public String format(int type, Object entry, int row, int col, ParsePosition pos) {
switch (type) {
case PrintMatrixFormat.BEGIN_ENTRY:
return "<TD align='right'>";
default:
return super.format(type, entry, row, col, pos);
}
}
}
/**
* Create the charts
*/
public void createCharts(HttpServletRequest request) {
createPrincipalChart(request);
createInterestChart(request);
}
/**
* Create the principal paid chart
*/
private void createPrincipalChart(HttpServletRequest request) {
principalChart = new Chart((java.awt.Component)null);
beanPrincipalChart.registerChart(principalChart, request);
principalChart.getChartTitle().setTitle("Principal Paid");
AxisXY axis = new AxisXY(principalChart);
axis.setTextFormat("0");
axis.getAxisX().getAxisTitle().setTitle("Months");
axis.getAxisY().getAxisTitle().setTitle("Dollars (x1000)");
int nper = 12*years;
double x[] = new double[nper-1];
double y[] = new double[nper-1];
for (int iper = 1; iper < nper; iper++) {
double r = 0.01*rate/12.;
x[iper-1] = iper;
y[iper-1] = -0.001*Finance.cumprinc(r, nper, amount, 1, iper, Finance.AT_END_OF_PERIOD);
}
Data data = new Data(axis, x, y);
data.setDataType(Data.DATA_TYPE_FILL);
data.setFillColor("green");
}
/**
* Create the interest costs chart
*/
private void createInterestChart(HttpServletRequest request) {
interestChart = new Chart();
beanInterestChart.registerChart(interestChart, request);
interestChart.getChartTitle().setTitle("Interest Costs");
AxisXY axis = new AxisXY(interestChart);
axis.setTextFormat("0");
axis.getAxisX().getAxisTitle().setTitle("Months");
axis.getAxisY().getAxisTitle().setTitle("Dollars (x1000)");
int nper = 12*years;
double x[] = new double[nper-1];
double y[] = new double[nper-1];
for (int iper = 1; iper < nper; iper++) {
double r = 0.01*rate/12.;
x[iper-1] = iper;
y[iper-1] = -0.001*Finance.cumipmt(r, nper, amount, 1, iper, Finance.AT_END_OF_PERIOD);
}
Data data = new Data(axis, x, y);
data.setDataType(Data.DATA_TYPE_FILL);
data.setFillColor("red");
}
public String getPrincipalChartImageTag() {
return beanPrincipalChart.getImageTag();
}
public String getInterestChartImageTag() {
return beanInterestChart.getImageTag();
}
}