-------------------------------------------------------------------------------- -- $Id: SwishMain.hs,v 1.15 2004/02/11 17:37:02 graham Exp $ -- -- Copyright (c) 2003, G. KLYNE. All rights reserved. -- See end of this file for licence information. -------------------------------------------------------------------------------- -- | -- Module : SwishMain -- Copyright : (c) 2003, Graham Klyne -- License : GPL V2 -- -- Maintainer : Graham Klyne -- Stability : provisional -- Portability : H98 -- -- Swish: Semantic Web Inference Scripting in Haskell -- -- This program is a simple skeleton for constructing Semantic Web [1] -- inference tools in Haskell, using the RDF graph, Notation 3 parser -- and Notation 3 formatter modules. -- -- It might be viewed as a kind of embroyonic CWM [2] in Haskell, except -- that the intent is that Haskell will be used as a primary language for -- defining inferences. As such, Swish is an open-ended toolkit for -- constructing new special-purpose Semantic Web applications rather -- than a closed, self-contained general-purpose SW application. -- I anticipate that this module may be used as a starting point for -- creating new programs rathar then as a complete program in its own right. -- The functionality built into this code is selected with a view to testing -- the Haskell modules for handling RDF rather than for performing any -- particular application processing (though development as a tool with -- some broader utility is not ruled out). As such, it is part of -- another experiment along the lines described in [3]. -- -- [1] Semantic werb: http://www.w3.org/2001/sw/ -- [2] CWM: http://www.w3.org/2000/10/swap/doc/cwm.html -- [3] Motivation: http://www.w3.org/2000/10/swap/doc/Motivation.html -- [4] Notation 3: http://www.w3.org/DesignIssues/Notation3.html -- [5] RDF: http://www.w3.org/RDF/ -- -- For command line details, see 'usageText' below. -- -- TODO: -- + Add RDF/XML input and output -- + Add N-triples input and output -- -------------------------------------------------------------------------------- module Swish.HaskellRDF.SwishMain(runSwish,runSwishArgs) where import Swish.HaskellRDF.SwishCommands ( swishFormat , swishInput , swishOutput , swishMerge , swishCompare , swishGraphDiff , swishScript ) import Swish.HaskellRDF.SwishMonad ( SwishStateIO, SwishState(..) , emptyState , SwishFormat(..) , swishError , reportLines ) import Swish.HaskellUtils.ListHelpers ( breakAll ) import Control.Monad.State ( execStateT ) import Data.Char ( isSpace ) import Control.Monad ( when ) import System.Exit ( ExitCode(ExitSuccess) ) ------------------------------------------------------------ -- Command line description ------------------------------------------------------------ usageText :: [[Char]] usageText = [ "Swish 0.2.1" , "Read, merge, write, compare and process RDF graphs." , "" , "Usage: swish option option ..." , "" , "where the options are processed from left to right, and may be" , "any of the following:" , "-? display this message." , "-n3 use Notation3 format for subsequent input and output." , "-i[=file] read file in selected format into the graph workspace," , " replacing any existing graph." , "-m[=file] merge file in selected format with the graph workspace." , "-c[=file] compare file in selected format with the graph workspace." , "-d[=file] show graph differences between the file in selected" , " format and the graph workspace. Differences are displayed" , " to the standard output stream." , "-o[=file] write the graph workspace to a file in the selected format." , "-s[=file] read and execute Swish script commands from the named file." , "" , " If an optional filename value is omitted, the standard input" , " or output stream is used, as appropriate." , "" , "Exit status codes:" , "Success - operation completed successfully/graphs compare equal" , "1 - graphs compare different" , "2 - input data format error" , "3 - file access problem" , "4 - command line error" , "5 - script file execution error" , "" , "Examples:" , "" , "swish -n3 -i=file" , " read file as Notation3, and report any syntax errors." , "swich -n3 -i=file1 -c=file2" , " read file1 and file2 as notation3, report any syntax errors, and" , " if both are OK, compare the resulting graphs to indicate whether" , " or not they are equivalent." , "swish -n3 -i=file1 -o=file2" , " read file1 as Notation3, report any syntax errors, and output the" , " resulting graph as reformatted Notation3. (The output may be" , " unedifying, but is intended to be used to test round-tripping" , " of Notation 3 data. The Notation3 formatter may be improved in" , " subsequent versions.)" ] ------------------------------------------------------------ -- Swish command line interpreter ------------------------------------------------------------ -- -- This is a composite monad combining some state with an IO -- Monad. "lift" allows a pure IO monad to be used as a step -- of the computation. -- -- sequence_ is a Monad sequencer, returning a new monad that -- executes members of a list in turn, passing state along the -- chain. -- swishCommands :: [String] -> SwishStateIO () swishCommands args = do { sequence_ (map swishCommand args) } swishCommand :: String -> SwishStateIO () swishCommand cmd = let (nam,more) = break (=='=') cmd arg = drop 1 more in case nam of "" -> return () -- do nothing "-?" -> swishHelp "-n3" -> swishFormat N3 "-i" -> swishInput arg "-m" -> swishMerge arg "-c" -> swishCompare arg "-d" -> swishGraphDiff arg "-o" -> swishOutput arg "-s" -> swishScript arg _ -> swishError ("Invalid command line element: "++cmd) 4 swishHelp :: SwishStateIO () swishHelp = reportLines usageText ------------------------------------------------------------ -- Interactive test function (e.g. for use in Hugs) ------------------------------------------------------------ runSwish :: String -> IO ExitCode runSwish cmdline = do { let args = breakAll isSpace cmdline ; ec <- runSwishArgs args ; when (ec /= ExitSuccess) (putStrLn $ "Swish exit: "++show ec) ; return ec } runSwishArgs :: [String] -> IO ExitCode runSwishArgs args = do { state <- execStateT (swishCommands args) emptyState ; return $ exitcode state } -------------------------------------------------------------------------------- -- -- Copyright (c) 2003, G. KLYNE. All rights reserved. -- -- This file is part of Swish. -- -- Swish is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation; either version 2 of the License, or -- (at your option) any later version. -- -- Swish is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with Swish; if not, write to: -- The Free Software Foundation, Inc., -- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -- -------------------------------------------------------------------------------- -- $Source: /file/cvsdev/HaskellRDF/SwishMain.hs,v $ -- $Author: graham $ -- $Revision: 1.15 $ -- $Log: SwishMain.hs,v $ -- Revision 1.15 2004/02/11 17:37:02 graham -- Update for Swish 0.2.1 -- -- Revision 1.14 2004/02/11 14:19:36 graham -- Add graph-difference option to Swish -- -- Revision 1.13 2004/02/09 22:22:44 graham -- Graph matching updates: change return value to give some indication -- of the extent match achieved in the case of no match. -- Added new module GraphPartition and test cases. -- Add VehicleCapcity demonstration script. -- -- Revision 1.12 2003/12/20 17:07:48 graham -- Display swish version number in usage message -- -- Revision 1.11 2003/12/20 14:34:21 graham -- Update command line options help message. -- -- Revision 1.10 2003/12/19 21:29:33 graham -- Minor edits -- -- Revision 1.9 2003/12/19 16:34:12 graham -- Add 'test' function to run SwishTest script -- -- Revision 1.8 2003/12/08 23:55:36 graham -- Various enhancements to variable bindings and proof structure. -- New module BuiltInMap coded and tested. -- Script processor is yet to be completed. -- -- Revision 1.7 2003/12/05 02:31:32 graham -- Script parsing complete. -- Some Swish script functions run successfully. -- Command execution to be completed. -- -- Revision 1.6 2003/12/04 02:53:27 graham -- More changes to LookupMap functions. -- SwishScript logic part complete, type-checks OK. -- -- Revision 1.5 2003/12/01 18:51:38 graham -- Described syntax for Swish script. -- Created Swish scripting test data. -- Edited export/import lists in Swish main program modules. -- -- Revision 1.4 2003/09/24 18:50:53 graham -- Revised module format to be Haddock compatible. -- -- Revision 1.3 2003/06/03 19:24:13 graham -- Updated all source modules to cite GNU Public Licence -- -- Revision 1.2 2003/05/29 12:39:49 graham -- Improved error handling for stand-alone swish program -- -- Revision 1.1 2003/05/29 11:52:41 graham -- Juggle Swish code: SwishMain.hs is main program logic, with -- Swish.hs and SwishTest.hs being alternative "Main" modules for -- the real program and test harness respectively.