be.roots.taconic.pricingguide.domain.Toc.java Source code

Java tutorial

Introduction

Here is the source code for be.roots.taconic.pricingguide.domain.Toc.java

Source

package be.roots.taconic.pricingguide.domain;

/**
 *  This file is part of the Taconic Pricing Guide generator.  This code will
 *  generate a full featured PDF Pricing Guide by using using iText
 *  (http://www.itextpdf.com) based on JSON files.
 *
 *  Copyright (C) 2015  Roots nv
 *  Authors: Koen Dehaen (koen.dehaen@roots.be)
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU Affero General Public License as
 *  published by the Free Software Foundation, either version 3 of the
 *  License, or (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Affero General Public License for more details.
 *
 *  You should have received a copy of the GNU Affero General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 *  For more information, please contact Roots nv at this address: support@roots.be
 *
 */

import be.roots.taconic.pricingguide.service.PDFServiceImpl;
import be.roots.taconic.pricingguide.util.IntUtil;
import be.roots.taconic.pricingguide.util.iTextUtil;
import org.springframework.util.StringUtils;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Toc {

    public static final String BEFORE_SORT_PREFIX = "AAA";
    public static final String TOC_SORT_PREFIX = "CCC";
    public static final String MODEL_SORT_PREFIX = "MODEL";
    public static final String AFTER_SORT_PREFIX = "ZZZ";

    private List<TocEntry> entries = new ArrayList<>();
    private int nextPageNumber = 1;

    public List<TocEntry> getEntries() {
        return entries;
    }

    public void addEntries(int level, List<String> pageNames, byte[] pages, boolean includedInToc, String sort)
            throws IOException {
        int numberOfPages = iTextUtil.numberOfPages(pages);
        if (pages == null) {
            numberOfPages = 1;
        }

        int i = 0;
        for (String pageName : pageNames) {
            entries.add(new TocEntry(level, pageName, includedInToc, nextPageNumber, numberOfPages,
                    sort + "___" + IntUtil.format(i++)));
        }
        if (pages != null) {
            nextPageNumber += numberOfPages;
        }
    }

    public void addTocEntry(int numberOfPages) {
        getEntries().add(new TocEntry(1, "Table of contents", false, nextPageNumber, numberOfPages,
                TOC_SORT_PREFIX + "___Table of contents"));
        nextPageNumber += numberOfPages;
    }

    public String getPageSequence() {

        int currentPageNumber = 1;
        int nextPageNumber = 1;

        String pageSequence = "";
        for (TocEntry entry : getEntriesSorted()) {

            // setting the correct page number
            if (entry.isNotSecondItemOnSamePage()) {
                currentPageNumber = nextPageNumber;
            }
            entry.setFinalPageNumber(currentPageNumber);
            if (entry.isNotSecondItemOnSamePage() && !entry.isModelHeader()) {
                nextPageNumber = currentPageNumber + entry.getNumberOfPages();
            }

            // calculating the pagesequence
            if (entry.getNumberOfPages() > 0) {
                if (!StringUtils.isEmpty(pageSequence)) {
                    pageSequence += ",";
                }
                if (entry.getNumberOfPages() == 1) {
                    pageSequence += entry.getOriginalPageNumber();
                } else {
                    pageSequence += entry.getOriginalPageNumber() + "-"
                            + (entry.getOriginalPageNumber() + entry.getNumberOfPages() - 1);
                }
            }
        }

        return pageSequence;

    }

    public List<TocEntry> getTocEntries() {
        final List<TocEntry> contents = new ArrayList<>();
        for (TocEntry entry : entries) {
            if (entry.isIncludedInToc()) {
                contents.add(entry);
            }
        }
        return contents;

    }

    public int getNumberOfPages() {

        final int size = this.getTocEntries().size();
        if (size <= PDFServiceImpl.getNumberOfItemsPerTocPage(0)) {
            return 1;
        } else {
            return ((size - PDFServiceImpl.getNumberOfItemsPerTocPage(0))
                    / PDFServiceImpl.getNumberOfItemsPerTocPage(1)) + 2;
        }
    }

    public List<TocEntry> getEntriesSorted() {
        final List<TocEntry> contents = new ArrayList<>(entries);
        Collections.sort(contents);
        return contents;
    }

    public int getFirstPageOfToc() {
        final List<TocEntry> contents = getEntriesSorted();
        int pageNumber = 1;
        for (TocEntry tocEntry : contents) {
            if (tocEntry.getSort().startsWith(TOC_SORT_PREFIX)) {
                return pageNumber;
            }
            pageNumber += tocEntry.getNumberOfPages();
        }

        return -1;
    }

    public int getLastPageNumberOfModelPages() {
        final List<TocEntry> contents = getEntriesSorted();
        int pageNumber = 1;
        int oldPageNumber = contents.get(0).getOriginalPageNumber();
        for (TocEntry tocEntry : contents) {
            if (tocEntry.getSort().startsWith(AFTER_SORT_PREFIX)) {
                return pageNumber - 1;
            }
            if (oldPageNumber != tocEntry.getOriginalPageNumber()) {
                pageNumber += tocEntry.getNumberOfPages();
                oldPageNumber = tocEntry.getOriginalPageNumber();
            }
        }

        return -1;
    }

}