All Downloads are FREE. Search and download functionalities are using the official Maven repository.

src.org.jafer.zclient.operations.Search Maven / Gradle / Ivy

/**
 * JAFER Toolkit Poject.
 * Copyright (C) 2002, JAFER Toolkit Project, Oxford University.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *
 *
 */

/**
 *  Title: JAFER Toolkit
 *  Description:
 *  Copyright: Copyright (c) 2001
 *  Company: Oxford University
 *
 *@author     Antony Corfield; Matthew Dovey; Colin Tatham
 *@version    1.0
 */

package org.jafer.zclient.operations;

import java.util.logging.Level;
import java.util.logging.Logger;

import org.jafer.exception.JaferException;
import org.jafer.query.CQLQuery;
import org.jafer.query.JaferQuery;
import org.jafer.query.QueryException;
import org.jafer.record.Diagnostic;
import org.jafer.transport.ConnectionException;
import org.jafer.transport.PDUDriver;
import org.jafer.zclient.SearchResult;
import org.jafer.zclient.ZSession;
import org.w3c.dom.Node;

import z3950.v3.DatabaseName;
import z3950.v3.InternationalString;
import z3950.v3.OtherInformation1;
import z3950.v3.PDU;
import z3950.v3.Query;
import z3950.v3.RPNQuery;
import z3950.v3.ReferenceId;
import z3950.v3.SearchRequest;
import z3950.v3.SearchResponse;
import asn1.ASN1Any;
import asn1.ASN1Boolean;
import asn1.ASN1Exception;
import asn1.ASN1GeneralString;
import asn1.ASN1Integer;
import asn1.ASN1OctetString;
import asn1.ASN1Sequence;

public class Search
{

    private PDUDriver pduDriver;

    private static int refId = 0;

    private static Logger logger;

    public Search(ZSession session)
    {
        this.pduDriver = session.getPDUDriver();
        logger = Logger.getLogger("org.jafer.zclient");
    }

    public SearchResult[] search(Object queryObject, String[] databases, String resultSetName)
            throws JaferException, ConnectionException
    {

        if (queryObject instanceof RPNQuery)
            return search((RPNQuery) queryObject, databases, resultSetName);
        else if (queryObject instanceof Node)
            return search((Node) queryObject, databases, resultSetName);
        else if (queryObject instanceof JaferQuery)
            return search((JaferQuery) queryObject, databases, resultSetName);
        else if (queryObject instanceof CQLQuery)
            return search((CQLQuery) queryObject, databases, resultSetName);
        else
            throw new QueryException("Query type: " + queryObject.getClass().getName()
                    + " not supported", 107, "");
    }

    public SearchResult[] search(Node domQuery, String[] databases, String resultSetName)
            throws JaferException, ConnectionException
    {
        JaferQuery jaferQuery = new JaferQuery(domQuery);
        return search(jaferQuery.toRPNQuery().getQuery(), databases, resultSetName);
    }

    public SearchResult[] search(JaferQuery jaferQuery, String[] databases, String resultSetName)
            throws JaferException, ConnectionException
    {
        return search(jaferQuery.toRPNQuery().getQuery(), databases, resultSetName);
    }

    public SearchResult[] search(CQLQuery cqlQuery, String[] databases, String resultSetName)
            throws JaferException, ConnectionException
    {
        return search(cqlQuery.toRPNQuery().getQuery(), databases, resultSetName);
    }

    public SearchResult[] search(RPNQuery rpnQuery, String[] databases, String resultSetName)
            throws JaferException, ConnectionException
    {

        SearchRequest search = new SearchRequest();

        try
        {
            search.s_query = new Query();
            search.s_query.c_type_1 = rpnQuery;
            search.s_smallSetUpperBound = new ASN1Integer(0);
            search.s_largeSetLowerBound = new ASN1Integer(1);
            search.s_mediumSetPresentNumber = new ASN1Integer(0);
            search.s_replaceIndicator = new ASN1Boolean(true);

            search.s_resultSetName = new InternationalString();
            search.s_resultSetName.value = new ASN1GeneralString(resultSetName);
            // s_referenceId is optional
            search.s_referenceId = new ReferenceId();
            search.s_referenceId.value = new ASN1OctetString("org.jafer.zclient.search_" + ++refId);

            DatabaseName dbs[] = new DatabaseName[databases.length];
            for (int n = 0; n < databases.length; n++)
            {
                dbs[n] = new DatabaseName();
                dbs[n].value = new InternationalString();
                dbs[n].value.value = new ASN1GeneralString(databases[n]);
            }
            search.s_databaseNames = dbs;
        }
        catch (NullPointerException e)
        {
            String message = "Search: NullPointer Error" + "(" + e.toString() + ")";
            throw new JaferException(message, e);
        }

        PDU pduResponse = new PDU();
        pduResponse.c_searchRequest = search;
        pduDriver.sendPDU(pduResponse);

        PDU pduRequest = pduDriver.getPDU();
        SearchResponse response = pduRequest.c_searchResponse;
        if (response == null)
        {
            throw new ConnectionException("Search failed");
        }
        if (response.s_searchStatus != null && response.s_searchStatus.get() == false)
        {
            String message = "";
            Diagnostic diagnostic = null;
            /** @todo handle mutliple diagnostics? */
            if (response.s_records.c_nonSurrogateDiagnostic != null)
            {
                try
                {
                    diagnostic = new Diagnostic(databases[0],
                            response.s_records.c_nonSurrogateDiagnostic.ber_encode());
                    message = diagnostic.toString();
                }
                catch (Exception e)
                {
                    message = "diagnostic not available - ASN1Exception processing diagnostic ("
                            + e.toString() + ")";
                }
            }
            throw new JaferException(message, diagnostic);
        }

        if (response.s_additionalSearchInfo != null
                && response.s_additionalSearchInfo.value[0] != null)
        {
            OtherInformation1 info = response.s_additionalSearchInfo.value[0];
            ASN1Sequence targetSeq = (ASN1Sequence) info.s_information.c_externallyDefinedInfo.c_singleASN1type;
            ASN1Any[] targets = targetSeq.get();
            DatabaseName dbName;
            SearchResult[] results = new SearchResult[targets.length];

            for (int i = 0; i < targets.length; i++)
            {
                try
                {
                    ASN1Sequence target = (ASN1Sequence) targets[i];
                    ASN1Any[] details = target.get();
                    dbName = new DatabaseName(details[0].ber_encode(), false);
                    if (!dbName.value.value.get().equalsIgnoreCase(databases[i]))
                    {
                        String message = "database name listed in additional search info doesn't match database name in names set.";
                        /** @todo diag condition in exception? */
                        logger.log(Level.WARNING, message);
                        // throw new JaferException(message);
                    }
                    results[i] = new SearchResult();
                    results[i].setDatabaseName(databases[i]);
                    if (details[1] instanceof ASN1Integer)
                    {
                        results[i].setNoOfResults(((ASN1Integer) details[1]).get());
                    }
                    if (details[2] instanceof ASN1Integer)
                    {
                        results[i].setDiagnostic(new JaferException(
                                "Additional Search Information", ((ASN1Integer) details[1]).get(),
                                ""));
                    }
                }
                catch (ASN1Exception ex)
                {
                    String message = "Error in accessing additional search info.";
                    results[i].setNoOfResults(0);
                    results[i].setDiagnostic(new JaferException(message));
                    logger.log(Level.WARNING, message);
                }
            }

            return results;
        }

        SearchResult results = new SearchResult();
        results.setDatabaseName(null);
        results.setNoOfResults(response.s_resultCount.get());
        results.setDiagnostic(null);

        return new SearchResult[] { results };
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy