using Microsoft.Extensions.Configuration; using System; using System.IO; namespace Npoi.Core.OpenXml4Net.Tests { public class POIDataSamples { /** * Name of the system property that defined path to the test data. */ public static string TEST_PROPERTY = "POI.testdata.path"; private static POIDataSamples _instSlideshow; private static POIDataSamples _instSpreadsheet; private static POIDataSamples _instDocument; private static POIDataSamples _instDiagram; private static POIDataSamples _instOpenXml4Net; private static POIDataSamples _instPOIFS; private static POIDataSamples _instDDF; private static POIDataSamples _instHPSF; private static POIDataSamples _instHPBF; private static POIDataSamples _instHSMF; private string _resolvedDataDir; /** true if standard system propery is not set, * but the data is available on the test runtime classpath */ private bool _sampleDataIsAvaliableOnClassPath; private string _moduleDir; /** * * @param moduleDir the name of the directory containing the test files */ private POIDataSamples(string moduleDir) { _moduleDir = moduleDir; Initialise(); } public static POIDataSamples GetSpreadSheetInstance() { if (_instSpreadsheet == null) _instSpreadsheet = new POIDataSamples("spreadsheet"); return _instSpreadsheet; } public static POIDataSamples GetDocumentInstance() { if (_instDocument == null) _instDocument = new POIDataSamples("document"); return _instDocument; } public static POIDataSamples GetSlideShowInstance() { if (_instSlideshow == null) _instSlideshow = new POIDataSamples("slideshow"); return _instSlideshow; } public static POIDataSamples GetDiagramInstance() { if (_instOpenXml4Net == null) _instOpenXml4Net = new POIDataSamples("diagram"); return _instOpenXml4Net; } public static POIDataSamples GetOpenXml4NetInstance() { if (_instDiagram == null) _instDiagram = new POIDataSamples("openxml4j"); return _instDiagram; } public static POIDataSamples GetPOIFSInstance() { if (_instPOIFS == null) _instPOIFS = new POIDataSamples("poifs"); return _instPOIFS; } public static POIDataSamples GetDDFInstance() { if (_instDDF == null) _instDDF = new POIDataSamples("ddf"); return _instDDF; } public static POIDataSamples GetHPSFInstance() { if (_instHPSF == null) _instHPSF = new POIDataSamples("hpsf"); return _instHPSF; } public static POIDataSamples GetPublisherInstance() { if (_instHPBF == null) _instHPBF = new POIDataSamples("publisher"); return _instHPBF; } public static POIDataSamples GetHSMFInstance() { if (_instHSMF == null) _instHSMF = new POIDataSamples("hsmf"); return _instHSMF; } /** * Opens a test sample file from the 'data' sub-package of this class's package. * @return null if the sample file is1 not deployed on the classpath. */ private Stream OpenClasspathResource(string sampleFileName) { FileStream file = new FileStream(_resolvedDataDir + sampleFileName, FileMode.Open, FileAccess.Read); return file; } private void Initialise() { var builder = new ConfigurationBuilder().AddJsonFile("appsettings.json"); var config = builder.Build(); string dataDirName = config[TEST_PROPERTY]; if (dataDirName == null) throw new Exception("Must set system property '" + TEST_PROPERTY + "' before running tests"); string dataDir = string.Format(@"{0}\{1}\", dataDirName, _moduleDir); if (!Directory.Exists(dataDir)) { throw new IOException("Data dir '" + dataDirName + "\\" + _moduleDir + "' specified by system property '" + TEST_PROPERTY + "' does not exist"); } //if (!File.Exists(dataDirName + "SampleSS.xls")) //{ // throw new IOException(dataDirName + "SampleSS.xls does not exist"); //} _sampleDataIsAvaliableOnClassPath = true; _resolvedDataDir = dataDir; } public string ResolvedDataDir { get { return _resolvedDataDir; } } /** * Opens a sample file from the standard HSSF test data directory * * @return an Open Stream for the specified sample file */ public Stream OpenResourceAsStream(string sampleFileName) { Initialise(); if (_sampleDataIsAvaliableOnClassPath) { Stream result = OpenClasspathResource(sampleFileName); if (result == null) { throw new Exception("specified test sample file '" + sampleFileName + "' not found on the classpath"); } // System.out.println("Opening cp: " + sampleFileName); // wrap to avoid temp warning method about auto-closing input stream return new NonSeekableStream(result); } if (_resolvedDataDir == "") { throw new Exception("Must set system property '" + TEST_PROPERTY + "' properly before running tests"); } if (!File.Exists(_resolvedDataDir + sampleFileName)) { throw new Exception("Sample file '" + sampleFileName + "' not found in data dir '" + _resolvedDataDir + "'"); } // System.out.println("Opening " + f.GetAbsolutePath()); try { return new FileStream(_resolvedDataDir + sampleFileName, FileMode.Open, FileAccess.Read); } catch (FileNotFoundException) { throw; } } public FileInfo GetFileInfo(string sampleFileName) { string path = _resolvedDataDir + sampleFileName; if (!File.Exists(path)) { throw new Exception("Sample file '" + sampleFileName + "' not found in data dir '" + _resolvedDataDir + "'"); } return new FileInfo(path); } /** * * @param sampleFileName the name of the test file * @return * @throws RuntimeException if the file was not found */ public FileStream GetFile(string sampleFileName) { string path = _resolvedDataDir + sampleFileName; if (!File.Exists(path)) { throw new Exception("Sample file '" + sampleFileName + "' not found in data dir '" + _resolvedDataDir + "'"); } //try //{ // if (sampleFileName.Length > 0 && !sampleFileName.Equals(f.getCanonicalFile().getName())) // { // throw new RuntimeException("File name is case-sensitive: requested '" + sampleFileName // + "' but actual file is '" + f.getCanonicalFile().getName() + "'"); // } //} //catch (IOException e) //{ // throw new RuntimeException(e); //} return new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite); } public string[] GetFiles() { return Directory.GetFiles(_resolvedDataDir); } public string[] GetFiles(string searchPattern) { return Directory.GetFiles(_resolvedDataDir, searchPattern); } /** * @return byte array of sample file content from file found in standard hssf test data dir */ public byte[] ReadFile(string fileName) { MemoryStream bos = new MemoryStream(); try { Stream fis = OpenResourceAsStream(fileName); byte[] buf = new byte[512]; while (true) { int bytesRead = fis.Read(buf, 0, buf.Length); if (bytesRead < 1) { break; } bos.Write(buf, 0, bytesRead); } fis.Dispose(); } catch (IOException) { throw; } return bos.ToArray(); } private class NonSeekableStream : Stream { private Stream _is; public NonSeekableStream(Stream is1) { _is = is1; } public int Read() { return _is.ReadByte(); } public override int Read(byte[] b, int off, int len) { return _is.Read(b, off, len); } public bool markSupported() { return false; } protected override void Dispose(bool disposing) { base.Dispose(disposing); _is.Dispose(); } public override bool CanRead { get { return _is.CanRead; } } public override bool CanSeek { get { return false; } } public override bool CanWrite { get { return _is.CanWrite; } } public override long Length { get { return _is.Length; } } public override long Position { get { return _is.Position; } set { _is.Position = value; } } public override void Write(byte[] buffer, int offset, int count) { _is.Write(buffer, offset, count); } public override void Flush() { _is.Flush(); } public override long Seek(long offset, SeekOrigin origin) { return _is.Seek(offset, origin); } public override void SetLength(long value) { _is.SetLength(value); } } } }