255 lines
9.1 KiB
Java
255 lines
9.1 KiB
Java
/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*************************************************************************
|
|
*
|
|
* The Contents of this file are made available subject to the terms of
|
|
* the BSD license.
|
|
*
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions 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.
|
|
* 3. Neither the name of Sun Microsystems, Inc. nor the names of its
|
|
* contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
|
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
|
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
*************************************************************************/
|
|
|
|
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.connection.XConnector;
|
|
import com.sun.star.connection.XConnection;
|
|
|
|
import com.sun.star.beans.XPropertySet;
|
|
|
|
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 final Button _btnWriter;
|
|
private final Label _txtLabel;
|
|
private final String _url;
|
|
|
|
private final 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");
|
|
Button _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()
|
|
{
|
|
@Override
|
|
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() );
|
|
throw new java.lang.RuntimeException( exc );
|
|
}
|
|
}
|
|
|
|
/** separates 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 = 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 = 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 = 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 = UnoRuntime.queryInterface( XMultiComponentFactory.class, x );
|
|
|
|
// retrieve the component context (it's not yet exported from the office)
|
|
// Query for the XPropertySet interface.
|
|
XPropertySet xProperySet = 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 =
|
|
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 = 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 );
|
|
}
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|