cantor-0.1: src/Project/Maven.hs
{- |
Module : Project.Maven
Copyright : Copyright (C) 2014 Krzysztof Langner
License : BSD3
Maintainer : Krzysztof Langner <klangner@gmail.com>
Stability : alpha
Portability : portable
Get information about project from Maven POM file.
-}
module Project.Maven ( loadProject
)where
import Text.XML.HXT.Core
import Data.Tree.NTree.TypeDefs
import Text.XML.HXT.XPath.XPathEval
import System.FilePath (normalise)
import System.Directory (doesFileExist)
import Project.Model
-- | Load project information from POM file.
loadProject :: FilePath -> IO (Maybe Project)
loadProject src = do
let pomPath = normalise (src ++ "/pom.xml")
fileExists <- doesFileExist pomPath
xs <- if fileExists then runX (readDocument [] pomPath) else return []
return $ if not (null xs) then Just (createFromPom src (head xs)) else Nothing
-- | Create Project data from POM file
createFromPom :: FilePath -> XmlTree -> Project
createFromPom src xt = Project src (metadataFromPom xt)
-- | Read metadata from pom
metadataFromPom :: XmlTree -> Metadata
metadataFromPom xt = Metadata (projectGroup xt)
(projectArtifact xt)
(projectName xt)
(projectDesc xt)
-- | Get project group from POM.
projectGroup :: XmlTree -> String
projectGroup = getNodeText "/project/groupId/text()"
-- | Get project artifact from POM.
projectArtifact :: XmlTree -> String
projectArtifact = getNodeText "/project/artifactId/text()"
-- | Get project name from POM.
projectName :: XmlTree -> String
projectName = getNodeText "/project/name/text()"
-- | Get project description from POM.
projectDesc :: XmlTree -> String
projectDesc = getNodeText "/project/description/text()"
-- | Get text from given node
getNodeText :: String -> XmlTree -> String
getNodeText xpath dom = case getXPath xpath dom of
[NTree (XText a) _] -> a
_ -> ""