/*
 * Copyright 2001-2004 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import org.apache.ws.scout.registry.ConnectionFactoryImpl;

import javax.xml.registry.BulkResponse;
import javax.xml.registry.BusinessQueryManager;
import javax.xml.registry.Connection;
import javax.xml.registry.ConnectionFactory;
import javax.xml.registry.FindQualifier;
import javax.xml.registry.JAXRException;
import javax.xml.registry.JAXRResponse;
import javax.xml.registry.RegistryService;
import javax.xml.registry.infomodel.Organization;
import javax.xml.registry.infomodel.RegistryObject;
import javax.xml.registry.infomodel.Service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Properties;

/**
 * Locates an Organization in the UDDI Registry
 *
 * @author Anil Saldhana  <anil@apache.org>
 */
public class FindOrganization {
    private static Properties prop = new Properties();

    private static final String queryurl = "http://localhost:8080/juddi/inquiry";
    private static final String publishurl = "http://localhost:8080/juddi/publish";

    public static void main(String[] args) {
        try {
            setProperties();
            Connection conn = getConnection();
            RegistryService rs = conn.getRegistryService();
            BusinessQueryManager bqm = rs.getBusinessQueryManager();
            ArrayList names = new ArrayList();
            //String qname= "%S%";
            String qname = "%";
            names.add(qname);
            Collection fQualifiers = new ArrayList();
            fQualifiers.add(FindQualifier.SORT_BY_NAME_DESC);
            BulkResponse br = bqm.findOrganizations(fQualifiers,
                    names, null, null, null, null);
            if (br.getStatus() == JAXRResponse.STATUS_SUCCESS) {
                System.out.println("Successfully queried the  registry");
                System.out.println("for organizations matching the " +
                        "name pattern: \"" + qname + "\"");
                Collection orgs = br.getCollection();
                System.out.println("Results found: " + orgs.size() + "\n");
                Iterator iter = orgs.iterator();
                while (iter.hasNext()) {
                    Organization org = (Organization) iter.next();
                    System.out.println("Organization Name: " +
                            getName(org));
                    System.out.println("Organization Key: " +
                            org.getKey().getId());
                    System.out.println("Organization Description: " +
                            getDescription(org));
                    Collection services = org.getServices();
                    Iterator siter = services.iterator();
                    while (siter.hasNext()) {
                        Service service = (Service) siter.next();
                        System.out.println("\tService Name: " +
                                getName(service));
                        System.out.println("\tService Key: " +
                                service.getKey().getId());
                        System.out.println("\tService Description: " +
                                getDescription(service));
                    }
                }
            } else {
                System.err.println("One or more JAXRExceptions " +
                        "occurred during the query operation:");
                Collection exceptions = br.getExceptions();
                Iterator iter = exceptions.iterator();
                while (iter.hasNext()) {
                    Exception e = (Exception) iter.next();
                    System.err.println(e.toString());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }//end catch
    }//end main 

    private static void setProperties() {
        prop.setProperty("javax.xml.registry.queryManagerURL", queryurl);
        prop.setProperty("javax.xml.registry.lifeCycleManagerURL", publishurl);
        prop.setProperty("javax.xml.registry.factoryClass",
                "org.apache.juddi.jaxr.registry.ConnectionFactoryImpl");
    }

    private static String getName(RegistryObject regobj)
            throws JAXRException {
        try {
            return regobj.getName().getValue();
        } catch (NullPointerException npe) {
            return "";
        }
    }

    private static String getDescription(RegistryObject regobj)
            throws JAXRException {
        try {
            return regobj.getDescription().getValue();
        } catch (NullPointerException npe) {
            return "";
        }
    }

    private static Connection getConnection() throws JAXRException {
        ConnectionFactory factory = ConnectionFactoryImpl.newInstance();
        factory.setProperties(prop);
        Connection conn = factory.createConnection();
        if (conn == null) System.out.println("No Connection");
        return conn;
    }
}
