Refactor.
[hs-java.git] / Java / JAR / Archive.hs
1
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 readJAR :: FilePath -> IO [Tree CPEntry]
16 readJAR jarfile = do
17   files <- Zip.withArchive [] jarfile $ Zip.fileNames []
18   return $ mapF (NotLoadedJAR jarfile) (buildTree files)
19
20 readFromJAR :: FilePath -> FilePath -> IO (Class Direct)
21 readFromJAR jarfile path = do
22   content <- Zip.withArchive [] jarfile $ Zip.fileContents [] path
23   let bstr = B.pack content
24   return $ classFile2Direct (decode bstr)
25
26 addJAR :: FilePath -> ClassPath ()
27 addJAR jarfile = do
28   classes <- liftIO $ readJAR jarfile
29   cp <- St.get
30   let cp' = merge $ cp ++ classes
31   St.put cp'
32