text: package com.monitorjbl.xlsx.impl;
  
  import com.monitorjbl.xlsx.exceptions.MissingSheetException;
  import org.apache.poi.ss.SpreadsheetVersion;
  import org.apache.poi.ss.formula.udf.UDFFinder;
  import org.apache.poi.ss.usermodel.CellStyle;
  import org.apache.poi.ss.usermodel.CreationHelper;
  import org.apache.poi.ss.usermodel.DataFormat;
  import org.apache.poi.ss.usermodel.Font;
  import org.apache.poi.ss.usermodel.Name;
  import org.apache.poi.ss.usermodel.PictureData;
  import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
  import org.apache.poi.ss.usermodel.Sheet;
  import org.apache.poi.ss.usermodel.SheetVisibility;
  import org.apache.poi.ss.usermodel.Workbook;
  
  import java.io.IOException;
  import java.io.OutputStream;
  import java.util.Iterator;
  import java.util.List;
  
  public class StreamingWorkbook implements Workbook, AutoCloseable {
    private final StreamingWorkbookReader reader;
  
    public StreamingWorkbook(StreamingWorkbookReader reader) {
      this.reader = reader;
    }
  
    int findSheetByName(String name) {
      for(int i = 0; i < reader.getSheetProperties().size(); i++) {
        if(reader.getSheetProperties().get(i).get("name").equals(name)) {
          return i;
        }
      }
      return -1;
    }
  
    /* Supported */
  
    /**
     * {@inheritDoc}
     */
    @Override
    public Iterator<Sheet> iterator() {
      return reader.iterator();
    }
  
    /**
     * {@inheritDoc}
     */
    @Override
    public Iterator<Sheet> sheetIterator() {
      return iterator();
    }
  
    /**
     * {@inheritDoc}
     */
    @Override
    public String getSheetName(int sheet) {
      return reader.getSheetProperties().get(sheet).get("name");
    }
  
    /**
     * {@inheritDoc}
     */
    @Override
    public int getSheetIndex(String name) {
      return findSheetByName(name);
    }
  
    /**
     * {@inheritDoc}
     */
    @Override
    public int getSheetIndex(Sheet sheet) {
      if(sheet instanceof StreamingSheet) {
        return findSheetByName(sheet.getSheetName());
      } else {
        throw new UnsupportedOperationException("Cannot use non-StreamingSheet sheets");
      }
    }
  
    /**
     * {@inheritDoc}
     */
    @Override
    public int getNumberOfSheets() {
      return reader.getSheets().size();
    }
  
    /**
     * {@inheritDoc}
     */
    @Override
    public Sheet getSheetAt(int index) {
      return reader.getSheets().get(index);
    }
  
    /**
     * {@inheritDoc}
     */
    @Override
    public Sheet getSheet(String name) {
      int index = getSheetIndex(name);
      if(index == -1) {
        throw new MissingSheetException("Sheet '" + name + "' does not exist");
      }
      return reader.getSheets().get(index);
    }
  
    /**
     * {@inheritDoc}
     */
    @Override
    public boolean isSheetHidden(int sheetIx) {
      return "hidden".equals(reader.getSheetProperties().get(sheetIx).get("state"));
    }
  
    /**
     * {@inheritDoc}
     */
    @Override
    public boolean isSheetVeryHidden(int sheetIx) {
      return "veryHidden".equals(reader.getSheetProperties().get(sheetIx).get("state"));
    }
  
    /**
     * {@inheritDoc}
     */
    @Override
    public void close() throws IOException {
      reader.close();
    }
  
    /* Not supported */
  
    /**
     * Not supported
     */
    @Override
    public int getActiveSheetIndex() {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public void setActiveSheet(int sheetIndex) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public int getFirstVisibleTab() {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public void setFirstVisibleTab(int sheetIndex) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public void setSheetOrder(String sheetname, int pos) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public void setSelectedTab(int index) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public void setSheetName(int sheet, String name) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public Sheet createSheet() {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public Sheet createSheet(String sheetname) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public Sheet cloneSheet(int sheetNum) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public void removeSheetAt(int index) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public Font createFont() {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public Font findFont(boolean b, short i, short i1, String s, boolean b1, boolean b2, short i2, byte b3) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public short getNumberOfFonts() {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public int getNumberOfFontsAsInt() { throw new UnsupportedOperationException(); }
  
    /**
     * Not supported
     */
    @Override
    public Font getFontAt(short idx) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public Font getFontAt(int i) { throw new UnsupportedOperationException(); }
  
    /**
     * Not supported
     */
    @Override
    public CellStyle createCellStyle() {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public int getNumCellStyles() {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public CellStyle getCellStyleAt(int i) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public void write(OutputStream stream) throws IOException {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public int getNumberOfNames() {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public Name getName(String name) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public List<? extends Name> getNames(String s) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public List<? extends Name> getAllNames() {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public Name getNameAt(int nameIndex) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public Name createName() {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public int getNameIndex(String name) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public void removeName(int index) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public void removeName(String name) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public void removeName(Name name) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public int linkExternalWorkbook(String name, Workbook workbook) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public void setPrintArea(int sheetIndex, String reference) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public void setPrintArea(int sheetIndex, int startColumn, int endColumn, int startRow, int endRow) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public String getPrintArea(int sheetIndex) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public void removePrintArea(int sheetIndex) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public MissingCellPolicy getMissingCellPolicy() {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public void setMissingCellPolicy(MissingCellPolicy missingCellPolicy) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public DataFormat createDataFormat() {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public int addPicture(byte[] pictureData, int format) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public List<? extends PictureData> getAllPictures() {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public CreationHelper getCreationHelper() {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public boolean isHidden() {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public void setHidden(boolean hiddenFlag) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public void setSheetHidden(int sheetIx, boolean hidden) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public SheetVisibility getSheetVisibility(int i) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public void setSheetVisibility(int i, SheetVisibility sheetVisibility) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public void addToolPack(UDFFinder toopack) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public void setForceFormulaRecalculation(boolean value) {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public boolean getForceFormulaRecalculation() {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public SpreadsheetVersion getSpreadsheetVersion() {
      throw new UnsupportedOperationException();
    }
  
    /**
     * Not supported
     */
    @Override
    public int addOlePackage(byte[] bytes, String s, String s1, String s2) throws IOException {
      throw new UnsupportedOperationException();
    }
  }
  