diff --git a/README.md b/README.md index 45f11ce..8c4d953 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Hatch -This tool converts VSI image format to TIFF. +This tool converts the largest image in a VSI, SVS, or TIF image into a new TIFF image with a freshly created image pyramid with each scaling 1/2 dimensions each scale. Features: 1) Hatch transfers raw jpeg encodings from original image to new image to prevent any re-encoding image loss due to re-compression. diff --git a/config/jni-config.json b/config/jni-config.json index 73273d6..9924ee5 100644 --- a/config/jni-config.json +++ b/config/jni-config.json @@ -1,7 +1,4 @@ [ -{ - "name":"[Lsun.java2d.loops.GraphicsPrimitive;" -}, { "name":"com.sun.imageio.plugins.jpeg.JPEGImageReader", "methods":[ @@ -28,126 +25,8 @@ ] }, { - "name":"java.awt.AWTEvent", - "fields":[ - {"name":"bdata"}, - {"name":"consumed"}, - {"name":"id"} - ] -}, -{ - "name":"java.awt.AlphaComposite", - "fields":[ - {"name":"extraAlpha"}, - {"name":"rule"} - ] -}, -{ - "name":"java.awt.Color", - "methods":[{"name":"getRGB","parameterTypes":[] }] -}, -{ - "name":"java.awt.Component", - "fields":[ - {"name":"appContext"}, - {"name":"background"}, - {"name":"cursor"}, - {"name":"enabled"}, - {"name":"focusable"}, - {"name":"foreground"}, - {"name":"graphicsConfig"}, - {"name":"height"}, - {"name":"parent"}, - {"name":"peer"}, - {"name":"visible"}, - {"name":"width"}, - {"name":"x"}, - {"name":"y"} - ], - "methods":[ - {"name":"getFont_NoClientCode","parameterTypes":[] }, - {"name":"getLocationOnScreen_NoTreeLock","parameterTypes":[] }, - {"name":"getToolkitImpl","parameterTypes":[] }, - {"name":"isEnabledImpl","parameterTypes":[] } - ] -}, -{ - "name":"java.awt.Container", - "fields":[{"name":"layoutMgr"}] -}, -{ - "name":"java.awt.Dimension", - "fields":[ - {"name":"height"}, - {"name":"width"} - ] -}, -{ - "name":"java.awt.Font", - "fields":[ - {"name":"name"}, - {"name":"pData"}, - {"name":"size"}, - {"name":"style"} - ], - "methods":[ - {"name":"getFont","parameterTypes":["java.lang.String"] }, - {"name":"getFontPeer","parameterTypes":[] } - ] -}, -{ - "name":"java.awt.Insets", - "fields":[ - {"name":"bottom"}, - {"name":"left"}, - {"name":"right"}, - {"name":"top"} - ], - "methods":[{"name":"","parameterTypes":["int","int","int","int"] }] -}, -{ - "name":"java.awt.Toolkit", - "methods":[ - {"name":"getDefaultToolkit","parameterTypes":[] }, - {"name":"getFontMetrics","parameterTypes":["java.awt.Font"] } - ] -}, -{ - "name":"java.awt.desktop.UserSessionEvent$Reason", - "fields":[ - {"name":"CONSOLE"}, - {"name":"LOCK"}, - {"name":"REMOTE"}, - {"name":"UNSPECIFIED"} - ] -}, -{ - "name":"java.awt.event.InputEvent", - "fields":[{"name":"modifiers"}], - "methods":[{"name":"getButtonDownMasks","parameterTypes":[] }] -}, -{ - "name":"java.awt.geom.AffineTransform", - "fields":[ - {"name":"m00"}, - {"name":"m01"}, - {"name":"m02"}, - {"name":"m10"}, - {"name":"m11"}, - {"name":"m12"} - ] -}, -{ - "name":"java.awt.geom.Path2D", - "fields":[ - {"name":"numTypes"}, - {"name":"pointTypes"}, - {"name":"windingRule"} - ] -}, -{ - "name":"java.awt.geom.Path2D$Float", - "fields":[{"name":"floatCoords"}] + "name":"java.awt.GraphicsEnvironment", + "methods":[{"name":"isHeadless","parameterTypes":[] }] }, { "name":"java.awt.image.BufferedImage", @@ -176,22 +55,6 @@ ], "methods":[{"name":"getRGBdefault","parameterTypes":[] }] }, -{ - "name":"java.awt.image.ComponentColorModel" -}, -{ - "name":"java.awt.image.IndexColorModel", - "fields":[ - {"name":"allgrayopaque"}, - {"name":"colorData"}, - {"name":"map_size"}, - {"name":"rgb"}, - {"name":"transparent_index"} - ] -}, -{ - "name":"java.awt.image.PackedColorModel" -}, { "name":"java.awt.image.Raster", "fields":[ @@ -218,19 +81,17 @@ {"name":"setPixels","parameterTypes":["int","int","int","int","int[]","java.awt.image.DataBuffer"] } ] }, -{ - "name":"java.awt.image.SinglePixelPackedSampleModel", - "fields":[ - {"name":"bitMasks"}, - {"name":"bitOffsets"}, - {"name":"bitSizes"}, - {"name":"maxBitSize"} - ] -}, { "name":"java.lang.Boolean", "methods":[{"name":"getBoolean","parameterTypes":["java.lang.String"] }] }, +{ + "name":"java.lang.System", + "methods":[ + {"name":"load","parameterTypes":["java.lang.String"] }, + {"name":"setProperty","parameterTypes":["java.lang.String","java.lang.String"] } + ] +}, { "name":"javax.imageio.plugins.jpeg.JPEGHuffmanTable", "fields":[ @@ -242,19 +103,6 @@ "name":"javax.imageio.plugins.jpeg.JPEGQTable", "fields":[{"name":"qTable"}] }, -{ - "name":"sun.awt.SunHints", - "fields":[{"name":"INTVAL_STROKE_PURE"}] -}, -{ - "name":"sun.awt.Win32GraphicsEnvironment", - "methods":[{"name":"dwmCompositionChanged","parameterTypes":["boolean"] }] -}, -{ - "name":"sun.awt.image.BufImgSurfaceData$ICMColorData", - "fields":[{"name":"pData"}], - "methods":[{"name":"","parameterTypes":["long"] }] -}, { "name":"sun.awt.image.ByteComponentRaster", "fields":[ @@ -265,268 +113,8 @@ {"name":"type"} ] }, -{ - "name":"sun.awt.image.BytePackedRaster", - "fields":[ - {"name":"data"}, - {"name":"dataBitOffset"}, - {"name":"pixelBitStride"}, - {"name":"scanlineStride"}, - {"name":"type"} - ] -}, -{ - "name":"sun.awt.image.IntegerComponentRaster", - "fields":[ - {"name":"data"}, - {"name":"dataOffsets"}, - {"name":"pixelStride"}, - {"name":"scanlineStride"}, - {"name":"type"} - ] -}, -{ - "name":"sun.awt.image.ShortComponentRaster", - "fields":[ - {"name":"data"}, - {"name":"dataOffsets"}, - {"name":"pixelStride"}, - {"name":"scanlineStride"}, - {"name":"type"} - ] -}, -{ - "name":"sun.awt.image.SunVolatileImage", - "fields":[{"name":"volSurfaceManager"}] -}, -{ - "name":"sun.awt.image.VolatileSurfaceManager", - "fields":[{"name":"sdCurrent"}] -}, -{ - "name":"sun.awt.windows.WComponentPeer", - "fields":[ - {"name":"hwnd"}, - {"name":"winGraphicsConfig"} - ], - "methods":[ - {"name":"disposeLater","parameterTypes":[] }, - {"name":"replaceSurfaceData","parameterTypes":[] }, - {"name":"replaceSurfaceDataLater","parameterTypes":[] } - ] -}, -{ - "name":"sun.awt.windows.WDesktopPeer", - "methods":[ - {"name":"systemSleepCallback","parameterTypes":["boolean"] }, - {"name":"userSessionCallback","parameterTypes":["boolean","java.awt.desktop.UserSessionEvent$Reason"] } - ] -}, -{ - "name":"sun.awt.windows.WObjectPeer", - "fields":[ - {"name":"createError"}, - {"name":"destroyed"}, - {"name":"pData"}, - {"name":"target"} - ], - "methods":[{"name":"getPeerForTarget","parameterTypes":["java.lang.Object"] }] -}, -{ - "name":"sun.awt.windows.WToolkit", - "methods":[ - {"name":"displayChanged","parameterTypes":[] }, - {"name":"windowsSettingChange","parameterTypes":[] } - ] -}, { "name":"sun.java2d.Disposer", "methods":[{"name":"addRecord","parameterTypes":["java.lang.Object","long","long"] }] -}, -{ - "name":"sun.java2d.InvalidPipeException" -}, -{ - "name":"sun.java2d.NullSurfaceData" -}, -{ - "name":"sun.java2d.SunGraphics2D", - "fields":[ - {"name":"clipRegion"}, - {"name":"composite"}, - {"name":"eargb"}, - {"name":"lcdTextContrast"}, - {"name":"pixel"}, - {"name":"strokeHint"} - ] -}, -{ - "name":"sun.java2d.SurfaceData", - "fields":[ - {"name":"pData"}, - {"name":"valid"} - ] -}, -{ - "name":"sun.java2d.loops.Blit", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.BlitBg", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.CompositeType", - "fields":[ - {"name":"AnyAlpha"}, - {"name":"Src"}, - {"name":"SrcNoEa"}, - {"name":"SrcOver"}, - {"name":"SrcOverNoEa"}, - {"name":"Xor"} - ] -}, -{ - "name":"sun.java2d.loops.DrawGlyphList", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.DrawGlyphListAA", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.DrawGlyphListLCD", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.DrawLine", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.DrawParallelogram", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.DrawPath", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.DrawPolygons", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.DrawRect", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.FillParallelogram", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.FillPath", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.FillRect", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.FillSpans", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.GraphicsPrimitive", - "fields":[{"name":"pNativePrim"}] -}, -{ - "name":"sun.java2d.loops.GraphicsPrimitiveMgr", - "methods":[{"name":"register","parameterTypes":["sun.java2d.loops.GraphicsPrimitive[]"] }] -}, -{ - "name":"sun.java2d.loops.MaskBlit", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.MaskFill", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.ScaledBlit", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.SurfaceType", - "fields":[ - {"name":"Any3Byte"}, - {"name":"Any4Byte"}, - {"name":"AnyByte"}, - {"name":"AnyColor"}, - {"name":"AnyInt"}, - {"name":"AnyShort"}, - {"name":"ByteBinary1Bit"}, - {"name":"ByteBinary2Bit"}, - {"name":"ByteBinary4Bit"}, - {"name":"ByteGray"}, - {"name":"ByteIndexed"}, - {"name":"ByteIndexedBm"}, - {"name":"FourByteAbgr"}, - {"name":"FourByteAbgrPre"}, - {"name":"Index12Gray"}, - {"name":"Index8Gray"}, - {"name":"IntArgb"}, - {"name":"IntArgbBm"}, - {"name":"IntArgbPre"}, - {"name":"IntBgr"}, - {"name":"IntRgb"}, - {"name":"IntRgbx"}, - {"name":"OpaqueColor"}, - {"name":"ThreeByteBgr"}, - {"name":"Ushort4444Argb"}, - {"name":"Ushort555Rgb"}, - {"name":"Ushort555Rgbx"}, - {"name":"Ushort565Rgb"}, - {"name":"UshortGray"}, - {"name":"UshortIndexed"} - ] -}, -{ - "name":"sun.java2d.loops.TransformHelper", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.XORComposite", - "fields":[ - {"name":"alphaMask"}, - {"name":"xorColor"}, - {"name":"xorPixel"} - ] -}, -{ - "name":"sun.java2d.pipe.Region", - "fields":[ - {"name":"bands"}, - {"name":"endIndex"}, - {"name":"hix"}, - {"name":"hiy"}, - {"name":"lox"}, - {"name":"loy"} - ] -}, -{ - "name":"sun.java2d.pipe.RegionIterator", - "fields":[ - {"name":"curIndex"}, - {"name":"numXbands"}, - {"name":"region"} - ] -}, -{ - "name":"sun.java2d.windows.WindowsFlags", - "fields":[ - {"name":"d3dEnabled"}, - {"name":"d3dSet"}, - {"name":"offscreenSharingEnabled"}, - {"name":"setHighDPIAware"} - ] } ] diff --git a/config/reflect-config.json b/config/reflect-config.json index 2f97972..69f6f7f 100644 --- a/config/reflect-config.json +++ b/config/reflect-config.json @@ -1,18 +1,53 @@ [ + { + "name": "sun.awt.image.BufImgSurfaceData", + "methods": [ + {"name": "getSolidLoops", "parameterTypes": ["sun.java2d.loops.SurfaceType"]} + ], + "allDeclaredConstructors": true, + "allPublicConstructors": true, + "allDeclaredMethods": true, + "allPublicMethods": true + }, { - "name":"[[I" + "name":"boolean", + "allDeclaredFields":true }, { - "name":"[[J" + "name":"com.beust.jcommander.converters.BooleanConverter", + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":["java.lang.String"] }] }, { - "name":"java.awt.image.AffineTransformOp" + "name":"com.beust.jcommander.converters.FileConverter", + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.beust.jcommander.converters.IntegerConverter", + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":["java.lang.String"] }] +}, +{ + "name":"com.beust.jcommander.validators.NoValidator", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.beust.jcommander.validators.NoValueValidator", + "methods":[{"name":"","parameterTypes":[] }] }, { - "name":"java.awt.image.ConvolveOp" + "name":"edu.stonybrook.bmi.hatch.HatchParameters", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true }, { - "name":"java.awt.image.LookupOp" + "name":"int", + "allDeclaredFields":true +}, +{ + "name":"java.io.File", + "allDeclaredFields":true }, { "name":"java.security.SecureRandomParameters" @@ -35,9 +70,6 @@ "name":"loci.common.Log4jTools", "methods":[{"name":"setRootLevel","parameterTypes":["java.lang.String"] }] }, -{ - "name":"[Lloci.formats.tiff.OnDemandLongArray;" -}, { "name":"loci.common.LogbackTools" }, @@ -133,19 +165,11 @@ "name":"ome.codecs.services.LuraWaveServiceImpl" }, { - "name":"sun.java2d.marlin.DMarlinRenderingEngine", + "name":"sun.security.provider.NativePRNG", "methods":[{"name":"","parameterTypes":[] }] }, -{ - "name":"sun.security.provider.DRBG", - "methods":[{"name":"","parameterTypes":["java.security.SecureRandomParameters"] }] -}, { "name":"sun.security.provider.SHA", "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.provider.SHA2$SHA256", - "methods":[{"name":"","parameterTypes":[] }] } ] diff --git a/config/resource-config.json b/config/resource-config.json index da4ea41..4120960 100644 --- a/config/resource-config.json +++ b/config/resource-config.json @@ -19,6 +19,9 @@ { "pattern":"\\Qorg/joda/time/tz/data/America/New_York\\E" }, + { + "pattern":"\\Qorg/joda/time/tz/data/Etc/UTC\\E" + }, { "pattern":"\\Qorg/joda/time/tz/data/ZoneInfoMap\\E" } diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml index 09f31c6..2742a53 100644 --- a/dependency-reduced-pom.xml +++ b/dependency-reduced-pom.xml @@ -3,7 +3,7 @@ 4.0.0 edu.stonybrook.bmi hatch - 2.1.0 + 2.2.0 @@ -19,43 +19,6 @@ - - - maven-shade-plugin - 3.4.1 - - - package - - shade - - - - - false - - - edu.stonybrook.bmi.hatch.X2TIF - - - - - false - - - - - *:* - - META-INF/*.SF - META-INF/*.DSA - META-INF/*.RSA - - - - - - @@ -65,7 +28,7 @@ maven-enforcer-plugin - 3.2.1 + 3.3.0 @@ -81,13 +44,35 @@ shade + + false + + + edu.stonybrook.bmi.hatch.Hatch + + true + + + + + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + false - edu.stonybrook.bmi.hatch.X2TIF + edu.stonybrook.bmi.hatch.Hatch true @@ -116,7 +101,7 @@ org.graalvm.buildtools native-maven-plugin - 0.9.20 + 0.9.21 true @@ -125,25 +110,11 @@ build - - hatch - edu.stonybrook.bmi.hatch.X2TIF - true - true - true - true - - --no-fallback - -H:ConfigurationFileDirectories=config - --enable-url-protocols=https - -H:+AddAllCharsets - - hatch - edu.stonybrook.bmi.hatch.X2TIF + edu.stonybrook.bmi.hatch.Hatch true true true @@ -153,6 +124,7 @@ -H:ConfigurationFileDirectories=config --enable-url-protocols=https -H:+AddAllCharsets + --static diff --git a/nbactions-hatch.xml b/nbactions-hatch.xml index ff172c1..921e6fa 100644 --- a/nbactions-hatch.xml +++ b/nbactions-hatch.xml @@ -13,7 +13,7 @@ ${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs} - edu.stonybrook.bmi.hatch.X2TIF + edu.stonybrook.bmi.hatch.Hatch java @@ -30,7 +30,7 @@ -agentlib:jdwp=transport=dt_socket,server=n,address=${jpda.address} ${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs} - edu.stonybrook.bmi.hatch.X2TIF + edu.stonybrook.bmi.hatch.Hatch java true @@ -47,7 +47,7 @@ ${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs} - edu.stonybrook.bmi.hatch.X2TIF + edu.stonybrook.bmi.hatch.Hatch java diff --git a/nbactions-hatchjar.xml b/nbactions-hatchjar.xml index 5166f49..28a6694 100644 --- a/nbactions-hatchjar.xml +++ b/nbactions-hatchjar.xml @@ -10,10 +10,10 @@ org.codehaus.mojo:exec-maven-plugin:3.0.0:exec - -Xmx20G -Xms20G -XX:+UseZGC + ${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs} - -v \HalcyonStorage\tcga\paad\TCGA-2J-AAB1-01Z-00-DX1.F3B4818F-9C3B-4C66-8241-0570B2873EC9.svs \HalcyonStorage\tcga\paad\profile.tif - edu.stonybrook.bmi.hatch.X2TIF + -v -src \vsi\tk\7-24-20 -dest \vsi\tk\wow + edu.stonybrook.bmi.hatch.Hatch java @@ -27,10 +27,10 @@ org.codehaus.mojo:exec-maven-plugin:3.0.0:exec - -Xmx20G -Xms20G -XX:+UseZGC -agentlib:jdwp=transport=dt_socket,server=n,address=${jpda.address} + -agentlib:jdwp=transport=dt_socket,server=n,address=${jpda.address} ${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs} - -v \HalcyonStorage\tcga\paad\TCGA-2J-AAB1-01Z-00-DX1.F3B4818F-9C3B-4C66-8241-0570B2873EC9.svs \HalcyonStorage\tcga\paad\profile.tif - edu.stonybrook.bmi.hatch.X2TIF + -v -src \vsi\tk\7-24-20 -dest \vsi\tk\wow + edu.stonybrook.bmi.hatch.Hatch java true @@ -45,11 +45,11 @@ org.codehaus.mojo:exec-maven-plugin:3.0.0:exec - -Xmx20G -Xms20G -XX:+UseZGC + ${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs} - edu.stonybrook.bmi.hatch.X2TIF + edu.stonybrook.bmi.hatch.Hatch java - -v \HalcyonStorage\tcga\paad\TCGA-2J-AAB1-01Z-00-DX1.F3B4818F-9C3B-4C66-8241-0570B2873EC9.svs \HalcyonStorage\tcga\paad\profile.tif + -v -src \vsi\tk\7-24-20 -dest \vsi\tk\wow diff --git a/pom.xml b/pom.xml index 9fe58d4..33eed24 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 edu.stonybrook.bmi hatch - 2.1.0 + 2.2.0 jar UTF-8 @@ -24,47 +24,20 @@ + + com.beust + jcommander + 1.82 + + + org.apache.jena + jena-core + 4.7.0 + jar + - - - org.apache.maven.plugins - maven-shade-plugin - 3.4.1 - - false - - - edu.stonybrook.bmi.hatch.X2TIF - - - - - false - - - - - *:* - - META-INF/*.SF - META-INF/*.DSA - META-INF/*.RSA - - - - - - - package - - shade - - - - - - + false src/main/resources @@ -102,7 +75,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.2.1 + 3.3.0 @@ -115,7 +88,7 @@ false - edu.stonybrook.bmi.hatch.X2TIF + edu.stonybrook.bmi.hatch.Hatch true @@ -152,7 +125,7 @@ org.graalvm.buildtools native-maven-plugin - 0.9.20 + 0.9.21 true @@ -165,7 +138,7 @@ hatch - edu.stonybrook.bmi.hatch.X2TIF + edu.stonybrook.bmi.hatch.Hatch true true true diff --git a/src/main/java/edu/stonybrook/bmi/hatch/CellSensReader.java b/src/main/java/edu/stonybrook/bmi/hatch/CellSensReader.java index 91639c1..4d3eaae 100644 --- a/src/main/java/edu/stonybrook/bmi/hatch/CellSensReader.java +++ b/src/main/java/edu/stonybrook/bmi/hatch/CellSensReader.java @@ -2503,6 +2503,11 @@ public byte[] getRawBytes(IFD ifd, int no, int row, int col) { throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody } + @Override + public byte[] getRawBytesMeta(int no, int row, int col) { + throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody + } + // -- Helper class -- class TileCoordinate { @@ -2586,11 +2591,9 @@ class Pyramid { public ArrayList deviceIDs = new ArrayList(); public ArrayList deviceManufacturers = new ArrayList(); - public Hashtable originalMetadata = - new Hashtable(); + public Hashtable originalMetadata = new Hashtable(); - public HashMap dimensionOrdering = - new HashMap(); + public HashMap dimensionOrdering = new HashMap(); public transient Double zStart; public transient Double zIncrement; diff --git a/src/main/java/edu/stonybrook/bmi/hatch/FormatReader.java b/src/main/java/edu/stonybrook/bmi/hatch/FormatReader.java index 4e82552..0b40f11 100644 --- a/src/main/java/edu/stonybrook/bmi/hatch/FormatReader.java +++ b/src/main/java/edu/stonybrook/bmi/hatch/FormatReader.java @@ -1821,6 +1821,7 @@ protected Pulse getPulse(String value) throws FormatException { * Construct an {@link ome.xml.model.AffineTransform} corresponding to * the given angle. * @param theta the angle of rotation in radians + * @return */ protected AffineTransform getRotationTransform(double theta) { AffineTransform transform = new AffineTransform(); @@ -1838,6 +1839,7 @@ private boolean isOmero(String id) { id.indexOf("\n") > 0; } + public abstract byte[] getRawBytesMeta(int no, int row, int col); public abstract byte[] getRawBytes(byte[] rawbuffer, int no, int row, int col); public abstract byte[] getRawBytes(IFD ifd, int no, int row, int col); public abstract byte[] getDecodedTile(byte[] rawbuffer, int no, int row, int col); diff --git a/src/main/java/edu/stonybrook/bmi/hatch/Hatch.java b/src/main/java/edu/stonybrook/bmi/hatch/Hatch.java new file mode 100644 index 0000000..0df2049 --- /dev/null +++ b/src/main/java/edu/stonybrook/bmi/hatch/Hatch.java @@ -0,0 +1,149 @@ +package edu.stonybrook.bmi.hatch; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.ParameterException; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Objects; +import java.util.concurrent.Callable; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.stream.Stream; +import org.apache.jena.rdf.model.Model; + +/** + * + * @author erich + */ +public class Hatch { + public static String software = "hatch 2.2.0 by Wing-n-Beak"; + private static final String[] ext = new String[] {".vsi", ".svs", ".tif"}; + public static final String HELP = Hatch.software+"\n"+ + """ + usage: hatch + -v : verbose + """; + + private static void Traverse(HatchParameters params) { + Path s = params.src.toPath(); + Path d = params.dest.toPath(); + ThreadPoolExecutor engine = new ThreadPoolExecutor(params.fp,params.fp,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<>()); + engine.prestartAllCoreThreads(); + try (Stream X = Files.walk(params.src.toPath())) { + X + .filter(Objects::nonNull) + .filter(fff -> { + for (String ext1 : ext) { + if (fff.toFile().toString().toLowerCase().endsWith(ext1)) { + return true; + } + } + return false; + }) + .forEach(f->{ + String frag = s.relativize(f).toString(); + frag = frag.substring(0,frag.length()-4)+".tif"; + Path t = Path.of(d.toString(), frag); + t.toFile().getParentFile().mkdirs(); + if (!t.toFile().exists()) { + System.out.println("PROCESSING FILE --> "+f); + engine.submit(new FileProcessor(params, f.toString(), t.toString())); + } else if (t.toFile().length()==0) { + System.out.println("ZERO LENGTH FILE --> "+f); + t.toFile().delete(); + System.out.println("RE-PROCESSING FILE --> "+f); + engine.submit(new FileProcessor(params, f.toString(), t.toString())); + } + }); + } catch (IOException ex) { + Logger.getLogger(Hatch.class.getName()).log(Level.SEVERE, null, ex); + } + int cc = engine.getActiveCount()+engine.getQueue().size(); + while ((engine.getActiveCount()+engine.getQueue().size())>0) { + int curr = engine.getActiveCount()+engine.getQueue().size(); + if (cc!=curr) { + cc=curr; + if (params.verbose) System.out.println("All jobs submitted...waiting for "+curr); + } + } + System.out.println("Engine shutdown"); + engine.shutdown(); + } + + public static void main(String[] args) { + loci.common.DebugTools.setRootLevel("WARN"); + HatchParameters params = new HatchParameters(); + JCommander jc = JCommander.newBuilder().addObject(params).build(); + jc.setProgramName(Hatch.software+"\nhatch"); + try { + jc.parse(args); + if (params.isHelp()) { + jc.usage(); + System.exit(0); + } else if (params.src.exists()) { + if (params.src.isDirectory()) { + System.out.println(params.src+" is directory"); + if (!params.dest.exists()) { + params.dest.mkdir(); + } + if (!params.dest.isDirectory()) { + jc.usage(); + } else { + Traverse(params); + } + } else { + System.out.println(params.src+" is not a directory"); + if (params.dest.exists()) { + System.out.println(params.dest+" does exist"); + if (!params.dest.isDirectory()) { + System.out.println(params.dest+" is not a directory"); + X2TIF v2t = new X2TIF(params, params.src.toString(), params.dest.toString()); + v2t.Execute(); + try { + v2t.close(); + } catch (Exception ex) { + Logger.getLogger(Hatch.class.getName()).log(Level.SEVERE, null, ex); + } + } else { + jc.usage(); + } + } else { + System.out.println(params.dest+" does not exist"); + X2TIF v2t = new X2TIF(params, params.src.toString(), params.dest.toString()); + v2t.Execute(); + } + } + } else { + System.out.println(params.src.toString()+" does not exist!"); + } + } catch (ParameterException ex) { + System.out.println(ex.getMessage()); + } + } +} + +class FileProcessor implements Callable { + private final HatchParameters params; + private final String src; + private final String dest; + + public FileProcessor(HatchParameters params, String src, String dest) { + this.params = params; + this.src = src; + this.dest = dest; + } + + @Override + public Model call() { + try (X2TIF v2t = new X2TIF(params, src, dest)) { + v2t.Execute(); + } catch (Exception ex) { + System.out.println("FILE PROCESSOR ERROR --> "+src+" "+dest+" "+ex.toString()); + } + return null; + } +} diff --git a/src/main/java/edu/stonybrook/bmi/hatch/HatchParameters.java b/src/main/java/edu/stonybrook/bmi/hatch/HatchParameters.java new file mode 100644 index 0000000..f535da5 --- /dev/null +++ b/src/main/java/edu/stonybrook/bmi/hatch/HatchParameters.java @@ -0,0 +1,40 @@ +package edu.stonybrook.bmi.hatch; + +import com.beust.jcommander.Parameter; +import com.beust.jcommander.internal.Lists; +import java.io.File; +import java.util.List; + +/** + * + * @author erich + */ +public class HatchParameters { + @Parameter(names = {"-help","-h"}, help = true) + private boolean help; + + public boolean isHelp() { + return help; + } + + @Parameter(names = "-src", description = "Source Folder or File", required = true) + public File src; + + @Parameter(names = "-dest", description = "Destination Folder or File", required = true) + public File dest; + + @Parameter(names = "-fp", description = "# of file processors") + public int fp = 1; + + @Parameter(names = "-cores", description = "# of cores for processing") + public int cores = 1; + + @Parameter + public List parameters = Lists.newArrayList(); + + @Parameter(names = {"-v","-verbose"}) + public boolean verbose = false; + + @Parameter(names = "-meta") + public boolean meta = false; +} \ No newline at end of file diff --git a/src/main/java/edu/stonybrook/bmi/hatch/JPEGTools.java b/src/main/java/edu/stonybrook/bmi/hatch/JPEGTools.java index 4ce7aec..4acbac8 100644 --- a/src/main/java/edu/stonybrook/bmi/hatch/JPEGTools.java +++ b/src/main/java/edu/stonybrook/bmi/hatch/JPEGTools.java @@ -61,7 +61,6 @@ public static byte[] FindFirstEOI(RandomAccessInputStream ets, byte[] r) throws public static byte[] FindFirstEOI(byte[] ets) throws IOException { int c=0; -// Files.write((new File("dump.jpg")).toPath(), ets); while(c "); - System.out.println("-v : verbose"); - } - - public void Execute(String src, String dest) { - if (verbose) { + public void Execute() { + if (params.verbose) { System.out.println("initializing..."); } - SetSrcDest(src,dest); initialize(); try { readWriteTiles(); @@ -396,22 +390,9 @@ public void Execute(String src, String dest) { } } - public static void main(String[] args) { - loci.common.DebugTools.setRootLevel("WARN"); - X2TIF v2t = new X2TIF(); - if ((args.length<2)||args.length>3) { - v2t.DisplayHelp(); - } else { - if (args.length==3) { - if (args[0].equals("-v")) { - v2t.SetVerbose(true); - v2t.Execute(args[1],args[2]); - } else { - v2t.DisplayHelp(); - } - } else { - v2t.Execute(args[0],args[1]); - } - } + @Override + public void close() throws Exception { + reader.close(); + writer.close(); } }