blob: 09c64351fa96e2cd74a31d1ae863695cc243ee09 [file] [log] [blame]
/**************************************************************
*
* 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.
*
*************************************************************/
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package complex.sfx2;
import com.sun.star.document.DocumentEvent;
import com.sun.star.document.XDocumentEventBroadcaster;
import com.sun.star.document.XDocumentEventListener;
import com.sun.star.lang.EventObject;
import com.sun.star.lang.XEventListener;
import com.sun.star.uno.Exception;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.util.CloseVetoException;
import com.sun.star.util.XCloseListener;
import com.sun.star.util.XCloseable;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
import org.openoffice.test.tools.OfficeDocument;
/**
*
* @author frank.shoenheit@oracle.com
*/
public class DocumentEvents extends JUnitBasedTest
{
@Before
public void beforeTest() throws Exception
{
m_document = OfficeDocument.blankTextDocument( this.getORB() );
}
@After
public void afterTest()
{
if ( m_document != null )
{
assertTrue( "closing the test document failed", m_document.close() );
m_document = null;
}
}
/**
* sets up the environment for a test which checks the behavior upon closing a doc
*/
private void impl_setupDocCloseTest()
{
m_observedCloseEvents.clear();
final XDocumentEventBroadcaster docEventBroadcaster = UnoRuntime.queryInterface(
XDocumentEventBroadcaster.class, m_document.getDocument() );
docEventBroadcaster.addDocumentEventListener( new DocumentEventListener() );
final XCloseable docCloseable = UnoRuntime.queryInterface( XCloseable.class,
m_document.getDocument() );
docCloseable.addCloseListener( new CloseListener() );
m_document.getDocument().addEventListener( new DocDisposeListener() );
}
/**
* sets up the environment for a test which checks the behavior upon closing a doc
*/
private void impl_tearDownDocCloseTest( final String i_docCloseMethod )
{
synchronized( m_document )
{
try
{
m_document.wait(10000);
}
catch (InterruptedException ex)
{
// don't continue the test if somebody interrupted us ...
return;
}
}
m_document = null;
synchronized( m_observedCloseEvents )
{
assertArrayEquals(
"wrong order of events when closing a doc " + i_docCloseMethod,
new CloseEventType[] { CloseEventType.OnUnload, CloseEventType.NotifyClosing, CloseEventType.Disposing },
m_observedCloseEvents.toArray( new CloseEventType[0] )
);
}
}
@Test
public void testCloseWinEvents() throws Exception
{
impl_setupDocCloseTest();
m_document.getCurrentView().dispatch( ".uno:CloseWin" );
impl_tearDownDocCloseTest( "via .uno:CloseWin" );
}
//@Test
public void testCloseDocEvents() throws Exception
{
impl_setupDocCloseTest();
m_document.getCurrentView().dispatch( ".uno:CloseDoc" );
impl_tearDownDocCloseTest( "via .uno:CloseDoc" );
}
//@Test
public void testCloseByAPI() throws Exception
{
impl_setupDocCloseTest();
// closing the doc by API is synchronous, so do this in a separate thread, else we will get a deadlock
// when the document tries to call back our listener (well, I admit I didn't understand *why* we get this
// deadlock ... :-\ )
(new DocCloser()).start();
impl_tearDownDocCloseTest( "by API" );
}
private class DocumentEventListener implements XDocumentEventListener
{
public void documentEventOccured( DocumentEvent i_documentEvent )
{
if ( i_documentEvent.EventName.equals( "OnUnload" ) )
{
synchronized( m_observedCloseEvents )
{
m_observedCloseEvents.add( CloseEventType.OnUnload );
}
}
}
public void disposing(EventObject eo)
{
// not interested in
}
};
private class CloseListener implements XCloseListener
{
public void queryClosing(EventObject eo, boolean bln) throws CloseVetoException
{
// not interested in
}
public void notifyClosing(EventObject eo)
{
synchronized( m_observedCloseEvents )
{
m_observedCloseEvents.add( CloseEventType.NotifyClosing );
}
}
public void disposing(EventObject eo)
{
// not interested in
}
};
private class DocDisposeListener implements XEventListener
{
public void disposing(EventObject eo)
{
synchronized( m_observedCloseEvents )
{
m_observedCloseEvents.add( CloseEventType.Disposing );
}
synchronized ( m_document )
{
m_document.notifyAll();
}
}
};
private class DocCloser extends Thread
{
@Override
public void run()
{
try
{
final XCloseable docCloseable = UnoRuntime.queryInterface(XCloseable.class, m_document.getDocument());
docCloseable.close(true);
}
catch (CloseVetoException ex)
{
Logger.getLogger(DocumentEvents.class.getName()).log(Level.SEVERE, null, ex);
}
}
};
private enum CloseEventType
{
OnUnload,
NotifyClosing,
Disposing
};
private OfficeDocument m_document = null;
final private Vector< CloseEventType > m_observedCloseEvents = new Vector<DocumentEvents.CloseEventType>();
}