/**************************************************************
 *
 * 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.
 *
 *************************************************************/



import java.io.*;

import com.sun.star.comp.helper.RegistryServiceFactory;
import com.sun.star.comp.servicemanager.ServiceManager;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.lang.XComponent;
import com.sun.star.bridge.XUnoUrlResolver;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import com.sun.star.beans.XPropertySet;
import com.sun.star.container.XNameAccess;
import com.sun.star.sdbc.*;
import com.sun.star.sdbcx.Privilege;
import com.sun.star.sdb.CommandType;
import com.sun.star.sdb.XRowSetApproveBroadcaster;

public class RowSet
{
    private static XComponentContext xContext = null;
    private static XMultiComponentFactory xMCF = null;
	public static void main(String argv[]) throws java.lang.Exception
	{
        try {
            // get the remote office component context
            xContext = com.sun.star.comp.helper.Bootstrap.bootstrap();
            System.out.println("Connected to a running office ...");
            xMCF = xContext.getServiceManager();
        }
        catch( Exception e) {
            System.err.println("ERROR: can't get a component context from a running office ...");
            e.printStackTrace(System.out);
            System.exit(1);
        }

        try{
			showRowSetEvents();
			showRowSetRowCount();
			showRowSetPrivileges();
			useRowSet();
		}
		catch(com.sun.star.uno.Exception e)
		{
			System.err.println(e);
			e.printStackTrace();
		}
		System.exit(0);
	}

	public static void printDataSources() throws com.sun.star.uno.Exception
	{
		// create a DatabaseContext and print all DataSource names
		XNameAccess xNameAccess = (XNameAccess)UnoRuntime.queryInterface(
            XNameAccess.class,
            xMCF.createInstanceWithContext("com.sun.star.sdb.DatabaseContext",
                                           xContext));
		String aNames [] = xNameAccess.getElementNames();
		for(int i=0;i<aNames.length;++i)
			System.out.println(aNames[i]);
	}

	public static void useRowSet() throws com.sun.star.uno.Exception
	{
		// first we create our RowSet object
		XRowSet xRowRes = (XRowSet)UnoRuntime.queryInterface(
            XRowSet.class,
            xMCF.createInstanceWithContext("com.sun.star.sdb.RowSet", xContext));

		System.out.println("RowSet created!");
		// set the properties needed to connect to a database
		XPropertySet xProp = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class,xRowRes);
		xProp.setPropertyValue("DataSourceName","Bibliography");
		xProp.setPropertyValue("Command","biblio");
		xProp.setPropertyValue("CommandType",new Integer(com.sun.star.sdb.CommandType.TABLE));

		xRowRes.execute();
		System.out.println("RowSet executed!");


		XComponent xComp = (XComponent)UnoRuntime.queryInterface(XComponent.class,xRowRes);
		xComp.dispose();
		System.out.println("RowSet destroyed!");
	}

	public static void showRowSetPrivileges() throws com.sun.star.uno.Exception
	{
		// first we create our RowSet object
		XRowSet xRowRes = (XRowSet)UnoRuntime.queryInterface(
            XRowSet.class,
            xMCF.createInstanceWithContext("com.sun.star.sdb.RowSet", xContext));

		System.out.println("RowSet created!");
		// set the properties needed to connect to a database
		XPropertySet xProp = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class,xRowRes);
		xProp.setPropertyValue("DataSourceName","Bibliography");
		xProp.setPropertyValue("Command","biblio");
		xProp.setPropertyValue("CommandType",new Integer(com.sun.star.sdb.CommandType.TABLE));

		xRowRes.execute();
		System.out.println("RowSet executed!");

		Integer aPriv = (Integer)xProp.getPropertyValue("Privileges");
		int nPriv  = aPriv.intValue();
		if( (nPriv & Privilege.SELECT) == Privilege.SELECT)
			System.out.println("SELECT");
		if( (nPriv & Privilege.INSERT) == Privilege.INSERT)
			System.out.println("INSERT");
		if( (nPriv & Privilege.UPDATE) == Privilege.UPDATE)
			System.out.println("UPDATE");
		if( (nPriv & Privilege.DELETE) == Privilege.DELETE)
			System.out.println("DELETE");

		// now destroy the RowSet
		XComponent xComp = (XComponent)UnoRuntime.queryInterface(XComponent.class,xRowRes);
		xComp.dispose();
		System.out.println("RowSet destroyed!");
	}

	public static void showRowSetRowCount() throws com.sun.star.uno.Exception
	{
		// first we create our RowSet object
		XRowSet xRowRes = (XRowSet)UnoRuntime.queryInterface(
            XRowSet.class,
            xMCF.createInstanceWithContext("com.sun.star.sdb.RowSet", xContext));

		System.out.println("RowSet created!");
		// set the properties needed to connect to a database
		XPropertySet xProp = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class,xRowRes);
		xProp.setPropertyValue("DataSourceName","Bibliography");
		xProp.setPropertyValue("Command","biblio");
		xProp.setPropertyValue("CommandType",new Integer(com.sun.star.sdb.CommandType.TABLE));

		xRowRes.execute();
		System.out.println("RowSet executed!");

		// now look if the RowCount is already final
		System.out.println("The RowCount is final: " + xProp.getPropertyValue("IsRowCountFinal"));

		XResultSet xRes = (XResultSet)UnoRuntime.queryInterface(XResultSet.class,xRowRes);
		xRes.last();

		System.out.println("The RowCount is final: " + xProp.getPropertyValue("IsRowCountFinal"));
		System.out.println("There are " + xProp.getPropertyValue("RowCount") + " rows!");

		// now destroy the RowSet
		XComponent xComp = (XComponent)UnoRuntime.queryInterface(XComponent.class,xRowRes);
		xComp.dispose();
		System.out.println("RowSet destroyed!");
	}

	public static void showRowSetEvents() throws com.sun.star.uno.Exception
	{
		// first we create our RowSet object
		XRowSet xRowRes = (XRowSet)UnoRuntime.queryInterface(
            XRowSet.class,
            xMCF.createInstanceWithContext("com.sun.star.sdb.RowSet", xContext));

		System.out.println("RowSet created!");
		// add our Listener
		System.out.println("Append our Listener!");
		RowSetEventListener pRow = new RowSetEventListener();
		XRowSetApproveBroadcaster xApBroad = (XRowSetApproveBroadcaster)UnoRuntime.queryInterface(XRowSetApproveBroadcaster.class,xRowRes);
		xApBroad.addRowSetApproveListener(pRow);
		xRowRes.addRowSetListener(pRow);

		// set the properties needed to connect to a database
		XPropertySet xProp = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class,xRowRes);
		xProp.setPropertyValue("DataSourceName","Bibliography");
		xProp.setPropertyValue("Command","biblio");
		xProp.setPropertyValue("CommandType",new Integer(com.sun.star.sdb.CommandType.TABLE));

		xRowRes.execute();
		System.out.println("RowSet executed!");

		// do some movements to check if we got all notifications
		XResultSet xRes = (XResultSet)UnoRuntime.queryInterface(XResultSet.class,xRowRes);
		System.out.println("beforeFirst");
		xRes.beforeFirst();
		// this should lead to no notifications because
		// we should stand before the first row at the beginning
		System.out.println("We stand before the first row: " + xRes.isBeforeFirst());

		System.out.println("next");
		xRes.next();
		System.out.println("next");
		xRes.next();
		System.out.println("last");
		xRes.last();
		System.out.println("next");
		xRes.next();
		System.out.println("We stand after the last row: " + xRes.isAfterLast());
		System.out.println("first");
		xRes.first();
		System.out.println("previous");
		xRes.previous();
		System.out.println("We stand before the first row: " + xRes.isBeforeFirst());
		System.out.println("afterLast");
		xRes.afterLast();
		System.out.println("We stand after the last row: " + xRes.isAfterLast());

		// now destroy the RowSet
		XComponent xComp = (XComponent)UnoRuntime.queryInterface(XComponent.class,xRowRes);
		xComp.dispose();
		System.out.println("RowSet destroyed!");
	}
}
