X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Rakka%2FEnvironment.hs;h=2de28b2ce2bf8df28106d664b0bd4abde30f742e;hb=45bce2c29948649f74ada71f2fa851bdb812e96c;hp=d68892b61590336f7e78c22f6dc5836cb35a5f63;hpb=2ad43b49ecc25bdf87dd19037fd63c12428992ae;p=Rakka.git diff --git a/Rakka/Environment.hs b/Rakka/Environment.hs index d68892b..2de28b2 100644 --- a/Rakka/Environment.hs +++ b/Rakka/Environment.hs @@ -1,64 +1,95 @@ +{-# LANGUAGE + UnicodeSyntax + #-} module Rakka.Environment ( Environment(..) , InterpTable , setupEnv - , getInterpTable - , getInterpTableA ) where - -import Control.Arrow.ArrowIO -import Data.IORef -import Data.Map (Map) +import Control.Arrow.ArrowList +import Control.Arrow.Unicode 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 +import Text.XML.HXT.Arrow.XmlState + +logger :: String +logger = "Rakka.Environment" data Environment = Environment { envLocalStateDir :: !FilePath , envLucuConf :: !LC.Config - , envStorage :: !Storage + , envRepository :: !Repository , envSysConf :: !SystemConfig - , envInterpTable :: !(IORef InterpTable) + , envStorage :: !Storage + , envInterpTable :: !InterpTable + , envAuthDB :: !AuthDB } - -type InterpTable = Map String Interpreter - - -setupEnv :: FilePath -> PortNumber -> IO Environment -setupEnv lsdir portNum - = do let lucuConf = LC.defaultConfig { - LC.cnfServerPort = PortNumber portNum - } - storage = mkStorage - sysConf = mkSystemConfig lucuConf - interpTable <- mkInterpTable - return $ Environment { +setupEnv ∷ FilePath → ServiceName → IO Environment +setupEnv lsdir port + = do let lucuConf = LC.defaultConfig { + LC.cnfServerPort = port + } + reposPath = lsdir "repos" + interpTable = mkInterpTable + reposExist <- doesDirectoryExist reposPath + repos <- if reposExist then + do debugM logger ("Found a subversion repository on " ++ reposPath) + openRepository reposPath + else + do noticeM logger ("Creating a subversion repository on " ++ reposPath) + createRepository reposPath [] [] + sysConf <- mkSystemConfig lucuConf repos + storage <- mkStorage lsdir repos (makeDraft' interpTable) + authDB <- mkAuthDB lsdir + return Environment { envLocalStateDir = lsdir , envLucuConf = lucuConf - , envStorage = storage + , envRepository = repos , 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 (IORef InterpTable) -mkInterpTable = newIORef (listToTable baseInterpreters) +mkInterpTable ∷ InterpTable +mkInterpTable = listToTable $ + concat [ Base.interpreters + , Image.interpreters + , PageList.interpreters + , Outline.interpreters + ] where - listToTable :: [Interpreter] -> InterpTable + listToTable ∷ [Interpreter] → InterpTable listToTable xs - = M.fromList [ (commandName x, x) | x <- xs ] - - -getInterpTable :: Environment -> IO InterpTable -getInterpTable = readIORef . envInterpTable - - -getInterpTableA :: ArrowIO a => Environment -> a b InterpTable -getInterpTableA = arrIO0 . getInterpTable + = M.fromList [ (commandName x, x) | x ← xs ]