org.onexus.website.api.widgets.download.formats.ExcelFormat.java Source code

Java tutorial

Introduction

Here is the source code for org.onexus.website.api.widgets.download.formats.ExcelFormat.java

Source

/**
 *  Copyright 2012 Universitat Pompeu Fabra.
 *
 *  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 org.onexus.website.api.widgets.download.formats;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.onexus.collection.api.Collection;
import org.onexus.collection.api.Field;
import org.onexus.collection.api.IEntity;
import org.onexus.collection.api.IEntityTable;
import org.onexus.collection.api.utils.QueryUtils;
import org.onexus.resource.api.IResourceManager;
import org.onexus.resource.api.ORI;
import org.onexus.website.api.WebsiteApplication;

import javax.inject.Inject;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class ExcelFormat extends AbstractFormat {

    @Inject
    private IResourceManager resourceManager;

    public ExcelFormat() {
        super("xls", "application/vnd.ms-excel", "Microsoft Excel file (max. 50000 rows)");
    }

    @Override
    public Long getMaxRowsLimit() {
        return Long.valueOf(50000);
    }

    @Override
    public void write(IEntityTable result, OutputStream out) throws IOException {

        Workbook wb = new HSSFWorkbook();
        CreationHelper createHelper = wb.getCreationHelper();
        Sheet sheet = wb.createSheet("new sheet");

        // Header row
        int rowIndex = 0;
        Row row = sheet.createRow(rowIndex);
        writeHeader(row, createHelper, result);

        while (result.next()) {
            rowIndex++;
            row = sheet.createRow(rowIndex);
            writeRow(row, result);
        }

        // Write the output to a file
        wb.write(out);

    }

    private void writeHeader(Row header, CreationHelper helper, IEntityTable table) {

        Iterator<Map.Entry<String, List<String>>> selectIt = table.getQuery().getSelect().entrySet().iterator();
        int cell = 0;
        while (selectIt.hasNext()) {
            Map.Entry<String, List<String>> select = selectIt.next();

            ORI collectionUri = QueryUtils.getCollectionOri(table.getQuery(), select.getKey());
            Collection collection = getResourceManager().load(Collection.class, collectionUri);

            Iterator<String> fieldId = select.getValue().iterator();
            while (fieldId.hasNext()) {
                Field field = collection.getField(fieldId.next());
                if (field == null) {
                    continue;
                }
                String label = field.getLabel();
                if (label == null) {
                    label = field.getId();
                }
                header.createCell(cell).setCellValue(helper.createRichTextString(label));
                cell++;
            }

        }
    }

    private void writeRow(Row row, IEntityTable table) {

        Iterator<Map.Entry<String, List<String>>> selectIt = table.getQuery().getSelect().entrySet().iterator();

        int cell = 0;
        while (selectIt.hasNext()) {
            Map.Entry<String, List<String>> select = selectIt.next();

            ORI collectionUri = QueryUtils.getCollectionOri(table.getQuery(), select.getKey());
            IEntity entity = table.getEntity(collectionUri);

            Iterator<String> fieldId = select.getValue().iterator();
            while (fieldId.hasNext()) {

                String field = fieldId.next();
                Object value = entity.get(field);

                if (value != null) {
                    if (value instanceof Number) {
                        Number number = (Number) value;
                        row.createCell(cell).setCellValue(number.doubleValue());
                    } else {
                        row.createCell(cell).setCellValue(String.valueOf(value));
                    }
                }

                cell++;
            }
        }

    }

    private IResourceManager getResourceManager() {
        if (resourceManager == null) {
            WebsiteApplication.inject(this);
        }

        return resourceManager;
    }
}