X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=hs-java.git;a=blobdiff_plain;f=Java%2FJAR%2FArchive.hs;fp=Java%2FJAR%2FArchive.hs;h=5425ab5aa7b7d72e1a298c111240fe566cda6794;hp=a4dd02669e9a09693223f3b169312c20eccca7c3;hb=480abc5f790688ae7572beadbf4fdf8dbc7135f7;hpb=ab2c5927c89e5d57ae96db959074ddf6ff501b6a diff --git a/Java/JAR/Archive.hs b/Java/JAR/Archive.hs index a4dd026..5425ab5 100644 --- a/Java/JAR/Archive.hs +++ b/Java/JAR/Archive.hs @@ -1,10 +1,12 @@ -- | This module defines functions to read Java JAR files. module Java.JAR.Archive where +import Control.Monad.Trans import qualified Codec.Archive.LibZip as Zip import Data.Binary import Data.List import qualified Data.ByteString.Lazy as B +import System.FilePath import Java.ClassPath.Types import Java.ClassPath.Common @@ -31,3 +33,23 @@ readFromJAR jarfile path = do let bstr = B.pack content return $ classFile2Direct (decode bstr) +checkClassTree :: [Tree CPEntry] -> IO [Tree (FilePath, Class Direct)] +checkClassTree forest = mapFMF check forest + where + check _ (NotLoaded path) = do + cls <- parseClassFile path + return (path, cls) + check a (Loaded path cls) = return (a path, cls) + check a (NotLoadedJAR jar path) = do + cls <- readFromJAR jar (a path) + return (a path, cls) + check a (LoadedJAR _ cls) = + return (a show (thisClass cls), cls) + +zipJAR :: [Tree (FilePath, Class Direct)] -> Zip.Archive () +zipJAR forest = do + mapFM go forest + return () + where + go (path, cls) = Zip.addFile path =<< Zip.sourceBuffer (B.unpack $ encodeClass cls) +