1*2be43276SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*2be43276SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*2be43276SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*2be43276SAndrew Rist  * distributed with this work for additional information
6*2be43276SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*2be43276SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*2be43276SAndrew Rist  * "License"); you may not use this file except in compliance
9*2be43276SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*2be43276SAndrew Rist  *
11*2be43276SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*2be43276SAndrew Rist  *
13*2be43276SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*2be43276SAndrew Rist  * software distributed under the License is distributed on an
15*2be43276SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*2be43276SAndrew Rist  * KIND, either express or implied.  See the License for the
17*2be43276SAndrew Rist  * specific language governing permissions and limitations
18*2be43276SAndrew Rist  * under the License.
19*2be43276SAndrew Rist  *
20*2be43276SAndrew Rist  *************************************************************/
21*2be43276SAndrew Rist 
22*2be43276SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir package com.sun.star.uno;
25cdf0e10cSrcweir 
26cdf0e10cSrcweir import complexlib.ComplexTestCase;
27cdf0e10cSrcweir import java.util.ArrayList;
28cdf0e10cSrcweir import java.util.Iterator;
29cdf0e10cSrcweir import util.WaitUnreachable;
30cdf0e10cSrcweir 
31cdf0e10cSrcweir public final class WeakReference_Test extends ComplexTestCase {
getTestObjectName()32cdf0e10cSrcweir     public String getTestObjectName() {
33cdf0e10cSrcweir         return getClass().getName();
34cdf0e10cSrcweir     }
35cdf0e10cSrcweir 
getTestMethodNames()36cdf0e10cSrcweir     public String[] getTestMethodNames() {
37cdf0e10cSrcweir         return new String[] { "test" };
38cdf0e10cSrcweir     }
39cdf0e10cSrcweir 
test()40cdf0e10cSrcweir     public void test() {
41cdf0e10cSrcweir         Object o = new MockWeak();
42cdf0e10cSrcweir         WeakReference r1 = new WeakReference(o);
43cdf0e10cSrcweir         WeakReference r2 = new WeakReference(r1);
44cdf0e10cSrcweir         assure("", r1.get() == o);
45cdf0e10cSrcweir         assure("", r2.get() == o);
46cdf0e10cSrcweir         WaitUnreachable u = new WaitUnreachable(o);
47cdf0e10cSrcweir         o = null;
48cdf0e10cSrcweir         u.waitUnreachable();
49cdf0e10cSrcweir         assure("a3", r1.get() == null);
50cdf0e10cSrcweir         assure("a4", r2.get() == null);
51cdf0e10cSrcweir     }
52cdf0e10cSrcweir 
53cdf0e10cSrcweir     private static final class MockWeak implements XWeak {
queryAdapter()54cdf0e10cSrcweir         public XAdapter queryAdapter() {
55cdf0e10cSrcweir             return adapter;
56cdf0e10cSrcweir         }
57cdf0e10cSrcweir 
finalize()58cdf0e10cSrcweir         protected void finalize() {
59cdf0e10cSrcweir             adapter.dispose();
60cdf0e10cSrcweir         }
61cdf0e10cSrcweir 
62cdf0e10cSrcweir         private static final class Adapter implements XAdapter {
Adapter(Object obj)63cdf0e10cSrcweir             public Adapter(Object obj) {
64cdf0e10cSrcweir                 ref = new java.lang.ref.WeakReference(obj);
65cdf0e10cSrcweir             }
66cdf0e10cSrcweir 
queryAdapted()67cdf0e10cSrcweir             public Object queryAdapted() {
68cdf0e10cSrcweir                 return ref.get();
69cdf0e10cSrcweir             }
70cdf0e10cSrcweir 
addReference(XReference ref)71cdf0e10cSrcweir             public void addReference(XReference ref) {
72cdf0e10cSrcweir                 synchronized (this) {
73cdf0e10cSrcweir                     if (listeners != null) {
74cdf0e10cSrcweir                         listeners.add(ref);
75cdf0e10cSrcweir                         return;
76cdf0e10cSrcweir                     }
77cdf0e10cSrcweir                 }
78cdf0e10cSrcweir                 ref.dispose();
79cdf0e10cSrcweir             }
80cdf0e10cSrcweir 
removeReference(XReference ref)81cdf0e10cSrcweir             public synchronized void removeReference(XReference ref) {
82cdf0e10cSrcweir                 if (listeners != null) {
83cdf0e10cSrcweir                     listeners.remove(ref);
84cdf0e10cSrcweir                 }
85cdf0e10cSrcweir             }
86cdf0e10cSrcweir 
dispose()87cdf0e10cSrcweir             public void dispose() {
88cdf0e10cSrcweir                 ArrayList l;
89cdf0e10cSrcweir                 synchronized (this){
90cdf0e10cSrcweir                     l = listeners;
91cdf0e10cSrcweir                     listeners = null;
92cdf0e10cSrcweir                 }
93cdf0e10cSrcweir                 if (l != null) {
94cdf0e10cSrcweir                     java.lang.RuntimeException ex = null;
95cdf0e10cSrcweir                     for (Iterator i = l.iterator(); i.hasNext();) {
96cdf0e10cSrcweir                         try {
97cdf0e10cSrcweir                             ((XReference) i.next()).dispose();
98cdf0e10cSrcweir                         } catch (java.lang.RuntimeException e) {
99cdf0e10cSrcweir                             ex = e;
100cdf0e10cSrcweir                         }
101cdf0e10cSrcweir                     }
102cdf0e10cSrcweir                     if (ex != null) {
103cdf0e10cSrcweir                         throw ex;
104cdf0e10cSrcweir                     }
105cdf0e10cSrcweir                 }
106cdf0e10cSrcweir             }
107cdf0e10cSrcweir 
108cdf0e10cSrcweir             private final java.lang.ref.WeakReference ref;
109cdf0e10cSrcweir             private ArrayList listeners = new ArrayList();
110cdf0e10cSrcweir         }
111cdf0e10cSrcweir 
112cdf0e10cSrcweir         private final Adapter adapter = new Adapter(this);
113cdf0e10cSrcweir     }
114cdf0e10cSrcweir }
115