1 module Java.META.Spec where
4 import Control.Monad.Error
5 import qualified Data.Map as M
7 import Data.Char (toLower)
11 class MetaSpec s where
12 loadFirstSection :: Section -> s
14 loadOtherSection :: s -> Section -> s
15 loadOtherSection s _ = s
17 storeMeta :: s -> META
19 loadSpec :: (MetaSpec s) => META -> s
20 loadSpec [] = error "Cannot load empty metadata"
22 let x = loadFirstSection s
23 in foldl loadOtherSection x ss
25 lookupList :: String -> Maybe String -> [(String, String)]
26 lookupList _ Nothing = []
27 lookupList name (Just val) = [(name, val)]
29 bool2string :: Bool -> String
30 bool2string True = "true"
31 bool2string False = "false"
33 string2bool :: String -> Bool
35 | map toLower s == "true" = True
38 data Manifest = Manifest {
39 manifestVersion :: String,
42 signatureVersion :: Maybe String,
43 classPath :: [String],
44 mainClass :: Maybe String,
45 manifestEntries :: [ManifestEntry]}
48 data ManifestEntry = ManifestEntry {
51 meContentType :: Maybe String,
55 instance MetaSpec Manifest where
56 loadFirstSection s = Manifest {
57 manifestVersion = s ! "Manifest-Version",
58 createdBy = s ! "Created-By",
59 sealed = case M.lookup "Sealed" s of
61 Just str -> string2bool str,
62 signatureVersion = M.lookup "Signature-Version" s,
63 classPath = case M.lookup "Class-Path" s of
65 Just str -> words str,
66 mainClass = M.lookup "Main-Class" s,
69 loadOtherSection m s = m {manifestEntries = manifestEntries m ++ [entry]}
71 entry = ManifestEntry {
73 meSealed = case M.lookup "Sealed" s of
75 Just str -> string2bool str,
76 meContentType = M.lookup "Content-Type" s,
77 meBean = case M.lookup "Java-Bean" s of
79 Just str -> string2bool str }
81 storeMeta m = first: map store (manifestEntries m)
83 first = M.fromList $ [
84 ("Manifest-Version", manifestVersion m),
85 ("Created-By", createdBy m)] ++
86 lookupList "Signature-Version" (signatureVersion m) ++
87 lookupList "Main-Class" (mainClass m) ++
90 list -> [("Class-Path", unwords list)]
92 store e = M.fromList $ [
94 ("Sealed", bool2string $ meSealed e)] ++
95 lookupList "Content-Type" (meContentType e) ++
97 then [("Java-Bean", "true")]