org.spdx.compare.ExternalReferencesSheet.java Source code

Java tutorial

Introduction

Here is the source code for org.spdx.compare.ExternalReferencesSheet.java

Source

/**
 * Copyright (c) 2015 Source Auditor Inc.
 *
 *   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.spdx.compare;

import java.util.Arrays;
import java.util.Comparator;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.spdx.rdfparser.InvalidSPDXAnalysisException;
import org.spdx.rdfparser.RdfModelHelper;
import org.spdx.rdfparser.model.ExternalDocumentRef;
import org.spdx.spdxspreadsheet.AbstractSheet;

/**
 * Sheet that compares the external document references
 * @author Gary O'Neall
 *
 */
public class ExternalReferencesSheet extends AbstractSheet {

    class ExternalDocRefComparator implements Comparator<ExternalDocumentRef> {

        /* (non-Javadoc)
         * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
         */
        @Override
        public int compare(ExternalDocumentRef o1, ExternalDocumentRef o2) {
            if (o1 instanceof ExternalDocumentRef) {
                if (o2 instanceof ExternalDocumentRef) {
                    ExternalDocumentRef r1 = (ExternalDocumentRef) o1;
                    ExternalDocumentRef r2 = (ExternalDocumentRef) o2;
                    int retval = r1.getSpdxDocumentNamespace().compareTo((r2.getSpdxDocumentNamespace()));
                    if (retval == 0) {
                        try {
                            return r1.getChecksum().getValue().compareTo(r2.getChecksum().getValue());
                        } catch (InvalidSPDXAnalysisException e) {
                            return retval;
                        }
                    } else {
                        return retval;
                    }
                } else {
                    return 1;
                }
            } else {
                return -1;
            }
        }
    }

    ExternalDocRefComparator externalDocRefComparator = new ExternalDocRefComparator();

    static final int NAMESPACE_COL = 0;
    static final String NAMESPACE_TEXT_TITLE = "External Document Namespace";
    static final int NAMESPACE_COL_WIDTH = 80;

    static final int CHECKSUM_COL = 1;
    static final String CHECKSUM_TEXT_TITLE = "External Doc Checksum";
    static final int CHECKSUM_COL_WIDTH = 55;

    static final int FIRST_DOC_ID_COL = 2;
    static final int DOC_ID_COL_WIDTH = 30;

    public ExternalReferencesSheet(Workbook workbook, String sheetName) {
        super(workbook, sheetName);
    }

    /* (non-Javadoc)
     * @see org.spdx.spdxspreadsheet.AbstractSheet#verify()
     */
    @Override
    public String verify() {
        return null; // nothing to verify
    }

    /**
     * @param wb
     * @param sheetName
     */
    public static void create(Workbook wb, String sheetName) {
        int sheetNum = wb.getSheetIndex(sheetName);
        if (sheetNum >= 0) {
            wb.removeSheetAt(sheetNum);
        }
        Sheet sheet = wb.createSheet(sheetName);
        CellStyle headerStyle = AbstractSheet.createHeaderStyle(wb);
        CellStyle defaultStyle = AbstractSheet.createLeftWrapStyle(wb);
        Row row = sheet.createRow(0);
        sheet.setColumnWidth(NAMESPACE_COL, NAMESPACE_COL_WIDTH * 256);
        sheet.setDefaultColumnStyle(NAMESPACE_COL, defaultStyle);
        Cell extractedHeaderCell = row.createCell(NAMESPACE_COL);
        extractedHeaderCell.setCellStyle(headerStyle);
        extractedHeaderCell.setCellValue(NAMESPACE_TEXT_TITLE);

        sheet.setColumnWidth(CHECKSUM_COL, CHECKSUM_COL_WIDTH * 256);
        sheet.setDefaultColumnStyle(CHECKSUM_COL, defaultStyle);
        Cell checksumHeaderCell = row.createCell(CHECKSUM_COL);
        checksumHeaderCell.setCellStyle(headerStyle);
        checksumHeaderCell.setCellValue(CHECKSUM_TEXT_TITLE);

        for (int i = FIRST_DOC_ID_COL; i < MultiDocumentSpreadsheet.MAX_DOCUMENTS; i++) {
            sheet.setColumnWidth(i, DOC_ID_COL_WIDTH * 256);
            sheet.setDefaultColumnStyle(i, defaultStyle);
            Cell cell = row.createCell(i);
            cell.setCellStyle(headerStyle);
        }
    }

    /**
     * @param comparer
     * @param docNames 
     * @throws InvalidSPDXAnalysisException 
     */
    public void importCompareResults(SpdxComparer comparer, String[] docNames)
            throws SpdxCompareException, InvalidSPDXAnalysisException {
        if (comparer.getNumSpdxDocs() != docNames.length) {
            throw (new SpdxCompareException(
                    "Number of document names does not match the number of SPDX documents"));
        }
        this.clear();
        Row header = sheet.getRow(0);
        int[] refIndexes = new int[comparer.getNumSpdxDocs()];
        ExternalDocumentRef[][] externalRefs = new ExternalDocumentRef[comparer.getNumSpdxDocs()][];
        for (int i = 0; i < externalRefs.length; i++) {
            Cell headerCell = header.getCell(FIRST_DOC_ID_COL + i);
            headerCell.setCellValue(docNames[i]);
            ExternalDocumentRef[] docExternalRefs = comparer.getSpdxDoc(i).getExternalDocumentRefs();
            Arrays.sort(docExternalRefs, externalDocRefComparator);
            externalRefs[i] = docExternalRefs;
            refIndexes[i] = 0;
        }
        while (!allExternalRefsExhausted(externalRefs, refIndexes)) {
            Row currentRow = this.addRow();
            ExternalDocumentRef nextRef = getNextExternalRef(externalRefs, refIndexes);
            Cell namespaceCell = currentRow.createCell(NAMESPACE_COL);
            namespaceCell.setCellValue(nextRef.getSpdxDocumentNamespace());
            Cell checksumCell = currentRow.createCell(CHECKSUM_COL);
            checksumCell.setCellValue(CompareHelper.checksumToString(nextRef.getChecksum()));
            for (int i = 0; i < externalRefs.length; i++) {
                if (externalRefs[i].length > refIndexes[i]) {
                    ExternalDocumentRef compareRef = externalRefs[i][refIndexes[i]];
                    if (RdfModelHelper.equalsConsideringNull(nextRef.getSpdxDocumentNamespace(),
                            compareRef.getSpdxDocumentNamespace())
                            && RdfModelHelper.equivalentConsideringNull(nextRef.getChecksum(),
                                    compareRef.getChecksum())) {
                        Cell docIdCell = currentRow.createCell(FIRST_DOC_ID_COL + i);
                        docIdCell.setCellValue(externalRefs[i][refIndexes[i]].getExternalDocumentId());
                        refIndexes[i]++;
                    }
                }
            }
        }
    }

    /**
     * @param externalRefs
     * @param refIndexes
     * @return
     */
    private ExternalDocumentRef getNextExternalRef(ExternalDocumentRef[][] externalRefs, int[] refIndexes) {
        ExternalDocumentRef retval = null;
        for (int i = 0; i < externalRefs.length; i++) {
            if (externalRefs[i].length > refIndexes[i]) {
                ExternalDocumentRef candidate = externalRefs[i][refIndexes[i]];
                if (retval == null || this.externalDocRefComparator.compare(retval, candidate) > 0) {
                    retval = candidate;
                }
            }
        }
        return retval;
    }

    /**
     * @param externalRefs
     * @param refIndexes
     * @return
     */
    private boolean allExternalRefsExhausted(ExternalDocumentRef[][] externalRefs, int[] refIndexes) {
        for (int i = 0; i < externalRefs.length; i++) {
            if (refIndexes[i] < externalRefs[i].length) {
                return false;
            }
        }
        return true;
    }

}