Changeset 1808 for TI01-discovery/trunk


Ignore:
Timestamp:
04/12/06 17:15:12 (13 years ago)
Author:
mpritcha
Message:

Updated to perform additional xquery to determine name of original doc, given just a document name. TODO : still need to add support for present formats other than "original".

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TI01-discovery/trunk/ws-Discovery2/src/ndg/services/discovery/PresentAgent.java

    r1793 r1808  
    77 
    88import java.io.*; 
     9 
    910 
    1011import org.apache.xmlrpc.XmlRpc; 
     
    1819import org.apache.xml.serialize.XMLSerializer; 
    1920 
     21import javax.xml.namespace.*; 
     22import javax.xml.xpath.*; 
     23import javax.xml.*; 
    2024 
    2125 
     
    103107                        while ( it.hasNext() ) 
    104108                        { 
    105                                 //1. Execute the remote getDocumentAsString()  
    106                                 Vector getDocumentAsStringParams = new Vector(); 
    107109                                String thisdoc = (String)it.next(); 
    108                                 getDocumentAsStringParams.addElement( thisdoc ); 
    109                                 System.out.println("present request doc:\t "+thisdoc); 
    110                                 getDocumentAsStringParams.addElement( options ); 
    111                                 //returnDoc = (byte[])xmlrpc.execute( "getDocument", getDocumentAsStringParams ); 
    112                                 returnDoc = (String)xmlrpc.execute("getDocumentAsString", getDocumentAsStringParams ); 
    113                                 if (returnDoc != null) 
     110                                 
     111                                if ( this.format.equals("original") ) 
    114112                                { 
    115                                         result.setStatus( true ); 
    116                                         result.setStatusMessage( "Success" ); 
    117  
    118                                         if ( this.format.equals("original") ) 
    119                                         { 
    120                                                 //returnDocs.add( new String( returnDoc ) ); 
    121                                                 returnDocs.add( returnDoc ); 
     113 
     114                                        //1. If it's original format request, find the one document in /db/discovery/original that matches this name 
     115                                        Vector queryParams = new Vector(); 
     116 
     117                                        String xqueryStr = "let $doc := collection('/db/discovery/original')//root()[util:document-name(.) = 'badc.nerc.ac.uk_DIF_dataent72.xml' ] for $i in $doc return <document>{document-uri($i)}</document>"; 
     118                                        System.out.println("Doc search for present\n" + xqueryStr); 
     119 
     120                                        queryParams.addElement( xqueryStr.getBytes("UTF-8") );  
     121                                        queryParams.addElement( 1 ); 
     122                                        queryParams.addElement( 1 );  
     123 
     124                                        Hashtable docSearchOptions = new Hashtable(); 
     125                                        docSearchOptions.put("indent", "yes"); 
     126                                        docSearchOptions.put("encoding", "UTF-8"); 
     127                                        docSearchOptions.put("process-xsl-pi", "no"); 
     128                                        queryParams.addElement( docSearchOptions ); 
     129 
     130                                        byte[] resultByteArray = (byte[])xmlrpc.execute( "query", queryParams ); 
     131                                        ByteArrayInputStream resultStream = new ByteArrayInputStream( resultByteArray ); 
     132 
     133                                        // Mark the beginning of the Stream, so can reset before each xpath evaluation (!) 
     134                                        resultStream.mark( resultStream.available() ); 
     135                                        InputSource resultSource = new InputSource( resultStream ); 
     136                                         
     137                                        XPath xpath = XPathFactory.newInstance().newXPath(); 
     138                                        String hitsExpr = "/exist:result/@hits";  
     139                                        String documentExpr = "//exist:result/document"; 
     140                                        xpath.setNamespaceContext( new existNamespaceContextImpl() ); 
     141                                        int hits = 0; 
     142                                        String docPath = ""; 
     143 
     144                                        try 
     145                                        { 
     146                                                hits = (new Integer( xpath.evaluate(hitsExpr, resultSource) )).intValue(); 
    122147                                        } 
    123                                         else 
    124                                         { 
    125                                                 throw new Exception("Format " + this.format + " not implemented."); 
     148                                        catch (NumberFormatException e) 
     149                                        { 
     150                                                hits = 0; 
     151                                        } 
     152                                         
     153                                        resultStream.reset(); 
     154                                        NodeList nodeList = (NodeList)xpath.evaluate( documentExpr, resultSource, XPathConstants.NODESET );  
     155                                         
     156                                        if ( hits > 0 ) 
     157                                        { 
     158                                                for (int i=0; i<nodeList.getLength(); i++) // limit to first doc of this name only 
     159                                                { 
     160                                                        docPath = (String)nodeList.item(i).getFirstChild().getNodeValue(); 
     161                                                        System.out.println("PresentAgent found document : " + docPath); 
     162                                                        //2. Execute the remote getDocumentAsString()  
     163                                                        Vector getDocumentAsStringParams = new Vector(); 
     164                                                        getDocumentAsStringParams.addElement( docPath ); 
     165                                                        System.out.println("present request doc:\t "+docPath); 
     166                                                        getDocumentAsStringParams.addElement( options ); 
     167                                                        returnDoc = (String)xmlrpc.execute("getDocumentAsString", getDocumentAsStringParams ); 
     168                                                        if (returnDoc != null) 
     169                                                        { 
     170                                                                result.setStatus( true ); 
     171                                                                result.setStatusMessage( "Success" ); 
     172                                                                returnDocs.add( returnDoc );             
     173                                                        } 
     174                                                        else { 
     175                                                                throw new Exception("Got null response from getDocumentAsString()"); 
     176                                                        }                                                
     177                                                }        
    126178                                        } 
    127179                                } 
    128                                 else { 
    129                                         throw new Exception("Got null response from getDocumentAsString()"); 
     180                                else 
     181                                        { 
     182                                                throw new Exception("Format " + this.format + " not implemented."); 
    130183                                } 
    131184                        } 
     
    142195        } 
    143196 
     197        public class existNamespaceContextImpl implements NamespaceContext 
     198    { 
     199        public String getNamespaceURI(String prefix) 
     200        { 
     201                        return "http://exist.sourceforge.net/NS/exist"; 
     202        } 
     203      
     204                // Doesn't matter what the prefix in the source doc is, override it 
     205                // Important thing is that the namespace URI matches, and that 
     206                // whatever prefix is set here, is used in the xpath query 
     207        public String getPrefix(String namespace) 
     208        { 
     209                        return "exist"; 
     210        } 
     211 
     212        public Iterator getPrefixes(String namespace) 
     213        { 
     214            return null; 
     215        } 
     216    }  
     217 
     218 
    144219} 
    145220 
Note: See TracChangeset for help on using the changeset viewer.