d84be49c35034b2b05d7c19e13bb7b3df8f627c3
[hs-java.git] / Java / JAR / Archive.hs
1 -- | This module defines functions to read Java JAR files.
2 module Java.JAR.Archive where
3
4 import Control.Monad.Trans
5 import qualified Control.Monad.State as St
6 import qualified Codec.Archive.LibZip as Zip
7 import Data.Binary
8 import qualified Data.ByteString.Lazy as B
9
10 import Java.ClassPath.Types
11 import Java.ClassPath.Common
12 import JVM.ClassFile
13 import JVM.Converter
14
15 -- | Read all entires from JAR file
16 readJAR :: FilePath -> IO [Tree CPEntry]
17 readJAR jarfile = do
18   files <- Zip.withArchive [] jarfile $ Zip.fileNames []
19   return $ mapF (NotLoadedJAR jarfile) (buildTree files)
20
21 -- | Read one class from JAR file
22 readFromJAR :: FilePath -> FilePath -> IO (Class Direct)
23 readFromJAR jarfile path = do
24   content <- Zip.withArchive [] jarfile $ Zip.fileContents [] path
25   let bstr = B.pack content
26   return $ classFile2Direct (decode bstr)
27
28 -- | Add given JAR file to ClassPath
29 addJAR :: FilePath -> ClassPath ()
30 addJAR jarfile = do
31   classes <- liftIO $ readJAR jarfile
32   cp <- St.get
33   let cp' = merge $ cp ++ classes
34   St.put cp'
35