org.generationcp.middleware.util.PoiEventUserModel.java Source code

Java tutorial

Introduction

Here is the source code for org.generationcp.middleware.util.PoiEventUserModel.java

Source

/*******************************************************************************
 * Copyright (c) 2012, All Rights Reserved.
 *
 * Generation Challenge Programme (GCP)
 *
 *
 * This software is licensed for use under the terms of the GNU General Public License (http://bit.ly/8Ztv8M) and the provisions of Part F
 * of the Generation Challenge Programme Amended Consortium Agreement (http://bit.ly/KQX1nL)
 *
 *******************************************************************************/

package org.generationcp.middleware.util;

import java.io.InputStream;

import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xssf.eventusermodel.XSSFReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

public class PoiEventUserModel {

    private static final Logger LOG = LoggerFactory.getLogger(PoiEventUserModel.class);
    int maxLimit = 10000;

    public void areSheetRowsOverMaxLimit(String filename, int sheetIndex) throws Exception {
        this.areSheetRowsOverMaxLimit(filename, sheetIndex, this.maxLimit);
    }

    public void areSheetRowsOverMaxLimit(String filename, int sheetIndex, int maxLimit) throws Exception {

        this.maxLimit = maxLimit;

        OPCPackage pkg = OPCPackage.open(filename);
        XSSFReader r = new XSSFReader(pkg);

        XMLReader parser = this.fetchSheetParser();

        InputStream sheet2 = null;
        // rId2 found by processing the Workbook
        // Seems to either be rId# or rSheet#
        try {
            sheet2 = r.getSheet("rId" + (sheetIndex + 1));
        } catch (Exception e) {
            PoiEventUserModel.LOG.error("Sheet could not be retrieved", e);
        }

        if (sheet2 == null) {
            try {
                sheet2 = r.getSheet("rSheet" + (sheetIndex + 1));
            } catch (Exception e) {
                PoiEventUserModel.LOG.error("Sheet could not be retrieved", e);
            }
        }

        InputSource sheetSource = new InputSource(sheet2);
        parser.parse(sheetSource);
        if (sheet2 != null) {
            sheet2.close();
        }
    }

    public void isAnySheetRowsOverMaxLimit(String filename, int maxLimit) throws Exception {

        this.maxLimit = maxLimit;

        OPCPackage pkg = OPCPackage.open(filename);
        XSSFReader r = new XSSFReader(pkg);

        XMLReader parser = this.fetchSheetParser();

        for (int i = 1; i < 10; i++) {

            InputStream sheet = null;
            // rId2 found by processing the Workbook
            // Seems to either be rId# or rSheet#
            try {
                sheet = r.getSheet("rId" + i);
            } catch (Exception e) {
                e.printStackTrace();
            }

            if (sheet == null) {
                try {
                    sheet = r.getSheet("rSheet" + i);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            if (sheet != null) {
                InputSource sheetSource = new InputSource(sheet);
                parser.parse(sheetSource);
                sheet.close();
            } else {
                break;
            }

        }

    }

    public XMLReader fetchSheetParser() throws SAXException {
        XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
        ContentHandler handler = new SheetHandler(this.maxLimit);
        parser.setContentHandler(handler);
        return parser;
    }

    /**
     * See org.xml.sax.helpers.DefaultHandler javadocs
     */
    private static class SheetHandler extends DefaultHandler {

        private int rowCounter = 0;
        private final int maxLimit;

        private SheetHandler(int maxLimit) {
            this.maxLimit = maxLimit;

        }

        @Override
        public void startElement(String uri, String localName, String name, Attributes attributes)
                throws SAXException {

        }

        @Override
        public void endElement(String uri, String localName, String name) throws SAXException {

            if (name.equals("row")) {
                if (this.rowCounter == this.maxLimit + 1) {
                    throw new SAXException("You have exceeded the limit!!!!");
                }
                this.rowCounter++;
            }
        }

        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {

        }
    }

}