ParseOWLAsLibDefn.hs revision 3ba8875fcf295efe6b5db340f93c23439f999797
842ae4bd224140319ae7feec1872b93dfd491143fieldingModule : $Header$
842ae4bd224140319ae7feec1872b93dfd491143fieldingCopyright : Heng Jiang, Uni Bremen 2004-2007
842ae4bd224140319ae7feec1872b93dfd491143fieldingLicense : GPLv2 or higher, see LICENSE.txt
842ae4bd224140319ae7feec1872b93dfd491143fieldingMaintainer : Christian.Maeder@dfki.de
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseStability : provisional
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcndPortability : non-portable (imports Logic.Logic)
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcndanalyse OWL files by calling the external Java parser.
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcndmodule OWL2.ParseOWLAsLibDefn (parseOWL) where
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcndimport qualified Data.ByteString.Lazy as L
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcndimport qualified Data.Map as Map
71c00f988beb28388702e14cb7fe06f08bd792bbdougmimport Text.XML.Light hiding (QName)
71c00f988beb28388702e14cb7fe06f08bd792bbdougm-- | call for owl parser (env. variable $HETS_OWL_TOOLS muss be defined)
7933d4a963def02417113b6798d87a36395053b0rseparseOWL :: Bool -- ^ Sets Option.quick
71c00f988beb28388702e14cb7fe06f08bd792bbdougm -> String -- ^ Input-Type (OMN, OWL-Xml, RDF, OBO, ..)
71c00f988beb28388702e14cb7fe06f08bd792bbdougm -> FilePath -- ^ local filepath or uri
71c00f988beb28388702e14cb7fe06f08bd792bbdougm -> IO [LIB_DEFN] -- ^ map: uri -> OntologyFile
7933d4a963def02417113b6798d87a36395053b0rseparseOWL quick itype fn = do
71c00f988beb28388702e14cb7fe06f08bd792bbdougm (hasJar, toolPath) <- check4HetsOWLjar jar
71c00f988beb28388702e14cb7fe06f08bd792bbdougm if hasJar then do
7933d4a963def02417113b6798d87a36395053b0rse tmpFile <- getTempFile "" "owlTemp.xml"
7933d4a963def02417113b6798d87a36395053b0rse let args = nub $ ["-o", "xml"]
d1bb6e2664788e0437acc18e877562c9a796d7cerse ++ if quick then ["-qk"] else []
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse ++ [ "-i", itype, "-f", tmpFile, fn ]
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse print $ intercalate " | " args
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse (exitCode, _, errStr) <- executeProcess "java"
7933d4a963def02417113b6798d87a36395053b0rse (["-jar", toolPath </> jar] ++ args) ""
7933d4a963def02417113b6798d87a36395053b0rse case (exitCode, errStr) of
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg (ExitSuccess, "") -> do
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg cont <- L.readFile tmpFile
7933d4a963def02417113b6798d87a36395053b0rse removeFile tmpFile
7933d4a963def02417113b6798d87a36395053b0rse parseProc cont
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg _ -> error $ "process stop! " ++ shows exitCode "\n"
7933d4a963def02417113b6798d87a36395053b0rse else error $ jar
7933d4a963def02417113b6798d87a36395053b0rse ++ " not found, check your environment variable: " ++ hetsOWLenv
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseparseProc :: L.ByteString -> IO [LIB_DEFN]
7933d4a963def02417113b6798d87a36395053b0rseparseProc str = do
7933d4a963def02417113b6798d87a36395053b0rse res <- parseXml str
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg let es = elChildren $ either error id res
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse mis = concatMap (filterElementsName $ isSmth "Missing") es
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse imap = Map.fromList . mapMaybe (\ e -> do
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse imp <- findAttr (unqual "name") e
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse ont <- findAttr (unqual "ontiri") e
e726f34f8da08c01ee8bc90904b26196b69c8587wrowe return (imp, ont)) $ concatMap (filterElementsName $ isSmth "Loaded") es
7933d4a963def02417113b6798d87a36395053b0rse unless (null mis) . putStrLn $ "Missing imports: "
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg ++ intercalate ", " (map strContent mis)
e9eabac76b50e8f00d0c391f6070d0f42db77aa2wrowe return . map (convertToLibDefN imap)
e9eabac76b50e8f00d0c391f6070d0f42db77aa2wrowe . unifyDocs . map (xmlBasicSpec imap)
e9eabac76b50e8f00d0c391f6070d0f42db77aa2wrowe $ concatMap (filterElementsName $ isSmth "Ontology") es
7933d4a963def02417113b6798d87a36395053b0rseqNameToIRI :: QName -> SPEC_NAME
7988a91d9a1c6413f2c1a2138847f513d20de856fuankgqNameToIRI qn = let s = showQN qn in
7933d4a963def02417113b6798d87a36395053b0rse fromMaybe (error $ "qNameToIRI " ++ s) $ parseIRIManchester s
7988a91d9a1c6413f2c1a2138847f513d20de856fuankgcreateSpec :: OntologyDocument -> [SPEC_NAME] -> Annoted SPEC
7933d4a963def02417113b6798d87a36395053b0rsecreateSpec o imps = addImports imps . makeSpec $ G_basic_spec OWL2 o
7988a91d9a1c6413f2c1a2138847f513d20de856fuankgconvertone :: OntologyDocument -> SPEC_NAME -> [SPEC_NAME] -> Annoted LIB_ITEM
7933d4a963def02417113b6798d87a36395053b0rseconvertone o oname i = makeSpecItem oname $ createSpec o i
7988a91d9a1c6413f2c1a2138847f513d20de856fuankgconvertToLibDefN :: Map.Map String String -> OntologyDocument -> LIB_DEFN
176c2742db03fcb7b7d13e6408dd967d87e542e9benconvertToLibDefN imap o = Lib_defn ln
e0c3fda9f782aee1140d83fbce32672ac299f2a4ben (makeLogicItem OWL2 : imp_libs ++ [convertone o oname imps2]) nullRange []
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg where ont = ontology o
7a4e3510f3516132ff057ac986fd6350164b7950kbrand is = map snd il
7a4e3510f3516132ff057ac986fd6350164b7950kbrand ln = case lookup libstr $ map (\ (a, b) -> (b, a)) il of
7a4e3510f3516132ff057ac986fd6350164b7950kbrand Just s -> setFilePath s
7a4e3510f3516132ff057ac986fd6350164b7950kbrand Nothing -> setFilePath libstr
7933d4a963def02417113b6798d87a36395053b0rse $ iriLibName oname
7933d4a963def02417113b6798d87a36395053b0rse imps = map qNameToIRI $ imports ont
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg imps2 = filter ((`elem` is) . show . setAngles False) imps
7933d4a963def02417113b6798d87a36395053b0rse oname = qNameToIRI $ name ont
7933d4a963def02417113b6798d87a36395053b0rse libstr = show $ setAngles False oname
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg imp_libs = map (addDownload False) imps2