{-# LANGUAGE OverloadedStrings #-}
module NetSpider.RPL.DAO
(
FoundNodeDAO,
SnapshotGraphDAO,
DAONode(..),
DAOLink(..),
daoDefQuery,
daoUnifierConf
) where
import Data.Greskell
( gIdentity
)
import Control.Applicative ((<$>), (<*>))
import Data.Aeson (ToJSON(..))
import Data.Greskell
( parseOneValue, parseListValues
)
import Data.Greskell.Extra (writePropertyKeyValues)
import Data.Maybe (listToMaybe)
import NetSpider.Found (FoundNode)
import NetSpider.Graph (NodeAttributes(..), LinkAttributes(..))
import qualified NetSpider.GraphML.Writer as GraphML
import qualified NetSpider.Query as Query
import NetSpider.Snapshot (SnapshotGraph)
import NetSpider.Unify (UnifyStdConfig, lsLinkAttributes, latestLinkSample)
import qualified NetSpider.Unify as Unify
import NetSpider.RPL.FindingID (FindingID)
type FoundNodeDAO = FoundNode FindingID DAONode DAOLink
type SnapshotGraphDAO = SnapshotGraph FindingID DAONode DAOLink
data DAONode =
DAONode
{ daoRouteNum :: Maybe Word
}
deriving (Show,Eq,Ord)
instance NodeAttributes DAONode where
writeNodeAttributes dn = writePropertyKeyValues pairs
where
pairs =
case daoRouteNum dn of
Nothing -> []
Just n -> [("dao_route_num", toJSON n)]
parseNodeAttributes ps = fmap (DAONode . listToMaybe) $ parseListValues "dao_route_num" ps
instance GraphML.ToAttributes DAONode where
toAttributes dn =
case daoRouteNum dn of
Nothing -> []
Just p -> [("dao_route_num", GraphML.AttrInt $ fromIntegral $ p)]
data DAOLink =
DAOLink
{ pathLifetimeSec :: Word
}
deriving (Show,Eq,Ord)
instance LinkAttributes DAOLink where
writeLinkAttributes dl = writePropertyKeyValues pairs
where
pairs = [ ("path_lifetime_sec", toJSON $ pathLifetimeSec dl)
]
parseLinkAttributes ps = DAOLink <$> parseOneValue "path_lifetime_sec" ps
instance GraphML.ToAttributes DAOLink where
toAttributes dl = [ ("path_lifetime_sec", GraphML.AttrInt $ fromIntegral $ pathLifetimeSec dl) ]
daoDefQuery :: [FindingID]
-> Query.Query FindingID DAONode DAOLink DAOLink
daoDefQuery start =
(Query.defQuery start)
{ Query.startsFrom = start,
Query.unifyLinkSamples = Unify.unifyStd daoUnifierConf
}
daoUnifierConf :: UnifyStdConfig FindingID DAONode DAOLink DAOLink ()
daoUnifierConf = Unify.defUnifyStdConfig { Unify.negatesLinkSample = \_ _ -> False }