Refactor.
[hs-java.git] / Java / META.hs
1
2 module Java.META
3   (module Java.META.Types,
4    module Java.META.Parser,
5    module Java.META.Spec)
6   where
7
8 import Java.META.Types
9 import Java.META.Parser
10 import Java.META.Spec
11
12 data Manifest = Manifest {
13   manifestVersion :: String,
14   createdBy :: String,
15   sealed :: Bool,
16   signatureVersion :: Maybe String,
17   classPath :: [String],
18   mainClass :: Maybe String,
19   manifestEntries :: [ManifestEntry]}
20   deriving (Eq, Show)
21
22 data ManifestEntry = ManifestEntry {
23   meName :: String,
24   meSealed :: Bool,
25   meContentType :: Maybe String,
26   meBean :: Bool }
27   deriving (Eq, Show)
28
29 instance MetaSpec Manifest where
30   loadFirstSection s = Manifest {
31     manifestVersion = s ! "Manifest-Version",
32     createdBy = s ! "Created-By",
33     sealed = case M.lookup "Sealed" s of
34                Nothing -> False
35                Just str -> string2bool str,
36     signatureVersion = M.lookup "Signature-Version" s,
37     classPath = case M.lookup "Class-Path" s of
38                   Nothing -> []
39                   Just str -> words str,
40     mainClass = M.lookup "Main-Class" s,
41     manifestEntries = []}
42
43   loadOtherSection m s = m {manifestEntries = manifestEntries m ++ [entry]}
44     where
45       entry = ManifestEntry {
46                 meName = s ! "Name",
47                 meSealed = case M.lookup "Sealed" s of
48                              Nothing -> sealed m
49                              Just str -> string2bool str,
50                 meContentType = M.lookup "Content-Type" s,
51                 meBean = case M.lookup "Java-Bean" s of
52                            Nothing -> False
53                            Just str -> string2bool str }
54
55   storeMeta m = first: map store (manifestEntries m)
56     where
57       first = M.fromList $ [
58           ("Manifest-Version", manifestVersion m),
59           ("Created-By", createdBy m)] ++
60           lookupList "Signature-Version" (signatureVersion m) ++
61           lookupList "Main-Class" (mainClass m) ++
62           case classPath m of
63             [] -> []
64             list -> [("Class-Path", unwords list)]
65
66       store e = M.fromList $ [
67           ("Name", meName e),
68           ("Sealed", bool2string $ meSealed e)] ++
69           lookupList "Content-Type" (meContentType e) ++
70           if meBean e
71             then [("Java-Bean", "true")]
72             else []
73