/*
 *
 * Copyright 2002 Sun Microsystems, Inc. All Rights Reserved.
 * 
 * Redistribution and use in source and binary forms, with or
 * without modification, are permitted provided that the following
 * conditions are met:
 * 
 * - Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 * 
 * - Redistribution in binary form must reproduce the above
 *   copyright notice, this list of conditions and the following
 *   disclaimer in the documentation and/or other materials
 *   provided with the distribution.
 * 
 * Neither the name of Sun Microsystems, Inc. or the names of
 * contributors may be used to endorse or promote products derived
 * from this software without specific prior written permission.
 * 
 * This software is provided "AS IS," without a warranty of any
 * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
 * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
 * EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY
 * DAMAGES OR LIABILITIES SUFFERED BY LICENSEE AS A RESULT OF OR
 * RELATING TO USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE OR
 * ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE
 * FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT,
 * SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
 * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF
 * THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS
 * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 * 
 * You acknowledge that this software is not designed, licensed or
 * intended for use in the design, construction, operation or
 * maintenance of any nuclear facility.
 * 
 */
import javax.xml.registry.*;
import javax.xml.registry.infomodel.*;
import java.net.*;
import java.security.*;
import java.util.*;

/**
 * The JAXRSaveClassificationScheme class consists of a main method, a
 * makeConnection method, and an executePublish method.  
 * It creates a classification scheme and publishes it to a registry.
 * 
 * To run this program, use the command 
 * 
 *     ant run-save-scheme
 */
public class JAXRSaveClassificationScheme {
    Connection connection = null;
		
    public JAXRSaveClassificationScheme() {}
	
    public static void main(String[] args) {	   
        ResourceBundle bundle =
           ResourceBundle.getBundle("JAXRExamples");

        String queryURL = bundle.getString("query.url");
        String publishURL = bundle.getString("publish.url");

        // Edit to provide your own username and password
        // Defaults for Registry Server are testuser/testuser
        String username = bundle.getString("registry.username");
        String password = bundle.getString("registry.password");
        
        JAXRSaveClassificationScheme jscs = new JAXRSaveClassificationScheme();
        
        jscs.makeConnection(queryURL, publishURL);
        
        jscs.executePublish(username, password);					                             
    }

    /**
     * Establishes a connection to a registry.
     *
     * @param queryUrl	the URL of the query registry
     * @param publishUrl	the URL of the publish registry
     */
    public void makeConnection(String queryUrl, 
        String publishUrl) {

        /*
         * Specify proxy information in case you
         *  are going beyond your firewall.
         */
        ResourceBundle bundle =
           ResourceBundle.getBundle("JAXRExamples");
        String httpProxyHost = bundle.getString("http.proxyHost");
        String httpProxyPort = bundle.getString("http.proxyPort");
        String httpsProxyHost = bundle.getString("https.proxyHost");
        String httpsProxyPort = bundle.getString("https.proxyPort");

        /*
         * Define connection configuration properties. 
         * To delete, you need both the query URL and the 
         * publish URL.
         */
        Properties props = new Properties();
        props.setProperty("javax.xml.registry.queryManagerURL",
            queryUrl);
        props.setProperty("javax.xml.registry.lifeCycleManagerURL", 
            publishUrl);
        props.setProperty("com.sun.xml.registry.http.proxyHost", 
            httpProxyHost);
        props.setProperty("com.sun.xml.registry.http.proxyPort", 
            httpProxyPort);
        props.setProperty("com.sun.xml.registry.https.proxyHost", 
            httpsProxyHost);
        props.setProperty("com.sun.xml.registry.https.proxyPort", 
            httpsProxyPort);

        try {
            // Create the connection, passing it the 
            // configuration properties
            ConnectionFactory factory = 
                ConnectionFactory.newInstance();
            factory.setProperties(props);
            connection = factory.createConnection();
            System.out.println("Created connection to registry");
        } catch (Exception e) {
            e.printStackTrace();
            if (connection != null) {
                try {
                    connection.close();
                } catch (JAXRException je) {}
            }
        }
    }
		
    /**
     * Creates a classification scheme and saves it to the
     * registry.
     *
     * @param username  the username for the registry
     * @param password  the password for the registry
     */
    public void executePublish(String username, 
        String password) {

        RegistryService rs = null;
        BusinessLifeCycleManager blcm = null;
        BusinessQueryManager bqm = null;
        ResourceBundle bundle =
           ResourceBundle.getBundle("JAXRExamples");

        try 
        {
            rs = connection.getRegistryService();
            blcm = rs.getBusinessLifeCycleManager();
            bqm = rs.getBusinessQueryManager();
            System.out.println("Got registry service, query " +
                "manager, and life cycle manager");

            // Get authorization from the registry
            PasswordAuthentication passwdAuth =
                new PasswordAuthentication(username, 
                    password.toCharArray());

            Set creds = new HashSet();
            creds.add(passwdAuth);
            connection.setCredentials(creds);
            System.out.println("Established security credentials");

            // Create classification scheme
            ClassificationScheme postalScheme =
                blcm.createClassificationScheme(
                bundle.getString("postal.scheme.name"), 
                bundle.getString("postal.scheme.description"));

            ClassificationScheme uddiOrgTypes = 
                bqm.findClassificationSchemeByName(null, "uddi-org:types");

            if (uddiOrgTypes != null) {
                Classification classification = 
                    blcm.createClassification(uddiOrgTypes,
                         bundle.getString("postal.classification.name"), 
                         bundle.getString("postal.classification.value"));

                postalScheme.addClassification(classification);
                
                // Set link to location of postal scheme (fictitious)
                //   so others can look it up
                ExternalLink externalLink = (ExternalLink)
                    blcm.createObject(LifeCycleManager.EXTERNAL_LINK);
                externalLink.setValidateURI(false);
                    externalLink.setExternalURI(bundle.getString("postal.scheme.link"));
                InternationalString is = 
                    blcm.createInternationalString(bundle.getString("postal.scheme.linkdesc"));
                externalLink.setDescription(is);
                postalScheme.addExternalLink(externalLink);

                // Add scheme and save it to registry
                // Retrieve key if successful
                Collection schemes = new ArrayList();
                schemes.add(postalScheme);
                BulkResponse br = blcm.saveClassificationSchemes(schemes);
                if (br.getStatus() == JAXRResponse.STATUS_SUCCESS) {
                    System.out.println("Saved PostalAddress " +
                        "ClassificationScheme");
                    Collection schemeKeys = br.getCollection();
                    Iterator keysIter = schemeKeys.iterator();
                    while (keysIter.hasNext()) {
                        javax.xml.registry.infomodel.Key key =
                            (javax.xml.registry.infomodel.Key)keysIter.next();
                        System.out.println("The postalScheme key is " + 
                            key.getId());
                        System.out.println("Use this key as the scheme uuid " +
                            "in the postalconcepts.xml file\n  and as the " +
                            "argument to run-publish-postal and " +
                            "run-query-postal");                        
                    }                 
                } else {
                    Collection exceptions = br.getExceptions();
                    Iterator excIter = exceptions.iterator();
                    Exception exception = null;
                    while (excIter.hasNext()) {
                        exception = (Exception) excIter.next();
                        System.err.println("Exception on save: " + 
                        exception.toString());
                    }
                }
            } else {
                System.out.println("uddi-org:types not found. Unable to " +
                    "save PostalAddress scheme.");
            }																							
        } catch (JAXRException jaxe) {
            jaxe.printStackTrace();
        } finally  {
            // At end, close connection to registry
            if (connection != null) {
                try {
                    connection.close();
                } catch (JAXRException je) {}
            }
        }
    }
}
