ParseOWLAsLibDefn.hs revision 3ba8875fcf295efe6b5db340f93c23439f999797
842ae4bd224140319ae7feec1872b93dfd491143fielding{- |
842ae4bd224140319ae7feec1872b93dfd491143fieldingModule : $Header$
842ae4bd224140319ae7feec1872b93dfd491143fieldingCopyright : Heng Jiang, Uni Bremen 2004-2007
842ae4bd224140319ae7feec1872b93dfd491143fieldingLicense : GPLv2 or higher, see LICENSE.txt
842ae4bd224140319ae7feec1872b93dfd491143fielding
842ae4bd224140319ae7feec1872b93dfd491143fieldingMaintainer : Christian.Maeder@dfki.de
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseStability : provisional
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcndPortability : non-portable (imports Logic.Logic)
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcndanalyse OWL files by calling the external Java parser.
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd-}
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcndmodule OWL2.ParseOWLAsLibDefn (parseOWL) where
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcndimport OWL2.AS
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcndimport OWL2.MS
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcndimport OWL2.Rename
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcndimport qualified Data.ByteString.Lazy as L
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcndimport Data.List
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcndimport Data.Maybe
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcndimport qualified Data.Map as Map
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcndimport Common.XmlParser
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseimport Common.Id
6ace32dacb8313226eb9019275d0e4fa45a15148rseimport Common.IRI
70535d6421eb979ac79d8f49d31cd94d75dd8b2fjortonimport Common.LibName
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseimport Common.ProverTools
a943533fd4d91d114af622731a405407990c4fb1rseimport Common.AS_Annotation
67139e2d50d1e11558d87f7042f61cb04bb0d1d2jimimport Common.Utils
1660a5facf5797acb7aa1300f5ef86756a0bf493jorton
1660a5facf5797acb7aa1300f5ef86756a0bf493jortonimport Control.Monad
a943533fd4d91d114af622731a405407990c4fb1rse
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseimport Logic.Grothendieck
c12917da693bae4028a1d5a5e8224bceed8c739dsfimport OWL2.Logic_OWL2
c12917da693bae4028a1d5a5e8224bceed8c739dsfimport OWL2.XML
c12917da693bae4028a1d5a5e8224bceed8c739dsf
c12917da693bae4028a1d5a5e8224bceed8c739dsfimport Syntax.AS_Library
c12917da693bae4028a1d5a5e8224bceed8c739dsfimport Syntax.AS_Structured
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseimport System.Directory
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseimport System.Exit
7933d4a963def02417113b6798d87a36395053b0rseimport System.FilePath
7933d4a963def02417113b6798d87a36395053b0rse
71c00f988beb28388702e14cb7fe06f08bd792bbdougmimport Text.XML.Light hiding (QName)
71c00f988beb28388702e14cb7fe06f08bd792bbdougm
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 let jar = "OWL2Parser.jar"
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"
53c239bee62c6d55b5ddfba5d99376d4c8de924ejwoolley ++ errStr
7933d4a963def02417113b6798d87a36395053b0rse else error $ jar
7933d4a963def02417113b6798d87a36395053b0rse ++ " not found, check your environment variable: " ++ hetsOWLenv
7988a91d9a1c6413f2c1a2138847f513d20de856fuankg
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
7933d4a963def02417113b6798d87a36395053b0rse
7933d4a963def02417113b6798d87a36395053b0rseqNameToIRI :: QName -> SPEC_NAME
7988a91d9a1c6413f2c1a2138847f513d20de856fuankgqNameToIRI qn = let s = showQN qn in
7933d4a963def02417113b6798d87a36395053b0rse fromMaybe (error $ "qNameToIRI " ++ s) $ parseIRIManchester s
7933d4a963def02417113b6798d87a36395053b0rse
7988a91d9a1c6413f2c1a2138847f513d20de856fuankgcreateSpec :: OntologyDocument -> [SPEC_NAME] -> Annoted SPEC
7933d4a963def02417113b6798d87a36395053b0rsecreateSpec o imps = addImports imps . makeSpec $ G_basic_spec OWL2 o
7933d4a963def02417113b6798d87a36395053b0rse
7988a91d9a1c6413f2c1a2138847f513d20de856fuankgconvertone :: OntologyDocument -> SPEC_NAME -> [SPEC_NAME] -> Annoted LIB_ITEM
7933d4a963def02417113b6798d87a36395053b0rseconvertone o oname i = makeSpecItem oname $ createSpec o i
7933d4a963def02417113b6798d87a36395053b0rse
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 il = Map.toList imap
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
e335319a08e12eb7daff9afa80e985dc53f652b8jorton