/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 * 
 *************************************************************/



package ifc.sdbc;

import lib.MultiMethodTest;
import lib.Status;
import lib.StatusException;

import com.sun.star.beans.PropertyValue;
import com.sun.star.sdbc.DriverPropertyInfo;
import com.sun.star.sdbc.SQLException;
import com.sun.star.sdbc.XConnection;
import com.sun.star.sdbc.XDriver;

/**
* Testing <code>com.sun.star.sdbc.XDriver</code>
* interface methods :
* <ul>
*  <li><code> connect()</code></li>
*  <li><code> acceptsURL()</code></li>
*  <li><code> getPropertyInfo()</code></li>
*  <li><code> getMajorVersion()</code></li>
*  <li><code> getMinorVersion()</code></li>
* </ul> <p>
* Required object relations :
* <ul>
* <li> <code>'XDriver.URL'</code>:
*      is the URL of the database to which to connect</code></li>
* <li><code>'XDriver.UNSUITABLE_URL'</code>:
*      the wrong kind of URL to connect using given driver</li>
* <li><code>'XDriver.INFO'</code>:
*      a list of arbitrary string tag/value pairs as connection arguments</li>
* </ul> <p>
* @see com.sun.star.sdbc.XDriver
*/
public class _XDriver extends MultiMethodTest {
    // oObj filled by MultiMethodTest
    public XDriver oObj = null;
    String url = null;
    String wrongUrl = null;
    String nbu = null;
    PropertyValue[] info = null;

    /**
    * Retrieves relations.
    * @throw StatusException If any relation not found.
    */
    protected void before() {
        nbu = (String) tEnv.getObjRelation("NoBadURL");
        url = (String)tEnv.getObjRelation("XDriver.URL");
        if (url == null) {
            throw new StatusException(Status.failed(
                "Couldn't get relation 'XDriver.URL'"));
        }
        wrongUrl = (String)tEnv.getObjRelation("XDriver.UNSUITABLE_URL");
        if (wrongUrl == null) {
            throw new StatusException(Status.failed(
                "Couldn't get relation 'XDriver.WRONG_URL'"));
        }
        info = (PropertyValue[])tEnv.getObjRelation("XDriver.INFO");
        if (info == null) {
            throw new StatusException(Status.failed(
                "Couldn't get relation 'XDriver.INFO'"));
        }
    }

    /**
    * Connects to <code>'XDriver.URL'</code>,
    * to <code>'XDriver.UNSUITABLE_URL'</code> and to wrong URL using
    * <code>'XDriver.INFO'</code>.
    * Has OK status if the method returns not null for <code>'XDriver.URL'</code>,
    * null for <code>'XDriver.UNSUITABLE_URL'</code> and
    * exception was thrown during the call with a wrong URL.
    */
    public void _connect() {
        boolean res = true;

        try {
            log.println("Trying to connect to " + url);
            XConnection connection = oObj.connect(url, info);
            res = (connection != null);
            log.println("Connected? " + res);
            log.println("Trying to connect to " + wrongUrl);
            connection = oObj.connect(wrongUrl, info);
            res &= (connection == null);
            log.println("Connected? " + !res);
        } catch(SQLException e) {
            log.println("Unexpected exception");            
            res &= false;
        }
        
        if (nbu==null) {
            try {
                String badUrl = url + "bla";
                log.println("Trying to connect to " + badUrl);
                oObj.connect(badUrl, info);
                res &= false;
                log.println("Expected exception isn't thrown");
            } catch(SQLException e) {
                log.println("Expected exception");
                res &= true;
            }
        }

        tRes.tested("connect()", res);
    }

    /**
    * Calls the method for <code>'XDriver.URL'</code> and
    * for <code>'XDriver.UNSUITABLE_URL'</code>.
    * Has OK status if the method returns true for <code>'XDriver.URL'</code>
    * and false for <code>'XDriver.UNSUITABLE_URL'</code>.
    */
    public void _acceptsURL() {
        boolean res = false;

        try {
            res = oObj.acceptsURL(url);
            log.println("Accepts " + url + "? " + res);
            res &= !oObj.acceptsURL(wrongUrl);
            log.println("Accepts " + wrongUrl + "? " + !res);
        } catch(SQLException e) {
            log.println("Unexpected exception");
            e.printStackTrace(log);
            res = false;
        }

        tRes.tested("acceptsURL()", res);
    }

    /**
    * Calls the method with passed <code>'XDriver.URL'</code> and
    * <code>'XDriver.INFO'</code>. Prints obtained driver properties info
    * to log.
    * Has OK status if returned value isn't null.
    */
    public void _getPropertyInfo() {
        requiredMethod("acceptsURL()");
        boolean res = false;
        DriverPropertyInfo[] dpi = null;
        try {
            dpi = oObj.getPropertyInfo(url, info);
        } catch(SQLException e) {
            log.println("Unexpected exception");
            e.printStackTrace(log);
            res = false;
        }

        if (dpi != null) {
            res = true;
            log.println("Driver properties info:");
            for(int i = 0; i < dpi.length; i++) {
                log.println("Property: " + dpi[i].Name);
                log.println("Description: " + dpi[i].Description);
                log.println("IsRequired? " + dpi[i].IsRequired);
                log.println("Value: " + dpi[i].Value);
                log.println("Choices: ");
                for(int j = 0; j < dpi[i].Choices.length; j++) {
                    log.println("\t" + dpi[i].Choices[j]);
                }
            }
        }

        tRes.tested("getPropertyInfo()", res);
    }

    /**
    * Calls the method.
    * Has OK status if returned value is greater than or is equal to 1.
    */
    public void _getMajorVersion() {
        int majorVer = oObj.getMajorVersion();
        boolean res = majorVer >= 1;
        log.println("Major version " + majorVer);
        tRes.tested("getMajorVersion()", res);
    }

    /**
    * Calls the method.
    * Has OK status if returned value is greater than or is equal to 0.
    */
    public void _getMinorVersion() {
        int minorVer = oObj.getMinorVersion();
        boolean res = minorVer >= 0;
        log.println("Minor version " + minorVer);
        tRes.tested("getMinorVersion()", res);
    }
}