/**************************************************************
 * 
 * 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.awt.*;
import java.awt.event.*;

import com.sun.star.uno.XComponentContext;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import com.sun.star.io.IOException;
import com.sun.star.connection.XConnector;
import com.sun.star.connection.XConnection;

import com.sun.star.beans.XPropertySet;

import com.sun.star.lang.XEventListener;
import com.sun.star.lang.XComponent;

import com.sun.star.bridge.XBridgeFactory;
import com.sun.star.bridge.XBridge;


public class ConnectionAwareClient extends java.awt.Frame
    implements ActionListener , com.sun.star.lang.XEventListener
{
    private Button _btnWriter,_btnCalc;
    private Label _txtLabel;
    private String _url;

    private XComponentContext _ctx;

    private com.sun.star.frame.XComponentLoader _officeComponentLoader;
    
    public ConnectionAwareClient( XComponentContext ctx , String url )
    {
        _url = url;
        _ctx = ctx;
        
        Panel p1 = new Panel();
        _btnWriter = new Button("New writer");
        _btnCalc = new Button("New calc");
        _txtLabel = new Label( "disconnected" );

        _btnWriter.addActionListener(this);
        _btnCalc.addActionListener(this);
        p1.add( _btnWriter );
        p1.add( _btnCalc );
        p1.add( _txtLabel );
        
        addWindowListener(
            new WindowAdapter()
            {
                public void windowClosing(WindowEvent event)
                {
                    System.exit(0);
                }
            }
            );

        add( p1 );
    }

    public void disposing( com.sun.star.lang.EventObject event )
    {
        // remote bridge has gone down, because the office crashed or was terminated.
        _officeComponentLoader = null;
        _txtLabel.setText( "disconnected" );
    }

    public void actionPerformed( ActionEvent event ) 
    {
        try
        {
            String sUrl;
            if( event.getSource() == _btnWriter )
            {
                sUrl = "private:factory/swriter";
            }
            else
            {
                sUrl = "private:factory/scalc";
            }
            getComponentLoader().loadComponentFromURL(
                sUrl, "_blank", 0,new com.sun.star.beans.PropertyValue[0] );
            _txtLabel.setText( "connected" );
        }
        catch ( com.sun.star.connection.NoConnectException exc )
        {
            _txtLabel.setText( exc.getMessage() );
        }
        catch ( com.sun.star.uno.Exception exc )
        {
            _txtLabel.setText( exc.getMessage() );
            exc.printStackTrace();
            throw new java.lang.RuntimeException( exc.getMessage()  );
        }
    }

    /** separtates the uno-url into 3 different parts.
     */
    protected static String[] parseUnoUrl(  String url )
    {
        String [] aRet = new String [3];

        if( ! url.startsWith( "uno:" ) )
        {
            return null;
        }

        int semicolon = url.indexOf( ';' );
        if( semicolon == -1 )
            return null;
        
        aRet[0] = url.substring( 4 , semicolon );
        int nextSemicolon = url.indexOf( ';' , semicolon+1);

        if( semicolon == -1 )
            return null;
        aRet[1] = url.substring( semicolon+1, nextSemicolon );

        aRet[2] = url.substring( nextSemicolon+1);
        return aRet;
    }



    protected com.sun.star.frame.XComponentLoader getComponentLoader()
        throws com.sun.star.uno.Exception
    {
        XComponentLoader officeComponentLoader = _officeComponentLoader;

        if( officeComponentLoader == null )
        {
            // instantiate connector service
            Object x = _ctx.getServiceManager().createInstanceWithContext(
                "com.sun.star.connection.Connector", _ctx );
            
            XConnector xConnector = (XConnector )
                UnoRuntime.queryInterface(XConnector.class, x);

            String a[] = parseUnoUrl( _url );
            if( null == a )
            {
                throw new com.sun.star.uno.Exception( "Couldn't parse uno-url "+ _url );
            }

            // connect using the connection string part of the uno-url only.
            XConnection connection = xConnector.connect( a[0] );
        
            x = _ctx.getServiceManager().createInstanceWithContext(
                "com.sun.star.bridge.BridgeFactory", _ctx );

            XBridgeFactory xBridgeFactory = (XBridgeFactory) UnoRuntime.queryInterface(
                XBridgeFactory.class , x );

            // create a nameless bridge with no instance provider
            // using the middle part of the uno-url
            XBridge bridge = xBridgeFactory.createBridge( "" , a[1] , connection , null );

            // query for the XComponent interface and add this as event listener
            XComponent xComponent = (XComponent) UnoRuntime.queryInterface(
                XComponent.class, bridge );
            xComponent.addEventListener( this );

            // get the remote instance 
            x = bridge.getInstance( a[2] );

            // Did the remote server export this object ?
            if( null == x )
            {
                throw new com.sun.star.uno.Exception(
                    "Server didn't provide an instance for" + a[2], null );
            }
      
            // Query the initial object for its main factory interface
            XMultiComponentFactory xOfficeMultiComponentFactory = ( XMultiComponentFactory )
                UnoRuntime.queryInterface( XMultiComponentFactory.class, x );

            // retrieve the component context (it's not yet exported from the office)
            // Query for the XPropertySet interface.
            XPropertySet xProperySet = ( XPropertySet )
                UnoRuntime.queryInterface( XPropertySet.class, xOfficeMultiComponentFactory );
            
            // Get the default context from the office server.
            Object oDefaultContext =
                xProperySet.getPropertyValue( "DefaultContext" );
            
            // Query for the interface XComponentContext.
            XComponentContext xOfficeComponentContext =
                ( XComponentContext ) UnoRuntime.queryInterface(
                    XComponentContext.class, oDefaultContext );

            
            // now create the desktop service
            // NOTE: use the office component context here !
            Object oDesktop = xOfficeMultiComponentFactory.createInstanceWithContext(
                "com.sun.star.frame.Desktop", xOfficeComponentContext );

            officeComponentLoader = ( XComponentLoader )
                UnoRuntime.queryInterface( XComponentLoader.class, oDesktop );

            if( officeComponentLoader == null )
            {
                throw new com.sun.star.uno.Exception(
                    "Couldn't instantiate com.sun.star.frame.Desktop" , null );
            }
            _officeComponentLoader = officeComponentLoader;
        }
        return officeComponentLoader;
    }
    
    public static void main( String [] args ) throws java.lang.Exception
        {
            if( args.length != 1 )
            {
                System.out.println( "usage: ConnectionAwareClient uno-url" );
                return;
            }
            XComponentContext ctx =
                com.sun.star.comp.helper.Bootstrap.createInitialComponentContext( null );

            ConnectionAwareClient connAware = new ConnectionAwareClient( ctx, args[0]);
            connAware.pack();
            connAware.setVisible( true );
        }
}

