xref: /trunk/main/bean/java/officebean/src/main/java/com/sun/star/comp/beans/CallWatchThread.java (revision 6fd2419af095b9e12baf06e33db2129edf4d719b)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 package com.sun.star.comp.beans;
25 
26 //---------------------------------------------------------------------------
27 /** Helper class to watch calls into AOO with a timeout.
28  */
29 // Do not add the thread instances to a threadgroup. When testing the bean in
30 // an applet it turned out the ThreadGroup was in an inconsistent state
31 // after navigating off the site that contains the applet and back to it.
32 // That was tested with a Sun JRE 1.4.2_06
33 public class CallWatchThread extends Thread
34 {
35     private static boolean DEBUG = false;
36 
37     private Thread aWatchedThread;
38     private String aTag;
39     private boolean bAlive;
40     private long nTimeout;
41 
CallWatchThread(long nTimeout)42     public CallWatchThread(long nTimeout)
43     {
44         this(nTimeout, "");
45     }
46 
CallWatchThread( long nTimeout, String aTag )47     public CallWatchThread( long nTimeout, String aTag )
48     {
49         super(aTag);
50         this.aWatchedThread = Thread.currentThread();
51         this.nTimeout = nTimeout;
52 
53         this.aTag = aTag;
54         setDaemon( true );
55         dbgPrint( "CallWatchThread(" + this + ").start(" + aTag + ")" );
56         start();
57     }
58 
cancel()59     public void cancel()
60         throws java.lang.InterruptedException
61     {
62         dbgPrint( "CallWatchThread(" + this + ".cancel(" + aTag + ")" );
63         if ( aWatchedThread != null && aWatchedThread != Thread.currentThread() )
64             throw new RuntimeException( "wrong thread" );
65         aWatchedThread = null;
66         if ( interrupted() )
67             throw new InterruptedException();
68     }
69 
restart()70     public synchronized void restart()
71         throws java.lang.InterruptedException
72     {
73         dbgPrint( "CallWatchThread(" + this + ".restart(" + aTag + ")" );
74         if ( aWatchedThread != null && aWatchedThread != Thread.currentThread() )
75             throw new RuntimeException( "wrong thread" );
76         bAlive = true;
77         if ( interrupted() )
78             throw new InterruptedException();
79         notify();
80     }
81 
run()82     public void run()
83     {
84         dbgPrint( "CallWatchThread(" + this + ".run(" + aTag + ") ***** STARTED *****" );
85         long n = 0;
86         while ( aWatchedThread != null )
87         {
88             dbgPrint( "CallWatchThread(" + this + ").run(" + aTag + ") running #" + ++n );
89             synchronized(this)
90             {
91                 bAlive = false;
92                 try
93                 {
94                     wait( nTimeout );
95                 }
96                 catch ( java.lang.InterruptedException aExc )
97                 {
98                     bAlive = false;
99                 }
100 
101                 // watched thread seems to be dead (not answering)?
102                 if ( !bAlive && aWatchedThread != null )
103                 {
104                     dbgPrint( "CallWatchThread(" + this + ").run(" + aTag + ") interrupting" );
105                     aWatchedThread.interrupt();
106                     aWatchedThread = null;
107                 }
108             }
109         }
110 
111         dbgPrint( "CallWatchThread(" + this + ").run(" + aTag + ") terminated" );
112     }
113 
dbgPrint( String aMessage )114     private void dbgPrint( String aMessage )
115     {
116         if (DEBUG)
117             System.err.println( "OOoBean: " + aMessage );
118     }
119 }
120