X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Rakka%2FEnvironment.hs;h=9a6df3a396fd3276156178227adcfcc22bab926f;hb=88747f2463963ff2895a597b3054b12b2288530e;hp=6ae6f11c708a61f7c6007326382394599d5ae5ff;hpb=0b1235464affca4fb349c713278d2e37fd8e9584;p=Rakka.git diff --git a/Rakka/Environment.hs b/Rakka/Environment.hs index 6ae6f11..9a6df3a 100644 --- a/Rakka/Environment.hs +++ b/Rakka/Environment.hs @@ -2,26 +2,32 @@ module Rakka.Environment ( Environment(..) , InterpTable , setupEnv - , getInterpTable - , getInterpTableA ) where -import Control.Concurrent.STM -import Control.Arrow.ArrowIO -import Data.Map (Map) +import Control.Arrow +import Control.Arrow.ArrowList import qualified Data.Map as M -import Network +import Network.Socket import qualified Network.HTTP.Lucu.Config as LC +import Rakka.Authorization +import Rakka.Page import Rakka.Storage import Rakka.SystemConfig +import Rakka.Wiki.Engine import Rakka.Wiki.Interpreter -import Rakka.Wiki.Interpreter.Base +import qualified Rakka.Wiki.Interpreter.Base as Base +import qualified Rakka.Wiki.Interpreter.Image as Image +import qualified Rakka.Wiki.Interpreter.PageList as PageList +import qualified Rakka.Wiki.Interpreter.Outline as Outline import Subversion.Repository import System.Directory import System.FilePath import System.Log.Logger +import Text.HyperEstraier + +logger :: String logger = "Rakka.Environment" @@ -29,22 +35,20 @@ data Environment = Environment { envLocalStateDir :: !FilePath , envLucuConf :: !LC.Config , envRepository :: !Repository - , envStorage :: !Storage , envSysConf :: !SystemConfig - , envInterpTable :: !(TVar InterpTable) + , envStorage :: !Storage + , envInterpTable :: !InterpTable + , envAuthDB :: !AuthDB } -type InterpTable = Map String Interpreter - - -setupEnv :: FilePath -> PortNumber -> IO Environment +setupEnv :: FilePath -> ServiceName -> IO Environment setupEnv lsdir portNum - = do let lucuConf = LC.defaultConfig { - LC.cnfServerPort = PortNumber portNum - } - reposPath = lsdir `combine` "repos" - storage = mkStorage + = do let lucuConf = LC.defaultConfig { + LC.cnfServerPort = portNum + } + reposPath = lsdir "repos" + interpTable = mkInterpTable reposExist <- doesDirectoryExist reposPath repos <- if reposExist then @@ -54,29 +58,41 @@ setupEnv lsdir portNum do noticeM logger ("Creating a subversion repository on " ++ reposPath) createRepository reposPath [] [] sysConf <- mkSystemConfig lucuConf repos - interpTable <- mkInterpTable + storage <- mkStorage lsdir repos (makeDraft' interpTable) + authDB <- mkAuthDB lsdir - return $ Environment { + return Environment { envLocalStateDir = lsdir , envLucuConf = lucuConf , envRepository = repos - , envStorage = storage , envSysConf = sysConf + , envStorage = storage , envInterpTable = interpTable + , envAuthDB = authDB } + where + makeDraft' :: InterpTable -> Page -> IO Document + makeDraft' interpTable page + = do [doc] <- runX ( setErrorMsgHandler False fail + >>> + constA page + >>> + xmlizePage + >>> + makeDraft interpTable + ) + return doc -mkInterpTable :: IO (TVar InterpTable) -mkInterpTable = newTVarIO (listToTable baseInterpreters) +mkInterpTable :: InterpTable +mkInterpTable = listToTable $ + foldl (++) [] [ Base.interpreters + , Image.interpreters + , PageList.interpreters + --, Trackback.interpreters + , Outline.interpreters + ] where listToTable :: [Interpreter] -> InterpTable listToTable xs = M.fromList [ (commandName x, x) | x <- xs ] - - -getInterpTable :: Environment -> IO InterpTable -getInterpTable = atomically . readTVar . envInterpTable - - -getInterpTableA :: ArrowIO a => Environment -> a b InterpTable -getInterpTableA = arrIO0 . getInterpTable