de.inren.frontend.banking.review.ReviewPanel.java Source code

Java tutorial

Introduction

Here is the source code for de.inren.frontend.banking.review.ReviewPanel.java

Source

/**
 * Copyright 2014 the original author or authors.
 *
 * 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 de.inren.frontend.banking.review;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;

import org.apache.wicket.Component;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.model.util.ListModel;
import org.apache.wicket.spring.injection.annot.SpringBean;

import de.inren.frontend.banking.common.TransactionSummaryListPanel;
import de.inren.frontend.common.panel.MoneyPanel;
import de.inren.service.banking.BankDataService;
import de.inren.service.banking.TransactionSummary;
import de.inren.service.banking.TransactionSummary.TransactionSummaryType;

/**
 * @author Ingo Renner
 *
 */
public class ReviewPanel extends Panel {

    @SpringBean
    private BankDataService bankDataService;

    private ListModel<TransactionSummary> incomeModel;
    private ListModel<TransactionSummary> expensesModel;

    private IModel<Date> startDateModel;
    private IModel<Date> endDateModel;

    public ReviewPanel(String id, IModel<Date> startDateModel, IModel<Date> endDateModel) {
        super(id);
        this.startDateModel = startDateModel;
        this.endDateModel = endDateModel;
        initDateModels();
    }

    private void initDateModels() {
        incomeModel = new ListModel<TransactionSummary>(new ArrayList<TransactionSummary>());
        expensesModel = new ListModel<TransactionSummary>(new ArrayList<TransactionSummary>());
    }

    @Override
    protected void onConfigure() {
        super.onConfigure();
        recalculate();
    }

    private void recalculate() {
        incomeModel.getObject().clear();
        incomeModel.getObject().addAll(bankDataService.calculateTransactionSummary(TransactionSummaryType.INCOME,
                startDateModel.getObject(), endDateModel.getObject()));
        expensesModel.getObject().clear();
        expensesModel.getObject().addAll(bankDataService.calculateTransactionSummary(TransactionSummaryType.EXPENSE,
                startDateModel.getObject(), endDateModel.getObject()));
    }

    @Override
    protected void onInitialize() {
        super.onInitialize();
        final Component balances = new BalanceSummaryPanel("balances", startDateModel, endDateModel);
        final Component incomeTable = getListPanel("income", incomeModel);
        final Component expensesTable = getListPanel("expenses", expensesModel);
        final Component incomeTotalLabel = new MoneyPanel("incomeTotal", createIncomeSummaryModel())
                .setOutputMarkupId(true);
        final Component expensesTotalLabel = new MoneyPanel("expensesTotal", createExpensesSummaryModel())
                .setOutputMarkupId(true);
        final Component monthTotalLabel = new MoneyPanel("monthTotal", createMonthTotalSummaryModel())
                .setOutputMarkupId(true);

        add(balances);
        add(incomeTable);
        add(new Label("incomeTotal.label", new StringResourceModel("incomeTotal.label", ReviewPanel.this, null)));
        add(incomeTotalLabel);

        add(expensesTable);
        add(new Label("expensesTotal.label",
                new StringResourceModel("expensesTotal.label", ReviewPanel.this, null)));
        add(expensesTotalLabel);

        add(new Label("monthTotal.label", new StringResourceModel("monthTotal.label", ReviewPanel.this, null)));
        add(monthTotalLabel);
        setOutputMarkupId(true);
    }

    private IModel<BigDecimal> createIncomeSummaryModel() {
        return new AbstractReadOnlyModel<BigDecimal>() {

            @Override
            public BigDecimal getObject() {
                BigDecimal sum = calculateTotal(incomeModel);
                return sum;
            }

        };
    }

    private IModel<BigDecimal> createExpensesSummaryModel() {
        return new AbstractReadOnlyModel<BigDecimal>() {

            @Override
            public BigDecimal getObject() {
                BigDecimal sum = calculateTotal(expensesModel);
                return sum;
            }

        };
    }

    private BigDecimal calculateTotal(ListModel<TransactionSummary> transactionSummaryModel) {
        BigDecimal total = BigDecimal.ZERO;
        for (TransactionSummary transactionSummary : transactionSummaryModel.getObject()) {
            total = total.add(transactionSummary.getSum());
        }
        return total;
    }

    private Component getListPanel(String id, ListModel<TransactionSummary> model) {
        return new TransactionSummaryListPanel(id, model).setOutputMarkupId(true);
    }

    private IModel<BigDecimal> createMonthTotalSummaryModel() {
        return new AbstractReadOnlyModel<BigDecimal>() {

            @Override
            public BigDecimal getObject() {
                BigDecimal sum = calculateTotal(incomeModel).add(calculateTotal(expensesModel));
                return sum;
            }

        };
    }

}