/** * Copyright (c) 2011 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.spdxspreadsheet; 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.LicenseDeclaration; import org.spdx.rdfparser.SPDXConjunctiveLicenseSet; import org.spdx.rdfparser.SPDXDisjunctiveLicenseSet; import org.spdx.rdfparser.SPDXLicenseInfo; import org.spdx.rdfparser.SPDXLicenseInfoFactory; import org.spdx.rdfparser.SPDXNonStandardLicense; import org.spdx.rdfparser.SPDXPackageInfo; /** * Sheet describing the package information for an SPDX Document * @author Gary O'Neall * */ public class PackageInfoSheet extends AbstractSheet { int NUM_COLS = 11; int NAME_COL = 0; int MACHINE_NAME_COL = NAME_COL+1; int URL_COL = MACHINE_NAME_COL + 1; int PACKAGE_SHA_COL = URL_COL + 1; int FILE_CHECKSUM_COL = PACKAGE_SHA_COL + 1; int SOURCE_INFO_COL = FILE_CHECKSUM_COL + 1; int DECLARED_LICENSE_COL = SOURCE_INFO_COL + 1; int SEEN_LICENSE_COL = DECLARED_LICENSE_COL + 1; int DECLARED_COPYRIGHT_COL = SEEN_LICENSE_COL + 1; int SHORT_DESC_COL = DECLARED_COPYRIGHT_COL + 1; int FULL_DESC_COL = SHORT_DESC_COL + 1; static final boolean[] REQUIRED = new boolean[] {true, true, true, true, true, false, true, true, true, false, false}; static final String[] HEADER_TITLES = new String[] {"DeclaredName", "MachineName", "Package URL", "Package SHA", "Files Checksum", "Source Info", "Declared License(s)", "Seen License(s)", "Declared Copyright", "Short Desc.", "Full Desc."}; static final int[] COLUMN_WIDTHS = new int[] {20, 20, 30, 15, 15, 30, 40, 40, 40, 40, 40}; /** * @param workbook * @param sheetName */ public PackageInfoSheet(Workbook workbook, String sheetName) { super(workbook, sheetName); } /* (non-Javadoc) * @see org.spdx.rdfparser.AbstractSheet#verify() */ @Override public String verify() { try { if (sheet == null) { return "Worksheet for SPDX Package Info does not exist"; } Row firstRow = sheet.getRow(firstRowNum); for (int i = 0; i < NUM_COLS; i++) { Cell cell = firstRow.getCell(i+firstCellNum); if (cell == null || cell.getStringCellValue() == null || !cell.getStringCellValue().equals(HEADER_TITLES[i])) { return "Column "+HEADER_TITLES[i]+" missing for SPDX Package Info worksheet"; } } // validate rows boolean done = false; int rowNum = firstRowNum + 1; while (!done) { Row row = sheet.getRow(rowNum); if (row == null || row.getCell(firstCellNum) == null) { done = true; } else { String error = validateRow(row); if (error != null) { return error; } rowNum++; } } return null; } catch (Exception ex) { return "Error in verifying SPDX Package Info work sheet: "+ex.getMessage(); } } private String validateRow(Row row) { for (int i = 0; i < NUM_COLS; i++) { Cell cell = row.getCell(i); if (cell == null) { if (REQUIRED[i]) { return "Required cell "+HEADER_TITLES[i]+" missing for row "+String.valueOf(row.getRowNum()); } } else { if (i == DECLARED_LICENSE_COL || i == SEEN_LICENSE_COL) { try { SPDXLicenseInfoFactory.parseSPDXLicenseString(cell.getStringCellValue()); } catch(SpreadsheetException ex) { if (i == DECLARED_LICENSE_COL) { return "Invalid declared license in row "+String.valueOf(row.getRowNum())+" detail: "+ex.getMessage(); } else { return "Invalid seen license in row "+String.valueOf(row.getRowNum())+" detail: "+ex.getMessage(); } } } // if (cell.getCellType() != Cell.CELL_TYPE_STRING) { // return "Invalid cell format for "+HEADER_TITLES[i]+" for forw "+String.valueOf(row.getRowNum()); // } } } return null; } 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); Row row = sheet.createRow(0); for (int i = 0; i < HEADER_TITLES.length; i++) { sheet.setColumnWidth(i, COLUMN_WIDTHS[i]*256); Cell cell = row.createCell(i); cell.setCellStyle(headerStyle); cell.setCellValue(HEADER_TITLES[i]); } } public void add(SPDXPackageInfo pkgInfo) { Row row = addRow(); Cell nameCell = row.createCell(NAME_COL); nameCell.setCellValue(pkgInfo.getDeclaredName()); Cell copyrightCell = row.createCell(DECLARED_COPYRIGHT_COL); copyrightCell.setCellValue(pkgInfo.getDeclaredCopyright()); Cell DeclaredLicenseCol = row.createCell(DECLARED_LICENSE_COL); DeclaredLicenseCol.setCellValue(licensesToString(pkgInfo.getDeclaredLicenses())); Cell fileChecksumCell = row.createCell(FILE_CHECKSUM_COL); fileChecksumCell.setCellValue(pkgInfo.getFileChecksum()); if (pkgInfo.getDescription() != null) { Cell descCell = row.createCell(FULL_DESC_COL); descCell.setCellValue(pkgInfo.getDescription()); } Cell fileNameCell = row.createCell(MACHINE_NAME_COL); fileNameCell.setCellValue(pkgInfo.getFileName()); Cell pkgSha1 = row.createCell(PACKAGE_SHA_COL); pkgSha1.setCellValue(pkgInfo.getSha1()); Cell detectedLicenseCell = row.createCell(SEEN_LICENSE_COL); detectedLicenseCell.setCellValue(licensesToString(pkgInfo.getDetectedLicenses())); if (pkgInfo.getShortDescription() != null) { Cell shortDescCell = row.createCell(SHORT_DESC_COL); shortDescCell.setCellValue(pkgInfo.getShortDescription()); } if (pkgInfo.getSourceInfo() != null) { Cell sourceInfoCell = row.createCell(SOURCE_INFO_COL); sourceInfoCell.setCellValue(pkgInfo.getSourceInfo()); } Cell urlCell = row.createCell(URL_COL); urlCell.setCellValue(pkgInfo.getUrl()); } public SPDXPackageInfo getPackageInfo(int rowNum) throws SpreadsheetException { Row row = sheet.getRow(rowNum); if (row == null) { return null; } String error = validateRow(row); if (error != null && !error.isEmpty()) { throw(new SpreadsheetException(error)); } String declaredName = row.getCell(NAME_COL).getStringCellValue(); String machineName = row.getCell(MACHINE_NAME_COL).getStringCellValue(); String sha1 = row.getCell(PACKAGE_SHA_COL).getStringCellValue(); String sourceInfo; Cell sourceInfocol = row.getCell(SOURCE_INFO_COL); if (sourceInfocol != null) { sourceInfo = sourceInfocol.getStringCellValue(); } else { sourceInfo = ""; } SPDXLicenseInfo[] declaredLicenses = new SPDXLicenseInfo[] { SPDXLicenseInfoFactory.parseSPDXLicenseString(row.getCell(DECLARED_LICENSE_COL).getStringCellValue()) }; SPDXLicenseInfo[] seenLicenses; Cell seenLicensesCell = row.getCell(SEEN_LICENSE_COL); if (seenLicensesCell != null && !seenLicensesCell.getStringCellValue().isEmpty()) { seenLicenses = new SPDXLicenseInfo[] {SPDXLicenseInfoFactory.parseSPDXLicenseString(seenLicensesCell.getStringCellValue())}; } else { seenLicenses = new SPDXLicenseInfo[0]; } String declaredCopyright = row.getCell(DECLARED_COPYRIGHT_COL).getStringCellValue(); Cell shortDescCell = row.getCell(SHORT_DESC_COL); String shortDesc; if (shortDescCell != null && !shortDescCell.getStringCellValue().isEmpty()) { shortDesc = shortDescCell.getStringCellValue(); } else { shortDesc = ""; } Cell descCell = row.getCell(FULL_DESC_COL); String description; if (descCell != null && !descCell.getStringCellValue().isEmpty()) { description = descCell.getStringCellValue(); } else { description = ""; } String url = row.getCell(URL_COL).getStringCellValue(); String fileChecksums = row.getCell(FILE_CHECKSUM_COL).getStringCellValue(); return new SPDXPackageInfo(declaredName, machineName, sha1, sourceInfo, declaredLicenses, seenLicenses, declaredCopyright, shortDesc, description, url, fileChecksums); } public static String licensesToString(SPDXLicenseInfo[] licenses) { if (licenses == null || licenses.length == 0) { return ""; } else if (licenses.length == 1) { return licenses[0].toString(); } else { StringBuilder sb = new StringBuilder("("); sb.append(licenses[0].toString()); for (int i = 1; i < licenses.length; i++) { sb.append(" AND "); sb.append(licenses[i].toString()); } sb.append(")"); return sb.toString(); } } }